From 1ef1644a3c66f0f96e051371289729b40c3c0506 Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Sun, 11 Oct 2026 22:16:10 -0700 Subject: [PATCH 01/11] Prototype lexical branch leaf prefix compression --- benchmarks/build_prefix_bench.py | 127 ++++++++++++++++ docs/branch-prefix-experiment.md | 62 ++++++++ include/splinterdb/data.h | 5 + src/btree.c | 225 ++++++++++++++++++++++++----- src/btree.h | 3 + src/btree_private.h | 96 ++++++++++++ src/default_data_config.c | 13 +- src/superblock.h | 5 +- tests/unit/btree_test.c | 18 +++ tests/unit/splinterdb_quick_test.c | 195 ++++++++++++++++++++++++- tests/unit/superblock_test.c | 30 ++++ 11 files changed, 732 insertions(+), 47 deletions(-) create mode 100644 benchmarks/build_prefix_bench.py create mode 100644 docs/branch-prefix-experiment.md diff --git a/benchmarks/build_prefix_bench.py b/benchmarks/build_prefix_bench.py new file mode 100644 index 000000000..2f848d58f --- /dev/null +++ b/benchmarks/build_prefix_bench.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +"""Build identical prefix workload code against a baseline or candidate tree. + +PREFIX_PATTERN=common|random|nonlexical selects 64-byte keys. Random keys have +uniformly dispersed first words, random tails, and a rank for validation. All +patterns preserve the kvbench logical-id ordering under their comparator. +PREFIX_DISABLE=1 disables compression on a capable candidate, for A/B control. +""" +import argparse +import hashlib +import json +from pathlib import Path +import subprocess + +p = argparse.ArgumentParser() +p.add_argument('tree', type=Path) +p.add_argument('--build-root', default='build') +a = p.parse_args() +tree = a.tree.resolve() +source = Path(__file__).with_name('kvbench.c').read_text() +source = source.replace('#define KEY_SIZE 24', '#define KEY_SIZE 64') +begin = source.index('static inline void\nmake_key(') +end = source.index('static inline void\nmake_value(', begin) +source = source[:begin] + r''' +static int prefix_pattern; +static uint64_t *prefix_random_words; + +static int +prefix_word_compare(const void *a, const void *b) +{ + uint64_t x = *(const uint64_t *)a, y = *(const uint64_t *)b; + return (x > y) - (x < y); +} + +static int +prefix_nonlexical_compare(const data_config *cfg, user_key a, user_key b) +{ + (void)cfg; + if (slice_length(a.key) != KEY_SIZE || slice_length(b.key) != KEY_SIZE) + abort(); + return memcmp((const char *)slice_data(a.key) + 56, + (const char *)slice_data(b.key) + 56, 8); +} + +static void +prefix_configure(void) +{ + const char *pattern = getenv("PREFIX_PATTERN"); + if (pattern == NULL || strcmp(pattern, "common") == 0) prefix_pattern = 0; + else if (strcmp(pattern, "random") == 0) prefix_pattern = 1; + else if (strcmp(pattern, "nonlexical") == 0) prefix_pattern = 2; + else { fprintf(stderr, "Unknown PREFIX_PATTERN %s\n", pattern); exit(2); } + if (prefix_pattern == 2) data_cfg.key_compare = prefix_nonlexical_compare; +#ifdef KVBENCH_PREFIX_SUPPORT + data_cfg.key_compare_is_lexical = prefix_pattern != 2 + && getenv("PREFIX_DISABLE") == NULL; +#endif + if (prefix_pattern == 1) { + if (opt.n > SIZE_MAX / 2 / sizeof(uint64_t)) abort(); + prefix_random_words = malloc(2 * opt.n * sizeof(uint64_t)); + if (!prefix_random_words) abort(); + for (uint64_t i = 0; i < 2 * opt.n; i++) + prefix_random_words[i] = mix(i + opt.seed * 1000003); + qsort(prefix_random_words, 2 * opt.n, sizeof(uint64_t), prefix_word_compare); + } + printf("prefix-pattern=%s key_bytes=%d compression_disabled=%s\n", + pattern ? pattern : "common", KEY_SIZE, + getenv("PREFIX_DISABLE") ? "true" : "false"); +} + +static inline void +prefix_encode_word(uint64_t word, char *key) +{ + for (int i = 0; i < 8; i++) key[i] = (char)(word >> (56 - 8 * i)); +} + +static inline void +make_key(uint64_t k, char *key) +{ + if (prefix_pattern == 0) { + memset(key, 'p', 48); + prefix_encode_word(k, key + 48); + } else { + for (unsigned i = 0; i < 7; i++) + prefix_encode_word(mix(k + (uint64_t)i * UINT64_C(0x9e3779b97f4a7c15)), + key + i * 8); + if (prefix_pattern == 1) prefix_encode_word(prefix_random_words[k], key); + } + prefix_encode_word(k, key + 56); +} + +static inline bool +decode_key(slice s, uint64_t *k) +{ + if (slice_length(s) != KEY_SIZE) return false; + const unsigned char *bytes = slice_data(s); + uint64_t rank = 0; + for (unsigned i = 56; i < 64; i++) rank = (rank << 8) | bytes[i]; + if (rank >= 2 * opt.n) return false; + char expected[KEY_SIZE]; + make_key(rank, expected); + *k = rank; + return memcmp(bytes, expected, KEY_SIZE) == 0; +} + +''' + source[end:] +source = source.replace('static const char KEY_PAD[16] = "kvbench-padding!";', '') +source = source.replace('default_data_config_init(&data_cfg);', + 'default_data_config_init(&data_cfg); prefix_configure();') +binary = tree / a.build_root / 'release/bin/prefix_kvbench' +binary.parent.mkdir(parents=True, exist_ok=True) +generated = binary.with_suffix('.c') +generated.write_text(source) +command = ['cc', '-D_GNU_SOURCE', '-ggdb', '-Wall', '-pthread', '-Werror', + '-DXXH_STATIC_LINKING_ONLY', '-fPIC', '-DSPLINTERDB_PLATFORM_DIR=platform_linux', + '-O3', '-ffast-math', '-flto', '-march=native', '-DKVBENCH_CLOSE_HAS_FORCE', + '-DKVBENCH_SPACE_MODE'] +if 'key_compare_is_lexical' in (tree / 'include/splinterdb/data.h').read_text(): + command.append('-DKVBENCH_PREFIX_SUPPORT') +command += ['-I', str(tree / 'include'), str(generated), + str(tree / a.build_root / 'release/lib/libsplinterdb.a'), '-laio', '-lxxhash', '-lm', + '-lpthread', '-o', str(binary)] +subprocess.run(command, check=True) +binary.with_suffix('.json').write_text(json.dumps(dict( + command=command, source_sha256=hashlib.sha256(source.encode()).hexdigest(), + binary_sha256=hashlib.sha256(binary.read_bytes()).hexdigest()), indent=2) + '\n') +print(binary) diff --git a/docs/branch-prefix-experiment.md b/docs/branch-prefix-experiment.md new file mode 100644 index 000000000..09cd9e1f8 --- /dev/null +++ b/docs/branch-prefix-experiment.md @@ -0,0 +1,62 @@ +# Branch leaf prefix experiment + +`data_config.key_compare_is_lexical` opts construction into prefix compression. +It promises unsigned-byte lexicographic ordering for stored keys and query +keys, including the rule that a shorter equal prefix sorts first. The default +data configuration opts in. Applications replacing its comparator must clear +the flag unless their replacement preserves this contract. + +When a branch leaf first fills, packing extracts the longest common prefix of +its first and last keys, rebuilds entries as suffixes, and continues filling the +page. A later key outside that prefix starts another leaf. Prefix bytes occupy +the page tail, so offset-table growth never moves them. A final partially full +leaf is left uncompressed. Index pivots and mutable memtable keys stay complete. + +Point reads compare the prefix once, then binary-search suffixes. A mismatch +can place the query on either side of the leaf. Range iterators reconstruct +full keys into owned buffers, copying the prefix only when changing leaves. +Equal-length successive keys retain the existing buffer, and suffix copies of +at most 16 bytes use bounded inline copies. +Positioning operations perform any allocation before returning; observing the +current tuple stays infallible. Bounds, seeks, asynchronous lookup, diagnostics, +parent pivots and logical key-byte accounting use the full key semantics. + +This independent prototype reserves superblock format `0x8007`. Its format +number must be reconciled with other format-changing projects before combining +them. It does not depend on the separate on-disk metadata project. + +Debug validation passed all 48 public quick tests. The new regression checks +compression enabled/disabled, actual compressed pages, close/reopen, point hits +and misses, asynchronous lookup, zero-length suffixes, forward/reverse ranges, +repeated seeks, full-key-only lexical callbacks, and prefix mismatches on both +sides. All 15 superblock tests pass, including rejection of the other independent +experiment formats. After the reconstruction optimization, all eight B-tree +tests (including bounded suffix copies) and the prefix roundtrip pass. +Performance acceptance is pending the follow-up measurements below. + +`benchmarks/build_prefix_bench.py /path/to/tree` compiles identical generated +kvbench source against baseline and candidate libraries and records source and +binary hashes. The campaign uses the same generator from its coordination +directory. It produces `build/release/bin/prefix_kvbench` with the existing +kvbench phase arguments and additional environment controls: + +* `PREFIX_PATTERN=common`: 64-byte keys with 48 fixed leading bytes. +* `PREFIX_PATTERN=random`: uniformly dispersed first words with random tails. +* `PREFIX_PATTERN=nonlexical`: a comparator orders the final eight-byte rank; + compression stays disabled. +* `PREFIX_DISABLE=1`: disable candidate compression for an overhead control. + +Use the same pattern, seed and key count on reopen. The random workload keeps +two eight-byte words per logical key in the harness to generate ordered ranks; +this memory is identical in baseline and candidate. Space mode reports live +allocation statistics and filesystem allocation after close. Report load plus +drain, point throughput, short/long range throughput and space together: saved +leaf bytes can trade off against rebuilding and key reconstruction. + +Initial ABBA common-prefix resident measurements reduced allocated file bytes +by 30.2% and mounted live extents by 25.1%. Point throughput changed by +1.2% +with one reader and -6.1% with eight; short ranges improved 4.3–8.6%. Disk and +nonlexical controls showed severe isolated device-latency outliers. Fixed-image +comparisons of the final reconstruction path and those controls are pending. +This implementation milestone is experimental and does not claim performance +neutrality. diff --git a/include/splinterdb/data.h b/include/splinterdb/data.h index 6e08f961a..a4bbcb1d5 100644 --- a/include/splinterdb/data.h +++ b/include/splinterdb/data.h @@ -188,6 +188,11 @@ struct data_config { merge_tuple_final_fn merge_tuples_final; key_to_str_fn key_to_string; message_to_str_fn message_to_string; + /* Opt in only when key_compare is exactly unsigned bytewise lexical order, + * with shorter equal-prefix keys first, for both stored and query keys. + * Enables common-prefix compression in immutable branch leaves. Clear this + * when replacing the default comparator with a different ordering. */ + bool32 key_compare_is_lexical; }; #ifdef __cplusplus diff --git a/src/btree.c b/src/btree.c index a9d6009b2..af53474e8 100644 --- a/src/btree.c +++ b/src/btree.c @@ -136,8 +136,9 @@ btree_increment_height(btree_hdr *hdr) static inline void btree_reset_node_entries(const btree_config *cfg, btree_hdr *hdr) { - hdr->num_entries = 0; - hdr->next_entry = btree_page_size(cfg); + hdr->num_entries = 0; + hdr->prefix_length = 0; + hdr->next_entry = btree_page_size(cfg); } @@ -1253,6 +1254,8 @@ btree_read_branch_header(const btree_config *cfg, uint64 page_size = btree_page_size(cfg); if (page_size < sizeof(*hdr) || hdr->height >= BTREE_MAX_HEIGHT + || hdr->prefix_length > MAX_INLINE_KEY_SIZE(page_size) + || (hdr->height != 0 && hdr->prefix_length != 0) || (hdr->flags & ~(BTREE_HDR_FIRST_IN_LEVEL | BTREE_HDR_LAST_IN_LEVEL)) != 0 || ((hdr->page_no == 0) != btree_hdr_is_first_in_level(hdr))) @@ -1266,7 +1269,8 @@ btree_read_branch_header(const btree_config *cfg, } uint64 table_end = sizeof(*hdr) + (uint64)hdr->num_entries * sizeof(hdr->offsets[0]); - if (hdr->next_entry < table_end || page_size < hdr->next_entry + if (hdr->next_entry < table_end + || page_size - hdr->prefix_length < hdr->next_entry || hdr->num_entries == 0) { return STATUS_INVALID_STATE; @@ -1302,7 +1306,7 @@ btree_read_entry_bounds(const btree_config *cfg, return STATUS_INVALID_STATE; } uint64 offset = hdr->offsets[idx]; - uint64 page_size = btree_page_size(cfg); + uint64 page_size = btree_page_size(cfg) - hdr->prefix_length; if (offset < hdr->next_entry || page_size <= offset || page_size - offset < min_size) { @@ -1365,7 +1369,9 @@ btree_read_leaf_key(const btree_config *cfg, if (entry->key_flags != ONDISK_KEY_DEFAULT_FLAGS || entry->key_length == ONDISK_KEY_NEGATIVE_INFINITY || entry->key_length == ONDISK_KEY_POSITIVE_INFINITY - || entry->key_length > remaining - sizeof(*entry)) + || entry->key_length > remaining - sizeof(*entry) + || (uint64)entry->key_length + hdr->prefix_length + > MAX_INLINE_KEY_SIZE(btree_page_size(cfg))) { return STATUS_INVALID_STATE; } @@ -1379,8 +1385,8 @@ btree_read_leaf_message(cache *cc, const btree_hdr *hdr, const leaf_entry *entry) { - uint64 offset = (const char *)entry - (const char *)hdr; - uint64 remaining = btree_page_size(cfg) - offset; + uint64 offset = (const char *)entry - (const char *)hdr; + uint64 remaining = btree_page_size(cfg) - hdr->prefix_length - offset; message_type message_class = ondisk_tuple_message_class(entry); if ((entry->flags & ~(ONDISK_MESSAGE_TYPE_MASK | ONDISK_MESSAGE_IS_BLOB)) != 0 @@ -1464,7 +1470,21 @@ btree_find_tuple_checked(const btree_config *cfg, const leaf_entry **entry_out) { int64 lo = 0, hi = btree_num_entries(hdr); - *found = FALSE; + *found = FALSE; + bool32 compressed = hdr->prefix_length != 0; + if (compressed) { + int cmp = btree_compare_prefix(cfg, hdr, target); + if (cmp != 0) { + *idx_out = cmp < 0 ? -1 : hi - 1; + if (entry_out != NULL) { + *entry_out = NULL; + } + return STATUS_OK; + } + target = key_create(target.is_query_key, + key_length(target) - hdr->prefix_length, + (const char *)key_data(target) + hdr->prefix_length); + } while (lo < hi) { int64 mid = (lo + hi) / 2; const leaf_entry *entry; @@ -1473,7 +1493,11 @@ btree_find_tuple_checked(const btree_config *cfg, return rc; } int cmp = - btree_key_compare(cfg, target, leaf_entry_key((leaf_entry *)entry)); + compressed + ? slice_lex_cmp(key_slice(target), + key_slice(leaf_entry_key((leaf_entry *)entry))) + : btree_key_compare( + cfg, target, leaf_entry_key((leaf_entry *)entry)); if (cmp == 0) { *found = TRUE; *idx_out = mid; @@ -2180,8 +2204,8 @@ accumulate_node_ranks(cache *cc, } else { entry = btree_get_leaf_entry(cfg, hdr, i); } - stats->key_bytes = - add_unknown(stats->key_bytes, leaf_entry_key_size(entry)); + stats->key_bytes = add_unknown( + stats->key_bytes, leaf_entry_key_size(entry) + hdr->prefix_length); stats->message_bytes = add_unknown(stats->message_bytes, leaf_entry_message_size(entry)); } @@ -2980,7 +3004,11 @@ btree_lookup_with_ref_async(btree_lookup_async_state *state, uint64 depth) } else { entry = btree_get_leaf_entry(state->cfg, state->node.hdr, idx); } - state->found_key = leaf_entry_key((leaf_entry *)entry); + state->found_key = state->node.hdr->prefix_length == 0 + ? leaf_entry_key((leaf_entry *)entry) + : key_create(FALSE, + key_length(state->target), + key_data(state->target)); state->msg = leaf_entry_message(state->cc, (leaf_entry *)entry); } else { btree_node_unget(state->cc, state->cfg, &state->node); @@ -3031,7 +3059,9 @@ btree_lookup_with_ref(cache *cc, // IN } else { entry = btree_get_leaf_entry(cfg, node->hdr, idx); } - *found_key = leaf_entry_key((leaf_entry *)entry); + *found_key = node->hdr->prefix_length == 0 + ? leaf_entry_key((leaf_entry *)entry) + : key_create(FALSE, key_length(target), key_data(target)); *msg = leaf_entry_message(cc, (leaf_entry *)entry); } else { btree_node_unget(cc, cfg, node); @@ -3282,7 +3312,7 @@ btree_iterator_read_node_key(btree_iterator *itor, const leaf_entry *entry; platform_status rc = btree_read_leaf_key(itor->cfg, hdr, idx, &entry); if (SUCCESS(rc)) { - *result = leaf_entry_key((leaf_entry *)entry); + rc = btree_leaf_full_key(itor->cfg, hdr, entry, &itor->bound_key, result); } return rc; } @@ -3579,6 +3609,25 @@ btree_iterator_check_current(btree_iterator *itor) itor->cc, itor->cfg, itor->curr.hdr, itor->idx, &entry); if (SUCCESS(rc)) { itor->validated_entry = entry; + uint64 prefix_length = itor->curr.hdr->prefix_length; + if (prefix_length != 0) { + uint64 key_length = prefix_length + entry->key_length; + if (key_buffer_length(&itor->decoded_key) != key_length) { + rc = key_buffer_resize(&itor->decoded_key, key_length); + } + if (SUCCESS(rc)) { + if (itor->prefix_page_addr != itor->curr.addr) { + memcpy(key_buffer_data(&itor->decoded_key), + btree_leaf_prefix(itor->cfg, itor->curr.hdr), + prefix_length); + itor->prefix_page_addr = itor->curr.addr; + } + btree_copy_key_suffix((char *)key_buffer_data(&itor->decoded_key) + + prefix_length, + entry->key_and_message, + entry->key_length); + } + } } } else { const index_entry *entry; @@ -3623,7 +3672,9 @@ btree_iterator_curr(iterator *base_itor, key *curr_key, message *data) } else { entry = btree_get_leaf_entry(itor->cfg, itor->curr.hdr, itor->idx); } - *curr_key = leaf_entry_key(entry); + *curr_key = itor->curr.hdr->prefix_length == 0 + ? leaf_entry_key(entry) + : key_buffer_key(&itor->decoded_key); *data = leaf_entry_message(itor->cc, entry); log_trace_key(*curr_key, "btree_iterator_get_curr"); } else { @@ -4784,6 +4835,10 @@ btree_iterator_seek(iterator *base_itor, comparison seek_type, key seek_key) itor->validation_status = rc; return rc; } + /* read_node_key reuses bound_key for compressed leaves. Consume the + * first result before reconstructing the last key into that buffer. */ + bool32 at_or_after_first = + btree_key_compare(itor->cfg, seek_key, first_key) >= 0; rc = btree_iterator_read_node_key( itor, itor->curr.hdr, num_entries - 1, &last_key); if (!SUCCESS(rc)) { @@ -4791,7 +4846,7 @@ btree_iterator_seek(iterator *base_itor, comparison seek_type, key seek_key) return rc; } seek_current_node = - btree_key_compare(itor->cfg, seek_key, first_key) >= 0 + at_or_after_first && btree_key_compare(itor->cfg, seek_key, last_key) <= 0; } @@ -4909,6 +4964,8 @@ btree_iterator_init_common(cache *cc, } ZERO_CONTENTS(itor); + key_buffer_init(&itor->decoded_key, PROCESS_PRIVATE_HEAP_ID); + key_buffer_init(&itor->bound_key, PROCESS_PRIVATE_HEAP_ID); itor->cc = cc; itor->cfg = cfg; itor->root_addr = root_addr; @@ -5032,6 +5089,8 @@ btree_iterator_deinit(btree_iterator *itor) debug_assert(itor != NULL); btree_prefetch_cursor_deinit(itor); btree_iterator_release_curr(itor); + key_buffer_deinit(&itor->decoded_key); + key_buffer_deinit(&itor->bound_key); if (itor->node_copy != NULL) { platform_free(PROCESS_PRIVATE_HEAP_ID, itor->node_copy); itor->node_copy = NULL; @@ -5118,8 +5177,21 @@ btree_pack_link_node(btree_pack_req *req, uint64 height, uint64 offset) btree_node *edge = &req->edge[height][offset]; btree_pivot_stats *edge_stats = &req->edge_stats[height][offset]; - key pivot = height ? btree_get_pivot(req->cfg, edge->hdr, 0) - : btree_get_tuple_key(req->cfg, edge->hdr, 0); + DECLARE_AUTO_KEY_BUFFER(pivot_buffer, PROCESS_PRIVATE_HEAP_ID); + key pivot; + if (height) { + pivot = btree_get_pivot(req->cfg, edge->hdr, 0); + } else { + platform_status rc = + btree_leaf_full_key(req->cfg, + edge->hdr, + btree_get_leaf_entry(req->cfg, edge->hdr, 0), + &pivot_buffer, + &pivot); + if (!SUCCESS(rc)) { + return rc; + } + } btree_node_unlock(req->cc, req->cfg, edge); btree_node_unclaim(req->cc, req->cfg, edge); // Cannot fully unlock edge yet because the key "pivot" may point into it. @@ -5251,6 +5323,68 @@ btree_pack_create_next_node(btree_pack_req *req, return STATUS_OK; } +/* Pull a common prefix out only when the uncompressed leaf first fills. + * The prefix lives at the page tail so appending offsets never moves it. */ +static bool32 +btree_pack_compress_leaf(btree_pack_req *req, btree_hdr *hdr) +{ + if (!req->cfg->data_cfg->key_compare_is_lexical || hdr->prefix_length != 0 + || hdr->num_entries < 2) + { + return FALSE; + } + key first = btree_get_tuple_key(req->cfg, hdr, 0); + key last = btree_get_tuple_key(req->cfg, hdr, hdr->num_entries - 1); + uint64 length = MIN(key_length(first), key_length(last)); + uint64 prefix = 0; + while (prefix < length + && ((const char *)key_data(first))[prefix] + == ((const char *)key_data(last))[prefix]) + { + prefix++; + } + if (prefix == 0) { + return FALSE; + } + char scratch[MAX_PAGE_SIZE]; + btree_hdr *packed = (btree_hdr *)scratch; + memcpy(packed, hdr, sizeof(*hdr)); + packed->num_entries = 0; + packed->prefix_length = prefix; + packed->next_entry = btree_page_size(req->cfg) - prefix; + memcpy(scratch + packed->next_entry, key_data(first), prefix); + for (uint64 i = 0; i < hdr->num_entries; i++) { + leaf_entry *entry = btree_get_leaf_entry(req->cfg, hdr, i); + key full = leaf_entry_key(entry); + key suffix = key_create(FALSE, + key_length(full) - prefix, + (const char *)key_data(full) + prefix); + bool32 fits = btree_set_leaf_entry( + req->cfg, packed, i, suffix, leaf_entry_message(req->cc, entry)); + platform_assert(fits); + } + memcpy(hdr, scratch, btree_page_size(req->cfg)); + return TRUE; +} + +static bool32 +btree_pack_append_leaf(btree_pack_req *req, + btree_hdr *hdr, + key full, + message msg) +{ + key suffix = full; + if (hdr->prefix_length != 0) { + if (btree_compare_prefix(req->cfg, hdr, full) != 0) { + return FALSE; + } + suffix = key_create(FALSE, + key_length(full) - hdr->prefix_length, + (const char *)key_data(full) + hdr->prefix_length); + } + return btree_set_leaf_entry(req->cfg, hdr, hdr->num_entries, suffix, msg); +} + static inline platform_status btree_pack_loop(btree_pack_req *req, // IN/OUT key tuple_key, // IN @@ -5312,10 +5446,12 @@ btree_pack_loop(btree_pack_req *req, // IN/OUT btree_node *leaf = btree_pack_get_current_node(req, 0); - if (!leaf - || !btree_set_leaf_entry( - req->cfg, leaf->hdr, btree_num_entries(leaf->hdr), tuple_key, msg)) - { + bool32 appended = + leaf != NULL && btree_pack_append_leaf(req, leaf->hdr, tuple_key, msg); + if (!appended && leaf != NULL && btree_pack_compress_leaf(req, leaf->hdr)) { + appended = btree_pack_append_leaf(req, leaf->hdr, tuple_key, msg); + } + if (!appended) { rc = btree_pack_create_next_node(req, 0, tuple_key, &leaf); if (!SUCCESS(rc)) { return rc; @@ -5729,19 +5865,28 @@ btree_print_index_node(platform_log_handle *log_handle, return STATUS_OK; } -static void +static platform_status btree_print_leaf_entry(platform_log_handle *log_handle, const btree_config *cfg, cache *cc, + const btree_hdr *hdr, leaf_entry *entry, uint64 entry_num) { data_config *dcfg = cfg->data_cfg; + DECLARE_AUTO_KEY_BUFFER(buffer, PROCESS_PRIVATE_HEAP_ID); + key full_key; + platform_status rc = + btree_leaf_full_key(cfg, hdr, entry, &buffer, &full_key); + if (!SUCCESS(rc)) { + return rc; + } platform_log(log_handle, "[%2lu]: %s -- %s\n", entry_num, - key_string(dcfg, leaf_entry_key(entry)), + key_string(dcfg, full_key), message_string(dcfg, leaf_entry_message(cc, entry))); + return STATUS_OK; } static platform_status @@ -5796,7 +5941,11 @@ btree_print_leaf_node(platform_log_handle *log_handle, } else { entry = btree_get_leaf_entry(cfg, hdr, i); } - btree_print_leaf_entry(log_handle, cfg, cc, (leaf_entry *)entry, i); + rc = btree_print_leaf_entry( + log_handle, cfg, cc, hdr, (leaf_entry *)entry, i); + if (!SUCCESS(rc)) { + return rc; + } } platform_log(log_handle, "-------------------\n"); platform_log(log_handle, "\n"); @@ -6080,11 +6229,14 @@ btree_verify_node(cache *cc, goto out; } } - if (btree_key_compare(cfg, - btree_get_tuple_key(cfg, node.hdr, idx), - btree_get_tuple_key(cfg, node.hdr, idx + 1)) - >= 0) - { + key first = btree_get_tuple_key(cfg, node.hdr, idx); + key second = btree_get_tuple_key(cfg, node.hdr, idx + 1); + // A user comparator may require full keys even when its ordering + // is lexical. Compressed entries contain only suffixes. + int cmp = node.hdr->prefix_length != 0 + ? slice_lex_cmp(key_slice(first), key_slice(second)) + : btree_key_compare(cfg, first, second); + if (cmp >= 0) { platform_error_log("out of order tuples\n"); platform_error_log("addr: %lu idx %2u\n", node.addr, idx); btree_node_unget(cc, cfg, &node); @@ -6142,9 +6294,11 @@ btree_verify_node(cache *cc, } } if (0 < idx - && btree_key_compare(cfg, - btree_get_pivot(cfg, node.hdr, idx), - btree_get_tuple_key(cfg, child.hdr, 0)) + && btree_compare_leaf_key( + cfg, + child.hdr, + btree_get_pivot(cfg, node.hdr, idx), + btree_get_leaf_entry(cfg, child.hdr, 0)) != 0) { platform_error_log( @@ -6178,10 +6332,11 @@ btree_verify_node(cache *cc, } } if (idx != btree_num_entries(node.hdr) - 1 - && btree_key_compare( + && btree_compare_leaf_key( cfg, + child.hdr, btree_get_pivot(cfg, node.hdr, idx + 1), - btree_get_tuple_key( + btree_get_leaf_entry( cfg, child.hdr, btree_num_entries(child.hdr) - 1)) < 0) { diff --git a/src/btree.h b/src/btree.h index 6afdcb55f..04b36969e 100644 --- a/src/btree.h +++ b/src/btree.h @@ -204,6 +204,9 @@ typedef struct btree_iterator { // Entry checked by the last successful positioning operation. Branch-tree // curr() reuses it so it does not decode the offset table again. const void *validated_entry; + key_buffer decoded_key; + key_buffer bound_key; + uint64 prefix_page_addr; btree_prefetch_cursor prefetch; } btree_iterator; diff --git a/src/btree_private.h b/src/btree_private.h index d2990f031..9e718696a 100644 --- a/src/btree_private.h +++ b/src/btree_private.h @@ -59,6 +59,9 @@ struct ONDISK btree_hdr { uint8 flags; node_offset next_entry; table_index num_entries; + /* Branch leaves only: prefix bytes occupy the end of the page. Entry keys + * are suffixes; index pivots and all mutable memtable keys remain full. */ + uint16 prefix_length; table_entry offsets[]; }; @@ -429,6 +432,99 @@ btree_get_tuple_key(const btree_config *cfg, return leaf_entry_key(btree_get_leaf_entry(cfg, hdr, k)); } +static inline const char * +btree_leaf_prefix(const btree_config *cfg, const btree_hdr *hdr) +{ + return (const char *)hdr + btree_page_size(cfg) - hdr->prefix_length; +} + +/* Compressed suffixes are commonly only a few bytes. Fixed-size copies avoid + * an out-of-line memcpy for these keys without reading past the suffix. */ +static inline void +btree_copy_key_suffix(char *dst, const char *src, uint64 length) +{ + if (length > 16) { + memcpy(dst, src, length); + } else if (length >= 8) { + memcpy(dst, src, 8); + memcpy(dst + length - 8, src + length - 8, 8); + } else if (length >= 4) { + memcpy(dst, src, 4); + memcpy(dst + length - 4, src + length - 4, 4); + } else if (length >= 2) { + memcpy(dst, src, 2); + memcpy(dst + length - 2, src + length - 2, 2); + } else if (length == 1) { + *dst = *src; + } +} + +/* The source leaf stays pinned while this key is used. Uncompressed keys keep + * the existing zero-copy path. */ +static inline platform_status +btree_leaf_full_key(const btree_config *cfg, + const btree_hdr *hdr, + const leaf_entry *entry, + key_buffer *buffer, + key *result) +{ + if (hdr->prefix_length == 0) { + *result = leaf_entry_key((leaf_entry *)entry); + return STATUS_OK; + } + uint64 length = (uint64)hdr->prefix_length + entry->key_length; + platform_status rc = key_buffer_resize(buffer, length); + if (!SUCCESS(rc)) { + return rc; + } + memcpy( + key_buffer_data(buffer), btree_leaf_prefix(cfg, hdr), hdr->prefix_length); + memcpy((char *)key_buffer_data(buffer) + hdr->prefix_length, + entry->key_and_message, + entry->key_length); + *result = key_buffer_key(buffer); + return STATUS_OK; +} + +/* Compare the shared prefix once before binary searching its suffixes. The + * mismatch may put target on either side of the entire leaf. */ +static inline int +btree_compare_prefix(const btree_config *cfg, const btree_hdr *hdr, key target) +{ + if (key_is_negative_infinity(target)) { + return -1; + } + if (key_is_positive_infinity(target)) { + return 1; + } + uint64 length = MIN(key_length(target), hdr->prefix_length); + int cmp = memcmp(key_data(target), btree_leaf_prefix(cfg, hdr), length); + if (cmp != 0) { + return cmp; + } + return key_length(target) < hdr->prefix_length ? -1 : 0; +} + +static inline int +btree_compare_leaf_key(const btree_config *cfg, + const btree_hdr *hdr, + key target, + const leaf_entry *entry) +{ + if (hdr->prefix_length == 0) { + return btree_key_compare( + cfg, target, leaf_entry_key((leaf_entry *)entry)); + } + int cmp = btree_compare_prefix(cfg, hdr, target); + if (cmp != 0) { + return cmp; + } + return slice_lex_cmp( + slice_create(key_length(target) - hdr->prefix_length, + (const char *)key_data(target) + hdr->prefix_length), + key_slice(leaf_entry_key((leaf_entry *)entry))); +} + static inline message btree_get_tuple_message(const btree_config *cfg, cache *cc, diff --git a/src/default_data_config.c b/src/default_data_config.c index 789af57ed..45f48eab6 100644 --- a/src/default_data_config.c +++ b/src/default_data_config.c @@ -59,12 +59,13 @@ default_data_config_init(data_config *out_cfg // OUT ) { data_config cfg = { - .key_compare = key_compare, - .key_hash = key_hash, - .merge_tuples = NULL, - .merge_tuples_final = NULL, - .key_to_string = key_to_string, - .message_to_string = message_to_string, + .key_compare = key_compare, + .key_hash = key_hash, + .merge_tuples = NULL, + .merge_tuples_final = NULL, + .key_to_string = key_to_string, + .message_to_string = message_to_string, + .key_compare_is_lexical = TRUE, }; *out_cfg = cfg; diff --git a/src/superblock.h b/src/superblock.h index a5bee05f5..cd02a2527 100644 --- a/src/superblock.h +++ b/src/superblock.h @@ -45,9 +45,10 @@ * moved the checksum and uint16 format into the fixed blob header; v5 made * log group ids start at 1 so they equal their durability tickets; v6 added * per-level page ordinals to branch btree pages; v7 made routing-filter - * descriptors carry their format version and fingerprint size. + * descriptors carry their format version and fingerprint size. Experimental + * v0x8007 adds per-leaf common-prefix encoding to immutable branch btrees. */ -#define SUPERBLOCK_FORMAT_VERSION (7) +#define SUPERBLOCK_FORMAT_VERSION (0x8007) /* The two physical superblock copies live at pages 0 and 1. */ #define SUPERBLOCK_NUM_SLOTS (2) diff --git a/tests/unit/btree_test.c b/tests/unit/btree_test.c index 1885165a0..5d30843b2 100644 --- a/tests/unit/btree_test.c +++ b/tests/unit/btree_test.c @@ -129,6 +129,24 @@ CTEST_TEARDOWN(btree) platform_deregister_thread(); } +CTEST2(btree, test_compressed_suffix_copy) +{ + char source[64]; + char destination[66]; + for (uint64 i = 0; i < sizeof(source); i++) { + source[i] = (char)(i + 1); + } + for (uint64 length = 0; length <= sizeof(source); length++) { + memset(destination, 0x5a, sizeof(destination)); + btree_copy_key_suffix(destination + 1, source, length); + ASSERT_EQUAL(0, memcmp(destination + 1, source, length)); + ASSERT_EQUAL(0x5a, destination[0]); + for (uint64 i = length + 1; i < sizeof(destination); i++) { + ASSERT_EQUAL(0x5a, destination[i]); + } + } +} + /* * Test leaf_hdr APIs. */ diff --git a/tests/unit/splinterdb_quick_test.c b/tests/unit/splinterdb_quick_test.c index 7ae046656..44c8bdb2c 100644 --- a/tests/unit/splinterdb_quick_test.c +++ b/tests/unit/splinterdb_quick_test.c @@ -37,8 +37,8 @@ #include "unit_tests.h" #include "util.h" #include "test_data.h" -#include "ctest.h" // This is required for all test-case files. -#include "btree.h" // for MAX_INLINE_MESSAGE_SIZE +#include "ctest.h" // This is required for all test-case files. +#include "btree_private.h" // branch encoding assertions #include "config.h" #include "splinterdb_tests_private.h" #include "clockcache.h" @@ -1201,6 +1201,192 @@ CTEST2(splinterdb_quick, test_variable_length_values) /* * iterator test case. */ +static slice +prefix_test_key(char buffer[64], uint64 value) +{ + memset(buffer, 'm', 48); + char suffix[17]; + snprintf(suffix, sizeof(suffix), "%016lx", value); + memcpy(buffer + 48, suffix, 16); + return slice_create(64, buffer); +} + +static int +prefix_test_compare(const data_config *cfg, user_key first, user_key second) +{ + /* Lexical ordering does not require accepting compressed suffixes. */ + platform_assert(slice_length(first.key) >= 48); + platform_assert(slice_length(second.key) >= 48); + return slice_lex_cmp(first.key, second.key); +} + +CTEST2(splinterdb_quick, test_branch_prefix_roundtrip) +{ + const uint64 count = 4096; + for (uint64 enabled = 0; enabled < 2; enabled++) { + ASSERT_EQUAL(0, splinterdb_close(&data->kvsb, FALSE)); + data->default_data_cfg.super.key_compare_is_lexical = enabled; + data->default_data_cfg.super.key_compare = prefix_test_compare; + ASSERT_EQUAL(0, splinterdb_create(&data->cfg, &data->kvsb)); + char keybuf[64]; + for (uint64 i = 0; i < count; i++) { + slice k = prefix_test_key(keybuf, i * 2); + ASSERT_EQUAL(0, + splinterdb_insert( + data->kvsb, k, slice_create(sizeof(i), &i), NULL)); + } + /* A key equal to a leaf's prefix exercises zero-length suffixes. */ + memset(keybuf, 'm', 48); + uint64 sentinel = UINT64_MAX; + ASSERT_EQUAL(0, + splinterdb_insert(data->kvsb, + slice_create(48, keybuf), + slice_create(sizeof(sentinel), &sentinel), + NULL)); + core_handle *core = + (core_handle *)splinterdb_get_trunk_handle(data->kvsb); + ASSERT_TRUE(SUCCESS(core_checkpoint(core, 0))); + + core_range_iterator probe; + ASSERT_TRUE(SUCCESS(core_range_iterator_init(core, + &probe, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY))); + bool32 compressed = FALSE; + for (uint64 i = 0; i < probe.num_branches; i++) { + if (probe.btree_itor_initialized[i] + && probe.btree_itor[i].curr.hdr != NULL) + { + compressed |= probe.btree_itor[i].curr.hdr->prefix_length != 0; + } + } + ASSERT_EQUAL(enabled, compressed); + /* Repeated seeks reuse the first/last-bound reconstruction buffer. */ + for (uint64 branch = 0; branch < probe.num_branches; branch++) { + if (!probe.btree_itor_initialized[branch] + || probe.btree_itor[branch].curr.hdr == NULL + || probe.btree_itor[branch].page_type != PAGE_TYPE_BRANCH) + { + continue; + } + ASSERT_TRUE(btree_verify_tree(core->cc, + core->cfg.btree_cfg, + probe.btree_itor[branch].root_addr, + PAGE_TYPE_BRANCH)); + iterator *branch_it = (iterator *)&probe.btree_itor[branch]; + for (uint64 i = 0; i < 64; i++) { + uint64 logical = (i * 19) % 64; + slice target = prefix_test_key(keybuf, logical * 2 + 1); + ASSERT_TRUE( + SUCCESS(iterator_seek(branch_it, + greater_than_or_equal, + key_create_from_slice(TRUE, target)))); + key found; + message value; + iterator_curr(branch_it, &found, &value); + ASSERT_EQUAL( + 0, + slice_lex_cmp(key_slice(found), + prefix_test_key(keybuf, (logical + 1) * 2))); + } + } + core_range_iterator_deinit(&probe); + + ASSERT_EQUAL(0, splinterdb_close(&data->kvsb, FALSE)); + ASSERT_EQUAL(0, splinterdb_open(&data->cfg, &data->kvsb)); + core = (core_handle *)splinterdb_get_trunk_handle(data->kvsb); + splinterdb_lookup_result result; + splinterdb_lookup_result_init( + data->kvsb, &result, SPLINTERDB_LOOKUP_VALUE, 0, NULL); + for (uint64 i = 0; i < count; i++) { + slice k = prefix_test_key(keybuf, i * 2); + ASSERT_EQUAL(0, splinterdb_lookup(data->kvsb, k, &result)); + ASSERT_TRUE(splinterdb_lookup_found(&result)); + slice value; + ASSERT_EQUAL(0, splinterdb_lookup_result_value(&result, &value)); + ASSERT_EQUAL(sizeof(i), slice_length(value)); + ASSERT_EQUAL(0, memcmp(slice_data(value), &i, sizeof(i))); + if (i % 127 == 0) { + lookup_result async_result; + lookup_result_init(&async_result, + core->cfg.data_cfg, + SPLINTERDB_LOOKUP_VALUE, + 0, + NULL); + ASSERT_TRUE( + SUCCESS(async_call_sync_callback(cache_cleanup(core->cc), + core_lookup_async, + core, + key_create_from_slice(TRUE, k), + &async_result))); + ASSERT_TRUE(lookup_result_found(&async_result)); + lookup_result_deinit(&async_result); + } + /* Missing keys between existing suffixes stay absent. */ + k = prefix_test_key(keybuf, i * 2 + 1); + ASSERT_EQUAL(0, splinterdb_lookup(data->kvsb, k, &result)); + ASSERT_FALSE(splinterdb_lookup_found(&result)); + } + splinterdb_lookup_result_deinit(&result); + + splinterdb_iterator *it; + ASSERT_EQUAL(0, + splinterdb_iterator_init( + data->kvsb, &it, greater_than_or_equal, NULL_SLICE)); + slice k, v; + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + ASSERT_EQUAL(48, slice_length(k)); + splinterdb_iterator_next(it); + for (uint64 i = 0; i < count; i++) { + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + slice expected = prefix_test_key(keybuf, i * 2); + ASSERT_EQUAL(0, slice_lex_cmp(k, expected)); + ASSERT_EQUAL(0, memcmp(slice_data(v), &i, sizeof(i))); + if (i + 1 < count) { + splinterdb_iterator_next(it); + } + } + for (uint64 i = count; i-- > 0;) { + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + ASSERT_EQUAL(0, slice_lex_cmp(k, prefix_test_key(keybuf, i * 2))); + splinterdb_iterator_prev(it); + } + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + ASSERT_EQUAL(48, slice_length(k)); + ASSERT_EQUAL(0, splinterdb_iterator_status(it)); + splinterdb_iterator_deinit(it); + + /* Prefix mismatch can lie below or above every tuple. */ + for (uint64 side = 0; side < 2; side++) { + memset(keybuf, side ? 'z' : 'a', sizeof(keybuf)); + ASSERT_EQUAL(0, + splinterdb_iterator_init( + data->kvsb, + &it, + side ? less_than_or_equal : greater_than_or_equal, + slice_create(sizeof(keybuf), keybuf))); + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + if (side) { + ASSERT_EQUAL( + 0, slice_lex_cmp(k, prefix_test_key(keybuf, (count - 1) * 2))); + } else { + ASSERT_EQUAL(48, slice_length(k)); + } + ASSERT_EQUAL(0, splinterdb_iterator_status(it)); + splinterdb_iterator_deinit(it); + } + } +} + CTEST2(splinterdb_quick, test_basic_iterator) { const int num_inserts = 50; @@ -2360,8 +2546,9 @@ CTEST2(splinterdb_quick, test_iterator_custom_comparator) // Tear down default instance, and create a new one. splinterdb_close(&data->kvsb, FALSE); - data->default_data_cfg.super.key_compare = custom_key_comparator; - data->default_data_cfg.num_comparisons = 0; + data->default_data_cfg.super.key_compare = custom_key_comparator; + data->default_data_cfg.super.key_compare_is_lexical = FALSE; + data->default_data_cfg.num_comparisons = 0; int rc = splinterdb_create(&data->cfg, &data->kvsb); ASSERT_EQUAL(0, rc); diff --git a/tests/unit/superblock_test.c b/tests/unit/superblock_test.c index f31e215dc..89a78184f 100644 --- a/tests/unit/superblock_test.c +++ b/tests/unit/superblock_test.c @@ -169,6 +169,36 @@ CTEST2(superblock, test_format_sets_fresh_state) superblock_context_deinit(&ctx); } +CTEST2(superblock, test_rejects_other_experiment_formats) +{ + const uint64 versions[] = {7, 8, 0x8006}; + superblock_context ctx; + platform_status rc = + superblock_context_init(&ctx, data->ioh, &data->allocator_cfg, data->hid); + ASSERT_TRUE(SUCCESS(rc)); + for (uint64 i = 0; i < ARRAY_SIZE(versions); i++) { + rc = superblock_format(&ctx, &data->allocator_cfg); + ASSERT_TRUE(SUCCESS(rc)); + ASSERT_EQUAL(SUPERBLOCK_FORMAT_VERSION, ctx.image->format_version); + ctx.image->format_version = versions[i]; + // Publish both slots with a valid checksum for the incompatible format. + rc = superblock_make_durable(&ctx); + ASSERT_TRUE(SUCCESS(rc)); + rc = superblock_make_durable(&ctx); + ASSERT_TRUE(SUCCESS(rc)); + rc = superblock_mount(&ctx, &data->allocator_cfg); + ASSERT_TRUE(STATUS_IS_EQ(rc, STATUS_NOT_FOUND)); + superblock image; + rc = superblock_read_bootstrap(data->io_cfg.filename, &image); + ASSERT_TRUE(STATUS_IS_EQ(rc, STATUS_NOT_FOUND)); + } + rc = superblock_format(&ctx, &data->allocator_cfg); + ASSERT_TRUE(SUCCESS(rc)); + rc = superblock_mount(&ctx, &data->allocator_cfg); + ASSERT_TRUE(SUCCESS(rc)); + superblock_context_deinit(&ctx); +} + /* * A durable tree snapshot and a subsequent durable allocator snapshot (the * clean-unmount Part A / Part B sequence) survive a deinit + re-mount: the From 4b57d57d68e9e1fe44aeb2eea35c40d84136bb58 Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Sun, 11 Oct 2026 22:30:42 -0700 Subject: [PATCH 02/11] Record prefix compression space and read performance results --- benchmarks/results-20261011/README.md | 15 + .../results-20261011/baseline-build.json | 31 ++ .../disk-common-fixed-final/manifest.json | 250 ++++++++++ .../disk-common-fixed-final/results.csv | 29 ++ .../disk-common/manifest.json | 427 ++++++++++++++++++ .../results-20261011/disk-common/results.csv | 41 ++ .../disk-nonlexical-fixed-final/manifest.json | 250 ++++++++++ .../disk-nonlexical-fixed-final/results.csv | 29 ++ .../disk-nonlexical/manifest.json | 427 ++++++++++++++++++ .../disk-nonlexical/results.csv | 41 ++ .../disk-random/manifest.json | 427 ++++++++++++++++++ .../results-20261011/disk-random/results.csv | 41 ++ .../final-candidate-build.json | 32 ++ .../final-implementation.json | 4 + .../prefix-pre-reconstruct.json | 6 + benchmarks/results-20261011/prefix_compare.py | 48 ++ .../results-20261011/prefix_fixed_compare.py | 20 + .../previous-candidate-build.json | 32 ++ .../resident-common-disabled/manifest.json | 427 ++++++++++++++++++ .../resident-common-disabled/results.csv | 41 ++ .../resident-common-fixed-final/manifest.json | 372 +++++++++++++++ .../resident-common-fixed-final/results.csv | 43 ++ .../resident-common/manifest.json | 427 ++++++++++++++++++ .../resident-common/results.csv | 41 ++ .../resident-nonlexical/manifest.json | 427 ++++++++++++++++++ .../resident-nonlexical/results.csv | 41 ++ .../resident-random/manifest.json | 427 ++++++++++++++++++ .../resident-random/results.csv | 41 ++ docs/branch-prefix-experiment.md | 76 +++- 29 files changed, 4506 insertions(+), 7 deletions(-) create mode 100644 benchmarks/results-20261011/README.md create mode 100644 benchmarks/results-20261011/baseline-build.json create mode 100644 benchmarks/results-20261011/disk-common-fixed-final/manifest.json create mode 100644 benchmarks/results-20261011/disk-common-fixed-final/results.csv create mode 100644 benchmarks/results-20261011/disk-common/manifest.json create mode 100644 benchmarks/results-20261011/disk-common/results.csv create mode 100644 benchmarks/results-20261011/disk-nonlexical-fixed-final/manifest.json create mode 100644 benchmarks/results-20261011/disk-nonlexical-fixed-final/results.csv create mode 100644 benchmarks/results-20261011/disk-nonlexical/manifest.json create mode 100644 benchmarks/results-20261011/disk-nonlexical/results.csv create mode 100644 benchmarks/results-20261011/disk-random/manifest.json create mode 100644 benchmarks/results-20261011/disk-random/results.csv create mode 100644 benchmarks/results-20261011/final-candidate-build.json create mode 100644 benchmarks/results-20261011/final-implementation.json create mode 100644 benchmarks/results-20261011/prefix-pre-reconstruct.json create mode 100644 benchmarks/results-20261011/prefix_compare.py create mode 100644 benchmarks/results-20261011/prefix_fixed_compare.py create mode 100644 benchmarks/results-20261011/previous-candidate-build.json create mode 100644 benchmarks/results-20261011/resident-common-disabled/manifest.json create mode 100644 benchmarks/results-20261011/resident-common-disabled/results.csv create mode 100644 benchmarks/results-20261011/resident-common-fixed-final/manifest.json create mode 100644 benchmarks/results-20261011/resident-common-fixed-final/results.csv create mode 100644 benchmarks/results-20261011/resident-common/manifest.json create mode 100644 benchmarks/results-20261011/resident-common/results.csv create mode 100644 benchmarks/results-20261011/resident-nonlexical/manifest.json create mode 100644 benchmarks/results-20261011/resident-nonlexical/results.csv create mode 100644 benchmarks/results-20261011/resident-random/manifest.json create mode 100644 benchmarks/results-20261011/resident-random/results.csv diff --git a/benchmarks/results-20261011/README.md b/benchmarks/results-20261011/README.md new file mode 100644 index 000000000..d5ee4f4f3 --- /dev/null +++ b/benchmarks/results-20261011/README.md @@ -0,0 +1,15 @@ +# Prefix experiment evidence, 2026-10-11 + +See ../../docs/branch-prefix-experiment.md for interpretation and validation. +Baseline is db3047a; the final implementation milestone is 1ef1644. Manifests +preserve absolute original paths, commands, timestamps and binary provenance. +No database images are included. Retained campaign runners document the original +workspace layout and fixture sources; the portable workload builder is at +../build_prefix_bench.py and accepts --build-root. + +The seven initial pattern/control directories measure the previous candidate. +The three *-fixed-final directories measure the final reconstruction path. +The resident common-prefix repeat includes the old candidate too, with identical +candidate images for both binaries. Incompatible baseline and candidate formats +use their own images, loaded serially with no background workers. File allocation +and live extent measurements come from the initial, format-identical images. diff --git a/benchmarks/results-20261011/baseline-build.json b/benchmarks/results-20261011/baseline-build.json new file mode 100644 index 000000000..88c9451f5 --- /dev/null +++ b/benchmarks/results-20261011/baseline-build.json @@ -0,0 +1,31 @@ +{ + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" +} diff --git a/benchmarks/results-20261011/disk-common-fixed-final/manifest.json b/benchmarks/results-20261011/disk-common-fixed-final/manifest.json new file mode 100644 index 000000000..41b5210c4 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final/manifest.json @@ -0,0 +1,250 @@ +{ + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/0-baseline.db", + "started": 1791782445.7997713, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "returncode": 0, + "finished": 1791782494.2788715 + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/1-candidate.db", + "started": 1791782495.1071756, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "returncode": 0, + "finished": 1791782543.4871998 + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/1-candidate.db", + "started": 1791782543.76991, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "returncode": 0, + "finished": 1791782592.150627 + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/0-baseline.db", + "started": 1791782592.5009682, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "returncode": 0, + "finished": 1791782642.0354667 + } + ], + "io": "O_DIRECT", + "note": "Identical candidate image for old/new reconstruction; own incompatible baseline image, serial load with no background workers." +} diff --git a/benchmarks/results-20261011/disk-common-fixed-final/results.csv b/benchmarks/results-20261011/disk-common-fixed-final/results.csv new file mode 100644 index 000000000..3c3c4d2a2 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final/results.csv @@ -0,0 +1,29 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,disk,0,0,warm,8,0,2000000,2000000,0.149,13412081.5,nan,nan,nan,0.000,nan,0.578,3461381.4,376782848,32768,188.39,0.02,nan,nan,nan,nan,nan,2000000,13412081.5,0.149,0.000,0.149,0.000,0,0,nan,0,0,0.163,0,0,0,0,4 +baseline,disk,0,0,point:uniform@1,1,0,2000000,163169,7.000,23309.3,47.616,93.184,182.272,664.112,42.848,0.991,164683.1,575610880,0,3527.70,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.163,0,0,0,0,0 +baseline,disk,0,0,point:uniform@8,8,0,2000000,1220364,7.000,174333.6,49.664,97.280,323.584,1340.022,45.823,8.178,149231.9,4303204352,0,3526.16,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.163,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@1,1,0,2000000,104191,7.000,14884.1,59.904,133.120,215.040,919.422,67.147,7.425,14033.4,1472147456,0,14129.31,0.00,58.880,133.120,66.842,nan,0.273,104191,14884.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.163,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@8,8,0,2000000,528135,7.000,75445.6,99.328,260.096,380.928,8209.812,105.969,58.642,9006.1,7469146112,0,14142.49,0.00,97.280,260.096,105.315,nan,0.612,528135,75445.6,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.163,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@1,1,0,2000000,1340,7.000,191.4,3440.640,15335.424,18612.224,25105.659,5224.281,3.124,428.9,3474710528,0,2593067.56,0.00,231.424,712.704,237.486,500.39,1.024,13363972,1909035.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.163,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@8,8,0,2000000,6743,7.000,963.3,6750.208,22282.240,30670.848,35481.605,8304.638,23.332,289.0,17170210816,0,2546375.62,0.00,331.776,1097.728,366.239,795.45,1.145,67331618,9618542.3,7.000,0.074,7.074,0.008,0,274432,nan,3671330816,833294336,0.163,0,0,0,0,0 +candidate,disk,1,0,warm,8,0,2000000,2000000,0.127,15742975.4,nan,nan,nan,0.000,nan,0.515,3886241.9,268337152,32768,134.17,0.02,nan,nan,nan,nan,nan,2000000,15742975.4,0.127,0.000,0.127,0.000,0,0,nan,0,0,0.103,0,0,0,0,5 +candidate,disk,1,0,point:uniform@1,1,0,2000000,183350,7.000,26192.3,45.568,91.136,202.752,599.443,38.134,0.872,210240.4,587169792,0,3202.45,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.103,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,0,2000000,1405438,7.000,200772.1,48.640,74.752,101.376,1350.047,39.789,7.783,180588.6,4507848704,0,3207.43,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.103,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@1,1,0,2000000,120412,7.000,17201.3,52.736,117.760,174.080,616.070,58.096,7.377,16321.9,1315053568,0,10921.28,0.00,51.712,117.760,57.667,nan,0.397,120412,17201.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.103,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,0,2000000,573050,7.000,81861.9,87.040,274.432,892.928,4300.432,97.655,58.584,9781.6,6275198976,4096,10950.53,0.01,87.040,274.432,96.711,nan,0.898,573050,81861.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.103,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@1,1,0,2000000,1677,7.000,239.6,2785.280,12713.984,15073.280,16561.329,4174.915,3.216,521.5,3101749248,0,1849582.14,0.00,190.464,614.400,204.249,398.32,1.186,16729203,2389825.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.103,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,0,2000000,7500,7.000,1071.4,5963.776,20709.376,26476.544,28766.293,7464.861,26.431,283.8,13464543232,0,1795272.43,0.00,282.624,1130.496,325.841,715.28,2.007,74869799,10695375.7,7.000,0.061,7.061,0.009,0,278528,nan,3250065408,542756864,0.103,0,0,1,0,0 +candidate,disk,2,0,warm,8,1,2000000,2000000,0.131,15238087.5,nan,nan,nan,0.000,nan,0.570,3508058.0,268136448,32768,134.07,0.02,nan,nan,nan,nan,nan,2000000,15238087.5,0.131,0.000,0.131,0.000,0,0,nan,0,0,0.118,0,0,0,0,3 +candidate,disk,2,0,point:uniform@1,1,1,2000000,167237,7.000,23890.4,46.592,133.120,339.968,3233.682,41.792,1.142,146496.5,536150016,0,3205.93,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.118,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,1,2000000,1287406,7.000,183910.2,49.664,103.424,811.008,2524.550,43.431,8.480,151823.3,4129902592,0,3207.93,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.118,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@1,1,1,2000000,113086,7.000,16154.7,53.760,141.312,274.432,912.796,61.857,7.400,15281.2,1234812928,0,10919.24,0.00,53.760,137.216,61.391,nan,0.432,113086,16154.7,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.118,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@8,8,1,2000000,532626,7.000,76087.1,89.088,348.160,991.232,14724.309,105.055,57.532,9257.9,5825519616,4096,10937.35,0.01,89.088,348.160,104.051,nan,0.956,532626,76087.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.118,0,0,1,0,0 +candidate,disk,2,0,range:uniform:10000@1,1,1,2000000,1616,7.000,230.9,2850.816,13500.416,16384.000,16847.875,4331.122,3.308,488.5,2987319296,0,1848588.67,0.00,190.464,663.552,207.389,413.70,1.216,16119203,2302692.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.118,0,0,3,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,1,2000000,8080,7.000,1154.3,5439.488,19136.512,23330.816,25859.053,6929.457,26.288,307.4,14614159360,0,1808683.09,0.00,274.432,925.696,304.473,664.13,1.559,80641279,11519888.0,7.000,0.055,7.055,0.008,0,278528,nan,3250065408,542756864,0.118,0,0,0,0,0 +baseline,disk,3,0,warm,8,1,2000000,2000000,0.197,10131047.3,nan,nan,nan,0.000,nan,0.681,2935706.6,375799808,32768,187.90,0.02,nan,nan,nan,nan,nan,2000000,10131047.3,0.197,0.000,0.197,0.000,0,0,nan,0,0,1.180,0,0,0,0,0 +baseline,disk,3,0,point:uniform@1,1,1,2000000,152708,7.000,21814.6,46.592,117.760,1294.336,2924.091,45.790,0.874,174634.2,538640384,0,3527.26,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.180,0,0,0,0,0 +baseline,disk,3,0,point:uniform@8,8,1,2000000,1142829,7.000,163257.2,49.664,99.328,1425.408,3012.596,48.939,7.373,154994.2,4032393216,0,3528.43,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.180,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@1,1,1,2000000,95464,7.000,13637.2,60.928,157.696,1523.712,2640.396,73.290,7.392,12915.2,1349660672,0,14137.90,0.00,60.928,157.696,72.978,nan,0.279,95464,13637.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.180,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@8,8,1,2000000,479004,7.000,68427.0,101.376,356.352,1720.320,4194.731,116.840,58.671,8164.3,6765563904,0,14124.23,0.00,101.376,356.352,116.145,nan,0.648,479004,68427.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.180,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@1,1,1,2000000,1312,7.000,187.4,3309.568,17039.360,62390.272,69768.818,5336.223,2.992,438.4,3391115264,0,2584691.51,0.00,235.520,925.696,252.643,510.26,0.967,13083972,1869092.6,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.180,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@8,8,1,2000000,6277,7.000,896.7,7012.352,32768.000,66584.576,80489.077,8931.009,23.455,267.6,15912615936,0,2535067.06,0.00,331.776,2195.456,414.144,853.46,1.281,62671618,8952869.0,7.000,0.067,7.067,0.007,0,278528,nan,3671330816,833294336,1.180,0,0,0,0,0 diff --git a/benchmarks/results-20261011/disk-common/manifest.json b/benchmarks/results-20261011/disk-common/manifest.json new file mode 100644 index 000000000..c4b5c4fa9 --- /dev/null +++ b/benchmarks/results-20261011/disk-common/manifest.json @@ -0,0 +1,427 @@ +{ + "pattern": "common", + "regime": "disk", + "io": "O_DIRECT", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/0-baseline.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761222.7155974, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791761274.921949, + "db_allocated_bytes": 833753088, + "db_apparent_bytes": 3671330816, + "preclose_live_extents": [ + 3376, + 3414 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/1-candidate.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761274.922609, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791761327.0636742, + "db_allocated_bytes": 543129600, + "db_apparent_bytes": 3250065408, + "preclose_live_extents": [ + 2547, + 2585 + ], + "preclose_branch_extents": [ + 2236, + 0 + ] + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/2-candidate.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761327.0641093, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791761378.9871957, + "db_allocated_bytes": 547315712, + "db_apparent_bytes": 3250065408, + "preclose_live_extents": [ + 2547, + 2585 + ], + "preclose_branch_extents": [ + 2236, + 0 + ] + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/3-baseline.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761378.9876037, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791761431.279278, + "db_allocated_bytes": 834072576, + "db_apparent_bytes": 3671330816, + "preclose_live_extents": [ + 3376, + 3414 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + } + ], + "source": "same generated kvbench source", + "loading_threads": 1 +} diff --git a/benchmarks/results-20261011/disk-common/results.csv b/benchmarks/results-20261011/disk-common/results.csv new file mode 100644 index 000000000..8541c9aff --- /dev/null +++ b/benchmarks/results-20261011/disk-common/results.csv @@ -0,0 +1,41 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,disk,0,0,load:random@1,1,0,2000000,2000000,3.623,552006.1,0.600,1.584,12.672,77653.931,1.758,2.765,723330.2,350765056,749961216,175.38,374.98,nan,nan,nan,nan,nan,0,0.0,3.623,0.238,3.861,0.094,46182400,83574784,2.5413,3671330816,833753088,0.008,0,0,0,0,0 +baseline,disk,0,0,warm,8,0,2000000,2000000,0.141,14141898.2,nan,nan,nan,0.000,nan,0.518,3858850.9,376389632,32768,188.19,0.02,nan,nan,nan,nan,nan,2000000,14141898.2,0.141,0.000,0.141,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,point:uniform@1,1,0,2000000,121229,5.000,24245.1,45.568,91.136,190.464,1917.092,41.205,0.558,217269.9,427462656,0,3526.08,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,point:uniform@8,8,0,2000000,914667,5.000,182927.1,48.640,82.944,113.664,2056.493,43.676,5.195,176056.2,3227820032,0,3528.96,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@1,1,0,2000000,75616,5.000,15122.7,58.880,125.952,186.368,2035.076,66.090,5.285,14308.4,1067855872,4096,14122.09,0.05,58.880,123.904,65.794,nan,0.265,75616,15122.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10@1,1,0,2000000,43792,5.000,8758.1,95.232,532.480,909.312,1996.396,114.144,4.524,9679.2,1319915520,0,30140.56,0.00,76.800,479.232,91.665,2465.54,0.275,437920,87581.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@1,1,0,2000000,992,5.000,198.4,3375.104,14286.848,18950.794,18950.794,5040.854,2.172,456.8,2559967232,0,2580612.13,0.00,235.520,925.696,266.283,478.49,0.710,9903951,1980736.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@8,8,0,2000000,377953,5.000,75587.2,99.328,260.096,380.928,3720.602,105.771,42.041,8990.2,5344919552,0,14141.76,0.00,97.280,260.096,105.131,nan,0.598,377953,75587.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10@8,8,0,2000000,183813,5.000,36760.7,165.888,860.160,1392.640,3310.434,217.542,36.877,4984.5,5511774208,0,29985.77,0.00,137.216,778.240,182.363,3839.81,0.599,1838127,367606.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@8,8,0,2000000,4584,5.000,916.8,6881.280,29622.272,50855.936,69958.815,8725.108,16.480,278.2,11560890368,0,2522009.24,0.00,339.968,2015.232,413.570,832.63,1.040,45768346,9153255.4,5.000,0.079,5.079,0.007,0,290816,nan,3671330816,833753088,0.039,0,0,0,0,0 +candidate,disk,1,0,load:random@1,1,0,2000000,2000000,3.570,560249.3,0.632,1.584,6.720,37939.304,1.729,2.844,703349.6,216444928,469794816,108.22,234.90,nan,nan,nan,nan,nan,0,0.0,3.570,0.228,3.798,0.095,32186368,73134080,1.6553,3250065408,543129600,0.014,0,0,0,0,0 +candidate,disk,1,0,warm,8,0,2000000,2000000,0.125,15998305.7,nan,nan,nan,0.000,nan,0.520,3842894.8,268226560,32768,134.11,0.02,nan,nan,nan,nan,nan,2000000,15998305.7,0.125,0.000,0.125,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,point:uniform@1,1,0,2000000,129359,5.000,25871.0,45.568,72.704,892.928,1964.614,38.615,0.544,237609.7,414285824,0,3202.61,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,0,2000000,980786,5.000,196150.6,48.640,74.752,389.120,2078.220,40.728,5.215,188062.8,3146534912,4096,3208.18,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,6,0,0 +candidate,disk,1,0,range:uniform:1@1,1,0,2000000,81802,5.000,16359.7,50.688,121.856,1425.408,1858.920,61.091,5.244,15600.4,893890560,4096,10927.49,0.05,50.688,121.856,60.680,nan,0.380,81802,16359.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10@1,1,0,2000000,46416,5.000,9282.8,78.848,696.320,1720.320,3840.479,107.690,4.664,9951.8,1073344512,0,23124.45,0.00,62.976,630.784,90.981,1811.99,0.385,464160,92828.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@1,1,0,2000000,730,5.000,146.0,4259.840,30670.848,51644.449,51644.449,6843.136,1.946,375.1,1363886080,0,1868337.10,0.00,243.712,2850.816,502.101,635.10,0.921,7292042,1458367.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,0,2000000,155777,5.000,31154.2,115.712,1851.392,2654.208,7934.521,256.695,40.678,3829.5,1699528704,0,10910.01,0.00,115.712,1851.392,255.846,nan,0.810,155777,31154.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10@8,8,0,2000000,60359,5.000,12071.3,282.624,7536.640,10878.976,13036.040,662.628,37.108,1626.6,1402855424,0,23241.86,0.00,239.616,7274.496,595.980,7309.58,0.841,603590,120713.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,0,2000000,4002,5.000,800.4,6488.064,59244.544,87031.808,101032.207,9974.450,15.350,260.7,7276466176,4096,1818207.44,1.02,307.200,8060.928,609.849,938.20,1.255,39961525,7991968.2,5.000,0.070,5.070,0.007,0,286720,nan,3250065408,543129600,0.006,0,0,0,0,0 +candidate,disk,2,0,load:random@1,1,1,2000000,2000000,3.450,579774.4,0.632,1.616,7.232,38709.014,1.668,2.820,709253.3,219430912,473784320,109.72,236.89,nan,nan,nan,nan,nan,0,0.0,3.450,0.216,3.666,0.089,32018432,73334784,1.6680,3250065408,547315712,0.010,0,0,0,0,0 +candidate,disk,2,0,warm,8,1,2000000,2000000,0.121,16589370.2,nan,nan,nan,0.000,nan,0.537,3727122.5,268480512,32768,134.24,0.02,nan,nan,nan,nan,nan,2000000,16589370.2,0.121,0.000,0.121,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +candidate,disk,2,0,point:uniform@1,1,1,2000000,134765,5.000,26951.5,45.568,70.656,165.888,591.179,37.065,0.571,235897.6,431677440,0,3203.19,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,1,2000000,1010671,5.000,202127.1,47.616,72.704,99.328,632.694,39.523,5.414,186685.9,3241500672,0,3207.28,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@1,1,1,2000000,87598,5.000,17518.6,50.688,115.712,165.888,615.333,57.047,5.258,16659.2,957194240,4096,10927.12,0.05,50.688,113.664,56.630,nan,0.386,87598,17518.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10@1,1,1,2000000,52231,5.000,10445.7,76.800,487.424,778.240,1336.476,95.696,4.682,11156.3,1212817408,0,23220.26,0.00,61.952,438.272,80.077,1690.09,0.393,522308,104456.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@1,1,1,2000000,1202,5.000,240.4,2850.816,12451.840,15073.280,15258.888,4165.395,2.326,516.8,2214821888,0,1842613.88,0.00,182.272,778.240,211.062,396.98,0.924,11983972,2396699.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@8,8,1,2000000,417877,5.000,83571.5,89.088,256.000,364.544,1627.893,95.663,41.958,9959.4,4568178688,0,10931.87,0.00,87.040,251.904,94.713,nan,0.905,417877,83571.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10@8,8,1,2000000,203154,5.000,40629.3,145.408,778.240,1130.496,2059.231,196.840,37.889,5361.8,4706906112,0,23169.15,0.00,119.808,729.088,170.944,2779.38,0.860,2031537,406292.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,1,2000000,5752,5.000,1150.4,5570.560,18612.224,23855.104,26768.385,6952.628,18.418,312.3,10458636288,4096,1818260.83,0.71,274.432,1007.616,307.883,665.69,1.367,57433637,11486240.5,5.000,0.064,5.064,0.008,0,286720,nan,3250065408,547315712,0.006,0,0,0,0,0 +baseline,disk,3,0,load:random@1,1,1,2000000,2000000,3.749,533545.4,0.632,1.680,13.184,49825.939,1.818,2.899,689944.5,347979776,749744128,173.99,374.87,nan,nan,nan,nan,nan,0,0.0,3.749,0.232,3.980,0.097,44695552,84099072,2.5422,3671330816,834072576,0.008,0,0,0,0,0 +baseline,disk,3,0,warm,8,1,2000000,2000000,0.131,15305791.7,nan,nan,nan,0.000,nan,0.523,3826857.7,375713792,32768,187.86,0.02,nan,nan,nan,nan,nan,2000000,15305791.7,0.131,0.000,0.131,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,3,0,point:uniform@1,1,1,2000000,122879,5.000,24575.1,45.568,89.088,178.176,621.208,40.654,0.559,219748.6,433233920,0,3525.70,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,3,0,point:uniform@8,8,1,2000000,923267,5.000,184647.1,48.640,78.848,105.472,2066.065,43.270,5.271,175160.9,3257929728,0,3528.70,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@1,1,1,2000000,76096,5.000,15218.6,58.880,125.952,190.464,596.680,65.673,5.291,14381.4,1074393088,4096,14118.92,0.05,58.880,125.952,65.374,nan,0.268,76096,15218.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10@1,1,1,2000000,44198,5.000,8839.3,95.232,532.480,860.160,1513.442,113.092,4.524,9769.9,1333145600,0,30163.03,0.00,74.752,479.232,90.687,2458.06,0.268,441980,88393.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@1,1,1,2000000,993,5.000,198.6,3309.568,14548.992,18355.269,18355.269,5041.143,2.204,450.6,2563846144,0,2581919.58,0.00,231.424,827.392,246.248,480.56,0.679,9913951,1982696.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,29,0,0 +baseline,disk,3,0,range:uniform:1@8,8,1,2000000,379587,5.000,75913.9,99.328,260.096,364.544,7312.355,105.317,42.036,9030.1,5371990016,0,14152.20,0.00,97.280,260.096,104.665,nan,0.608,379587,75913.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10@8,8,1,2000000,187198,5.000,37437.9,165.888,811.008,1163.264,4263.431,213.606,36.881,5075.8,5602111488,0,29926.13,0.00,133.120,729.088,178.186,3863.90,0.623,1871977,374378.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@8,8,1,2000000,4843,5.000,968.6,6750.208,21757.952,30670.848,34039.133,8262.363,16.988,285.1,12196876288,0,2518454.74,0.00,323.584,1064.960,362.938,791.56,1.065,48352165,9669990.5,5.000,0.085,5.085,0.008,0,290816,nan,3671330816,834072576,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261011/disk-nonlexical-fixed-final/manifest.json b/benchmarks/results-20261011/disk-nonlexical-fixed-final/manifest.json new file mode 100644 index 000000000..49e28e0c2 --- /dev/null +++ b/benchmarks/results-20261011/disk-nonlexical-fixed-final/manifest.json @@ -0,0 +1,250 @@ +{ + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/0-baseline.db", + "started": 1791782747.3825905, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "returncode": 0, + "finished": 1791782795.8199513 + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/1-candidate.db", + "started": 1791782797.2660391, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "returncode": 0, + "finished": 1791782846.8482606 + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/1-candidate.db", + "started": 1791782847.2312615, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "returncode": 0, + "finished": 1791782895.6604657 + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/0-baseline.db", + "started": 1791782896.0853186, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "returncode": 0, + "finished": 1791782944.6652558 + } + ], + "io": "O_DIRECT", + "note": "Identical candidate image for old/new reconstruction; own incompatible baseline image, serial load with no background workers." +} diff --git a/benchmarks/results-20261011/disk-nonlexical-fixed-final/results.csv b/benchmarks/results-20261011/disk-nonlexical-fixed-final/results.csv new file mode 100644 index 000000000..2bc3920f3 --- /dev/null +++ b/benchmarks/results-20261011/disk-nonlexical-fixed-final/results.csv @@ -0,0 +1,29 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,disk,0,0,warm,8,0,2000000,2000000,0.130,15417703.7,nan,nan,nan,0.000,nan,0.534,3745409.5,374820864,32768,187.41,0.02,nan,nan,nan,nan,nan,2000000,15417703.7,0.130,0.000,0.130,0.000,0,0,nan,0,0,0.178,0,0,0,0,0 +baseline,disk,0,0,point:uniform@1,1,0,2000000,167167,7.000,23880.4,45.568,93.184,219.136,667.827,41.822,0.860,194303.6,589660160,0,3527.37,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.178,0,0,0,0,0 +baseline,disk,0,0,point:uniform@8,8,0,2000000,1287727,7.000,183956.9,47.616,87.040,121.856,2744.659,43.422,7.368,174783.1,4541366272,0,3526.65,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.178,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@1,1,0,2000000,106226,7.000,15174.8,58.880,125.952,190.464,606.040,65.855,7.399,14357.3,1501253632,0,14132.64,0.00,58.880,125.952,65.565,nan,0.260,106226,15174.8,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.178,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@8,8,0,2000000,527640,7.000,75374.6,99.328,260.096,372.736,8289.869,106.054,58.737,8983.1,7482429440,0,14180.94,0.00,99.328,260.096,105.397,nan,0.614,527640,75374.6,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.178,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@1,1,0,2000000,1405,7.000,200.7,3244.032,13762.560,16384.000,19374.760,4981.410,3.108,452.1,3648409600,0,2596732.81,0.00,227.328,581.632,228.248,476.93,0.827,14013972,2001944.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.178,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@8,8,0,2000000,6676,7.000,953.7,6750.208,22806.528,29622.272,32574.803,8386.976,23.964,278.6,17065017344,0,2556173.96,0.00,331.776,1040.384,361.712,804.09,1.117,66661618,9522831.2,7.000,0.052,7.052,0.008,0,278528,nan,3671461888,835055616,0.178,0,0,0,0,0 +candidate,disk,1,0,warm,8,0,2000000,2000000,0.254,7881302.9,nan,nan,nan,0.000,nan,0.910,2198645.4,374669312,32768,187.33,0.02,nan,nan,nan,nan,nan,2000000,7881302.9,0.254,0.000,0.254,0.000,0,0,nan,0,0,1.226,0,0,0,0,0 +candidate,disk,1,0,point:uniform@1,1,0,2000000,161625,7.000,23088.4,46.592,105.472,315.392,2616.613,43.258,0.843,191683.2,571371520,0,3535.17,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.226,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,0,2000000,1213581,7.000,173364.7,48.640,95.232,1064.960,2438.970,46.076,7.388,164267.2,4280258560,0,3526.97,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.226,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@1,1,0,2000000,100525,7.000,14360.3,59.904,133.120,1392.640,2851.576,69.585,7.400,13584.9,1421537280,0,14141.13,0.00,59.904,133.120,69.278,nan,0.276,100525,14360.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.226,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,0,2000000,485869,7.000,69407.6,99.328,323.584,1785.856,16309.871,115.178,58.703,8276.8,6872526848,0,14144.81,0.00,99.328,323.584,114.481,nan,0.654,485869,69407.6,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.226,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@1,1,0,2000000,1339,7.000,191.3,3309.568,15073.280,39321.600,81823.234,5224.860,3.053,438.6,3480641536,0,2599433.56,0.00,231.424,860.160,242.943,499.99,0.928,13353972,1907661.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,1.226,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,0,2000000,6271,7.000,895.8,7012.352,31195.136,52953.088,76089.478,8928.044,23.719,264.4,16045367296,0,2558661.66,0.00,331.776,2326.528,413.507,853.17,1.210,62611618,8944263.4,7.000,0.056,7.056,0.008,0,278528,nan,3671461888,834215936,1.226,0,0,0,0,0 +candidate,disk,2,0,warm,8,1,2000000,2000000,0.153,13113240.7,nan,nan,nan,0.000,nan,0.579,3452049.3,377217024,32768,188.61,0.02,nan,nan,nan,nan,nan,2000000,13113240.7,0.153,0.000,0.153,0.000,0,0,nan,0,0,0.164,0,0,0,0,2 +candidate,disk,2,0,point:uniform@1,1,1,2000000,166832,7.000,23832.5,45.568,95.232,206.848,723.865,41.906,0.861,193837.0,588550144,0,3527.80,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.164,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,1,2000000,1277288,7.000,182465.3,48.640,82.944,109.568,642.288,43.775,7.726,165317.2,4504461312,0,3526.58,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.164,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@1,1,1,2000000,103202,7.000,14742.8,60.928,133.120,194.560,2043.399,67.780,7.431,13888.9,1458741248,0,14134.82,0.00,59.904,133.120,67.450,nan,0.297,103202,14742.8,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.164,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@8,8,1,2000000,522063,7.000,74577.9,101.376,260.096,372.736,7794.440,107.185,58.817,8876.1,7400509440,4096,14175.51,0.01,99.328,260.096,106.456,nan,0.683,522063,74577.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.164,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@1,1,1,2000000,1420,7.000,202.9,3244.032,13238.272,16646.144,20266.295,4932.976,3.074,461.9,3684495360,0,2594715.04,0.00,231.424,614.400,229.217,471.98,0.856,14163972,2023372.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.164,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,1,2000000,6569,7.000,938.4,7012.352,22806.528,31195.136,32660.662,8523.533,23.869,275.2,16801136640,0,2557639.92,0.00,331.776,1064.960,367.389,817.21,1.256,65591618,9369954.0,7.000,0.061,7.061,0.008,0,278528,nan,3671461888,834215936,0.164,0,0,0,0,0 +baseline,disk,3,0,warm,8,1,2000000,2000000,0.160,12509995.0,nan,nan,nan,0.000,nan,0.611,3271271.9,376922112,32768,188.46,0.02,nan,nan,nan,nan,nan,2000000,12509995.0,0.160,0.000,0.160,0.000,0,0,nan,0,0,0.299,0,0,0,0,0 +baseline,disk,3,0,point:uniform@1,1,1,2000000,161406,7.000,23057.4,46.592,95.232,266.240,2526.059,43.319,0.826,195463.1,569368576,0,3527.56,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.299,0,0,0,0,0 +baseline,disk,3,0,point:uniform@8,8,1,2000000,1238696,7.000,176952.2,48.640,93.184,133.120,3286.469,45.140,7.571,163617.6,4368064512,0,3526.34,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.299,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@1,1,1,2000000,100427,7.000,14346.2,62.976,137.216,548.864,2880.465,69.657,7.413,13547.3,1420034048,0,14139.96,0.00,62.976,133.120,69.341,nan,0.283,100427,14346.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.299,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@8,8,1,2000000,506767,7.000,72393.0,101.376,274.432,1359.872,3785.186,110.413,58.900,8603.8,7170400256,4096,14149.30,0.01,99.328,274.432,109.719,nan,0.649,506767,72393.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.299,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@1,1,1,2000000,1343,7.000,191.9,3309.568,15073.280,42467.328,50598.834,5213.208,3.000,447.7,3487039488,0,2596455.31,0.00,235.520,909.312,246.903,498.37,0.962,13393972,1913375.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.299,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@8,8,1,2000000,6313,7.000,901.8,7012.352,26476.544,46661.632,74246.794,8844.990,23.819,265.0,15976460288,0,2530723.95,0.00,339.968,1818.624,407.609,845.41,1.303,63031618,9004255.6,7.000,0.063,7.063,0.007,0,278528,nan,3671461888,835059712,0.299,0,0,3,0,0 diff --git a/benchmarks/results-20261011/disk-nonlexical/manifest.json b/benchmarks/results-20261011/disk-nonlexical/manifest.json new file mode 100644 index 000000000..1e419a067 --- /dev/null +++ b/benchmarks/results-20261011/disk-nonlexical/manifest.json @@ -0,0 +1,427 @@ +{ + "pattern": "nonlexical", + "regime": "disk", + "io": "O_DIRECT", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/0-baseline.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763300.5089808, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791763352.8485532, + "db_allocated_bytes": 835346432, + "db_apparent_bytes": 3671461888, + "preclose_live_extents": [ + 3376, + 3414 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/1-candidate.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763352.8491957, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791763405.3924327, + "db_allocated_bytes": 834498560, + "db_apparent_bytes": 3671461888, + "preclose_live_extents": [ + 3376, + 3414 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/2-candidate.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763405.3928556, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791763458.1511865, + "db_allocated_bytes": 834019328, + "db_apparent_bytes": 3671461888, + "preclose_live_extents": [ + 3376, + 3414 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/3-baseline.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763458.151594, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791763510.9457915, + "db_allocated_bytes": 834527232, + "db_apparent_bytes": 3671461888, + "preclose_live_extents": [ + 3376, + 3414 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + } + ], + "source": "same generated kvbench source", + "loading_threads": 1 +} diff --git a/benchmarks/results-20261011/disk-nonlexical/results.csv b/benchmarks/results-20261011/disk-nonlexical/results.csv new file mode 100644 index 000000000..0d39c408e --- /dev/null +++ b/benchmarks/results-20261011/disk-nonlexical/results.csv @@ -0,0 +1,41 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,disk,0,0,load:random@1,1,0,2000000,2000000,3.777,529571.7,0.616,1.648,8.576,60412.293,1.819,2.907,688111.0,343019520,750571520,171.51,375.29,nan,nan,nan,nan,nan,0,0.0,3.777,0.256,4.033,0.116,46129152,84529152,2.5460,3671461888,835346432,0.012,0,0,0,0,0 +baseline,disk,0,0,warm,8,0,2000000,2000000,0.140,14260822.7,nan,nan,nan,0.000,nan,0.566,3535592.8,376008704,32768,188.00,0.02,nan,nan,nan,nan,nan,2000000,14260822.7,0.140,0.000,0.140,0.000,0,0,nan,0,0,0.005,0,0,0,0,1 +baseline,disk,0,0,point:uniform@1,1,0,2000000,116830,5.000,23365.2,45.568,91.136,974.848,1679.333,42.753,0.555,210635.8,412000256,0,3526.49,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,point:uniform@8,8,0,2000000,866678,5.000,173329.6,48.640,95.232,1228.800,7014.251,46.089,5.037,172056.8,3059060736,4096,3529.64,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@1,1,0,2000000,69883,5.000,13976.1,58.880,141.312,1687.552,1978.967,71.504,5.274,13249.9,986677248,0,14118.99,0.00,58.880,141.312,71.205,nan,0.267,69883,13976.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10@1,1,0,2000000,41294,5.000,8258.5,95.232,630.784,1720.320,3032.326,121.038,4.524,9127.3,1245675520,0,30166.02,0.00,76.800,565.248,97.572,2574.96,0.277,412940,82585.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@1,1,0,2000000,922,5.000,184.4,3506.176,22806.528,55050.240,55241.525,5429.886,2.163,426.2,2353700864,0,2552820.89,0.00,231.424,1490.944,265.595,517.66,0.819,9203951,1840732.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@8,8,0,2000000,341147,5.000,68226.3,101.376,356.352,1687.552,8175.388,117.171,41.824,8156.6,4832608256,0,14165.77,0.00,99.328,356.352,116.500,nan,0.626,341147,68226.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10@8,8,0,2000000,170338,5.000,34066.1,169.984,1228.800,2457.600,4822.144,234.740,36.830,4625.0,5100109824,4096,29941.12,0.02,137.216,1097.728,197.252,4094.94,0.612,1703380,340661.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@8,8,0,2000000,4478,5.000,895.6,7012.352,29622.272,52953.088,65050.290,8931.855,16.888,265.2,11480690688,0,2563798.72,0.00,331.776,1916.928,400.013,854.65,1.094,44708346,8941348.2,5.000,0.056,5.056,0.008,0,290816,nan,3671461888,835346432,0.005,0,0,0,0,0 +candidate,disk,1,0,load:random@1,1,0,2000000,2000000,3.820,523554.6,0.600,1.616,12.672,66925.067,1.842,2.885,693226.5,347205632,748740608,173.60,374.37,nan,nan,nan,nan,nan,0,0.0,3.820,0.306,4.126,0.120,46383104,85516288,2.5435,3671461888,834498560,0.028,0,0,0,0,0 +candidate,disk,1,0,warm,8,0,2000000,2000000,0.209,9549971.4,nan,nan,nan,0.000,nan,0.702,2847939.9,376336384,32768,188.17,0.02,nan,nan,nan,nan,nan,2000000,9549971.4,0.209,0.000,0.209,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,point:uniform@1,1,0,2000000,114739,5.000,22947.2,45.568,93.184,1163.264,1939.917,43.529,0.554,207083.9,404443136,0,3524.90,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,0,2000000,851573,5.000,170308.9,48.640,95.232,1261.568,4070.610,46.906,5.007,170083.8,3005128704,4096,3528.91,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@1,1,0,2000000,68262,5.000,13651.7,59.904,153.600,1654.784,3346.348,73.205,5.265,12965.9,964448256,0,14128.63,0.00,58.880,153.600,72.884,nan,0.290,68262,13651.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10@1,1,0,2000000,38863,5.000,7772.3,95.232,778.240,1916.928,3537.447,128.614,4.522,8593.3,1169874944,4096,30102.54,0.11,78.848,696.320,104.288,2667.87,0.299,388630,77723.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@1,1,0,2000000,935,5.000,187.0,3571.712,16646.144,34849.061,34849.061,5353.423,2.204,424.2,2391461888,0,2557713.25,0.00,231.424,1294.336,266.503,509.93,0.789,9333951,1866721.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,0,2000000,340307,5.000,68058.6,101.376,339.968,1982.464,16856.646,117.463,41.831,8135.3,4811571200,0,14138.91,0.00,99.328,339.968,116.754,nan,0.665,340307,68058.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10@8,8,0,2000000,166523,5.000,33303.1,169.984,1261.568,3178.496,13775.593,240.054,36.690,4538.7,4981403648,4096,29914.21,0.02,137.216,1097.728,201.454,4211.77,0.671,1665230,333031.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,0,2000000,4529,5.000,905.8,7012.352,25427.968,72351.744,87213.895,8817.510,17.131,264.4,11568021504,0,2554210.97,0.00,339.968,1556.480,394.117,843.68,1.131,45218346,9043243.0,5.000,0.084,5.085,0.008,0,290816,nan,3671461888,834498560,0.041,0,0,0,0,0 +candidate,disk,2,0,load:random@1,1,1,2000000,2000000,4.134,483743.0,0.616,1.648,8.832,82278.379,1.998,3.053,655003.5,350724096,749801472,175.36,374.90,nan,nan,nan,nan,nan,0,0.0,4.134,0.319,4.453,0.125,45891584,83968000,2.5420,3671461888,834019328,0.016,0,0,0,0,0 +candidate,disk,2,0,warm,8,1,2000000,2000000,0.144,13858362.0,nan,nan,nan,0.000,nan,0.581,3439931.1,374956032,32768,187.48,0.02,nan,nan,nan,nan,nan,2000000,13858362.0,0.144,0.000,0.144,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,point:uniform@1,1,1,2000000,101267,5.000,20252.3,46.592,109.568,1064.960,1932.816,49.329,0.483,209651.7,357101568,0,3526.34,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,1,2000000,762433,5.000,152481.6,50.688,109.568,1163.264,3095.548,52.400,4.382,173986.1,2689818624,0,3527.94,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@1,1,1,2000000,61720,5.000,12343.6,70.656,157.696,1490.944,2711.674,80.968,5.241,11776.1,871374848,4096,14118.19,0.07,70.656,157.696,80.641,nan,0.295,61720,12343.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10@1,1,1,2000000,37162,5.000,7432.2,109.568,630.784,1654.784,3183.574,134.507,4.498,8261.3,1118965760,0,30110.48,0.00,89.088,565.248,108.717,2830.05,0.303,371620,74321.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@1,1,1,2000000,816,5.000,163.2,3833.856,31195.136,50855.936,51225.460,6128.873,2.041,399.9,2115223552,0,2592185.73,0.00,260.096,1884.160,313.069,582.52,0.775,8152042,1630356.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@8,8,1,2000000,86385,5.000,17276.3,231.424,2080.768,3506.176,7396.735,462.973,40.542,2130.7,1221963776,0,14145.56,0.00,231.424,2080.768,462.297,nan,0.636,86385,17276.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10@8,8,1,2000000,39556,5.000,7910.9,495.616,9830.400,11927.552,14225.574,1011.232,35.817,1104.4,1175543808,0,29718.47,0.00,413.696,9568.256,878.708,14648.90,0.662,395560,79108.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,1,2000000,1546,5.000,309.2,15597.568,112197.632,153092.096,155278.900,25697.114,11.727,131.8,3950587904,4096,2555360.87,2.65,614.400,13762.560,1851.859,2388.81,1.200,15444664,3088817.9,5.000,0.086,5.087,0.007,0,286720,nan,3671461888,834019328,0.005,0,0,0,0,0 +baseline,disk,3,0,load:random@1,1,1,2000000,2000000,4.104,487290.3,0.600,1.648,9.088,63103.588,1.983,3.046,656591.7,350400512,752828416,175.20,376.41,nan,nan,nan,nan,nan,0,0.0,4.104,0.325,4.429,0.135,46231552,81453056,2.5435,3671461888,834527232,0.019,0,0,0,0,0 +baseline,disk,3,0,warm,8,1,2000000,2000000,0.178,11230916.9,nan,nan,nan,0.000,nan,0.638,3134560.4,376643584,32768,188.32,0.02,nan,nan,nan,nan,nan,2000000,11230916.9,0.178,0.000,0.178,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,point:uniform@1,1,1,2000000,91507,5.000,18300.8,57.856,121.856,1130.496,5409.962,54.595,0.442,206850.6,322838528,0,3528.02,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,point:uniform@8,8,1,2000000,708789,5.000,141753.1,60.928,113.664,356.352,3113.837,56.372,3.977,178210.3,2499878912,0,3526.97,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@1,1,1,2000000,58701,5.000,11739.8,74.752,161.792,1130.496,2315.135,85.133,5.239,11204.3,828620800,4096,14115.96,0.07,74.752,161.792,84.835,nan,0.266,58701,11739.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10@1,1,1,2000000,34176,5.000,6834.9,121.856,663.552,1851.392,3579.937,146.262,4.455,7671.2,1031192576,0,30173.00,0.00,95.232,598.016,117.973,3111.38,0.272,341760,68349.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@1,1,1,2000000,842,5.000,168.4,3964.928,17563.648,53598.119,53598.119,5938.991,2.021,416.7,2176815104,0,2585291.10,0.00,299.008,1163.264,310.460,564.35,0.704,8403951,1680735.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@8,8,1,2000000,287775,5.000,57552.6,125.952,364.544,1556.480,6180.136,138.921,41.816,6881.9,4071735296,0,14149.02,0.00,125.952,364.544,138.251,nan,0.626,287775,57552.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10@8,8,1,2000000,145243,5.000,29047.4,210.944,1040.384,2195.456,5225.831,275.379,36.562,3972.5,4351766528,0,29961.97,0.00,174.080,942.080,232.265,4721.37,0.600,1452430,290474.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.043,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@8,8,1,2000000,3892,5.000,778.4,8192.000,32768.000,59244.544,77987.994,10272.245,15.372,253.2,9922105344,0,2549359.03,0.00,413.696,1753.088,477.378,981.57,1.119,38855767,7770820.8,5.000,0.075,5.075,0.008,0,290816,nan,3671461888,834527232,0.043,0,0,11,0,0 diff --git a/benchmarks/results-20261011/disk-random/manifest.json b/benchmarks/results-20261011/disk-random/manifest.json new file mode 100644 index 000000000..390f3b14a --- /dev/null +++ b/benchmarks/results-20261011/disk-random/manifest.json @@ -0,0 +1,427 @@ +{ + "pattern": "random", + "regime": "disk", + "io": "O_DIRECT", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/0-baseline.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791762940.013043, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791762992.6656344, + "db_allocated_bytes": 835305472, + "db_apparent_bytes": 3671592960, + "preclose_live_extents": [ + 3377, + 3415 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/1-candidate.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791762992.6662693, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791763045.9102073, + "db_allocated_bytes": 834510848, + "db_apparent_bytes": 3671592960, + "preclose_live_extents": [ + 3377, + 3415 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/2-candidate.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763045.91067, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791763099.1506274, + "db_allocated_bytes": 835530752, + "db_apparent_bytes": 3671592960, + "preclose_live_extents": [ + 3377, + 3415 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/3-baseline.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763099.151079, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791763152.0496871, + "db_allocated_bytes": 834215936, + "db_apparent_bytes": 3671592960, + "preclose_live_extents": [ + 3377, + 3415 + ], + "preclose_branch_extents": [ + 3065, + 0 + ] + } + ], + "source": "same generated kvbench source", + "loading_threads": 1 +} diff --git a/benchmarks/results-20261011/disk-random/results.csv b/benchmarks/results-20261011/disk-random/results.csv new file mode 100644 index 000000000..f39340c40 --- /dev/null +++ b/benchmarks/results-20261011/disk-random/results.csv @@ -0,0 +1,41 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,disk,0,0,load:random@1,1,0,2000000,2000000,3.670,544994.5,0.568,1.456,7.104,58446.601,1.677,2.861,699142.3,347443200,751497216,173.72,375.75,nan,nan,nan,nan,nan,0,0.0,3.670,0.213,3.883,0.099,45887488,83558400,2.5459,3671592960,835305472,0.033,0,0,0,0,0 +baseline,disk,0,0,warm,8,0,2000000,2000000,0.139,14372085.9,nan,nan,nan,0.000,nan,0.570,3511383.9,375541760,32768,187.77,0.02,nan,nan,nan,nan,nan,2000000,14372085.9,0.139,0.000,0.139,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,point:uniform@1,1,0,2000000,122159,5.000,24431.0,45.568,89.088,186.368,1974.940,40.753,0.563,217006.4,430669824,0,3525.49,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,point:uniform@8,8,0,2000000,923611,5.000,184716.3,47.616,84.992,113.664,1828.102,43.141,5.070,182175.6,3260198912,0,3529.84,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@1,1,0,2000000,77421,5.000,15483.6,56.832,121.856,182.272,2037.381,64.439,5.274,14678.4,1093115904,0,14119.11,0.00,56.832,121.856,64.153,nan,0.256,77421,15483.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10@1,1,0,2000000,44189,5.000,8837.5,95.232,532.480,811.008,1861.366,113.001,4.518,9781.3,1333288960,0,30172.42,0.00,74.752,479.232,90.662,2451.15,0.265,441890,88375.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@1,1,0,2000000,988,5.000,197.6,3506.176,14024.704,19136.512,19307.216,5063.488,2.190,451.1,2546626560,0,2577557.25,0.00,231.424,876.544,250.287,482.40,0.700,9863951,1972722.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:1@8,8,0,2000000,380910,5.000,76178.5,97.280,260.096,389.120,7874.954,104.830,41.946,9081.0,5390983168,0,14152.91,0.00,97.280,260.096,104.203,nan,0.586,380910,76178.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10@8,8,0,2000000,179299,5.000,35858.3,165.888,909.312,1982.464,17013.041,222.906,36.832,4868.0,5359915008,0,29893.73,0.00,133.120,811.008,187.173,3901.36,0.600,1792987,358582.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@8,8,0,2000000,4392,5.000,878.4,7012.352,37224.448,58195.968,68548.996,9103.032,16.398,267.8,11117711360,4096,2531355.05,0.93,339.968,2392.064,433.966,868.36,1.026,43848346,8769290.0,5.000,0.051,5.051,0.007,0,286720,nan,3671592960,835305472,0.005,0,0,0,0,0 +candidate,disk,1,0,load:random@1,1,0,2000000,2000000,4.186,477802.6,0.584,1.488,7.488,56644.969,1.935,3.103,644543.6,348160000,750514176,174.08,375.26,nan,nan,nan,nan,nan,0,0.0,4.186,0.255,4.441,0.116,46215168,83750912,2.5435,3671592960,834510848,0.012,0,0,0,0,0 +candidate,disk,1,0,warm,8,0,2000000,2000000,0.157,12759575.1,nan,nan,nan,0.000,nan,0.571,3501989.1,376700928,32768,188.35,0.02,nan,nan,nan,nan,nan,2000000,12759575.1,0.157,0.000,0.157,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,point:uniform@1,1,0,2000000,115743,5.000,23147.8,45.568,91.136,1097.728,1778.982,43.026,0.557,207967.4,408203264,0,3526.81,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,0,2000000,869673,5.000,173929.2,48.640,93.184,1228.800,2142.694,45.831,4.951,175651.0,3068805120,0,3528.69,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@1,1,0,2000000,74891,5.000,14977.7,58.880,125.952,430.080,1774.654,66.619,5.282,14179.2,1058463744,0,14133.39,0.00,57.856,125.952,66.218,nan,0.371,74891,14977.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10@1,1,0,2000000,40683,5.000,8136.3,95.232,663.552,1687.552,3765.423,122.752,4.517,9006.6,1222152192,0,30040.86,0.00,76.800,598.016,98.895,2605.41,0.392,406830,81362.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@1,1,0,2000000,972,5.000,194.4,3440.640,14548.992,33167.986,33167.986,5135.997,2.214,439.0,2504081408,0,2576215.44,0.00,231.424,794.624,242.632,490.39,0.896,9703951,1940718.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,0,2000000,354866,5.000,70969.9,99.328,299.008,1589.248,3647.665,112.534,42.008,8447.6,5022883840,0,14154.31,0.00,99.328,299.008,111.641,nan,0.848,354866,70969.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10@8,8,0,2000000,170754,5.000,34149.4,169.984,1097.728,2260.992,5653.885,234.064,36.740,4647.6,5116100608,0,29961.82,0.00,137.216,991.232,196.386,4091.20,0.835,1707540,341493.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,0,2000000,4323,5.000,864.6,7405.568,40370.176,59244.544,66678.645,9249.398,16.491,262.1,11105349632,0,2568898.83,0.00,339.968,2785.280,440.797,882.56,1.419,43158346,8631217.6,5.000,0.083,5.083,0.009,0,290816,nan,3671592960,834510848,0.005,0,0,0,0,0 +candidate,disk,2,0,load:random@1,1,1,2000000,2000000,4.224,473436.7,0.600,1.648,9.600,72566.317,1.947,3.222,620825.1,350138368,751349760,175.07,375.67,nan,nan,nan,nan,nan,0,0.0,4.224,0.222,4.446,0.104,45744128,83931136,2.5466,3671592960,835530752,0.012,0,0,0,0,0 +candidate,disk,2,0,warm,8,1,2000000,2000000,0.154,13024178.9,nan,nan,nan,0.000,nan,0.597,3351616.4,376754176,32768,188.38,0.02,nan,nan,nan,nan,nan,2000000,13024178.9,0.154,0.000,0.154,0.000,0,0,nan,0,0,0.005,0,0,0,0,1 +candidate,disk,2,0,point:uniform@1,1,1,2000000,113218,5.000,22642.6,45.568,95.232,1294.336,2278.180,43.988,0.547,207142.0,399073280,0,3524.82,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,1,2000000,877789,5.000,175551.9,48.640,93.184,892.928,2847.822,45.406,5.160,170106.1,3098099712,0,3529.44,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@1,1,1,2000000,71025,5.000,14204.5,58.880,133.120,1458.176,3160.368,70.250,5.272,13473.2,1003364352,0,14126.92,0.00,58.880,133.120,69.839,nan,0.379,71025,14204.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10@1,1,1,2000000,40119,5.000,8023.6,95.232,679.936,1851.392,16391.889,124.486,4.509,8897.6,1207398400,0,30095.43,0.00,78.848,614.400,99.988,2676.76,0.391,401190,80235.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@1,1,1,2000000,854,5.000,170.8,3637.248,30146.560,78643.200,79464.573,5841.683,2.103,406.1,2203643904,0,2580379.28,0.00,235.520,2588.672,311.610,554.39,0.947,8523951,1704699.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@8,8,1,2000000,356521,5.000,71301.1,99.328,290.816,1851.392,6222.876,112.012,41.970,8494.7,5044506624,0,14149.26,0.00,97.280,290.816,111.137,nan,0.833,356521,71301.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10@8,8,1,2000000,168613,5.000,33721.3,169.984,1196.032,2654.208,5533.256,237.042,36.837,4577.3,5048901632,0,29943.73,0.00,137.216,1064.960,199.153,4113.27,0.847,1686130,337212.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,1,2000000,4415,5.000,883.0,7143.424,35127.296,68157.440,74322.646,9057.638,16.721,264.0,11060895744,4096,2505299.15,0.93,331.776,2392.064,417.384,865.73,1.417,44078346,8815302.0,5.000,0.054,5.054,0.008,0,286720,nan,3671592960,835530752,0.005,0,0,0,0,0 +baseline,disk,3,0,load:random@1,1,1,2000000,2000000,3.856,518699.1,0.600,1.552,7.232,53935.182,1.767,3.022,661899.4,348721152,748158976,174.36,374.08,nan,nan,nan,nan,nan,0,0.0,3.856,0.234,4.089,0.098,46358528,85815296,2.5426,3671592960,834215936,0.027,0,0,0,0,0 +baseline,disk,3,0,warm,8,1,2000000,2000000,0.154,12999873.9,nan,nan,nan,0.000,nan,0.577,3467887.4,375754752,32768,187.88,0.02,nan,nan,nan,nan,nan,2000000,12999873.9,0.154,0.000,0.154,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,point:uniform@1,1,1,2000000,120535,5.000,24105.7,45.568,91.136,198.656,1993.095,41.316,0.575,209653.8,424980480,0,3525.78,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,point:uniform@8,8,1,2000000,901802,5.000,180354.2,48.640,89.088,130.048,2561.034,44.199,5.330,169184.6,3182759936,4096,3529.33,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@1,1,1,2000000,75472,5.000,15093.8,57.856,125.952,198.656,3194.742,66.107,5.284,14284.3,1065975808,0,14124.12,0.00,57.856,125.952,65.807,nan,0.269,75472,15093.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10@1,1,1,2000000,43210,5.000,8641.7,95.232,548.864,942.080,2607.506,115.572,4.527,9545.1,1304866816,0,30198.26,0.00,76.800,495.616,92.792,2498.82,0.276,432100,86416.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@1,1,1,2000000,974,5.000,194.8,3440.640,14548.992,24379.392,24637.245,5131.593,2.221,438.6,2508279808,0,2575235.94,0.00,231.424,827.392,250.948,489.18,0.740,9723951,1944708.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,range:uniform:1@8,8,1,2000000,370067,5.000,74010.0,99.328,274.432,1359.872,5944.635,107.907,42.063,8797.8,5233364992,0,14141.67,0.00,97.280,266.240,107.257,nan,0.607,370067,74010.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10@8,8,1,2000000,175155,5.000,35029.7,165.888,958.464,2195.456,18037.535,228.192,36.832,4755.5,5238026240,4096,29905.09,0.02,137.216,860.160,191.622,3992.73,0.613,1751547,350296.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.022,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@8,8,1,2000000,4450,5.000,890.0,7143.424,32243.712,49807.360,71245.890,8990.069,16.764,265.4,11343630336,0,2549130.41,0.00,339.968,2048.000,413.612,859.18,1.087,44428346,8885268.2,5.000,0.058,5.058,0.008,0,290816,nan,3671592960,834215936,0.022,0,0,0,0,0 diff --git a/benchmarks/results-20261011/final-candidate-build.json b/benchmarks/results-20261011/final-candidate-build.json new file mode 100644 index 000000000..db13bf1db --- /dev/null +++ b/benchmarks/results-20261011/final-candidate-build.json @@ -0,0 +1,32 @@ +{ + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56" +} diff --git a/benchmarks/results-20261011/final-implementation.json b/benchmarks/results-20261011/final-implementation.json new file mode 100644 index 000000000..dd1456242 --- /dev/null +++ b/benchmarks/results-20261011/final-implementation.json @@ -0,0 +1,4 @@ +{ + "commit": "1ef1644", + "library_sha256": "674f5eef25ee83b6d2816061d6a01cba93cca6a92093e1c4793f32a29ca07c41" +} diff --git a/benchmarks/results-20261011/prefix-pre-reconstruct.json b/benchmarks/results-20261011/prefix-pre-reconstruct.json new file mode 100644 index 000000000..6edfd13c1 --- /dev/null +++ b/benchmarks/results-20261011/prefix-pre-reconstruct.json @@ -0,0 +1,6 @@ +{ + "src/btree.c": "9f3721e407abe4735f22b9852a8ac47bc669ca419bced6044b066681ae881754", + "src/btree_private.h": "ab6204f802643538066777378c8238ee1ff08cd8304704af73b023d579c7fff3", + "build/release/bin/prefix_kvbench": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build/release/lib/libsplinterdb.a": "56bb3229c990ef18fd7a109762e0433991c3970965449f2b16b73e018989bc15" +} diff --git a/benchmarks/results-20261011/prefix_compare.py b/benchmarks/results-20261011/prefix_compare.py new file mode 100644 index 000000000..c523c4096 --- /dev/null +++ b/benchmarks/results-20261011/prefix_compare.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +"""Prefix workload ABBA; invoke once per pattern/regime under benchmark lock.""" +import argparse, csv, hashlib, json, os, re, subprocess, time +from pathlib import Path +p=argparse.ArgumentParser() +p.add_argument('--pattern', choices=['common','random','nonlexical'], required=True) +p.add_argument('--regime', choices=['resident','disk'], required=True) +p.add_argument('--seconds',type=int,default=5) +p.add_argument('--disabled', action='store_true') +a=p.parse_args() +root=Path(__file__).resolve().parent.parent +out=root/'benchmarks/branch-prefix'/(a.regime+'-'+a.pattern+('-disabled' if a.disabled else '')) +out.mkdir(parents=True,exist_ok=False) +env=dict(os.environ,PREFIX_PATTERN=a.pattern,KVBENCH_STATS_BEFORE_CLOSE='1') +if a.disabled: env['PREFIX_DISABLE']='1' +phases=['load:random@1','warm','point:uniform@1','point:uniform@8'] +phases += [f'range:uniform:{length}@{threads}' for threads in [1,8] for length in [1,10,10000]] +manifest=dict(pattern=a.pattern,regime=a.regime,io='O_DIRECT',runs=[],source='same generated kvbench source',loading_threads=1) +for index,version in enumerate(['baseline','candidate','candidate','baseline']): + tree=root/('baseline' if version=='baseline' else 'worktrees/branch-prefix') + binary=tree/'build/release/bin/prefix_kvbench' + db=out/f'{index}-{version}.db' + argv=['taskset','-c','0-11',str(binary),'--db',str(db),'--create', + '--n','200000' if a.regime=='resident' else '2000000', + '--cache-mib','128' if a.regime=='resident' else '64','--disk-gib','8', + '--log','0','--threads','8','--mt-bg','0','--normal-bg','0','--memtable-mib','4', + '--secs',str(a.seconds),'--warmup','1','--csv',str(out/'results.csv'), + '--vtag',version,'--stag',a.regime,'--otag',str(index),'--rep',str(index//2), + '--seed','42','--hang-secs','60','--hang-dir',str(out),*phases] + record=dict(index=index,version=version,command=argv,started=time.time(), + binary_sha256=hashlib.sha256(binary.read_bytes()).hexdigest(), + build=json.loads(binary.with_suffix('.json').read_text())) + print(f'prefix {a.pattern} {a.regime}: {index+1}/4 {version}',flush=True) + with (out/f'{index}-{version}.log').open('w') as log: + result=subprocess.run(argv,env=env,stdout=log,stderr=subprocess.STDOUT,timeout=900) + record.update(returncode=result.returncode,finished=time.time(), + db_allocated_bytes=db.stat().st_blocks*512,db_apparent_bytes=db.stat().st_size) + printed=(out/f'{index}-{version}.log').read_text() + live=re.findall(r'Currently Allocated:\s+(\d+) extents',printed) + branch=re.findall(r'\| branch\s*\|\s+[-0-9]+ \|\s+[-0-9]+ \|\s+([0-9]+)',printed) + record['preclose_live_extents']=[int(n) for n in live] + record['preclose_branch_extents']=[int(n) for n in branch] + manifest['runs'].append(record) + (out/'manifest.json').write_text(json.dumps(manifest,indent=2)+'\n') + if result.returncode: raise SystemExit(result.returncode) +with (out/'results.csv').open() as f: rows=list(csv.DictReader(f)) +assert rows and all(int(r[x])==0 for r in rows for x in ['violations','errors']) +print('Completed',out,flush=True) diff --git a/benchmarks/results-20261011/prefix_fixed_compare.py b/benchmarks/results-20261011/prefix_fixed_compare.py new file mode 100644 index 000000000..aac5e5b50 --- /dev/null +++ b/benchmarks/results-20261011/prefix_fixed_compare.py @@ -0,0 +1,20 @@ +import argparse,csv,hashlib,json,os,subprocess,time +from pathlib import Path +p=argparse.ArgumentParser();p.add_argument('--pattern',default='common');p.add_argument('--regime',default='resident');a=p.parse_args() +root=Path(__file__).resolve().parent.parent +out=root/'benchmarks/branch-prefix'/(a.regime+'-'+a.pattern+'-fixed-final');out.mkdir(exist_ok=False) +profiles={'baseline':(root/'baseline/build/release/bin/prefix_kvbench','0-baseline.db'), 'pre-reconstruct':(root/'worktrees/branch-prefix/build/release/bin/prefix_kvbench','1-candidate.db'), 'candidate':(root/'worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench','1-candidate.db')} +manifest=dict(runs=[],io='O_DIRECT',note='Identical candidate image for old/new reconstruction; own incompatible baseline image, serial load with no background workers.') +order=['baseline','pre-reconstruct','candidate','candidate','pre-reconstruct','baseline'] if a.regime=='resident' else ['baseline','candidate','candidate','baseline'] +phases=['warm','point:uniform@1','point:uniform@8','range:uniform:1@1','range:uniform:1@8','range:uniform:10000@1','range:uniform:10000@8'] +for index,version in enumerate(order): + binary,fixture=profiles[version];source=root/'benchmarks/branch-prefix'/(a.regime+'-'+a.pattern)/fixture;db=out/'scratch.db' + subprocess.run(['cp','--reflink=auto','--sparse=always',str(source),str(db)],check=True) + argv=['taskset','-c','0-11',str(binary),'--db',str(db),'--open','--n','200000' if a.regime=='resident' else '2000000','--cache-mib','128' if a.regime=='resident' else '64','--disk-gib','8','--log','0','--threads','8','--mt-bg','0','--normal-bg','0','--memtable-mib','4','--secs','7','--warmup','1','--csv',str(out/'results.csv'),'--vtag',version,'--stag',a.regime,'--otag',str(index),'--rep',str(index//2),'--seed','42','--hang-secs','60','--hang-dir',str(out),*phases] + record=dict(index=index,version=version,command=argv,fixture=str(source),started=time.time(),binary_sha256=hashlib.sha256(binary.read_bytes()).hexdigest()) + print('Prefix fixed comparison',a.regime,a.pattern,index,version,flush=True) + with (out/f'{index}-{version}.log').open('w') as f:result=subprocess.run(argv,env=dict(os.environ,PREFIX_PATTERN=a.pattern),stdout=f,stderr=subprocess.STDOUT,timeout=180) + record.update(returncode=result.returncode,finished=time.time());manifest['runs'].append(record);(out/'manifest.json').write_text(json.dumps(manifest,indent=2)+'\n') + if result.returncode:raise SystemExit(result.returncode) + rows=list(csv.DictReader((out/'results.csv').open()));assert all(int(r[x])==0 for r in rows for x in ['violations','errors']);db.unlink() +print('Completed',out,flush=True) diff --git a/benchmarks/results-20261011/previous-candidate-build.json b/benchmarks/results-20261011/previous-candidate-build.json new file mode 100644 index 000000000..3d7cc3781 --- /dev/null +++ b/benchmarks/results-20261011/previous-candidate-build.json @@ -0,0 +1,32 @@ +{ + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" +} diff --git a/benchmarks/results-20261011/resident-common-disabled/manifest.json b/benchmarks/results-20261011/resident-common-disabled/manifest.json new file mode 100644 index 000000000..14e2053b6 --- /dev/null +++ b/benchmarks/results-20261011/resident-common-disabled/manifest.json @@ -0,0 +1,427 @@ +{ + "pattern": "common", + "regime": "resident", + "io": "O_DIRECT", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/0-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763510.9775028, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791763559.6422205, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/1-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763559.6429765, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791763608.266232, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/2-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763608.2667253, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791763656.9448879, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/3-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-disabled", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791763656.945295, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791763705.5595763, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + } + ], + "source": "same generated kvbench source", + "loading_threads": 1 +} diff --git a/benchmarks/results-20261011/resident-common-disabled/results.csv b/benchmarks/results-20261011/resident-common-disabled/results.csv new file mode 100644 index 000000000..4e32b5036 --- /dev/null +++ b/benchmarks/results-20261011/resident-common-disabled/results.csv @@ -0,0 +1,41 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,resident,0,0,load:random@1,1,0,200000,200000,0.267,747749.0,0.648,2.848,4.800,40091.384,1.296,0.267,748262.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.267,0.161,0.428,0.027,0,37261312,1.1360,237375488,37408768,0.021,0,0,0,0,0 +baseline,resident,0,0,warm,8,0,200000,200000,0.016,12477622.2,nan,nan,nan,0.000,nan,0.065,3060537.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12477622.2,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.040,0,0,0,0,1 +baseline,resident,0,0,point:uniform@1,1,0,200000,4881363,5.000,976218.9,0.968,1.328,1.872,36.304,0.987,5.000,976261.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,0,0,point:uniform@8,8,0,200000,22757514,5.000,4551299.8,1.648,2.336,5.824,332.154,1.687,39.995,569009.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@1,1,0,200000,1206899,5.000,241370.8,4.064,4.672,8.576,32.858,4.114,5.000,241380.0,0,0,0.00,0.00,3.872,4.416,3.925,nan,0.161,1206899,241370.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10@1,1,0,200000,1032183,5.000,206424.8,4.672,6.592,9.856,153.938,4.816,5.000,206442.7,0,0,0.00,0.00,3.872,5.184,3.887,84.11,0.158,10321558,2064193.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@1,1,0,200000,7262,5.000,1452.3,696.320,745.472,794.624,848.901,688.455,5.004,1451.3,0,0,0.00,0.00,5.824,7.360,5.866,69.94,0.283,70848568,14168902.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@8,8,0,200000,5855620,5.000,1171073.3,5.824,9.600,16.640,108.525,6.785,39.997,146403.1,0,0,0.00,0.00,5.568,9.088,6.388,nan,0.356,5855620,1171073.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10@8,8,0,200000,4703476,5.000,940652.4,7.360,13.184,19.712,158.270,8.458,39.998,117592.9,0,0,0.00,0.00,5.824,9.600,6.667,156.25,0.364,47033597,9406291.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@8,8,0,200000,21577,5.000,4315.2,991.232,4161.536,4259.840,4334.268,1853.723,39.998,539.5,0,0,0.00,0.00,7.104,12.672,7.720,189.09,0.534,210398935,42077572.6,5.000,0.095,5.095,0.012,0,323584,nan,237375488,37408768,0.040,0,0,0,0,0 +candidate,resident,1,0,load:random@1,1,0,200000,200000,0.255,784484.7,0.616,2.720,4.544,38293.050,1.236,0.255,784486.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.255,0.146,0.401,0.026,0,37261312,1.1360,237375488,37408768,0.043,0,0,0,0,0 +candidate,resident,1,0,warm,8,0,200000,200000,0.015,13439923.6,nan,nan,nan,0.000,nan,0.062,3229765.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13439923.6,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,2 +candidate,resident,1,0,point:uniform@1,1,0,200000,4955896,5.000,991126.0,0.968,1.264,1.520,37.118,0.973,5.000,991159.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,1,0,point:uniform@8,8,0,200000,22796494,5.000,4559067.6,1.648,2.336,6.720,75.122,1.683,39.997,569960.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@1,1,0,200000,1248907,5.000,249773.6,3.936,5.312,8.576,43.691,3.976,5.000,249778.6,0,0,0.00,0.00,3.744,5.056,3.792,nan,0.157,1248907,249773.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@1,1,0,200000,1069789,5.000,213946.9,4.544,6.208,9.600,34.761,4.647,5.000,213957.2,0,0,0.00,0.00,3.744,4.288,3.749,80.93,0.156,10697600,2139411.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@1,1,0,200000,7156,5.000,1431.1,712.704,778.240,827.392,901.511,698.633,5.000,1431.2,0,0,0.00,0.00,5.696,7.616,5.778,70.99,0.264,69823061,13963887.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@8,8,0,200000,5817247,5.000,1163400.4,5.952,9.600,17.664,443.260,6.827,39.991,145462.5,0,0,0.00,0.00,5.568,9.088,6.431,nan,0.356,5817247,1163400.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@8,8,0,200000,4522655,5.000,904491.0,7.872,13.440,21.248,112.672,8.798,39.997,113074.0,0,0,0.00,0.00,6.080,9.856,6.848,170.80,0.391,45225472,9044694.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,0,200000,19182,5.000,3836.2,2129.920,4390.912,4390.912,4612.035,2085.358,39.997,479.6,0,0,0.00,0.00,7.488,12.672,7.953,212.99,0.566,187045472,37407161.1,5.000,0.114,5.114,0.012,0,323584,nan,237375488,37408768,0.007,0,0,0,0,0 +candidate,resident,2,0,load:random@1,1,1,200000,200000,0.247,809579.1,0.616,2.656,4.288,37059.162,1.197,0.247,809775.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.247,0.173,0.420,0.025,0,37261312,1.1360,237375488,37408768,0.045,0,0,0,0,0 +candidate,resident,2,0,warm,8,1,200000,200000,0.035,5647187.4,nan,nan,nan,0.000,nan,0.146,1367493.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,5647187.4,0.035,0.000,0.035,0.000,0,0,nan,0,0,0.040,0,0,0,0,1 +candidate,resident,2,0,point:uniform@1,1,1,200000,5063428,5.000,1012635.1,0.936,1.264,1.488,77.916,0.952,5.000,1012719.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,point:uniform@8,8,1,200000,23123298,5.000,4624451.6,1.616,2.272,4.544,114.975,1.661,39.996,578134.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@1,1,1,200000,1276506,5.000,255291.4,3.872,4.416,8.000,34.543,3.890,5.000,255297.2,0,0,0.00,0.00,3.680,4.160,3.709,nan,0.155,1276506,255291.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@1,1,1,200000,1080125,5.000,216014.1,4.544,6.080,9.344,41.679,4.603,5.000,216022.5,0,0,0.00,0.00,3.680,4.160,3.711,80.30,0.155,10800958,2160082.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,1,200000,7133,5.000,1426.5,712.704,860.160,909.312,1039.640,700.981,5.000,1426.7,0,0,0.00,0.00,5.696,8.576,5.809,71.23,0.255,69593652,13918164.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,1,200000,5858433,5.000,1171635.5,5.952,9.600,16.640,153.387,6.780,40.030,146351.1,0,0,0.00,0.00,5.568,9.088,6.384,nan,0.357,5858433,1171635.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@8,8,1,200000,4828258,5.000,965608.4,7.360,12.672,19.200,111.763,8.241,39.998,120712.5,0,4096,0.00,0.00,5.696,9.088,6.429,158.24,0.367,48281373,9655842.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,1,200000,20346,5.000,4069.0,1064.960,4784.128,5046.272,5288.969,1965.472,39.999,508.7,0,0,0.00,0.00,7.360,12.928,8.008,200.40,0.557,198494600,39696940.5,5.000,0.096,5.096,0.013,0,323584,nan,237375488,37408768,0.040,0,0,0,0,0 +baseline,resident,3,0,load:random@1,1,1,200000,200000,0.248,806231.7,0.616,2.656,4.416,37032.049,1.202,0.248,806526.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.248,0.148,0.396,0.025,0,37261312,1.1360,237375488,37408768,0.047,0,0,0,0,0 +baseline,resident,3,0,warm,8,1,200000,200000,0.028,7024233.9,nan,nan,nan,0.000,nan,0.142,1412050.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,7024233.9,0.028,0.000,0.028,0.000,0,0,nan,0,0,0.009,0,0,0,0,2 +baseline,resident,3,0,point:uniform@1,1,1,200000,5029390,5.000,1005827.1,0.952,1.296,1.776,221.425,0.958,4.999,1006017.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +baseline,resident,3,0,point:uniform@8,8,1,200000,23014756,5.000,4602743.6,1.648,2.272,3.872,79.903,1.668,39.998,575396.8,0,4096,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@1,1,1,200000,1241280,5.000,248243.2,4.000,4.544,8.832,43.483,4.000,5.004,248060.1,0,0,0.00,0.00,3.808,4.288,3.814,nan,0.158,1241280,248243.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10@1,1,1,200000,1055724,5.000,211135.2,4.672,6.336,9.600,43.469,4.708,5.000,211149.4,0,4096,0.00,0.00,3.744,4.800,3.796,82.32,0.157,10556962,2111296.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@1,1,1,200000,7375,5.000,1474.9,696.320,729.088,794.624,859.288,677.925,5.000,1475.0,0,0,0.00,0.00,5.568,7.232,5.643,68.91,0.285,71932102,14385620.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@8,8,1,200000,6205406,5.000,1241028.5,5.568,9.088,15.488,77.430,6.402,39.997,155145.5,0,0,0.00,0.00,5.184,8.576,6.027,nan,0.337,6205406,1241028.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10@8,8,1,200000,4761544,5.000,952267.1,7.488,12.928,19.712,1620.962,8.355,39.996,119051.9,0,0,0.00,0.00,5.824,9.600,6.575,153.98,0.373,47614258,9522434.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@8,8,1,200000,20960,5.000,4191.8,974.848,4521.984,4784.128,4882.841,1907.876,39.998,524.0,0,0,0.00,0.00,7.104,13.440,7.852,194.64,0.548,204378051,40873476.2,5.000,0.102,5.103,0.013,0,323584,nan,237375488,37408768,0.009,0,0,0,0,0 diff --git a/benchmarks/results-20261011/resident-common-fixed-final/manifest.json b/benchmarks/results-20261011/resident-common-fixed-final/manifest.json new file mode 100644 index 000000000..ee22a80d7 --- /dev/null +++ b/benchmarks/results-20261011/resident-common-fixed-final/manifest.json @@ -0,0 +1,372 @@ +{ + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/0-baseline.db", + "started": 1791782139.4229414, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "returncode": 0, + "finished": 1791782187.5676143 + }, + { + "index": 1, + "version": "pre-reconstruct", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/results.csv", + "--vtag", + "pre-reconstruct", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/1-candidate.db", + "started": 1791782187.6038043, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "returncode": 0, + "finished": 1791782235.7525835 + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/1-candidate.db", + "started": 1791782235.769608, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "returncode": 0, + "finished": 1791782283.9218976 + }, + { + "index": 3, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/1-candidate.db", + "started": 1791782283.935439, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "returncode": 0, + "finished": 1791782332.0819576 + }, + { + "index": 4, + "version": "pre-reconstruct", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/results.csv", + "--vtag", + "pre-reconstruct", + "--stag", + "resident", + "--otag", + "4", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/1-candidate.db", + "started": 1791782332.0984194, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "returncode": 0, + "finished": 1791782380.2059798 + }, + { + "index": 5, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "5", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common-fixed-final", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:1@8", + "range:uniform:10000@1", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/0-baseline.db", + "started": 1791782380.2274806, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "returncode": 0, + "finished": 1791782428.3337078 + } + ], + "io": "O_DIRECT", + "note": "Identical candidate image for old/new reconstruction; own incompatible baseline image, serial load with no background workers." +} diff --git a/benchmarks/results-20261011/resident-common-fixed-final/results.csv b/benchmarks/results-20261011/resident-common-fixed-final/results.csv new file mode 100644 index 000000000..6e1de347a --- /dev/null +++ b/benchmarks/results-20261011/resident-common-fixed-final/results.csv @@ -0,0 +1,43 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,resident,0,0,warm,8,0,200000,200000,0.012,16739952.8,nan,nan,nan,0.000,nan,0.057,3511667.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,16739952.8,0.012,0.000,0.012,0.000,0,0,nan,0,0,0.013,0,0,0,0,2 +baseline,resident,0,0,point:uniform@1,1,0,200000,7643965,7.000,1091955.5,0.856,1.232,5.568,165.442,0.884,6.999,1092152.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,0,0,point:uniform@8,8,0,200000,37307198,7.000,5329434.4,1.392,2.784,5.568,736.381,1.441,55.987,666355.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@1,1,0,200000,1837168,7.000,262445.7,3.616,7.360,29.440,54.469,3.785,7.000,262435.9,0,4096,0.00,0.00,3.424,7.104,3.618,nan,0.142,1837168,262445.7,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@8,8,0,200000,8694276,7.000,1242004.0,5.568,9.088,16.000,167.054,6.397,55.991,155280.3,0,4096,0.00,0.00,5.312,8.576,6.023,nan,0.337,8694276,1242004.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@1,1,0,200000,10212,7.000,1458.8,663.552,1163.264,1523.712,2070.263,685.341,7.000,1458.8,0,0,0.00,0.00,5.696,17.152,6.312,69.56,0.328,99649826,14235177.4,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,33,0,0 +baseline,resident,0,0,range:uniform:10000@8,8,0,200000,30855,7.000,4407.7,1884.160,4030.464,4161.536,4604.111,1814.677,55.993,551.1,0,0,0.00,0.00,6.720,12.416,7.328,185.20,0.506,301007604,42999624.4,7.000,0.085,7.085,0.012,0,307200,nan,237375488,37285888,0.013,0,0,0,0,0 +pre-reconstruct,resident,1,0,warm,8,0,200000,200000,0.012,17018695.5,nan,nan,nan,0.000,nan,0.049,4107788.4,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,17018695.5,0.012,0.000,0.012,0.000,0,0,nan,0,0,0.011,0,0,0,0,1 +pre-reconstruct,resident,1,0,point:uniform@1,1,0,200000,7576959,7.000,1082383.2,0.872,1.232,1.552,58.830,0.889,7.000,1082403.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,1,0,point:uniform@8,8,0,200000,34775582,7.000,4967785.6,1.520,2.144,2.976,80.905,1.541,56.025,620718.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,1,0,range:uniform:1@1,1,0,200000,1972506,7.000,281779.5,3.424,4.000,28.928,141.240,3.523,7.000,281798.0,0,4096,0.00,0.00,3.232,3.808,3.346,nan,0.152,1972506,281779.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,1,0,range:uniform:1@8,8,0,200000,9014632,7.000,1287765.1,5.184,8.832,16.640,88.066,6.166,55.994,160993.4,0,4096,0.00,0.00,4.928,8.320,5.742,nan,0.386,9014632,1287765.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,1,0,range:uniform:10000@1,1,0,200000,10383,7.000,1483.2,679.936,811.008,925.696,1118.802,674.187,7.000,1483.2,0,0,0.00,0.00,4.928,7.616,4.950,68.56,0.269,101313493,14472836.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,1,0,range:uniform:10000@8,8,0,200000,24881,7.000,3554.3,2392.064,2981.888,3112.960,3290.100,2250.436,55.996,444.3,0,0,0.00,0.00,7.104,9.600,7.026,229.86,0.590,242727787,34674429.3,7.000,0.091,7.092,0.012,0,307200,nan,207360000,26005504,0.011,0,0,0,0,0 +candidate,resident,2,0,warm,8,1,200000,200000,0.010,20433077.0,nan,nan,nan,0.000,nan,0.043,4613503.7,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,20433077.0,0.010,0.000,0.010,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,2,0,point:uniform@1,1,1,200000,7632145,7.000,1090272.2,0.872,1.232,1.840,1525.789,0.883,6.998,1090585.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,2,0,point:uniform@8,8,1,200000,35893762,7.000,5127533.8,1.456,2.080,4.928,154.199,1.496,55.988,641098.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@1,1,1,200000,1901475,7.000,271633.4,3.616,4.160,8.576,31.321,3.654,7.000,271631.2,0,4096,0.00,0.00,3.424,3.936,3.465,nan,0.163,1901475,271633.4,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,1,200000,8618758,7.000,1231213.9,5.440,9.088,17.152,116.294,6.445,55.993,153926.3,0,4096,0.00,0.00,5.056,8.576,6.004,nan,0.401,8618758,1231213.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,1,200000,10350,7.000,1478.5,696.320,811.008,876.544,1138.644,676.284,7.000,1478.5,0,0,0.00,0.00,5.056,7.616,5.147,68.75,0.280,101005797,14429098.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,1,200000,27837,7.000,3976.6,1851.392,2785.280,3047.424,3408.392,2011.444,55.993,497.2,0,0,0.00,0.00,7.104,12.928,7.024,205.43,0.577,271574215,38794995.5,7.000,0.076,7.076,0.012,0,311296,nan,207360000,26005504,0.011,0,0,0,0,0 +candidate,resident,3,0,warm,8,1,200000,200000,0.011,17803031.2,nan,nan,nan,0.000,nan,0.051,3933600.8,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,17803031.2,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.011,0,0,0,0,2 +candidate,resident,3,0,point:uniform@1,1,1,200000,7442764,7.000,1063207.9,0.888,1.296,1.648,52.510,0.905,7.000,1063215.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,3,0,point:uniform@8,8,1,200000,35973902,7.000,5138982.5,1.456,2.080,3.488,176.468,1.490,55.984,642569.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,3,0,range:uniform:1@1,1,1,200000,1931057,7.000,275858.1,3.488,4.544,27.904,40.492,3.599,7.000,275863.9,0,4096,0.00,0.00,3.360,4.416,3.415,nan,0.158,1931057,275858.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,3,0,range:uniform:1@8,8,1,200000,8869323,7.000,1267014.2,5.312,9.088,17.664,1647.677,6.264,56.021,158322.6,0,4096,0.00,0.00,5.056,8.576,5.834,nan,0.391,8869323,1267014.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,1,0,0 +candidate,resident,3,0,range:uniform:10000@1,1,1,200000,10347,7.000,1478.1,696.320,729.088,761.856,880.678,676.467,7.000,1478.1,0,0,0.00,0.00,5.056,6.720,5.137,68.78,0.281,100961009,14422612.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +candidate,resident,3,0,range:uniform:10000@8,8,1,200000,28647,7.000,4092.3,1024.000,4390.912,4915.200,5163.759,1954.586,55.987,511.7,0,0,0.00,0.00,6.208,14.464,7.038,199.45,0.576,279365417,39908119.3,7.000,0.081,7.082,0.012,0,311296,nan,207360000,26005504,0.011,0,0,0,0,0 +pre-reconstruct,resident,4,0,warm,8,2,200000,200000,0.011,17648448.4,nan,nan,nan,0.000,nan,0.050,4018646.5,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,17648448.4,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,4,0,point:uniform@1,1,2,200000,7219580,7.000,1031330.9,0.920,1.296,1.936,51.781,0.934,7.000,1031362.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,4,0,point:uniform@8,8,2,200000,33147694,7.000,4735233.4,1.584,2.272,4.160,182.180,1.620,55.983,592099.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,15,0,0 +pre-reconstruct,resident,4,0,range:uniform:1@1,1,2,200000,1747887,7.000,249689.3,3.808,6.592,12.928,134.638,3.977,7.000,249706.8,0,4096,0.00,0.00,3.616,6.336,3.779,nan,0.170,1747887,249689.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,51,0,0 +pre-reconstruct,resident,4,0,range:uniform:1@8,8,2,200000,8447066,7.000,1206685.1,5.568,9.344,17.664,4001.398,6.583,55.977,150901.9,0,4096,0.00,0.00,5.184,8.832,6.137,nan,0.406,8447066,1206685.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,4,0,range:uniform:10000@1,1,2,200000,10022,7.000,1431.7,712.704,811.008,909.312,1192.547,698.398,7.000,1431.8,0,0,0.00,0.00,5.184,9.088,5.415,71.02,0.282,97765866,13966238.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.011,0,0,0,0,0 +pre-reconstruct,resident,4,0,range:uniform:10000@8,8,2,200000,26402,7.000,3771.6,2048.000,4521.984,4653.056,4882.203,2121.119,55.995,471.5,0,0,0.00,0.00,7.744,13.696,7.799,216.64,0.622,257557532,36792618.3,7.000,0.069,7.069,0.012,0,311296,nan,207360000,26005504,0.011,0,0,0,0,0 +baseline,resident,5,0,warm,8,2,200000,200000,0.012,16191332.3,nan,nan,nan,0.000,nan,0.058,3457814.7,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,16191332.3,0.012,0.000,0.012,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,5,0,point:uniform@1,1,2,200000,7299553,7.000,1042771.2,0.920,1.232,2.720,41.170,0.925,7.000,1042756.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,3,0,0 +baseline,resident,5,0,point:uniform@8,8,2,200000,33874783,7.000,4839098.6,1.552,2.144,5.056,88.522,1.585,55.997,604942.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,5,0,range:uniform:1@1,1,2,200000,1823465,7.000,260489.6,3.680,5.056,28.928,45.834,3.813,7.000,260484.8,0,4096,0.00,0.00,3.552,4.928,3.644,nan,0.144,1823465,260489.6,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,5,0,range:uniform:1@8,8,2,200000,8470941,7.000,1210098.7,5.696,9.344,16.256,687.671,6.565,55.987,151302.2,0,0,0.00,0.00,5.312,8.832,6.180,nan,0.346,8470941,1210098.7,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,0,0,0 +baseline,resident,5,0,range:uniform:10000@1,1,2,200000,10317,7.000,1473.8,679.936,827.392,1097.728,1499.220,678.396,7.002,1473.4,0,0,0.00,0.00,5.568,9.344,5.770,68.91,0.298,100678205,14382213.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.013,0,0,43,0,0 +baseline,resident,5,0,range:uniform:10000@8,8,2,200000,27291,7.000,3898.6,1982.464,4784.128,5308.416,6133.186,2051.742,55.984,487.5,0,0,0.00,0.00,7.616,17.664,8.599,209.33,0.617,266242019,38033297.5,7.000,0.050,7.050,0.013,0,311296,nan,237375488,37285888,0.013,0,0,0,0,0 diff --git a/benchmarks/results-20261011/resident-common/manifest.json b/benchmarks/results-20261011/resident-common/manifest.json new file mode 100644 index 000000000..85b6f5575 --- /dev/null +++ b/benchmarks/results-20261011/resident-common/manifest.json @@ -0,0 +1,427 @@ +{ + "pattern": "common", + "regime": "resident", + "io": "O_DIRECT", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/0-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791757560.3043447, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791757608.8109066, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/1-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791757608.811556, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791757657.3247614, + "db_allocated_bytes": 26128384, + "db_apparent_bytes": 207360000, + "preclose_live_extents": [ + 279, + 256 + ], + "preclose_branch_extents": [ + 179, + 0 + ] + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/2-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791757657.3251767, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791757705.7938395, + "db_allocated_bytes": 26128384, + "db_apparent_bytes": 207360000, + "preclose_live_extents": [ + 279, + 256 + ], + "preclose_branch_extents": [ + 179, + 0 + ] + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/3-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-common", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791757705.794274, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791757754.2970247, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + } + ], + "source": "same generated kvbench source", + "loading_threads": 1 +} diff --git a/benchmarks/results-20261011/resident-common/results.csv b/benchmarks/results-20261011/resident-common/results.csv new file mode 100644 index 000000000..a95a4ec4c --- /dev/null +++ b/benchmarks/results-20261011/resident-common/results.csv @@ -0,0 +1,41 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,resident,0,0,load:random@1,1,0,200000,200000,0.243,822812.1,0.600,2.592,4.416,36446.069,1.178,0.243,823333.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.243,0.116,0.359,0.022,0,37261312,1.1360,237375488,37408768,0.008,0,0,0,0,0 +baseline,resident,0,0,warm,8,0,200000,200000,0.013,15578329.5,nan,nan,nan,0.000,nan,0.058,3452681.0,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15578329.5,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.006,0,0,0,0,2 +baseline,resident,0,0,point:uniform@1,1,0,200000,5027454,5.000,1005453.0,0.952,1.296,1.648,170.860,0.959,5.000,1005551.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +baseline,resident,0,0,point:uniform@8,8,0,200000,24426068,5.000,4885006.7,1.552,2.208,2.976,118.408,1.571,39.996,610713.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@1,1,0,200000,1220121,5.000,244010.7,3.872,5.824,16.640,80.983,4.070,5.000,244037.4,0,0,0.00,0.00,3.680,5.568,3.887,nan,0.157,1220121,244010.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,9,0,0 +baseline,resident,0,0,range:uniform:10@1,1,0,200000,1023611,5.000,204711.1,4.672,9.856,16.640,81.699,4.857,5.000,204740.0,0,0,0.00,0.00,3.744,7.872,3.922,85.23,0.155,10235845,2047058.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@1,1,0,200000,7372,5.000,1474.3,696.320,811.008,860.160,1058.460,678.133,5.000,1474.4,0,0,0.00,0.00,5.824,8.576,5.851,68.89,0.284,71919660,14383192.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@8,8,0,200000,5751321,5.000,1150214.5,5.952,9.856,17.664,97.685,6.907,39.994,143806.2,0,0,0.00,0.00,5.696,9.344,6.502,nan,0.364,5751321,1150214.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,1,0,0 +baseline,resident,0,0,range:uniform:10@8,8,0,200000,4732487,5.000,946454.5,7.744,13.952,21.248,504.168,8.406,39.987,118349.4,0,0,0.00,0.00,5.824,10.368,6.628,154.52,0.366,47323706,9464311.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@8,8,0,200000,19433,5.000,3886.4,1982.464,4653.056,4784.128,4803.534,2058.072,39.997,485.9,0,0,0.00,0.00,7.872,13.440,8.534,210.02,0.613,189602484,37918687.6,5.000,0.085,5.085,0.006,0,323584,nan,237375488,37408768,0.006,0,0,0,0,0 +candidate,resident,1,0,load:random@1,1,0,200000,200000,0.258,774695.5,0.632,2.784,5.184,42892.527,1.251,0.258,775293.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.258,0.104,0.362,0.024,0,25980928,0.7921,207360000,26128384,0.009,0,0,0,0,0 +candidate,resident,1,0,warm,8,0,200000,200000,0.011,18367588.0,nan,nan,nan,0.000,nan,0.055,3639672.4,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,18367588.0,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.008,0,0,0,0,1 +candidate,resident,1,0,point:uniform@1,1,0,200000,5111205,5.000,1022208.4,0.936,1.264,1.488,144.962,0.941,5.000,1022191.5,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,point:uniform@8,8,0,200000,22606277,5.000,4521061.6,1.648,2.592,5.696,150.967,1.693,39.992,565274.5,0,4096,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@1,1,0,200000,1282282,5.000,256446.8,3.872,4.288,8.576,163.296,3.870,5.000,256457.2,0,0,0.00,0.00,3.616,4.064,3.651,nan,0.191,1282282,256446.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@1,1,0,200000,1047442,5.000,209481.4,4.672,6.336,9.600,53.512,4.744,5.000,209478.8,0,4096,0.00,0.00,3.680,4.544,3.713,91.72,0.191,10474142,2094758.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@1,1,0,200000,6446,5.000,1289.1,778.240,942.080,1196.032,1975.063,775.591,4.995,1290.4,0,0,0.00,0.00,5.312,10.624,5.671,78.89,0.336,62880141,12575534.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.008,0,0,1,0,0 +candidate,resident,1,0,range:uniform:1@8,8,0,200000,6103720,5.000,1220691.4,5.440,9.344,17.664,147.643,6.505,39.995,152613.1,0,0,0.00,0.00,5.056,8.832,6.050,nan,0.414,6103720,1220691.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@8,8,0,200000,4801534,5.000,960264.2,7.488,12.928,21.760,183.035,8.285,39.991,120066.1,0,4096,0.00,0.00,5.440,9.344,6.289,171.83,0.428,48014124,9602398.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,0,200000,23000,5.000,4599.8,1490.944,4784.128,4915.200,5095.770,1739.195,39.992,575.1,0,0,0.00,0.00,7.104,13.696,7.733,177.25,0.624,224442924,44886164.7,5.000,0.068,5.069,0.013,0,323584,nan,207360000,26128384,0.008,0,0,0,0,0 +candidate,resident,2,0,load:random@1,1,1,200000,200000,0.253,789486.3,0.616,2.720,4.416,42710.370,1.228,0.253,789958.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.253,0.096,0.349,0.021,0,25980928,0.7921,207360000,26128384,0.009,0,0,0,0,0 +candidate,resident,2,0,warm,8,1,200000,200000,0.012,17358297.9,nan,nan,nan,0.000,nan,0.047,4237647.3,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,17358297.9,0.012,0.000,0.012,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,point:uniform@1,1,1,200000,5134547,5.000,1026841.3,0.920,1.296,2.720,161.135,0.937,5.000,1026891.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,point:uniform@8,8,1,200000,23056572,5.000,4611111.2,1.616,2.336,4.672,185.357,1.664,40.026,576046.0,0,4096,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,40,0,0 +candidate,resident,2,0,range:uniform:1@1,1,1,200000,1387714,5.000,277527.0,3.552,4.000,7.744,64.252,3.576,5.000,277540.9,0,0,0.00,0.00,3.360,3.808,3.388,nan,0.162,1387714,277527.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@1,1,1,200000,1152935,5.000,230573.9,4.288,5.696,8.832,651.890,4.309,4.999,230614.4,0,4096,0.00,0.00,3.360,3.808,3.412,80.11,0.162,11529050,2305678.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,1,200000,7323,5.000,1464.6,696.320,729.088,778.240,876.514,682.787,5.000,1464.7,0,0,0.00,0.00,4.672,6.208,4.756,69.50,0.270,71428057,14285158.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,1,200000,6446497,5.000,1289243.9,5.184,8.832,15.232,90.780,6.158,39.996,161176.6,0,0,0.00,0.00,4.928,8.320,5.723,nan,0.397,6446497,1289243.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@8,8,1,200000,5094898,5.000,1018933.5,6.976,12.160,18.688,2351.963,7.808,39.993,127393.8,0,4096,0.00,0.00,5.184,8.832,5.937,160.56,0.405,50947799,10189098.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,1,200000,20036,5.000,4007.0,2129.920,4161.536,4259.840,4432.587,1996.158,39.997,500.9,0,0,0.00,0.00,6.336,10.880,6.893,203.75,0.583,195591520,39116301.8,5.000,0.050,5.050,0.012,0,323584,nan,207360000,26128384,0.007,0,0,0,0,0 +baseline,resident,3,0,load:random@1,1,1,200000,200000,0.252,794622.6,0.616,2.720,4.416,37924.337,1.220,0.252,794953.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.252,0.090,0.342,0.027,0,37261312,1.1360,237375488,37408768,0.008,0,0,0,0,0 +baseline,resident,3,0,warm,8,1,200000,200000,0.015,13551920.4,nan,nan,nan,0.000,nan,0.059,3408722.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13551920.4,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.005,0,0,0,0,1 +baseline,resident,3,0,point:uniform@1,1,1,200000,5098004,5.000,1019568.1,0.936,1.264,1.552,62.858,0.946,5.000,1019620.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,resident,3,0,point:uniform@8,8,1,200000,24194047,5.000,4838605.4,1.552,2.208,2.784,77.426,1.585,39.997,604900.3,0,4096,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@1,1,1,200000,1291253,5.000,258235.9,3.808,5.056,11.904,39.863,3.845,5.000,258246.2,0,0,0.00,0.00,3.616,4.800,3.670,nan,0.150,1291253,258235.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10@1,1,1,200000,1054180,5.000,210825.0,4.672,6.336,9.600,37.830,4.715,5.000,210834.3,0,0,0.00,0.00,3.808,4.288,3.802,82.56,0.157,10541522,2108194.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@1,1,1,200000,7254,5.000,1450.7,696.320,811.008,942.080,1084.494,689.275,4.999,1451.0,0,0,0.00,0.00,5.824,8.832,5.946,69.99,0.292,70794526,14158390.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@8,8,1,200000,5801521,5.000,1160256.3,5.952,9.856,18.688,511.762,6.848,39.992,145067.8,0,0,0.00,0.00,5.568,9.344,6.451,nan,0.356,5801521,1160256.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,15,0,0 +baseline,resident,3,0,range:uniform:10@8,8,1,200000,4757030,5.000,951361.2,7.744,12.672,18.176,100.962,8.363,39.997,118935.2,0,0,0.00,0.00,5.824,9.344,6.525,160.82,0.370,47569095,9513371.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@8,8,1,200000,19977,5.000,3995.2,1851.392,4259.840,4390.912,4465.066,2002.151,39.998,499.5,0,0,0.00,0.00,7.232,11.648,7.735,204.44,0.536,194757854,38949492.7,5.000,0.100,5.100,0.013,0,323584,nan,237375488,37408768,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261011/resident-nonlexical/manifest.json b/benchmarks/results-20261011/resident-nonlexical/manifest.json new file mode 100644 index 000000000..9ba380a6d --- /dev/null +++ b/benchmarks/results-20261011/resident-nonlexical/manifest.json @@ -0,0 +1,427 @@ +{ + "pattern": "nonlexical", + "regime": "resident", + "io": "O_DIRECT", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/0-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791762334.2292933, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791762382.8055072, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/1-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791762382.8061142, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791762431.4837275, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/2-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791762431.484146, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791762480.1029687, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/3-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-nonlexical", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791762480.103382, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791762528.7290916, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + } + ], + "source": "same generated kvbench source", + "loading_threads": 1 +} diff --git a/benchmarks/results-20261011/resident-nonlexical/results.csv b/benchmarks/results-20261011/resident-nonlexical/results.csv new file mode 100644 index 000000000..7155afd82 --- /dev/null +++ b/benchmarks/results-20261011/resident-nonlexical/results.csv @@ -0,0 +1,41 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,resident,0,0,load:random@1,1,0,200000,200000,0.242,825505.0,0.584,2.592,5.056,36931.255,1.163,0.242,826111.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.242,0.157,0.399,0.024,0,37261312,1.1360,237375488,37408768,0.022,0,0,0,0,0 +baseline,resident,0,0,warm,8,0,200000,200000,0.022,9077724.1,nan,nan,nan,0.000,nan,0.095,2095842.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,9077724.1,0.022,0.000,0.022,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,resident,0,0,point:uniform@1,1,0,200000,5334856,5.000,1066906.1,0.888,1.200,1.424,51.468,0.894,5.000,1067001.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,resident,0,0,point:uniform@8,8,0,200000,23660713,5.000,4731933.9,1.552,2.208,3.424,91.370,1.605,39.996,591574.5,0,4096,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@1,1,0,200000,1268348,5.000,253661.3,3.872,4.800,8.320,81.829,3.904,5.000,253690.6,0,0,0.00,0.00,3.680,4.672,3.722,nan,0.155,1268348,253661.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10@1,1,0,200000,1077502,5.000,215489.3,4.544,6.208,9.856,115.485,4.603,5.000,215505.2,0,0,0.00,0.00,3.616,4.160,3.652,87.10,0.154,10774728,2154834.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@1,1,0,200000,6808,5.000,1361.5,745.472,794.624,860.160,990.088,734.356,5.000,1361.6,0,0,0.00,0.00,5.568,7.104,5.668,74.66,0.282,66433883,13286088.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@8,8,0,200000,6324194,5.000,1264787.8,5.440,8.832,15.488,101.636,6.267,39.998,158114.1,0,0,0.00,0.00,5.184,8.320,5.899,nan,0.331,6324194,1264787.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10@8,8,0,200000,4793878,5.000,958731.3,7.744,12.416,19.712,108.556,8.280,39.998,119854.3,0,0,0.00,0.00,5.568,9.088,6.316,175.14,0.368,47937569,9587071.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,4,0,0 +baseline,resident,0,0,range:uniform:10000@8,8,0,200000,24837,5.000,4967.2,1523.712,4653.056,5046.272,8357.935,1610.462,39.994,621.0,0,0,0.00,0.00,8.128,12.416,8.323,164.13,0.567,242279353,48453451.9,5.000,0.106,5.106,0.012,0,323584,nan,237375488,37408768,0.007,0,0,0,0,0 +candidate,resident,1,0,load:random@1,1,0,200000,200000,0.239,837685.0,0.568,2.592,4.544,36122.031,1.146,0.239,837738.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.239,0.163,0.402,0.023,0,37261312,1.1360,237375488,37408768,0.051,0,0,0,0,0 +candidate,resident,1,0,warm,8,0,200000,200000,0.029,6932756.5,nan,nan,nan,0.000,nan,0.136,1469961.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,6932756.5,0.029,0.000,0.029,0.000,0,0,nan,0,0,0.040,0,0,0,0,2 +candidate,resident,1,0,point:uniform@1,1,0,200000,5226767,5.000,1045319.5,0.904,1.200,1.488,128.505,0.913,4.999,1045508.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,1,0,point:uniform@8,8,0,200000,23509063,5.000,4701612.4,1.584,2.208,5.312,444.300,1.615,39.996,587785.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@1,1,0,200000,1254739,5.000,250934.5,3.936,4.416,8.320,33.389,3.947,5.000,250949.2,0,0,0.00,0.00,3.744,4.288,3.761,nan,0.159,1254739,250934.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@1,1,0,200000,1052371,5.000,210463.1,4.672,6.208,9.856,136.094,4.713,5.000,210478.1,0,0,0.00,0.00,3.744,4.160,3.746,88.18,0.159,10523432,2104575.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@1,1,0,200000,6716,5.000,1343.2,761.856,811.008,860.160,1153.090,744.377,5.000,1343.2,0,0,0.00,0.00,5.696,7.104,5.753,75.68,0.277,65533889,13106368.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@8,8,0,200000,5966447,5.000,1193239.7,5.824,9.344,15.488,101.131,6.637,39.998,149168.8,0,0,0.00,0.00,5.440,8.832,6.237,nan,0.359,5966447,1193239.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@8,8,0,200000,4820634,5.000,964087.1,7.360,12.672,19.712,88.657,8.236,39.998,120521.5,0,0,0.00,0.00,5.568,9.088,6.291,172.69,0.370,48205142,9640631.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,0,200000,22502,5.000,4500.2,1622.016,4653.056,4915.200,4957.439,1777.292,39.998,562.6,0,0,0.00,0.00,7.744,12.160,8.168,181.45,0.564,219444000,43886662.2,5.000,0.104,5.104,0.013,0,323584,nan,237375488,37408768,0.040,0,0,0,0,0 +candidate,resident,2,0,load:random@1,1,1,200000,200000,0.239,837864.2,0.568,2.592,4.416,36068.875,1.146,0.239,837913.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.239,0.176,0.414,0.025,0,37261312,1.1360,237375488,37408768,0.041,0,0,0,0,0 +candidate,resident,2,0,warm,8,1,200000,200000,0.019,10452486.0,nan,nan,nan,0.000,nan,0.088,2280579.7,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,10452486.0,0.019,0.000,0.019,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,point:uniform@1,1,1,200000,5223030,5.000,1044549.6,0.904,1.264,1.744,49.508,0.914,4.999,1044738.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,point:uniform@8,8,1,200000,23712709,5.000,4742328.2,1.552,2.208,2.720,92.845,1.604,39.997,592861.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@1,1,1,200000,1304173,5.000,260821.6,3.680,4.288,28.928,38.995,3.798,5.000,260826.1,0,0,0.00,0.00,3.552,4.160,3.622,nan,0.151,1304173,260821.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@1,1,1,200000,1088889,5.000,217766.6,4.416,6.208,29.952,153.757,4.556,5.000,217776.1,0,0,0.00,0.00,3.552,4.064,3.601,87.65,0.152,10888598,2177608.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,1,200000,6650,5.000,1329.9,761.856,860.160,1024.000,1112.175,751.858,5.000,1330.0,0,0,0.00,0.00,5.696,8.320,5.768,76.45,0.279,64891394,12977601.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,1,200000,5999323,5.000,1199806.1,5.696,9.344,15.744,126.936,6.602,39.997,149993.6,0,0,0.00,0.00,5.440,8.832,6.205,nan,0.357,5999323,1199806.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@8,8,1,200000,4786477,5.000,957252.5,7.488,12.672,18.688,254.832,8.294,39.996,119674.5,0,4096,0.00,0.00,5.696,9.088,6.314,175.89,0.376,47863595,9572290.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,1,200000,20010,5.000,4001.8,1523.712,4030.464,4096.000,4264.930,1998.823,39.996,500.3,0,0,0.00,0.00,6.976,12.160,7.556,204.07,0.545,195248007,39047849.6,5.000,0.076,5.077,0.005,0,323584,nan,237375488,37408768,0.041,0,0,0,0,0 +baseline,resident,3,0,load:random@1,1,1,200000,200000,0.248,806630.7,0.600,2.784,5.056,36215.146,1.190,0.248,806842.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.248,0.160,0.408,0.024,0,37261312,1.1360,237375488,37408768,0.018,0,0,0,0,0 +baseline,resident,3,0,warm,8,1,200000,200000,0.036,5519552.1,nan,nan,nan,0.000,nan,0.158,1266399.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,5519552.1,0.036,0.000,0.036,0.000,0,0,nan,0,0,0.041,0,0,0,0,1 +baseline,resident,3,0,point:uniform@1,1,1,200000,5290270,5.000,1057999.5,0.888,1.200,1.424,42.830,0.902,5.001,1057767.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +baseline,resident,3,0,point:uniform@8,8,1,200000,25035905,5.000,5006964.1,1.488,2.080,2.656,85.002,1.517,39.997,625951.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@1,1,1,200000,1266327,5.000,253255.6,3.872,4.928,8.832,34.150,3.910,5.000,253256.6,0,0,0.00,0.00,3.680,4.672,3.729,nan,0.153,1266327,253255.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10@1,1,1,200000,1072989,5.000,214586.2,4.544,6.208,9.600,45.786,4.622,5.004,214421.7,0,0,0.00,0.00,3.616,4.160,3.663,88.23,0.152,10729600,2145803.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@1,1,1,200000,6711,5.000,1342.1,761.856,909.312,1196.032,1459.046,744.966,5.000,1342.2,0,0,0.00,0.00,5.696,9.088,5.759,75.74,0.302,65492202,13097948.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@8,8,1,200000,6130619,5.000,1226070.7,5.568,9.088,16.256,97.180,6.464,39.998,153274.9,0,0,0.00,0.00,5.312,8.576,6.085,nan,0.341,6130619,1226070.7,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10@8,8,1,200000,4793071,5.000,958572.9,7.616,12.672,19.712,138.540,8.282,39.997,119837.2,0,0,0.00,0.00,5.568,9.088,6.313,175.67,0.368,47929518,9585491.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@8,8,1,200000,22825,5.000,4564.8,1589.248,4784.128,4915.200,4953.734,1752.282,39.998,570.7,0,0,0.00,0.00,7.744,12.928,8.246,178.80,0.584,222582219,44514306.7,5.000,0.107,5.107,0.012,0,323584,nan,237375488,37408768,0.041,0,0,0,0,0 diff --git a/benchmarks/results-20261011/resident-random/manifest.json b/benchmarks/results-20261011/resident-random/manifest.json new file mode 100644 index 000000000..5b1fda53f --- /dev/null +++ b/benchmarks/results-20261011/resident-random/manifest.json @@ -0,0 +1,427 @@ +{ + "pattern": "random", + "regime": "resident", + "io": "O_DIRECT", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/0-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761744.7202158, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791761793.3403068, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/1-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761793.3409536, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791761842.0734682, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/2-candidate.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/results.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761842.0739107, + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "6b4f7b374f7970aba6c302060d7423beb82a339194d3938ee1aea74b6bc1b896" + }, + "returncode": 0, + "finished": 1791761890.7501183, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/3-baseline.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random/results.csv", + "--vtag", + "baseline", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/resident-random", + "load:random@1", + "warm", + "point:uniform@1", + "point:uniform@8", + "range:uniform:1@1", + "range:uniform:10@1", + "range:uniform:10000@1", + "range:uniform:1@8", + "range:uniform:10@8", + "range:uniform:10000@8" + ], + "started": 1791761890.7505662, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840" + }, + "returncode": 0, + "finished": 1791761939.4765873, + "db_allocated_bytes": 37408768, + "db_apparent_bytes": 237375488, + "preclose_live_extents": [ + 358, + 342 + ], + "preclose_branch_extents": [ + 258, + 0 + ] + } + ], + "source": "same generated kvbench source", + "loading_threads": 1 +} diff --git a/benchmarks/results-20261011/resident-random/results.csv b/benchmarks/results-20261011/resident-random/results.csv new file mode 100644 index 000000000..3d0c23504 --- /dev/null +++ b/benchmarks/results-20261011/resident-random/results.csv @@ -0,0 +1,41 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,resident,0,0,load:random@1,1,0,200000,200000,0.253,789356.6,0.584,2.656,4.288,35836.985,1.165,0.253,789886.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.253,0.109,0.363,0.026,0,37261312,1.1360,237375488,37408768,0.022,0,0,0,0,0 +baseline,resident,0,0,warm,8,0,200000,200000,0.040,5058335.9,nan,nan,nan,0.000,nan,0.145,1374929.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,5058335.9,0.040,0.000,0.040,0.000,0,0,nan,0,0,0.010,0,0,0,0,2 +baseline,resident,0,0,point:uniform@1,1,0,200000,4967009,5.000,993349.6,0.904,1.200,1.456,48.788,0.907,5.000,993412.5,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +baseline,resident,0,0,point:uniform@8,8,0,200000,23046686,5.000,4609127.9,1.552,2.208,2.784,89.922,1.597,39.997,576205.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@1,1,0,200000,1300433,5.000,260078.5,3.616,4.160,27.392,72.785,3.700,5.000,260096.2,0,0,0.00,0.00,3.488,3.936,3.527,nan,0.148,1300433,260078.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10@1,1,0,200000,1097622,5.000,219515.9,4.288,6.080,29.440,43.068,4.459,5.000,219532.8,0,4096,0.00,0.00,3.488,3.936,3.525,85.89,0.148,10975928,2195100.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@1,1,0,200000,7048,5.000,1409.5,729.088,761.856,811.008,915.710,709.326,5.000,1409.6,0,0,0.00,0.00,5.696,6.976,5.679,72.12,0.265,68746797,13748619.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +baseline,resident,0,0,range:uniform:1@8,8,0,200000,5965675,5.000,1193082.8,5.696,9.088,16.640,163.624,6.569,39.995,149158.7,0,0,0.00,0.00,5.440,8.576,6.174,nan,0.356,5965675,1193082.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10@8,8,0,200000,4791561,5.000,958270.6,7.232,12.672,19.712,87.503,8.231,39.999,119792.4,0,4096,0.00,0.00,5.568,9.088,6.309,170.68,0.365,47914342,9582452.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +baseline,resident,0,0,range:uniform:10000@8,8,0,200000,18565,5.000,3712.8,2392.064,4259.840,4390.912,4586.705,2154.341,40.001,464.1,0,0,0.00,0.00,7.616,12.416,8.023,219.93,0.560,181070929,36212241.9,5.000,0.113,5.114,0.012,0,323584,nan,237375488,37408768,0.010,0,0,0,0,0 +candidate,resident,1,0,load:random@1,1,0,200000,200000,0.254,788582.4,0.568,2.592,4.288,37302.283,1.169,0.254,788659.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.254,0.152,0.405,0.025,0,37261312,1.1360,237375488,37408768,0.044,0,0,0,0,0 +candidate,resident,1,0,warm,8,0,200000,200000,0.038,5252275.9,nan,nan,nan,0.000,nan,0.170,1177045.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,5252275.9,0.038,0.000,0.038,0.000,0,0,nan,0,0,0.042,0,0,0,0,2 +candidate,resident,1,0,point:uniform@1,1,0,200000,5053047,5.000,1010576.8,0.888,1.200,1.456,30.700,0.893,5.000,1010562.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.042,0,0,0,0,0 +candidate,resident,1,0,point:uniform@8,8,0,200000,23189650,5.000,4637734.0,1.552,2.208,5.440,254.150,1.588,39.997,579789.6,0,4096,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.042,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@1,1,0,200000,1292975,5.000,258586.6,3.744,4.416,8.320,33.184,3.750,5.000,258597.3,0,0,0.00,0.00,3.552,4.160,3.556,nan,0.167,1292975,258586.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.042,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@1,1,0,200000,1071350,5.000,214259.2,4.544,6.208,9.600,32.694,4.568,5.000,214263.4,0,0,0.00,0.00,3.552,4.000,3.553,92.63,0.166,10713210,2142534.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.042,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@1,1,0,200000,6596,5.000,1319.1,778.240,860.160,892.928,965.207,757.962,5.000,1319.2,0,0,0.00,0.00,5.440,7.104,5.537,77.12,0.304,64337051,12866689.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.042,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@8,8,0,200000,6207336,5.000,1241414.8,5.440,9.088,16.000,101.468,6.304,40.028,155074.1,0,0,0.00,0.00,5.056,8.576,5.880,nan,0.381,6207336,1241414.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.042,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10@8,8,0,200000,4880957,5.000,976147.1,6.976,12.672,19.712,151.200,8.074,39.995,122039.2,0,0,0.00,0.00,5.312,8.832,6.047,178.60,0.399,48808403,9761237.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.042,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,0,200000,19616,5.000,3923.0,1982.464,4521.984,4521.984,4681.172,2038.809,39.996,490.5,0,0,0.00,0.00,7.232,14.976,7.875,208.19,0.589,191403931,38278877.0,5.000,0.125,5.125,0.013,0,323584,nan,237375488,37408768,0.042,0,0,0,0,0 +candidate,resident,2,0,load:random@1,1,1,200000,200000,0.259,770875.1,0.584,2.656,4.288,38410.357,1.195,0.259,770810.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.259,0.159,0.418,0.023,0,37261312,1.1360,237375488,37408768,0.033,0,0,0,0,0 +candidate,resident,2,0,warm,8,1,200000,200000,0.020,9922779.9,nan,nan,nan,0.000,nan,0.088,2271952.7,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,9922779.9,0.020,0.000,0.020,0.000,0,0,nan,0,0,0.040,0,0,0,0,2 +candidate,resident,2,0,point:uniform@1,1,1,200000,5000580,5.000,1000082.3,0.888,1.232,1.424,140.162,0.906,5.000,1000146.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,point:uniform@8,8,1,200000,23321331,5.000,4664072.3,1.552,2.208,5.184,510.708,1.587,39.994,583115.9,0,4096,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@1,1,1,200000,1292256,5.000,258438.1,3.680,4.800,8.320,141.397,3.754,5.000,258457.8,0,0,0.00,0.00,3.488,4.544,3.560,nan,0.167,1292256,258438.1,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@1,1,1,200000,1074232,5.000,214835.5,4.544,6.208,9.600,54.210,4.563,5.000,214838.0,0,0,0.00,0.00,3.552,4.000,3.550,92.39,0.166,10742030,2148297.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,1,200000,6623,5.000,1324.5,778.240,811.008,843.776,906.170,754.830,5.000,1324.6,0,0,0.00,0.00,5.440,6.720,5.485,76.80,0.295,64607051,12920760.6,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,1,200000,6401888,5.000,1280319.5,5.184,8.576,14.976,83.083,6.121,39.998,160055.6,0,0,0.00,0.00,4.928,8.128,5.711,nan,0.368,6401888,1280319.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10@8,8,1,200000,4792633,5.000,958485.7,7.360,12.928,20.224,118.896,8.228,39.997,119824.0,0,4096,0.00,0.00,5.312,9.088,6.139,184.70,0.406,47925090,9584609.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,1,200000,17444,5.000,3488.6,2326.528,4521.984,4653.056,4753.799,2292.838,39.997,436.1,0,0,0.00,0.00,7.872,12.416,8.305,234.19,0.656,170093085,34016821.6,5.000,0.100,5.100,0.012,0,323584,nan,237375488,37408768,0.040,0,0,0,0,0 +baseline,resident,3,0,load:random@1,1,1,200000,200000,0.252,794015.2,0.584,2.592,4.288,35762.922,1.161,0.252,793849.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.252,0.168,0.420,0.025,0,37261312,1.1360,237375488,37408768,0.025,0,0,0,0,0 +baseline,resident,3,0,warm,8,1,200000,200000,0.052,3853674.6,nan,nan,nan,0.000,nan,0.214,934230.2,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,3853674.6,0.052,0.000,0.052,0.000,0,0,nan,0,0,0.040,0,0,0,0,1 +baseline,resident,3,0,point:uniform@1,1,1,200000,5036920,5.000,1007343.6,0.888,1.232,1.616,211.877,0.899,5.000,1007409.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,3,0,point:uniform@8,8,1,200000,23313709,5.000,4662545.3,1.552,2.144,2.528,144.444,1.585,39.998,582878.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@1,1,1,200000,1267616,5.000,253515.5,3.808,4.288,8.320,33.579,3.833,5.000,253516.2,0,0,0.00,0.00,3.616,4.160,3.652,nan,0.154,1267616,253515.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10@1,1,1,200000,1070269,5.000,214042.7,4.544,6.208,9.856,74.686,4.588,5.000,214061.9,0,0,0.00,0.00,3.616,4.672,3.646,85.91,0.155,10702400,2140368.8,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@1,1,1,200000,7002,5.000,1400.3,729.088,761.856,811.008,886.602,713.980,5.000,1400.4,0,0,0.00,0.00,5.568,6.848,5.592,72.61,0.261,68298809,13659027.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,3,0,range:uniform:1@8,8,1,200000,6310900,5.000,1262128.3,5.312,8.832,15.744,89.323,6.219,39.998,157779.4,0,0,0.00,0.00,5.056,8.320,5.845,nan,0.337,6310900,1262128.3,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10@8,8,1,200000,5015406,5.000,1003038.8,6.976,12.160,18.688,86.911,7.874,39.998,125391.7,0,0,0.00,0.00,5.312,8.576,6.008,165.79,0.354,50152849,10030146.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +baseline,resident,3,0,range:uniform:10000@8,8,1,200000,17961,5.000,3592.0,1884.160,5832.704,5963.776,6156.402,2226.778,39.999,449.0,0,0,0.00,0.00,7.360,12.672,7.954,227.49,0.588,175226858,35043687.5,5.000,0.108,5.109,0.012,0,323584,nan,237375488,37408768,0.040,0,0,0,0,0 diff --git a/docs/branch-prefix-experiment.md b/docs/branch-prefix-experiment.md index 09cd9e1f8..ad33d0b0e 100644 --- a/docs/branch-prefix-experiment.md +++ b/docs/branch-prefix-experiment.md @@ -53,10 +53,72 @@ allocation statistics and filesystem allocation after close. Report load plus drain, point throughput, short/long range throughput and space together: saved leaf bytes can trade off against rebuilding and key reconstruction. -Initial ABBA common-prefix resident measurements reduced allocated file bytes -by 30.2% and mounted live extents by 25.1%. Point throughput changed by +1.2% -with one reader and -6.1% with eight; short ranges improved 4.3–8.6%. Disk and -nonlexical controls showed severe isolated device-latency outliers. Fixed-image -comparisons of the final reconstruction path and those controls are pending. -This implementation milestone is experimental and does not claim performance -neutrality. +# Measurements + +All runs used O_DIRECT files on ext4, CPU affinity 0–11, 64-byte keys, +100-byte values and WAL disabled. Loading used one thread and zero background +workers for reproducible construction within each format. Baseline and candidate +formats require separate images. The random workload's 16-byte/key harness +array is identical for both variants. Resident runs used 200,000 keys and a +128 MiB cache; disk runs used 2 million keys and a 64 MiB cache. + +| Common-prefix space | Resident | Disk | +| --- | ---: | ---: | +| Mean allocated file bytes, baseline | 37,408,768 | 833,912,832 | +| Mean allocated file bytes, candidate | 26,128,384 | 545,222,656 | +| File allocation reduction | 30.2% | 34.6% | +| Mounted live extents, baseline → candidate | 342 → 256 | 3,414 → 2,585 | +| Live extent reduction | 25.1% | 24.3% | + +Filesystem allocation includes written pages that were subsequently freed; +live extents measure current allocator ownership and include constant empty +memtable allocations. Per-page-type allocation counters are not persisted and +are not used to interpret reopened images. Random and nonlexical inputs showed +no live-extent reduction. + +The final common-prefix measurements use copies of fixed per-format images. +Resident order was baseline / previous candidate / final candidate / final +candidate / previous candidate / baseline. Both candidate binaries read the +same candidate image. Disk order was ABBA. Read phases lasted seven seconds. +Positive changes below mean more throughput than baseline. + +| Final common-prefix reader | Resident | Disk | +| --- | ---: | ---: | +| Point, 1 reader | +0.9% | +11.0% | +| Point, 8 readers | +1.0% | +14.0% | +| Length-1 range, 1 reader | +4.7% | +17.0% | +| Length-1 range, 8 readers | +1.9% | +9.8% | +| Length-10,000 range, 1 reader | +0.8% | +24.2% | +| Length-10,000 range, 8 readers | -2.9% | +19.7% | + +The final reconstruction path improved the resident eight-reader long scan by +10.1% relative to the previous candidate on identical images. Disk I/O per query +fell about 9% for points, 23% for length-1 ranges and 29% for long ranges. The +initial disk common-prefix matrix had one severely slow candidate repetition; +the fixed-image repeat above did not reproduce it. + +The earlier five-second ABBA controls used the previous reconstruction path. +Random inputs changed resident point throughput by +0.3–0.5%, while long-range +throughput ranged from -5.9% to +1.5%. Disk random-input point throughput was +4.3–5.7% lower and ranges were 1.2–7.6% lower. Nonlexical resident point throughput +was 1.6–3.0% lower, and its eight-reader long range was 10.8% lower. Disabling +compression on common-prefix input left space unchanged and point throughput +within 1.1%, but eight-reader long ranges were 7.1% lower. These controls do not +establish a universally neutral overhead, and they are not final-reader results. + +The final nonlexical disk control repeated fixed per-format images in ABBA +order. Point throughput changed by -0.0% / -1.4%, length-1 ranges by -1.4% / +-2.6%, and long ranges by +0.4% / -1.2% (one/eight readers). I/O per operation +remained comparable. This did not reproduce the earlier isolated 8-reader +collapse, but the small negative differences remain part of the measured cost. + +All completed samples report zero correctness violations and errors. Loads were +short (subsecond resident, a few seconds on disk), so their throughput is not a +strong write-performance conclusion. The experiment is promising for large +shared prefixes, with a demonstrated space/read-I/O tradeoff; broader adoption +still requires resolving workloads with little prefix benefit and the remaining +resident long-scan cost. + +Compact CSVs, manifests, build hashes and campaign runners are retained in +`benchmarks/results-20261011/`. Full original artifacts and images remain in +`.cache/projects-20261011/benchmarks/branch-prefix/` in the main checkout. From 18842ab359dedf6195e2c79e74e95edaf9d6a79a Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Sun, 11 Oct 2026 22:49:15 -0700 Subject: [PATCH 03/11] Clarify completed prefix performance assessment --- docs/branch-prefix-experiment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/branch-prefix-experiment.md b/docs/branch-prefix-experiment.md index ad33d0b0e..ba6340a56 100644 --- a/docs/branch-prefix-experiment.md +++ b/docs/branch-prefix-experiment.md @@ -32,7 +32,7 @@ repeated seeks, full-key-only lexical callbacks, and prefix mismatches on both sides. All 15 superblock tests pass, including rejection of the other independent experiment formats. After the reconstruction optimization, all eight B-tree tests (including bounded suffix copies) and the prefix roundtrip pass. -Performance acceptance is pending the follow-up measurements below. +Performance remains workload dependent; the completed measurements follow. `benchmarks/build_prefix_bench.py /path/to/tree` compiles identical generated kvbench source against baseline and candidate libraries and records source and From 919b61f04355248a26d054a0a7948d5fbb33832a Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Mon, 12 Oct 2026 00:28:36 -0700 Subject: [PATCH 04/11] Validate prefix disk gains with fsynced fixture copies --- benchmarks/results-20261011/README.md | 13 + .../0-baseline.log | 17 ++ .../1-candidate.log | 17 ++ .../2-candidate.log | 17 ++ .../3-baseline.log | 17 ++ .../disk-common-fixed-final-fsynced/README.md | 13 + .../manifest.json | 259 ++++++++++++++++++ .../prefix_synced_disk_compare.py | 60 ++++ .../results.csv | 13 + .../summary.csv | 5 + docs/branch-prefix-experiment.md | 25 ++ 11 files changed, 456 insertions(+) create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/0-baseline.log create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/1-candidate.log create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/2-candidate.log create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/3-baseline.log create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/README.md create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/manifest.json create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/prefix_synced_disk_compare.py create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/results.csv create mode 100644 benchmarks/results-20261011/disk-common-fixed-final-fsynced/summary.csv diff --git a/benchmarks/results-20261011/README.md b/benchmarks/results-20261011/README.md index d5ee4f4f3..ba2b9dcbf 100644 --- a/benchmarks/results-20261011/README.md +++ b/benchmarks/results-20261011/README.md @@ -13,3 +13,16 @@ The resident common-prefix repeat includes the old candidate too, with identical candidate images for both binaries. Incompatible baseline and candidate formats use their own images, loaded serially with no background workers. File allocation and live extent measurements come from the initial, format-identical images. + +Method correction: the three original *-fixed-final campaigns copied fixtures +with buffered cp without explicitly fsyncing before O_DIRECT open/warm/timing. +Pending copy writeback is a possible confound, not an established outlier cause. +The original files and runners remain unchanged. The initial seven matrices +created fresh O_DIRECT databases and did not use this copy path. + +`disk-common-fixed-final-fsynced` is one bounded followup: fsync each destination +before opening, then warm, point8 and range10000@8 in ABBA order, seven seconds +per measured phase. It reuses the same per-format images and verifies frozen +binary hashes against the earlier manifest. All four runs pass; the large gains +and read-I/O reductions remain. Its manifest records copy/fsync timestamps and +fixture size/mtime, and its archived runner shows the procedure change. diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/0-baseline.log b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/0-baseline.log new file mode 100644 index 000000000..f9ed76200 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/0-baseline.log @@ -0,0 +1,17 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=baseline splinter=splinterdb_build_version db3047a8 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.046 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.22 ops/s= 8988857 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.74s ops/cpu-s=2695930 rd=188.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1132900 notfound=0 +== point:uniform@8 T=8 ops=1132900 secs= 7.00 ops/s= 161839 lat us p50=49.66 p99=99.33 p99.9=1425.41 max=16305.9 mean=49.37 + cpu=7.13s ops/cpu-s=158893 rd=3528.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 2342 ops (+234 ops/s) +close took 0.076 s +== range:uniform:10000@8 T=8 ops=5882 secs= 7.00 ops/s= 840 lat us p50=7274.50 p99=40370.18 p99.9=82837.50 max=99125.3 mean=9516.59 + cpu=23.53s ops/cpu-s=250 rd=2549464.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 + startup us p50=348.16 p99=2850.82 mean=450.99 per-tuple=908.5 ns deinit mean=1.22 us tuples/s=8389231 + insert/run=7.00s drain(close)=0.08s total=7.08s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671330816 db_alloc=833306624 diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/1-candidate.log b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/1-candidate.log new file mode 100644 index 000000000..ab6bf7a42 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/1-candidate.log @@ -0,0 +1,17 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version db3047a8-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.15 ops/s= 13062539 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.64s ops/cpu-s=3109767 rd=134.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1310393 notfound=0 +== point:uniform@8 T=8 ops=1310393 secs= 7.00 ops/s= 187194 lat us p50=49.66 p99=76.80 p99.9=843.78 max=2452.1 mean=42.67 + cpu=8.09s ops/cpu-s=161938 rd=3208.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=4 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 2992 ops (+299 ops/s) +close took 0.082 s +== range:uniform:10000@8 T=8 ops=7349 secs= 7.00 ops/s= 1050 lat us p50=5832.70 p99=26476.54 p99.9=64487.42 max=76801.4 mean=7619.79 + cpu=25.77s ops/cpu-s=285 rd=1815383.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=282.62 p99=1949.70 mean=347.74 per-tuple=728.6 ns deinit mean=1.52 us tuples/s=10481210 + insert/run=7.00s drain(close)=0.08s total=7.08s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3250065408 db_alloc=542765056 diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/2-candidate.log b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/2-candidate.log new file mode 100644 index 000000000..7bf530e11 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/2-candidate.log @@ -0,0 +1,17 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version db3047a8-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.14 ops/s= 14356344 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.58s ops/cpu-s=3430538 rd=134.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1187895 notfound=0 +== point:uniform@8 T=8 ops=1187895 secs= 7.00 ops/s= 169695 lat us p50=50.69 p99=99.33 p99.9=141.31 max=3244.8 mean=47.08 + cpu=6.90s ops/cpu-s=172082 rd=3207.9 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 2982 ops (+298 ops/s) +close took 0.071 s +== range:uniform:10000@8 T=8 ops=7275 secs= 7.00 ops/s= 1039 lat us p50=6094.85 p99=22282.24 p99.9=29097.98 max=36203.9 mean=7696.60 + cpu=24.49s ops/cpu-s=297 rd=1803161.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=315.39 p99=1294.34 mean=361.28 per-tuple=734.9 ns deinit mean=1.38 us tuples/s=10375508 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3250065408 db_alloc=542765056 diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/3-baseline.log b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/3-baseline.log new file mode 100644 index 000000000..b45546cc0 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/3-baseline.log @@ -0,0 +1,17 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=baseline splinter=splinterdb_build_version db3047a8 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.15 ops/s= 13223540 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.60s ops/cpu-s=3340549 rd=187.8 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=972163 notfound=0 +== point:uniform@8 T=8 ops=972163 secs= 7.00 ops/s= 138877 lat us p50=61.95 p99=117.76 p99.9=161.79 max=3300.3 mean=57.54 + cpu=5.94s ops/cpu-s=163674 rd=3528.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 2286 ops (+229 ops/s) +close took 0.057 s +== range:uniform:10000@8 T=8 ops=5675 secs= 7.00 ops/s= 811 lat us p50=8060.93 p99=27525.12 p99.9=37224.45 max=46886.3 mean=9863.72 + cpu=21.73s ops/cpu-s=261 rd=2547022.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=405.50 p99=1359.87 mean=450.48 per-tuple=943.4 ns deinit mean=1.12 us tuples/s=8093301 + insert/run=7.00s drain(close)=0.06s total=7.06s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671330816 db_alloc=833306624 diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/README.md b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/README.md new file mode 100644 index 000000000..f1a40d026 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/README.md @@ -0,0 +1,13 @@ +# Bounded fsynced-fixture control + +One ABBA campaign, using frozen baseline/final-prefix binaries and the same +per-format disk-common images as disk-common-fixed-final. Each buffered copy is +fsynced before any O_DIRECT open/warm/timing. Seven seconds per point8 and +range10000@8 phase; 2M common-prefix keys, 64MiB cache, zero background workers. +All4 runs have zero errors/violations. No databases are archived. + +Manifest includes commands, checked binary hashes, fixture path/size/mtime and +copy/fsync timestamps. summary.csv derives means/ranges from the individual +results.csv samples; old campaigns remain preserved separately. This control +checks persistence of the large common-prefix disk gains, not a full matrix or +proof that previous outliers were caused by buffered-copy writeback. diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/manifest.json b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/manifest.json new file mode 100644 index 000000000..4a47bf3a2 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/manifest.json @@ -0,0 +1,259 @@ +{ + "io": "O_DIRECT", + "fixture_copy_sync": "fsync destination before warm/open/timing", + "note": "Frozen final binaries and the same incompatible per-format images as the earlier fixed-final comparison; only point8 and range10000@8 are repeated.", + "runs": [ + { + "index": 0, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced", + "warm", + "point:uniform@8", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/0-baseline.db", + "fixture_size": 3671330816, + "fixture_mtime_ns": 1791761274819324224, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "copy_started": 1791786365.5759044, + "copied_at": 1791786366.974513, + "synced_at": 1791786368.287166, + "started": 1791786368.2872157, + "fixture_copy_allocated_bytes": 833130496, + "returncode": 0, + "finished": 1791786384.687846 + }, + { + "index": 1, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced", + "warm", + "point:uniform@8", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/1-candidate.db", + "fixture_size": 3250065408, + "fixture_mtime_ns": 1791761326962406481, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "copy_started": 1791786384.8306432, + "copied_at": 1791786385.6462572, + "synced_at": 1791786385.959061, + "started": 1791786385.959108, + "fixture_copy_allocated_bytes": 542584832, + "returncode": 0, + "finished": 1791786402.2654066 + }, + { + "index": 2, + "version": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-reconstruct/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/results.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced", + "warm", + "point:uniform@8", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/1-candidate.db", + "fixture_size": 3250065408, + "fixture_mtime_ns": 1791761326962406481, + "binary_sha256": "08ea74f21d805fe2dc225ece121d9572e06bc80660958838a1b3ceba7da62e56", + "copy_started": 1791786402.318701, + "copied_at": 1791786402.530488, + "synced_at": 1791786402.8776414, + "started": 1791786402.8776965, + "fixture_copy_allocated_bytes": 542584832, + "returncode": 0, + "finished": 1791786419.1753364 + }, + { + "index": 3, + "version": "baseline", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/baseline/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced/results.csv", + "--vtag", + "baseline", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common-fixed-final-fsynced", + "warm", + "point:uniform@8", + "range:uniform:10000@8" + ], + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/branch-prefix/disk-common/0-baseline.db", + "fixture_size": 3671330816, + "fixture_mtime_ns": 1791761274819324224, + "binary_sha256": "5f223e0567e75eff8dfe04cfb1015444d620be3839a829ba3e3ac44639cdb840", + "copy_started": 1791786419.2292047, + "copied_at": 1791786419.5437512, + "synced_at": 1791786420.0150888, + "started": 1791786420.0151353, + "fixture_copy_allocated_bytes": 833130496, + "returncode": 0, + "finished": 1791786436.3065357 + } + ] +} diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/prefix_synced_disk_compare.py b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/prefix_synced_disk_compare.py new file mode 100644 index 000000000..2883e2ee4 --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/prefix_synced_disk_compare.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +"""Bounded P7 disk control: fsync copied fixture before any O_DIRECT access.""" +import csv +import hashlib +import json +import os +from pathlib import Path +import subprocess +import time + +root = Path(__file__).resolve().parent.parent +out = root / 'benchmarks/branch-prefix/disk-common-fixed-final-fsynced' +out.mkdir(exist_ok=False) +old = json.loads((root / 'benchmarks/branch-prefix/disk-common-fixed-final/manifest.json').read_text()) +profiles = { + version: next(row for row in old['runs'] if row['version'] == version) + for version in ['baseline', 'candidate'] +} +manifest = dict(io='O_DIRECT', fixture_copy_sync='fsync destination before warm/open/timing', + note='Frozen final binaries and the same incompatible per-format images as the earlier fixed-final comparison; only point8 and range10000@8 are repeated.', + runs=[]) +for index, version in enumerate(['baseline', 'candidate', 'candidate', 'baseline']): + profile = profiles[version] + binary = Path(profile['command'][3]) + source = Path(profile['fixture']) + source_stat = source.stat() + digest = hashlib.sha256(binary.read_bytes()).hexdigest() + assert digest == profile['binary_sha256'] + db = out / 'scratch.db' + copy_started = time.time() + subprocess.run(['cp', '--reflink=auto', '--sparse=always', str(source), str(db)], check=True) + copied_at = time.time() + with db.open('rb') as stream: + os.fsync(stream.fileno()) + synced_at = time.time() + argv = ['taskset', '-c', '0-11', str(binary), '--db', str(db), '--open', + '--n', '2000000', '--cache-mib', '64', '--disk-gib', '8', '--log', '0', + '--threads', '8', '--mt-bg', '0', '--normal-bg', '0', '--memtable-mib', '4', + '--secs', '7', '--warmup', '1', '--csv', str(out / 'results.csv'), + '--vtag', version, '--stag', 'disk', '--otag', str(index), '--rep', str(index // 2), + '--seed', '42', '--hang-secs', '60', '--hang-dir', str(out), + 'warm', 'point:uniform@8', 'range:uniform:10000@8'] + record = dict(index=index, version=version, command=argv, fixture=str(source), + fixture_size=source_stat.st_size, fixture_mtime_ns=source_stat.st_mtime_ns, + binary_sha256=digest, copy_started=copy_started, copied_at=copied_at, + synced_at=synced_at, started=time.time(), + fixture_copy_allocated_bytes=db.stat().st_blocks * 512) + print('Prefix fsynced disk control', index, version, flush=True) + with (out / f'{index}-{version}.log').open('w') as stream: + result = subprocess.run(argv, env=dict(os.environ, PREFIX_PATTERN='common'), + stdout=stream, stderr=subprocess.STDOUT, timeout=90) + record.update(returncode=result.returncode, finished=time.time()) + manifest['runs'].append(record) + (out / 'manifest.json').write_text(json.dumps(manifest, indent=2) + '\n') + assert result.returncode == 0, record + rows = list(csv.DictReader((out / 'results.csv').open())) + assert all(int(row[key]) == 0 for row in rows for key in ['violations', 'errors']) + assert source.stat().st_mtime_ns == source_stat.st_mtime_ns + db.unlink() +print('Completed', out, flush=True) diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/results.csv b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/results.csv new file mode 100644 index 000000000..fba878fce --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/results.csv @@ -0,0 +1,13 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +baseline,disk,0,0,warm,8,0,2000000,2000000,0.222,8988856.6,nan,nan,nan,0.000,nan,0.742,2695930.1,377094144,32768,188.55,0.02,nan,nan,nan,nan,nan,2000000,8988856.6,0.222,0.000,0.222,0.000,0,0,nan,0,0,0.046,0,0,0,0,0 +baseline,disk,0,0,point:uniform@8,8,0,2000000,1132900,7.000,161838.7,49.664,99.328,1425.408,16305.883,49.371,7.130,158893.2,3997618176,0,3528.66,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.046,0,0,0,0,0 +baseline,disk,0,0,range:uniform:10000@8,8,0,2000000,5882,7.000,840.3,7274.496,40370.176,82837.504,99125.251,9516.587,23.530,250.0,14995947520,0,2549464.05,0.00,348.160,2850.816,450.993,908.45,1.224,58726565,8389231.0,7.000,0.076,7.076,0.008,0,274432,nan,3671330816,833306624,0.046,0,0,1,0,0 +candidate,disk,1,0,warm,8,0,2000000,2000000,0.153,13062538.7,nan,nan,nan,0.000,nan,0.643,3109767.0,268894208,32768,134.45,0.02,nan,nan,nan,nan,nan,2000000,13062538.7,0.153,0.000,0.153,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +candidate,disk,1,0,point:uniform@8,8,0,2000000,1310393,7.000,187194.0,49.664,76.800,843.776,2452.069,42.671,8.092,161937.6,4204449792,0,3208.54,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,4,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,0,2000000,7349,7.000,1049.8,5832.704,26476.544,64487.424,76801.375,7619.793,25.769,285.2,13341249536,0,1815382.98,0.00,282.624,1949.696,347.737,728.58,1.520,73370664,10481209.7,7.000,0.082,7.082,0.009,0,274432,nan,3250065408,542765056,0.006,0,0,0,0,0 +candidate,disk,2,0,warm,8,1,2000000,2000000,0.139,14356343.9,nan,nan,nan,0.000,nan,0.583,3430537.6,268263424,32768,134.13,0.02,nan,nan,nan,nan,nan,2000000,14356343.9,0.139,0.000,0.139,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,1,2000000,1187895,7.000,169695.1,50.688,99.328,141.312,3244.849,47.084,6.903,172081.7,3810705408,0,3207.95,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,1,2000000,7275,7.000,1039.3,6094.848,22282.240,29097.984,36203.863,7696.601,24.490,297.1,13117997056,0,1803161.11,0.00,315.392,1294.336,361.281,734.90,1.383,72630692,10375508.1,7.000,0.071,7.071,0.007,0,274432,nan,3250065408,542765056,0.006,0,0,0,0,0 +baseline,disk,3,0,warm,8,1,2000000,2000000,0.151,13223539.7,nan,nan,nan,0.000,nan,0.599,3340548.9,375537664,32768,187.77,0.02,nan,nan,nan,nan,nan,2000000,13223539.7,0.151,0.000,0.151,0.000,0,0,nan,0,0,0.007,0,0,0,0,1 +baseline,disk,3,0,point:uniform@8,8,1,2000000,972163,7.000,138877.1,61.952,117.760,161.792,3300.336,57.545,5.940,163674.5,3430461440,0,3528.69,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +baseline,disk,3,0,range:uniform:10000@8,8,1,2000000,5675,7.000,810.7,8060.928,27525.120,37224.448,46886.281,9863.717,21.730,261.2,14454353920,0,2547022.72,0.00,405.504,1359.872,450.475,943.37,1.120,56654795,8093300.5,7.000,0.057,7.058,0.008,0,274432,nan,3671330816,833306624,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261011/disk-common-fixed-final-fsynced/summary.csv b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/summary.csv new file mode 100644 index 000000000..2d7f3720a --- /dev/null +++ b/benchmarks/results-20261011/disk-common-fixed-final-fsynced/summary.csv @@ -0,0 +1,5 @@ +phase,version,n,ops_s_mean,ops_s_min,ops_s_max,throughput_delta_percent,rd_B_op_mean,read_delta_percent,ops_per_cpu_s_mean,cpu_efficiency_delta_percent +point:uniform@8,baseline,2,150357.90000000002,138877.1,161838.7,0.0,3528.675,0.0,161283.85,0.0 +point:uniform@8,candidate,2,178444.55,169695.1,187194.0,18.679863179786338,3208.245,-9.080745605645191,167009.65000000002,3.550138467056696 +range:uniform:10000@8,baseline,2,825.5,810.7,840.3,0.0,2548243.385,0.0,255.6,0.0 +range:uniform:10000@8,candidate,2,1044.55,1039.3,1049.8,26.535433070866144,1809272.045,-28.999244905329157,291.15,13.90845070422535 diff --git a/docs/branch-prefix-experiment.md b/docs/branch-prefix-experiment.md index ba6340a56..14a9260de 100644 --- a/docs/branch-prefix-experiment.md +++ b/docs/branch-prefix-experiment.md @@ -82,6 +82,14 @@ candidate / previous candidate / baseline. Both candidate binaries read the same candidate image. Disk order was ABBA. Read phases lasted seven seconds. Positive changes below mean more throughput than baseline. +These full fixed-image matrices used buffered `cp` without an explicit fsync +before O_DIRECT open/warm/timing. Pending copy writeback, including unreachable +historical pages, may confound their results. This is a method limitation, not +proof of the cause of any earlier outlier. The initial seven pattern/control +matrices constructed fresh O_DIRECT databases and did not use this copy path. +The bounded fsynced disk repeat described below checks two final-reader phases; +the original full matrices are preserved here for comparison. + | Final common-prefix reader | Resident | Disk | | --- | ---: | ---: | | Point, 1 reader | +0.9% | +11.0% | @@ -112,6 +120,23 @@ order. Point throughput changed by -0.0% / -1.4%, length-1 ranges by -1.4% / remained comparable. This did not reproduce the earlier isolated 8-reader collapse, but the small negative differences remain part of the measured cost. +A bounded followup fsynced each copied disk fixture before O_DIRECT open and +warmup, then repeated only point and length-10,000 queries with eight readers. +It used the same frozen final binaries, the same per-format images, ABBA order +and seven-second phases. All four runs passed with no errors or violations. + +| Fsynced common-prefix disk control | Baseline ops/s, min–max | Candidate ops/s, min–max | Mean throughput change | Read bytes/query change | +| --- | ---: | ---: | ---: | ---: | +| Point, 8 readers | 138,877–161,839 | 169,695–187,194 | +18.7% | -9.1% | +| Length-10,000 range, 8 readers | 810.7–840.3 | 1,039.3–1,049.8 | +26.5% | -29.0% | + +CPU efficiency increased 3.6% for points and 13.9% for long ranges. Baseline +rates still varied between the two repetitions, so these throughput deltas are +not precise universal estimates. The large gains and read-I/O reductions persist +after explicitly synchronizing the copies. This control does not establish that +copy writeback caused any earlier outlier, and it does not replace unmeasured +phases or the nonlexical and resident controls. + All completed samples report zero correctness violations and errors. Loads were short (subsecond resident, a few seconds on disk), so their throughput is not a strong write-performance conclusion. The experiment is promising for large From 100800cb1a11a60a259869f4b195d9572b9da86c Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Tue, 13 Oct 2026 09:29:20 -0700 Subject: [PATCH 05/11] Record main integration tests and real-disk benchmark results --- .../main-7bb5fab/.gitattributes | 3 + .../results-20261013/main-7bb5fab/README.md | 11 + .../main-7bb5fab/benchmarks/audit.json | 90 + .../main-7bb5fab/benchmarks/audit.py | 62 + .../benchmarks/benchmark-jobs.json | 167 ++ .../benchmarks/branch-prefix-build.json | 231 +++ .../main-7bb5fab/benchmarks/build_all.py | 44 + .../main-7bb5fab/benchmarks/control-drift.csv | 69 + .../benchmarks/feature-summaries.json | 354 ++++ .../fixtures/disk-branch-prefix-common.csv | 2 + .../fixtures/disk-branch-prefix-common.log | 8 + .../fixtures/disk-branch-prefix-random.csv | 2 + .../fixtures/disk-branch-prefix-random.log | 8 + .../benchmarks/fixtures/disk-main-common.csv | 2 + .../benchmarks/fixtures/disk-main-common.log | 8 + .../benchmarks/fixtures/disk-main-random.csv | 2 + .../benchmarks/fixtures/disk-main-random.log | 8 + .../benchmarks/fixtures/manifest.json | 531 +++++ .../resident-branch-prefix-common.csv | 2 + .../resident-branch-prefix-common.log | 8 + .../resident-branch-prefix-random.csv | 2 + .../resident-branch-prefix-random.log | 8 + .../fixtures/resident-main-common.csv | 2 + .../fixtures/resident-main-common.log | 8 + .../fixtures/resident-main-random.csv | 2 + .../fixtures/resident-main-random.log | 8 + .../main-7bb5fab/benchmarks/host.json | 7 + .../benchmarks/insert_benchmark.c | 1002 ++++++++++ .../main-7bb5fab/benchmarks/inventory.json | 65 + .../main-7bb5fab/benchmarks/kvbench.c | 1707 ++++++++++++++++ .../main-7bb5fab/benchmarks/main-build.json | 230 +++ .../main-7bb5fab/benchmarks/package.py | 67 + .../benchmarks/prefix-disk-common/00-main.log | 21 + .../prefix-disk-common/01-branch-prefix.log | 21 + .../prefix-disk-common/02-branch-prefix.log | 21 + .../benchmarks/prefix-disk-common/03-main.log | 21 + .../prefix-disk-common/manifest.json | 311 +++ .../benchmarks/prefix-disk-common/results.csv | 17 + .../benchmarks/prefix-disk-random/00-main.log | 21 + .../prefix-disk-random/01-branch-prefix.log | 21 + .../prefix-disk-random/02-branch-prefix.log | 21 + .../benchmarks/prefix-disk-random/03-main.log | 21 + .../prefix-disk-random/manifest.json | 311 +++ .../benchmarks/prefix-disk-random/results.csv | 17 + .../prefix-resident-common/00-main.log | 25 + .../01-branch-prefix.log | 25 + .../02-branch-prefix.log | 25 + .../prefix-resident-common/03-main.log | 25 + .../prefix-resident-common/manifest.json | 315 +++ .../prefix-resident-common/results.csv | 21 + .../prefix-resident-random/00-main.log | 25 + .../01-branch-prefix.log | 25 + .../02-branch-prefix.log | 25 + .../prefix-resident-random/03-main.log | 25 + .../prefix-resident-random/manifest.json | 315 +++ .../prefix-resident-random/results.csv | 21 + .../main-7bb5fab/benchmarks/prefix_kvbench.c | 1765 +++++++++++++++++ .../main-7bb5fab/benchmarks/preparation.json | 20 + .../main-7bb5fab/benchmarks/repeat.py | 19 + .../main-7bb5fab/benchmarks/report.md | 237 +++ .../main-7bb5fab/benchmarks/report.py | 127 ++ .../main-7bb5fab/benchmarks/run_job.py | 54 + .../benchmarks/run_matrix-fixtures.py | 152 ++ .../main-7bb5fab/benchmarks/run_matrix.py | 156 ++ .../main-7bb5fab/benchmarks/status.json | 41 + .../main-7bb5fab/benchmarks/summary.csv | 15 + .../main-7bb5fab/tests/README.md | 11 + .../main-7bb5fab/tests/archive-manifest.json | 142 ++ .../main-7bb5fab/tests/debug-blob.log | 6 + .../main-7bb5fab/tests/debug-btree.log | 10 + .../main-7bb5fab/tests/debug-build.log | 117 ++ .../main-7bb5fab/tests/debug-quick.log | 56 + .../main-7bb5fab/tests/debug-results.json | 67 + .../main-7bb5fab/tests/debug-superblock.log | 34 + .../main-7bb5fab/tests/debug-tests.log | 9 + .../main-7bb5fab/tests/kvbench-build.log | 4 + .../main-7bb5fab/tests/release-blob.log | 6 + .../main-7bb5fab/tests/release-btree.log | 10 + .../main-7bb5fab/tests/release-build.log | 117 ++ .../main-7bb5fab/tests/release-libs.log | 3 + .../main-7bb5fab/tests/release-quick.log | 56 + .../main-7bb5fab/tests/release-results.json | 67 + .../main-7bb5fab/tests/release-superblock.log | 34 + .../main-7bb5fab/tests/release-tests.log | 9 + .../main-7bb5fab/tests/shared/before.json | 97 + .../main-7bb5fab/tests/shared/run_job.py | 54 + .../tests/shared/test_root_branches.py | 67 + .../main-7bb5fab/tests/source-manifest.json | 174 ++ .../main-7bb5fab/tests/validate.py | 29 + docs/branch-prefix-experiment.md | 10 + 90 files changed, 10191 insertions(+) create mode 100644 benchmarks/results-20261013/main-7bb5fab/.gitattributes create mode 100644 benchmarks/results-20261013/main-7bb5fab/README.md create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/benchmark-jobs.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/branch-prefix-build.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/build_all.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/control-drift.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/feature-summaries.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/manifest.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/host.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/insert_benchmark.c create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/inventory.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/kvbench.c create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/main-build.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/package.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/00-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/01-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/02-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/03-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/manifest.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/results.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/00-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/01-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/02-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/03-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/manifest.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/results.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/00-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/01-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/02-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/03-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/manifest.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/results.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/00-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/01-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/02-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/03-main.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/manifest.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/results.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix_kvbench.c create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/preparation.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/repeat.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/report.md create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/report.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/run_job.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix-fixtures.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/status.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/benchmarks/summary.csv create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/README.md create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/archive-manifest.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/debug-blob.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/debug-btree.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/debug-build.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/debug-quick.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/debug-results.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/debug-superblock.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/debug-tests.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/kvbench-build.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-blob.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-btree.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-build.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-libs.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-quick.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-results.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-superblock.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/release-tests.log create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/shared/before.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/shared/run_job.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/shared/test_root_branches.py create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/source-manifest.json create mode 100644 benchmarks/results-20261013/main-7bb5fab/tests/validate.py diff --git a/benchmarks/results-20261013/main-7bb5fab/.gitattributes b/benchmarks/results-20261013/main-7bb5fab/.gitattributes new file mode 100644 index 000000000..b56614d96 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/.gitattributes @@ -0,0 +1,3 @@ +*.csv whitespace=cr-at-eol +*.patch -whitespace +*.log -whitespace diff --git a/benchmarks/results-20261013/main-7bb5fab/README.md b/benchmarks/results-20261013/main-7bb5fab/README.md new file mode 100644 index 000000000..46e6e0cd0 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/README.md @@ -0,0 +1,11 @@ +# branch-prefix: main integration evidence + +Source merge: `3024eec0dda2d74ae6ee96adbaffcdf465585a38`; main: `7bb5fab305b9c6179e31f75998dabea833537a08`. + +[Correctness checks](tests/README.md) include exact commands, hashes and retained initial failures. [Benchmark report](benchmarks/report.md), [project summary](benchmarks/summary.csv), and [verification status](benchmarks/status.json) describe the fresh real-disk screening. + +Common-prefix resident point throughput improved 10.61%, while the random-key resident long-range workload lost 10.88%, both with non-overlapping sample ranges. Common-prefix disk long-range throughput improved about 14.4%. The experiment retains a workload-dependent cost; it is not performance neutral. + +The campaign ran 133 comparison processes, 12 fixture creators and one recorded warmup through 11 exclusive jobs. These compare each updated feature with main; they do not isolate merge cost. Main controls drifted; sample-range overlap is descriptive, not a statistical confidence interval. Query/hash/barrier runs validate data, while insert-only runs check API returns, positive counts and successful close without readback. All benchmark databases were on ext4 `/dev/mapper/snafu-root_crypt` with O_DIRECT and fsynced fixture copies. + +`tests/archive-manifest.json` and `benchmarks/inventory.json` verify the small archived files. No database images, executables or core dumps are committed. Archived scripts retain original paths and must be adapted before replay outside the original campaign. diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.json new file mode 100644 index 000000000..188de621f --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.json @@ -0,0 +1,90 @@ +{ + "complete": true, + "scope": "new main versus updated feature; merge cost not isolated", + "counts": { + "fixtures": { + "runs": 12, + "runner": "run_matrix-fixtures.py", + "verified": true + }, + "resident": { + "runs": 23, + "runner": "run_matrix.py", + "verified": true + }, + "disk": { + "runs": 23, + "runner": "run_matrix.py", + "verified": true + }, + "prefix-resident-common": { + "runs": 4, + "runner": "run_matrix.py", + "verified": true + }, + "prefix-resident-random": { + "runs": 4, + "runner": "run_matrix.py", + "verified": true + }, + "prefix-disk-common": { + "runs": 4, + "runner": "run_matrix.py", + "verified": true + }, + "prefix-disk-random": { + "runs": 4, + "runner": "run_matrix.py", + "verified": true + }, + "insert": { + "runs": 31, + "runner": "run_matrix.py", + "verified": true + }, + "hash": { + "runs": 4, + "runner": "run_matrix.py", + "verified": true + }, + "barrier": { + "runs": 24, + "runner": "run_matrix.py", + "verified": true + }, + "repeat-warmup": { + "runs": 1, + "runner": "repeat.py", + "verified": true + }, + "repeat-cache-invalid-addresses": { + "runs": 4, + "runner": "repeat.py", + "verified": true + }, + "repeat-directory-bucket-atomic": { + "runs": 4, + "runner": "repeat.py", + "verified": true + }, + "repeat-async-durable-barrier": { + "runs": 4, + "runner": "repeat.py", + "verified": true + } + }, + "total_processes": 146, + "comparison_processes": 133, + "fixture_processes": 12, + "recorded_warmup_processes": 1, + "exclusive_benchmark_jobs": 11, + "source_and_binary_hashes_verified": true, + "runner_hashes_verified": true, + "all_processes_serial": true, + "no_overlapping_build_test_jobs": true, + "resident_physical_read_bytes": 0, + "errors": 0, + "violations": 0, + "insert_verification": "API return, positive insert count and successful close; no readback", + "storage": "ext4 /dev/mapper/snafu-root_crypt; O_DIRECT; fsynced fixture copies" +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.py new file mode 100644 index 000000000..ad764439d --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/audit.py @@ -0,0 +1,62 @@ +"""Validate final matrix coverage, provenance, row counts and exclusive scheduling.""" +import csv,hashlib,json +from pathlib import Path +C=Path(__file__).resolve().parent +P=C.parents[2] +O=P/'benchmarks/main-7bb5fab' +def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest() +def readcsv(p):return list(csv.DictReader(p.open())) +expected={'fixtures':12,'resident':23,'disk':23,'prefix-resident-common':4,'prefix-resident-random':4,'prefix-disk-common':4,'prefix-disk-random':4,'insert':31,'hash':4,'barrier':24,'repeat-warmup':1,'repeat-cache-invalid-addresses':4,'repeat-directory-bucket-atomic':4,'repeat-async-durable-barrier':4} +known_runner_hashes={sha(C/n):n for n in ['run_matrix.py','run_matrix-fixtures.py','repeat.py']} +builds={p.name.removesuffix('-build.json'):json.loads(p.read_text()) for p in C.glob('*-build.json')} +for profile,b in builds.items(): + assert sha(Path(b['library']))==b['library_sha256'],profile + for f,h in b['source_files_sha256'].items():assert sha(Path(b['tree'])/f)==h,(profile,f) + for exe,v in b['binaries'].items(): + assert sha(Path(v['binary']))==v['binary_sha256'] + assert sha(Path(v['source']))==v['source_sha256'] +runs=[];counts={} +for mode,count in expected.items(): + folder=O/mode;m=json.loads((folder/'manifest.json').read_text()) + assert m['complete'] and len(m['runs'])==count,mode + assert m['runner_sha256'] in known_runner_hashes,mode + if 'shared_runner_sha256' in m:assert m['shared_runner_sha256']==sha(C/'run_matrix.py') + for r in m['runs']: + assert r['verified'] and r['returncode']==0,(mode,r['label']) + log=folder/(r['label']+'.log');assert sha(log)==r['log_sha256'] + assert 'FINDING: splinterdb_close' not in log.read_text(errors='replace') + b=builds[r['profile']];assert r['source_head']==b['head'] and r['library_sha256']==b['library_sha256'] + assert r['binary_sha256'] in {v['binary_sha256'] for v in b['binaries'].values()} + assert r['finished']>=r['started'] and r['process_cpu_s']>0 + runs.append(dict(mode=mode,label=r['label'],started=r['started'],finished=r['finished'])) + counts[mode]=dict(runs=count,runner=known_runner_hashes[m['runner_sha256']],verified=True) + if (folder/'results.csv').exists(): + rows=readcsv(folder/'results.csv') + if 'phase' in rows[0]: + for r in rows: + assert int(r['errors'])==0 and int(r['violations'])==0 and int(r['ops'])>0 + if r['phase']=='warm':assert int(r['ops'])==int(r['n']) + elif mode=='resident' or mode.startswith('repeat-'):assert int(r['rd_bytes'])==0 + if mode=='barrier':assert len(rows)==count and all(int(r['verified'])==1 for r in rows) + if mode=='insert':assert len(rows)==count and all(int(r['errors'])==0 and int(r['violations'])==0 and int(r['inserted'])>0 for r in rows) + if mode=='fixtures': + for r in m['runs']: + rows=readcsv(folder/(r['label']+'.csv'));assert len(rows)==1 and int(rows[0]['ops'])==int(rows[0]['n']) and int(rows[0]['errors'])==int(rows[0]['violations'])==0 + if mode=='hash': + for r in m['runs']:assert [int(x['limit']) for x in r['rows']]==[1,2,10,100] and all(int(x['queries'])==1000 for x in r['rows']) + for i in range(4):assert len({r['rows'][i]['checksum'] for r in m['runs']})==1 +runs.sort(key=lambda r:r['started']) +assert all(a['finished']<=b['started'] for a,b in zip(runs,runs[1:])), 'Benchmark subprocesses overlap' +jobs=[json.loads(line) for line in (P/'coordination/jobs.jsonl').read_text().splitlines()] +ours=[j for j in jobs if j['mode']=='benchmark' and j['name'].startswith('main-7bb5fab-benchmark-')] +assert len(ours)==11 and all(j['mode']=='benchmark' and j['returncode']==0 for j in ours) +for j in ours: + for k in jobs: + if j is k:continue + assert min(j['finished'],k['finished'])<=max(j['started'],k['started']),(j['name'],k['name']) +for r in runs:assert sum(j['started']<=r['started'] and j['finished']>=r['finished'] for j in ours)==1 +(C/'run_job.py').write_bytes((P/'coordination/run_job.py').read_bytes()) +(C/'benchmark-jobs.json').write_text(json.dumps(ours,indent=2)+'\n') +result=dict(complete=True,scope='new main versus updated feature; merge cost not isolated',counts=counts,total_processes=len(runs),comparison_processes=len(runs)-13,fixture_processes=12,recorded_warmup_processes=1,exclusive_benchmark_jobs=len(ours),source_and_binary_hashes_verified=True,runner_hashes_verified=True,all_processes_serial=True,no_overlapping_build_test_jobs=True,resident_physical_read_bytes=0,errors=0,violations=0,insert_verification='API return, positive insert count and successful close; no readback',storage='ext4 /dev/mapper/snafu-root_crypt; O_DIRECT; fsynced fixture copies') +(C/'audit.json').write_text(json.dumps(result,indent=2)+'\n') +print(json.dumps(result,indent=2)) diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/benchmark-jobs.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/benchmark-jobs.json new file mode 100644 index 000000000..079868d9d --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/benchmark-jobs.json @@ -0,0 +1,167 @@ +[ + { + "name": "main-7bb5fab-benchmark-fixtures", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/run_matrix.py", + "fixtures" + ], + "started": 1791905953.791713, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791905996.8644083 + }, + { + "name": "main-7bb5fab-benchmark-resident", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/run_matrix.py", + "resident" + ], + "started": 1791906087.9268048, + "pid": 5, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791906898.088736 + }, + { + "name": "main-7bb5fab-benchmark-disk", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/run_matrix.py", + "disk" + ], + "started": 1791906929.7655535, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791907361.8222167 + }, + { + "name": "main-7bb5fab-benchmark-prefix", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/run_matrix.py", + "prefix" + ], + "started": 1791907361.8244245, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791907746.3817344 + }, + { + "name": "main-7bb5fab-benchmark-insert", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/run_matrix.py", + "insert" + ], + "started": 1791907746.3838046, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791907918.6362858 + }, + { + "name": "main-7bb5fab-benchmark-hash", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/run_matrix.py", + "hash" + ], + "started": 1791907918.6382897, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791907922.146424 + }, + { + "name": "main-7bb5fab-benchmark-barrier", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/run_matrix.py", + "barrier" + ], + "started": 1791908012.5013723, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791908144.8841226 + }, + { + "name": "main-7bb5fab-benchmark-repeat-warmup", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/repeat.py", + "warmup" + ], + "started": 1791908144.8859186, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791908167.146525 + }, + { + "name": "main-7bb5fab-benchmark-repeat-invalid", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/repeat.py", + "cache-invalid-addresses" + ], + "started": 1791908236.5269575, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791908369.5229552 + }, + { + "name": "main-7bb5fab-benchmark-repeat-atomic", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/repeat.py", + "directory-bucket-atomic" + ], + "started": 1791908442.7619998, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791908531.8354392 + }, + { + "name": "main-7bb5fab-benchmark-repeat-async", + "mode": "benchmark", + "cwd": "/home/rob/projects/splinterdb", + "command": [ + "python3", + ".cache/projects-20261011/coordination/main-7bb5fab/benchmarks/repeat.py", + "async-durable-barrier" + ], + "started": 1791908542.3013017, + "pid": 3, + "db_dir": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab", + "returncode": 0, + "finished": 1791908631.2491326 + } +] diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/branch-prefix-build.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/branch-prefix-build.json new file mode 100644 index 000000000..d0923473a --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/branch-prefix-build.json @@ -0,0 +1,231 @@ +{ + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/lib/libsplinterdb.a", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "binaries": { + "kvbench": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/kvbench", + "binary_sha256": "c5b7993b93aa17de1bf50fc7ac90fc86895a2cfc59cb45509475154e5e7cbf3c", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + }, + "insert_benchmark": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/insert_benchmark", + "binary_sha256": "92cebc8480a0006bfcb8803338c1a7002910d00531eccc6f8eb367a21051010a", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/insert_benchmark.c", + "source_sha256": "75acbda52b2a8949f1d61710a8d89250d4dac63b12ec9803b89170f9c2cc0b26" + }, + "prefix_kvbench": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/prefix_kvbench.c", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51" + } + }, + "source_files_sha256": { + "include/splinterdb/data.h": "58b47863d92bea53e50ff28d97d594b05675e122a6d7193fdfb19f5deda4df4d", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "364073691c390663f6b732f57c3ee4bfecc9f68aca33ef6750d6106e04462dc8", + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "bc0621be7903d64e25059140005dafeea3f2a4a4ae0e658686501e52e4be934f", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "7d46871423a15992f697cabb363316183cb842a11c26017f8566267174e5ae45", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "2c26b56a2c779faec79eccf7928032204d5907687e63455850eeb51e0ee106c3", + "src/btree.h": "47789ba7191a88faa21ae5b13fa02f7ab59dd698b2207654fe5fcaf422ecbc87", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "70caf9f8d7794dea8d2aeec339883ccfcfdfc29ce6c2e1edd2d0353c4a3975ea", + "src/core.h": "7cf4d086f6d4dcaa4cbd161fef786dbe3cc502ced4512b7fe547c2aa2020462e", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "49a2b0aec91a1c40784b8b3b54f016ef5504c79492b1393674123e27656a09bb", + "src/log_data.h": "06ab1d39b77abb01ec66a901fa52354908be26db8daef52899f5c03a6db2462e", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "df98421e597d1edeac871755f0473055b590791af8efad495575d20260e46a12", + "src/merge.h": "c17e2a0b6272ec52e6d1e80acd9df7dc85221f186e6c60e323c37b467dc5c41a", + "src/mini_allocator.c": "d9444da13fca2000f4128500b84be2b778300a4befc93f72e52b071b83c6491e", + "src/mini_allocator.h": "8d5242f5e4df5443baeab7a494a3c3b2f1491216abfd914c6dbc273370e45683", + "src/notification.c": "2f3bcda49d8ce35ad532fef8ec8f4aeca48bec280cdf6210c21d55cf2aa4a661", + "src/notification.h": "47eb73f5813d6f54658f339ce44d6a475f8f64f2b2eb6368261e839a090f083f", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "a145d39af39caf9dec6f1e1e24b6606ed615587d8dee52a23e0df410b2d07545", + "src/rc_allocator.h": "65f01decb7244b8f6a6c9e7acb47d4ccb4f2f3f369461e70aff33211f03ee39b", + "src/routing_filter.c": "3e722a880217cc4f5831f162dd6b3853a5d0d3f67ca3d3421b2144650657f73a", + "src/routing_filter.h": "579a3a4cc00b9cb125479b23eaa93e4a8309a195fe4082d988b629d4b95a2c91", + "src/shard_log.c": "ed1fcdb429d4fc26382546ecbce04154910275494e9fef522cf34b647cf5e734", + "src/shard_log.h": "07c5867b959eefd35e3e9f08e6c015a594f6331850844590e9c2b1126cd2716b", + "src/splinterdb.c": "e054c2dc9224c7de8bdb63206bb5150947f853d903e3b8012ba46fe1a66dba5f", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "34dd4c724e53c98f170c024c70dd22dae0a466806c167134200f92128420dfba", + "src/superblock.h": "cee4253a99b71e75e67d2d5abc28e2eb34faec5a3297cd0371b67ec66a3dbc6c", + "src/task.c": "35886e598b4464af16e76497917955d3d55c6c077fbcf80fb3fd2284c8ddc08d", + "src/task.h": "35405e04fbdcef9bc5c5d6ef43debc4b0889d6bc4d8d530649b0c45a34012825", + "src/trunk.c": "892373ec383717289a6220b4351b670637e7c41877a97eb0edcb27a9e4e270f2", + "src/trunk.h": "05c5c5313f5a42b68482d03b58d2f17081c6da468a0ce888b0b0b38cc069baf2", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9" + }, + "library_build_configuration": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": { + "sha256": "19ceedfc17adeaaf3fc4d1a84ef3508a897c35ff28a12b03c4400bb602180354", + "text": "BUILD_ROOT=build-main-7bb5fab\nMAKEFLAGS= -j8 --jobserver-auth=fifo:/tmp/splinter-main-7bb5fab-prefix-release-build-gcmpao4r/GMfifo7 -- BUILD_MODE=release BUILD_ROOT=build-main-7bb5fab\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/build_all.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/build_all.py new file mode 100644 index 000000000..f3e172154 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/build_all.py @@ -0,0 +1,44 @@ +import hashlib,json,subprocess,sys +from pathlib import Path +ROOT=Path('/home/rob/projects/splinterdb') +CAMP=ROOT/'.cache/projects-20261011' +OUT=Path(__file__).resolve().parent +SOURCES=OUT/'sources' +def sha(p):return hashlib.sha256(Path(p).read_bytes()).hexdigest() +profiles={'main':(ROOT,'build-main-7bb5fab')} +for name in ['disk-format','filtered-ranges','log-group-limit','branch-prefix','lazy-merge','async-durable-barrier','cache-invalid-addresses']: + profiles[name]=(CAMP/'worktrees'/name,'build-main-7bb5fab') +for opt in ['direct','bucket','bucket-simd','bucket-atomic']: + profiles['directory-'+opt]=(CAMP/'worktrees/cache-directory',f'build-main-7bb5fab/{opt}') +flags=['cc','-D_GNU_SOURCE','-ggdb','-Wall','-pthread','-Werror','-DXXH_STATIC_LINKING_ONLY','-fPIC','-DSPLINTERDB_PLATFORM_DIR=platform_linux','-O3','-ffast-math','-flto','-march=native'] +manifest={} +for name,(tree,buildroot) in profiles.items(): + if len(sys.argv)>1 and name not in sys.argv[1:]:continue + head=subprocess.check_output(['git','rev-parse','HEAD'],cwd=tree,text=True).strip() + subprocess.run(['git','merge-base','--is-ancestor','7bb5fab',head],cwd=tree,check=True) + lib=tree/buildroot/'release/lib/libsplinterdb.a' + header=(tree/'include/splinterdb/splinterdb.h').read_text() + record=dict(tree=str(tree),head=head,library=str(lib),library_sha256=sha(lib),binaries={},source_files_sha256={}) + for filename in subprocess.check_output(['git','ls-files','src','include'],cwd=tree,text=True).splitlines(): + if (tree/filename).is_file():record['source_files_sha256'][filename]=sha(tree/filename) + bins=['kvbench','insert_benchmark'] + if name in ['main','branch-prefix']:bins+=['prefix_kvbench'] + if name in ['main','filtered-ranges']:bins+=['hash_range_benchmark'] + if name in ['main','async-durable-barrier']:bins+=['barrier_bench'] + for binaryname in bins: + source=SOURCES/(binaryname+'.c');binary=OUT/'bin'/name/binaryname;binary.parent.mkdir(parents=True,exist_ok=True) + macros=[] + if binaryname in ['kvbench','prefix_kvbench']:macros+=['-DKVBENCH_CLOSE_HAS_FORCE'] + if binaryname=='prefix_kvbench': + macros+=['-DKVBENCH_SPACE_MODE'] + if name=='branch-prefix':macros+=['-DKVBENCH_PREFIX_SUPPORT'] + if binaryname=='hash_range_benchmark' and name=='filtered-ranges':macros+=['-DHASH_RANGE_FILTER_API'] + if binaryname=='insert_benchmark' and name!='log-group-limit':macros+=['-DKVBENCH_NO_LOG_GROUP_LIMIT'] + if '#define SPLINTERDB_NOTIFICATION_BLOCKING' in header:macros+=['-DHAVE_SENTINEL_NOTIFICATION','-DHAVE_ASYNC_BARRIER'] + command=flags+macros+['-I',str(tree/'include'),'-I',str(tree/'src'),'-I',str(tree/'src/platform_linux'),str(source),str(lib),'-laio','-lxxhash','-lm','-lpthread','-o',str(binary)] + print('build',name,binaryname,flush=True) + subprocess.run(command,check=True) + record['binaries'][binaryname]=dict(command=command,binary=str(binary),binary_sha256=sha(binary),source=str(source),source_sha256=sha(source)) + (OUT/(name+'-build.json')).write_text(json.dumps(record,indent=2)+'\n') + manifest[name]=record +(OUT/'builds-last.json').write_text(json.dumps(manifest,indent=2)+'\n') diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/control-drift.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/control-drift.csv new file mode 100644 index 000000000..cfb613d57 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/control-drift.csv @@ -0,0 +1,69 @@ +workload,phase,order,ops_s,change_from_first_pct,cpu_us_op,read_bytes +repeat-warmup,point:uniform@8,0,5725282.1,0.0,1.397020051521282,0 +repeat-warmup,range:uniform:1@8,0,531558.3,0.0,15.047298523902287,0 +repeat-directory-bucket-atomic,point:uniform@8,0,6058373.4,0.0,1.320094818123589,0 +repeat-directory-bucket-atomic,point:uniform@8,3,5103421.5,-15.762513086433405,1.5670903540638217,0 +repeat-directory-bucket-atomic,range:uniform:1@8,0,566747.0,0.0,14.112342596291334,0 +repeat-directory-bucket-atomic,range:uniform:1@8,3,498451.0,-12.050526954708186,16.044938184918625,0 +disk,point:uniform@8,0,153061.5,0.0,5.361065052728681,2471006208 +disk,point:uniform@8,11,162899.9,6.427743096729088,6.005865909099279,2630258688 +disk,point:uniform@8,22,168110.0,9.831668969662521,6.042270913585652,2714718208 +disk,range:uniform:1@8,0,63458.1,0.0,132.9297233243934,6286577664 +disk,range:uniform:1@8,11,63625.4,0.2636385268389718,133.28995634011335,6302711808 +disk,range:uniform:1@8,22,64975.4,2.391026519861139,130.54799748839613,6439641088 +disk,range:uniform:10000@8,0,841.4,0.0,3017.1143332541005,9990152192 +disk,range:uniform:10000@8,11,835.2,-0.7368671262181992,3448.754789272031,9911496704 +disk,range:uniform:10000@8,22,840.0,-0.16638935108153063,3655.0,9932713984 +repeat-async-durable-barrier,point:uniform@8,0,5568429.8,0.0,1.4363332788847318,0 +repeat-async-durable-barrier,point:uniform@8,3,4940084.1,-11.284073294773334,1.6189229334750765,0 +repeat-async-durable-barrier,range:uniform:1@8,0,506930.4,0.0,15.778718800936517,0 +repeat-async-durable-barrier,range:uniform:1@8,3,489239.4,-3.4898281894319205,16.345419991652534,0 +prefix-resident-common,point:uniform@8,0,3798858.3,0.0,2.105459146011521,0 +prefix-resident-common,point:uniform@8,3,3979950.2,4.767008550963858,2.009371623828547,0 +prefix-resident-common,range:uniform:1@8,0,992358.5,0.0,8.06011032205677,0 +prefix-resident-common,range:uniform:1@8,3,996704.2,0.43791633769447724,8.02499213268852,0 +prefix-resident-common,range:uniform:10000@8,0,3472.3,0.0,2305.0155987521,0 +prefix-resident-common,range:uniform:10000@8,3,3609.2,3.9426316850502463,2216.3834503140006,0 +prefix-resident-common,ow:uniform@8,0,2274316.9,0.0,3.0310520336583586,2005544960 +prefix-resident-common,ow:uniform@8,3,2304559.8,1.3297575197194433,3.037911263890554,2003456000 +resident,point:uniform@1,0,1261757.3,0.0,0.79252082249396,0 +resident,point:uniform@1,11,1152531.0,-8.656680646904125,0.8676282687172,0 +resident,point:uniform@1,22,1148133.5,-9.005202506060407,0.8709404196916726,0 +resident,point:uniform@8,0,6445634.1,0.0,1.2407480739199983,0 +resident,point:uniform@8,11,5270841.2,-18.22618041567081,1.5171993153252339,0 +resident,point:uniform@8,22,5463995.8,-15.229507055015734,1.4638320892600838,0 +resident,range:uniform:1@1,0,114690.1,0.0,8.718775883865906,0 +resident,range:uniform:1@1,11,105447.5,-8.058760084785,9.481407022468359,0 +resident,range:uniform:1@1,22,105112.6,-8.350764364143027,9.519536136660204,0 +resident,range:uniform:1@8,0,600376.6,0.0,13.32092671033598,0 +resident,range:uniform:1@8,11,532530.7,-11.300557017045643,15.020171795914191,0 +resident,range:uniform:1@8,22,549552.3,-8.465403215248546,14.554061799643964,0 +resident,range:uniform:10000@8,0,4305.3,0.0,1857.8562304029729,0 +resident,range:uniform:10000@8,11,3785.8,-12.06652265811906,2112.651875330164,0 +resident,range:uniform:10000@8,22,3929.7,-8.724130722597733,2035.4552780016115,0 +repeat-cache-invalid-addresses,point:uniform@1,0,1237297.9,0.0,0.8081970578394306,0 +repeat-cache-invalid-addresses,point:uniform@1,3,1167884.0,-5.610120246708572,0.8562318264794829,0 +repeat-cache-invalid-addresses,point:uniform@8,0,6207307.6,0.0,1.2885781245675567,0 +repeat-cache-invalid-addresses,point:uniform@8,3,5328062.8,-14.164672619091723,1.5011880792761536,0 +repeat-cache-invalid-addresses,range:uniform:1@8,0,546650.2,0.0,14.631325678521693,0 +repeat-cache-invalid-addresses,range:uniform:1@8,3,516913.3,-5.439840687884134,15.472656757810807,0 +prefix-disk-random,point:uniform@8,0,135623.0,0.0,6.979415663796549,2392637440 +prefix-disk-random,point:uniform@8,3,173077.1,27.616333512752256,6.5078303110978615,3054764032 +prefix-disk-random,range:uniform:1@8,0,56431.4,0.0,148.08803203742426,3998134272 +prefix-disk-random,range:uniform:1@8,3,70766.5,25.402701332945842,118.96633582781307,5010862080 +prefix-disk-random,range:uniform:10000@8,0,813.8,0.0,3910.2973703612683,10312994816 +prefix-disk-random,range:uniform:10000@8,3,912.4,12.11599901695748,3859.710653222271,11551866880 +prefix-disk-common,point:uniform@8,0,166767.1,0.0,6.629322760954632,2942513152 +prefix-disk-common,point:uniform@8,3,137171.0,-17.74696567848215,6.595905989385899,2419056640 +prefix-disk-common,range:uniform:1@8,0,67364.5,0.0,124.38620345685463,4767051776 +prefix-disk-common,range:uniform:1@8,3,56813.9,-15.661958449925406,147.16173499200934,4020363264 +prefix-disk-common,range:uniform:10000@8,0,899.2,0.0,3836.7437722419927,11408752640 +prefix-disk-common,range:uniform:10000@8,3,812.8,-9.608540925266917,3834.399606299213,10284527616 +prefix-resident-random,point:uniform@8,0,4089596.1,0.0,1.955655773286237,0 +prefix-resident-random,point:uniform@8,3,3861855.4,-5.568782208101187,2.0713343968861757,0 +prefix-resident-random,range:uniform:1@8,0,987903.4,0.0,8.096649643019639,0 +prefix-resident-random,range:uniform:1@8,3,1027722.4,4.0306572484718695,7.782304346965907,0 +prefix-resident-random,range:uniform:10000@8,0,4617.6,0.0,1732.1976395856643,0 +prefix-resident-random,range:uniform:10000@8,3,4063.2,-12.006237006237019,1968.7448728465956,0 +prefix-resident-random,ow:uniform@8,0,2181154.0,0.0,3.049805026119027,1722953728 +prefix-resident-random,ow:uniform@8,3,2346979.3,7.602640620515544,3.0134031679362994,2000707584 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/feature-summaries.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/feature-summaries.json new file mode 100644 index 000000000..4d9a23e69 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/feature-summaries.json @@ -0,0 +1,354 @@ +{ + "hash": [ + { + "profile": "main", + "limit": 1, + "samples": 2, + "ns_per_query_mean": 27787.25, + "ns_per_query_min": 26622.0, + "ns_per_query_max": 28952.5, + "latency_delta_main_pct": 0.0, + "visited_mean": 16404.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + }, + { + "profile": "filtered-ranges", + "limit": 1, + "samples": 2, + "ns_per_query_mean": 26204.55, + "ns_per_query_min": 25561.8, + "ns_per_query_max": 26847.3, + "latency_delta_main_pct": -5.6957777397907305, + "visited_mean": 1000.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + }, + { + "profile": "main", + "limit": 2, + "samples": 2, + "ns_per_query_mean": 24743.4, + "ns_per_query_min": 23851.0, + "ns_per_query_max": 25635.8, + "latency_delta_main_pct": 0.0, + "visited_mean": 48404.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + }, + { + "profile": "filtered-ranges", + "limit": 2, + "samples": 2, + "ns_per_query_mean": 20609.85, + "ns_per_query_min": 20525.1, + "ns_per_query_max": 20694.6, + "latency_delta_main_pct": -16.70566696573633, + "visited_mean": 2000.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + }, + { + "profile": "main", + "limit": 10, + "samples": 2, + "ns_per_query_mean": 33161.2, + "ns_per_query_min": 32551.2, + "ns_per_query_max": 33771.2, + "latency_delta_main_pct": 0.0, + "visited_mean": 304404.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + }, + { + "profile": "filtered-ranges", + "limit": 10, + "samples": 2, + "ns_per_query_mean": 33346.8, + "ns_per_query_min": 33010.8, + "ns_per_query_max": 33682.8, + "latency_delta_main_pct": 0.5596902404014559, + "visited_mean": 10000.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + }, + { + "profile": "main", + "limit": 100, + "samples": 2, + "ns_per_query_mean": 152074.95, + "ns_per_query_min": 150518.6, + "ns_per_query_max": 153631.3, + "latency_delta_main_pct": 0.0, + "visited_mean": 3184404.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + }, + { + "profile": "filtered-ranges", + "limit": 100, + "samples": 2, + "ns_per_query_mean": 137488.2, + "ns_per_query_min": 136036.1, + "ns_per_query_max": 138940.3, + "latency_delta_main_pct": -9.59181640368778, + "visited_mean": 100000.0, + "verified": true, + "verification_kind": "successful process with harness assertions and matching result checksums" + } + ], + "barrier": [ + { + "workload": "barrier", + "phase": "wal0-workers0-sync", + "version": "main", + "samples": 2, + "ops_s_mean": 35984.341, + "ops_s_min": 31071.613, + "ops_s_max": 40897.069, + "baseline_ops_s_mean": 35984.341, + "baseline_ops_s_min": 31071.613, + "baseline_ops_s_max": 40897.069, + "delta_pct": 0.0, + "ranges_overlap": true, + "launch_p99_us": 18830.339, + "completion_p99_us": 18830.339, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 9.038776397705078, + "read_bytes_update": 0.0, + "write_bytes_update": 5924.65625 + }, + { + "workload": "barrier", + "phase": "wal0-workers0-sync", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 58274.859500000006, + "ops_s_min": 57551.641, + "ops_s_max": 58998.078, + "baseline_ops_s_mean": 35984.341, + "baseline_ops_s_min": 31071.613, + "baseline_ops_s_max": 40897.069, + "delta_pct": 61.945051321073265, + "ranges_overlap": false, + "launch_p99_us": 15769.339, + "completion_p99_us": 15769.339, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 8.89599609375, + "read_bytes_update": 0.03125, + "write_bytes_update": 5924.65625 + }, + { + "workload": "barrier", + "phase": "wal0-workers0-async", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 59874.4315, + "ops_s_min": 59568.233, + "ops_s_max": 60180.63, + "baseline_ops_s_mean": 35984.341, + "baseline_ops_s_min": 31071.613, + "baseline_ops_s_max": 40897.069, + "delta_pct": 66.39024041040517, + "ranges_overlap": false, + "launch_p99_us": 0.9764999999999999, + "completion_p99_us": 14594.8035, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 8.942153930664062, + "read_bytes_update": 0.0, + "write_bytes_update": 5924.65625 + }, + { + "workload": "barrier", + "phase": "wal0-workers1-sync", + "version": "main", + "samples": 2, + "ops_s_mean": 32877.4345, + "ops_s_min": 32685.772, + "ops_s_max": 33069.097, + "baseline_ops_s_mean": 32877.4345, + "baseline_ops_s_min": 32685.772, + "baseline_ops_s_max": 33069.097, + "delta_pct": 0.0, + "ranges_overlap": true, + "launch_p99_us": 21590.944499999998, + "completion_p99_us": 21590.944499999998, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 9.591472625732422, + "read_bytes_update": 0.046875, + "write_bytes_update": 5944.890625 + }, + { + "workload": "barrier", + "phase": "wal0-workers1-sync", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 32816.2485, + "ops_s_min": 32566.888, + "ops_s_max": 33065.609, + "baseline_ops_s_mean": 32877.4345, + "baseline_ops_s_min": 32685.772, + "baseline_ops_s_max": 33069.097, + "delta_pct": -0.18610332871319413, + "ranges_overlap": true, + "launch_p99_us": 21671.515, + "completion_p99_us": 21671.515, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 9.660575866699219, + "read_bytes_update": 0.015625, + "write_bytes_update": 5946.984375 + }, + { + "workload": "barrier", + "phase": "wal0-workers1-async", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 32623.6835, + "ops_s_min": 31925.049, + "ops_s_max": 33322.318, + "baseline_ops_s_mean": 32877.4345, + "baseline_ops_s_min": 32685.772, + "baseline_ops_s_max": 33069.097, + "delta_pct": -0.7718090047445836, + "ranges_overlap": true, + "launch_p99_us": 2.8975, + "completion_p99_us": 23050.2955, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 9.739543914794922, + "read_bytes_update": 0.03125, + "write_bytes_update": 5946.421875 + }, + { + "workload": "barrier", + "phase": "wal1-workers0-sync", + "version": "main", + "samples": 2, + "ops_s_mean": 63924.082500000004, + "ops_s_min": 63287.752, + "ops_s_max": 64560.413, + "baseline_ops_s_mean": 63924.082500000004, + "baseline_ops_s_min": 63287.752, + "baseline_ops_s_max": 64560.413, + "delta_pct": 0.0, + "ranges_overlap": true, + "launch_p99_us": 4813.8705, + "completion_p99_us": 4813.8705, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 1.2700424194335938, + "read_bytes_update": 0.0, + "write_bytes_update": 206.3828125 + }, + { + "workload": "barrier", + "phase": "wal1-workers0-sync", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 127121.751, + "ops_s_min": 60090.385, + "ops_s_max": 194153.117, + "baseline_ops_s_mean": 63924.082500000004, + "baseline_ops_s_min": 63287.752, + "baseline_ops_s_max": 64560.413, + "delta_pct": 98.86363015065565, + "ranges_overlap": true, + "launch_p99_us": 4118.6775, + "completion_p99_us": 4118.6775, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 1.2528772354125977, + "read_bytes_update": 0.0, + "write_bytes_update": 206.3828125 + }, + { + "workload": "barrier", + "phase": "wal1-workers0-async", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 236974.144, + "ops_s_min": 200297.973, + "ops_s_max": 273650.315, + "baseline_ops_s_mean": 63924.082500000004, + "baseline_ops_s_min": 63287.752, + "baseline_ops_s_max": 64560.413, + "delta_pct": 270.7118424421656, + "ranges_overlap": false, + "launch_p99_us": 3.5060000000000002, + "completion_p99_us": 2190.8725, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 1.2635889053344727, + "read_bytes_update": 0.0, + "write_bytes_update": 206.3828125 + }, + { + "workload": "barrier", + "phase": "wal1-workers1-sync", + "version": "main", + "samples": 2, + "ops_s_mean": 62594.769, + "ops_s_min": 61606.519, + "ops_s_max": 63583.019, + "baseline_ops_s_mean": 62594.769, + "baseline_ops_s_min": 61606.519, + "baseline_ops_s_max": 63583.019, + "delta_pct": 0.0, + "ranges_overlap": true, + "launch_p99_us": 5467.197, + "completion_p99_us": 5467.197, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 1.2778234481811523, + "read_bytes_update": 0.0, + "write_bytes_update": 206.6484375 + }, + { + "workload": "barrier", + "phase": "wal1-workers1-sync", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 68395.2785, + "ops_s_min": 67544.975, + "ops_s_max": 69245.582, + "baseline_ops_s_mean": 62594.769, + "baseline_ops_s_min": 61606.519, + "baseline_ops_s_max": 63583.019, + "delta_pct": 9.266763968727165, + "ranges_overlap": false, + "launch_p99_us": 4940.577, + "completion_p99_us": 4940.577, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 1.2629365921020508, + "read_bytes_update": 0.0, + "write_bytes_update": 206.6484375 + }, + { + "workload": "barrier", + "phase": "wal1-workers1-async", + "version": "async-durable-barrier", + "samples": 2, + "ops_s_mean": 79283.9895, + "ops_s_min": 78489.093, + "ops_s_max": 80078.886, + "baseline_ops_s_mean": 62594.769, + "baseline_ops_s_min": 61606.519, + "baseline_ops_s_max": 63583.019, + "delta_pct": 26.66232461054372, + "ranges_overlap": false, + "launch_p99_us": 6.167, + "completion_p99_us": 4128.316, + "verified": true, + "verification_kind": "crash after completed final barrier, reopen and full key/value readback", + "cpu_us_update": 1.3590545654296875, + "read_bytes_update": 0.0, + "write_bytes_update": 206.6484375 + } + ] +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.csv new file mode 100644 index 000000000..4a1a55dbf --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +branch-prefix,disk,0,0,load:random,1,0,2000000,2000000,3.203,624472.2,0.568,1.648,22.272,33045.745,1.551,2.589,772553.9,220004352,476119040,110.00,238.06,nan,nan,nan,nan,nan,0,0.0,3.203,0.231,3.433,0.092,31068160,74362880,1.6783,3250065408,550690816,0.011,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.log new file mode 100644 index 000000000..47980c678 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-common.log @@ -0,0 +1,8 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-common.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.011 s +phase load:random: T=1 dist=random (fixed count) +close took 0.231 s +== load:random T=1 ops=2000000 secs= 3.20 ops/s= 624472 lat us p50=0.57 p99=1.65 p99.9=22.27 max=33045.7 mean=1.55 + cpu=2.59s ops/cpu-s=772554 rd=110.0 B/op wr=238.1 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=3.20s drain(close)=0.23s total=3.43s drain_cpu=0.09s drain_rd=31068160 drain_wr=74362880 wamp=1.678 db_apparent=3250065408 db_alloc=550690816 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.csv new file mode 100644 index 000000000..4e2eb810d --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +branch-prefix,disk,0,0,load:random,1,0,2000000,2000000,4.028,496567.7,0.552,1.520,19.200,43517.444,1.842,3.062,653156.1,345690112,752869376,172.85,376.43,nan,nan,nan,nan,nan,0,0.0,4.028,0.307,4.335,0.115,45817856,81063936,2.5425,3671592960,834170880,0.020,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.log new file mode 100644 index 000000000..327ae95f9 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-branch-prefix-random.log @@ -0,0 +1,8 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-random.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.020 s +phase load:random: T=1 dist=random (fixed count) +close took 0.307 s +== load:random T=1 ops=2000000 secs= 4.03 ops/s= 496568 lat us p50=0.55 p99=1.52 p99.9=19.20 max=43517.4 mean=1.84 + cpu=3.06s ops/cpu-s=653156 rd=172.8 B/op wr=376.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=4.03s drain(close)=0.31s total=4.34s drain_cpu=0.12s drain_rd=45817856 drain_wr=81063936 wamp=2.542 db_apparent=3671592960 db_alloc=834170880 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.csv new file mode 100644 index 000000000..47cb035cc --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,load:random,1,0,2000000,2000000,3.508,570177.3,0.552,1.648,25.344,60061.189,1.704,2.667,749838.5,347615232,752930816,173.81,376.47,nan,nan,nan,nan,nan,0,0.0,3.508,0.262,3.769,0.097,45633536,81440768,2.5438,3671330816,834621440,0.010,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.log new file mode 100644 index 000000000..48f0dbad9 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-common.log @@ -0,0 +1,8 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-common.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.010 s +phase load:random: T=1 dist=random (fixed count) +close took 0.262 s +== load:random T=1 ops=2000000 secs= 3.51 ops/s= 570177 lat us p50=0.55 p99=1.65 p99.9=25.34 max=60061.2 mean=1.70 + cpu=2.67s ops/cpu-s=749839 rd=173.8 B/op wr=376.5 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=3.51s drain(close)=0.26s total=3.77s drain_cpu=0.10s drain_rd=45633536 drain_wr=81440768 wamp=2.544 db_apparent=3671330816 db_alloc=834621440 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.csv new file mode 100644 index 000000000..52bf9d262 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,load:random,1,0,2000000,2000000,3.993,500818.6,0.552,1.584,16.640,69283.628,1.827,2.960,675641.9,351236096,749301760,175.62,374.65,nan,nan,nan,nan,nan,0,0.0,3.993,0.306,4.300,0.107,46366720,83800064,2.5399,3671592960,833347584,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.log new file mode 100644 index 000000000..8ef3965d0 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/disk-main-random.log @@ -0,0 +1,8 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-random.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.008 s +phase load:random: T=1 dist=random (fixed count) +close took 0.306 s +== load:random T=1 ops=2000000 secs= 3.99 ops/s= 500819 lat us p50=0.55 p99=1.58 p99.9=16.64 max=69283.6 mean=1.83 + cpu=2.96s ops/cpu-s=675642 rd=175.6 B/op wr=374.7 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=3.99s drain(close)=0.31s total=4.30s drain_cpu=0.11s drain_rd=46366720 drain_wr=83800064 wamp=2.540 db_apparent=3671592960 db_alloc=833347584 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/manifest.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/manifest.json new file mode 100644 index 000000000..0b2f33e9b --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/manifest.json @@ -0,0 +1,531 @@ +{ + "mode": "fixtures", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "io": "O_DIRECT", + "cpu_affinity": "0-11", + "scope": "Updated feature branches versus fresh main; not an isolation of merge cost", + "runner_sha256": "776d2ee23705f3a60a54f4e78b4f305a24d4a124eeecfe75dfacf5a90e4329c5", + "runs": [ + { + "label": "resident-main-common", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-common.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-common.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905954.9236379, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791905955.3385847, + "log_sha256": "a47d1404ca64590e9328650770b461a74beede07946a715b48cba9efe68aeff1", + "process_cpu_s": 0.260466, + "process_read_bytes": 24576, + "process_write_bytes": 37306368, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-common.db", + "fixture_sha256": "f46e09ff5cf4059f0d4b8e82c586323274ca1af83a3e6197389ebb28aabda858", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + { + "label": "resident-branch-prefix-common", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-common.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-common.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905955.5802932, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791905955.9456637, + "log_sha256": "a5f29c881b0aea3aa1d4796ff0aa76f008d8c77255987e1dd998d611a06167db", + "process_cpu_s": 0.265332, + "process_read_bytes": 16384, + "process_write_bytes": 26025984, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-common.db", + "fixture_sha256": "f37cb48c6fb00b08adccea6eebc85a25e2c12f3ada74432d96dd06abb1eaaa30", + "allocated_bytes": 26128384, + "apparent_bytes": 207360000 + }, + { + "label": "resident-main-random", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-random.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-random.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905956.151964, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791905956.6169322, + "log_sha256": "6e5d5621436b2a3040731eec91b9115fa68fbe1c1efa5a79511abc3c9df1543f", + "process_cpu_s": 0.3098989999999998, + "process_read_bytes": 49152, + "process_write_bytes": 37306368, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-random.db", + "fixture_sha256": "33cccf3217cbc9ae09c4a0a2ac62c0bacb8f6fa1858a0c1957a702d8e2f078b8", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + { + "label": "resident-branch-prefix-random", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-random.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-random.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905956.853846, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791905957.3194685, + "log_sha256": "8b1cf60c008ef9d5236f48e4ba5bec86187504809e77e5492da049123147e707", + "process_cpu_s": 0.3124360000000001, + "process_read_bytes": 8192, + "process_write_bytes": 37306368, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-random.db", + "fixture_sha256": "8cca25877ee38aef2c506b684adb204c7c347d6ebc68850441050aff549651dd", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + { + "label": "disk-main-common", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-common.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-common.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905967.4049842, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791905971.229656, + "log_sha256": "da29089bd2140d5730ff76b4639a024cb8b1b329befc7188ae63815d98cf030c", + "process_cpu_s": 2.788083999999999, + "process_read_bytes": 393248768, + "process_write_bytes": 834424832, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-common.db", + "fixture_sha256": "830b8a8131e519c61ce4f699bdf857dff08a5be7071e6be4a3065d17d5b9dc58", + "allocated_bytes": 834621440, + "apparent_bytes": 3671330816 + }, + { + "label": "disk-branch-prefix-common", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-common.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-common.csv", + "--vtag", + "branch-prefix", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905974.3834143, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791905977.8563876, + "log_sha256": "b11a5b04f6ddd933f929c3865df4e2bd06ce651a72bf7e584dd5390996a3e75e", + "process_cpu_s": 2.7054929999999997, + "process_read_bytes": 251072512, + "process_write_bytes": 550535168, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-common.db", + "fixture_sha256": "878befa71de3feeeb30ca8cf2837ba163e5495378a72f3332b4f495ca3234b08", + "allocated_bytes": 550690816, + "apparent_bytes": 3250065408 + }, + { + "label": "disk-main-random", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-random.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-random.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905980.6008859, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791905985.4755645, + "log_sha256": "9f44a160497eabf26a2aa9695eaa55dd74985dd18d52d45ad58f87979dd97275", + "process_cpu_s": 3.628277000000001, + "process_read_bytes": 397602816, + "process_write_bytes": 833155072, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-random.db", + "fixture_sha256": "ca874e9d980e52ea52e0ccf8f41b266a6263675b49dfefc880e5c1bbabd27b63", + "allocated_bytes": 833347584, + "apparent_bytes": 3671592960 + }, + { + "label": "disk-branch-prefix-random", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-random.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-random.csv", + "--vtag", + "branch-prefix", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures", + "load:random" + ], + "started": 1791905988.720692, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791905993.5974793, + "log_sha256": "1c81c74b950464070a27ea33b414070bdd799e5ee1ef7a75c60f45110f6dcd21", + "process_cpu_s": 3.654647000000002, + "process_read_bytes": 391507968, + "process_write_bytes": 833986560, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-random.db", + "fixture_sha256": "16b2a30021c7181c624f3fd92abee235b4443bf13e228376e34ab11e68224549", + "allocated_bytes": 834170880, + "apparent_bytes": 3671592960 + } + ], + "complete": true +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.csv new file mode 100644 index 000000000..ec5dd2c1d --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +branch-prefix,resident,0,0,load:random,1,0,200000,200000,0.232,862437.4,0.552,2.528,6.976,37785.603,1.125,0.232,863129.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.232,0.119,0.351,0.026,8192,25972736,0.7919,207360000,26128384,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.log new file mode 100644 index 000000000..46675d244 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-common.log @@ -0,0 +1,8 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-common.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.008 s +phase load:random: T=1 dist=random (fixed count) +close took 0.119 s +== load:random T=1 ops=200000 secs= 0.23 ops/s= 862437 lat us p50=0.55 p99=2.53 p99.9=6.98 max=37785.6 mean=1.12 + cpu=0.23s ops/cpu-s=863129 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.23s drain(close)=0.12s total=0.35s drain_cpu=0.03s drain_rd=8192 drain_wr=25972736 wamp=0.792 db_apparent=207360000 db_alloc=26128384 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.csv new file mode 100644 index 000000000..395198a17 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +branch-prefix,resident,0,0,load:random,1,0,200000,200000,0.244,820046.6,0.520,2.400,4.160,34532.169,1.095,0.244,820674.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.244,0.115,0.359,0.021,8192,37253120,1.1358,237375488,37408768,0.027,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.log new file mode 100644 index 000000000..eb8daf3e3 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-branch-prefix-random.log @@ -0,0 +1,8 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-random.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.027 s +phase load:random: T=1 dist=random (fixed count) +close took 0.115 s +== load:random T=1 ops=200000 secs= 0.24 ops/s= 820047 lat us p50=0.52 p99=2.40 p99.9=4.16 max=34532.2 mean=1.09 + cpu=0.24s ops/cpu-s=820674 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.24s drain(close)=0.12s total=0.36s drain_cpu=0.02s drain_rd=8192 drain_wr=37253120 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.csv new file mode 100644 index 000000000..01af5a0ff --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random,1,0,200000,200000,0.227,882137.6,0.552,2.464,5.952,32714.139,1.100,0.227,882266.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.227,0.138,0.365,0.025,20480,37253120,1.1358,237375488,37408768,0.009,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.log new file mode 100644 index 000000000..246638821 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-common.log @@ -0,0 +1,8 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-common.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.009 s +phase load:random: T=1 dist=random (fixed count) +close took 0.138 s +== load:random T=1 ops=200000 secs= 0.23 ops/s= 882138 lat us p50=0.55 p99=2.46 p99.9=5.95 max=32714.1 mean=1.10 + cpu=0.23s ops/cpu-s=882266 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.23s drain(close)=0.14s total=0.36s drain_cpu=0.02s drain_rd=20480 drain_wr=37253120 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.csv new file mode 100644 index 000000000..c271d6019 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random,1,0,200000,200000,0.243,822358.1,0.520,2.400,4.672,32858.527,1.086,0.243,822750.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.243,0.129,0.372,0.024,49152,37253120,1.1358,237375488,37408768,0.029,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.log new file mode 100644 index 000000000..4de3260b4 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/fixtures/resident-main-random.log @@ -0,0 +1,8 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-random.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.029 s +phase load:random: T=1 dist=random (fixed count) +close took 0.129 s +== load:random T=1 ops=200000 secs= 0.24 ops/s= 822358 lat us p50=0.52 p99=2.40 p99.9=4.67 max=32858.5 mean=1.09 + cpu=0.24s ops/cpu-s=822751 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.24s drain(close)=0.13s total=0.37s drain_cpu=0.02s drain_rd=49152 drain_wr=37253120 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/host.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/host.json new file mode 100644 index 000000000..989b69784 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/host.json @@ -0,0 +1,7 @@ +{ + "cpu": "{\n \"lscpu\": [\n {\n \"field\": \"Architecture:\",\n \"data\": \"x86_64\"\n },{\n \"field\": \"CPU op-mode(s):\",\n \"data\": \"32-bit, 64-bit\"\n },{\n \"field\": \"Address sizes:\",\n \"data\": \"46 bits physical, 48 bits virtual\"\n },{\n \"field\": \"Byte Order:\",\n \"data\": \"Little Endian\"\n },{\n \"field\": \"CPU(s):\",\n \"data\": \"20\"\n },{\n \"field\": \"On-line CPU(s) list:\",\n \"data\": \"0-19\"\n },{\n \"field\": \"Vendor ID:\",\n \"data\": \"GenuineIntel\"\n },{\n \"field\": \"Model name:\",\n \"data\": \"12th Gen Intel(R) Core(TM) i7-12800H\"\n },{\n \"field\": \"CPU family:\",\n \"data\": \"6\"\n },{\n \"field\": \"Model:\",\n \"data\": \"154\"\n },{\n \"field\": \"Thread(s) per core:\",\n \"data\": \"2\"\n },{\n \"field\": \"Core(s) per socket:\",\n \"data\": \"14\"\n },{\n \"field\": \"Socket(s):\",\n \"data\": \"1\"\n },{\n \"field\": \"Stepping:\",\n \"data\": \"3\"\n },{\n \"field\": \"CPU(s) scaling MHz:\",\n \"data\": \"31%\"\n },{\n \"field\": \"CPU max MHz:\",\n \"data\": \"4800.0000\"\n },{\n \"field\": \"CPU min MHz:\",\n \"data\": \"400.0000\"\n },{\n \"field\": \"BogoMIPS:\",\n \"data\": \"5606.40\"\n },{\n \"field\": \"Flags:\",\n \"data\": \"fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves split_lock_detect user_shstk avx_vnni dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp hwp_pkg_req hfi vnmi umip pku ospke waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize pconfig arch_lbr ibt flush_l1d arch_capabilities\"\n },{\n \"field\": \"Virtualization:\",\n \"data\": \"VT-x\"\n },{\n \"field\": \"L1d cache:\",\n \"data\": \"544 KiB (14 instances)\"\n },{\n \"field\": \"L1i cache:\",\n \"data\": \"704 KiB (14 instances)\"\n },{\n \"field\": \"L2 cache:\",\n \"data\": \"11.5 MiB (8 instances)\"\n },{\n \"field\": \"L3 cache:\",\n \"data\": \"24 MiB (1 instance)\"\n },{\n \"field\": \"NUMA node(s):\",\n \"data\": \"1\"\n },{\n \"field\": \"NUMA node0 CPU(s):\",\n \"data\": \"0-19\"\n },{\n \"field\": \"Vulnerability Gather data sampling:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Indirect target selection:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Itlb multihit:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability L1tf:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Mds:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Meltdown:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Mmio stale data:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Reg file data sampling:\",\n \"data\": \"Mitigation; Clear Register File\"\n },{\n \"field\": \"Vulnerability Retbleed:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Spec rstack overflow:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Spec store bypass:\",\n \"data\": \"Mitigation; Speculative Store Bypass disabled via prctl\"\n },{\n \"field\": \"Vulnerability Spectre v1:\",\n \"data\": \"Mitigation; usercopy/swapgs barriers and __user pointer sanitization\"\n },{\n \"field\": \"Vulnerability Spectre v2:\",\n \"data\": \"Mitigation; Enhanced / Automatic IBRS; IBPB conditional; PBRSB-eIBRS SW sequence; BHI BHI_DIS_S\"\n },{\n \"field\": \"Vulnerability Srbds:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Tsa:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Tsx async abort:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Vmscape:\",\n \"data\": \"Mitigation; IBPB before exit to userspace\"\n }\n ]\n}", + "kernel": "Linux snafu 6.12.107+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.107-1 (2026-08-29) x86_64 GNU/Linux", + "compiler": "cc (Debian 14.2.0-19) 14.2.0\nCopyright (C) 2024 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions. There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "space": "Filesystem 1B-blocks Used Available Use% Mounted on\n/dev/mapper/snafu-root_crypt 830432124928 706181464064 81991790592 90% /home/rob/projects/splinterdb" +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/insert_benchmark.c b/benchmarks/results-20261013/main-7bb5fab/benchmarks/insert_benchmark.c new file mode 100644 index 000000000..7da615cbe --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/insert_benchmark.c @@ -0,0 +1,1002 @@ +// Copyright 2026 VMware, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/* Concurrent random insertion and point queries, sampled independently. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splinterdb/default_data_config.h" +#include "splinterdb/splinterdb.h" +#ifndef KVBENCH_NO_TRACE +# include "platform_trace.h" +#endif +#include "platform_threads.h" + +#define GIB (UINT64_C(1) << 30) +#define MAX_WORKERS 64 +#define MAX_RECORD_PART 1024 +#define HIST_SUB_BITS 5 +#define HIST_SUB (1u << HIST_SUB_BITS) +#define HIST_BUCKETS (64 * HIST_SUB) + +typedef struct latency_histogram { + uint64_t buckets[HIST_BUCKETS]; + uint64_t count; + uint64_t sum_ns; + uint64_t max_ns; +} latency_histogram; + +typedef struct options { + const char *filename; + const char *csv; + const char *summary; + const char *trace; + uint64_t records, data_gib, cache_mib, disk_gib, seed, id_base; + uint64_t inserts, queries, memtable_bg, normal_bg, memtable_mib; + uint64_t key_size, value_size, report_ms, seconds, min_free_gib; + uint64_t queue_scale, barrier_ms, target_insert_ops_s; + uint64_t log_group_size_pages; + bool full_query_range, direct, use_log, open_existing; +} options; + +typedef struct benchmark benchmark; +typedef struct worker { + _Alignas(64) atomic_uint_fast64_t completed; + atomic_uint_fast64_t hits, max_ns, response_max_ns, active_since_ns; + atomic_bool done; + pthread_t thread; + benchmark *bench; + uint64_t index; + bool query; + latency_histogram service_latency; + latency_histogram response_latency; +} worker; + +struct benchmark { + options opt; + splinterdb *db; + atomic_bool start, stop; + uint64_t start_ns; + atomic_uint_fast64_t arrival_sequence; + atomic_int error; + worker workers[MAX_WORKERS]; + pthread_t barrier_thread; + atomic_bool barrier_started, barrier_done; + atomic_uint_fast64_t barrier_count, barrier_sum_ns, barrier_max_ns; +}; + +static volatile sig_atomic_t interrupted; + +static void +handle_signal(int signo) +{ + interrupted = signo; +} + +static uint64_t +now_ns(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000 + ts.tv_nsec; +} + +/* A bijection on 64-bit integers, so the random insertion keys are unique. */ +static uint64_t +mix(uint64_t x) +{ + x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9); + x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb); + return x ^ (x >> 31); +} + +static uint64_t +next_random(uint64_t *state) +{ + *state += UINT64_C(0x9e3779b97f4a7c15); + return mix(*state); +} + +static void +make_key(const options *opt, uint64_t id, char *key) +{ + uint64_t x = mix(id + opt->seed); + for (uint64_t i = 0; i < opt->key_size; i++) { + key[i] = (char)(x >> (56 - 8 * (i % 8))); + } +} + +static void +record_max(atomic_uint_fast64_t *slot, uint64_t ns) +{ + uint64_t old = atomic_load_explicit(slot, memory_order_relaxed); + while (old < ns + && !atomic_compare_exchange_weak_explicit( + slot, &old, ns, memory_order_relaxed, memory_order_relaxed)) + { + } +} + +static void +record_latency(worker *w, uint64_t ns) +{ + record_max(&w->max_ns, ns); +} + +static unsigned +histogram_index(uint64_t value) +{ + if (value < HIST_SUB) { + return (unsigned)value; + } + unsigned exponent = 63 - __builtin_clzll(value); + unsigned sub = + (unsigned)((value >> (exponent - HIST_SUB_BITS)) & (HIST_SUB - 1)); + return (exponent - HIST_SUB_BITS + 1) * HIST_SUB + sub; +} + +static uint64_t +histogram_value(unsigned index) +{ + if (index < HIST_SUB) { + return index; + } + unsigned exponent = index / HIST_SUB + HIST_SUB_BITS - 1; + unsigned sub = index % HIST_SUB; + uint64_t low = + (UINT64_C(1) << exponent) | ((uint64_t)sub << (exponent - HIST_SUB_BITS)); + uint64_t width = UINT64_C(1) << (exponent - HIST_SUB_BITS); + return low + width / 2; +} + +static void +histogram_add(latency_histogram *histogram, uint64_t value) +{ + histogram->buckets[histogram_index(value)]++; + histogram->count++; + histogram->sum_ns += value; + histogram->max_ns = MAX(histogram->max_ns, value); +} + +static void +histogram_merge(latency_histogram *result, const latency_histogram *source) +{ + for (unsigned i = 0; i < HIST_BUCKETS; i++) { + result->buckets[i] += source->buckets[i]; + } + result->count += source->count; + result->sum_ns += source->sum_ns; + result->max_ns = MAX(result->max_ns, source->max_ns); +} + +static double +histogram_percentile_ms(const latency_histogram *histogram, double percentile) +{ + if (histogram->count == 0) { + return 0; + } + uint64_t target = (uint64_t)(percentile * histogram->count); + if (target == 0) { + target = 1; + } + uint64_t cumulative = 0; + for (unsigned i = 0; i < HIST_BUCKETS; i++) { + cumulative += histogram->buckets[i]; + if (cumulative >= target) { + return histogram_value(i) / 1e6; + } + } + return histogram->max_ns / 1e6; +} + +static void +wait_until(benchmark *b, uint64_t deadline) +{ + while (!atomic_load_explicit(&b->stop, memory_order_relaxed)) { + uint64_t now = now_ns(); + if (now >= deadline) { + return; + } + uint64_t remaining = deadline - now; + if (remaining > UINT64_C(10000000)) { + remaining = UINT64_C(10000000); + } + struct timespec delay = {.tv_sec = remaining / UINT64_C(1000000000), + .tv_nsec = remaining % UINT64_C(1000000000)}; + nanosleep(&delay, NULL); + } +} + +static void * +run_worker(void *arg) +{ + worker *w = arg; + benchmark *b = w->bench; + const options *o = &b->opt; + char key[MAX_RECORD_PART], value[MAX_RECORD_PART]; + memset(value, 'v', o->value_size); + int rc = platform_register_thread(); + if (rc) { + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + atomic_store(&w->done, true); + return NULL; + } + splinterdb_lookup_result result; + fprintf(stderr, + "worker=%lu kind=%s tid=%lu os_tid=%d\n", + w->index, + w->query ? "query" : "insert", + platform_get_tid(), + gettid()); + if (w->query) { + splinterdb_lookup_result_init( + b->db, &result, SPLINTERDB_LOOKUP_VALUE, sizeof(value), value); + } + while (!atomic_load_explicit(&b->start, memory_order_acquire)) { + struct timespec delay = {.tv_nsec = 1000000}; + nanosleep(&delay, NULL); + } + uint64_t completed = 0, hits = 0; + uint64_t random = o->seed + w->index + 1; + while (!atomic_load_explicit(&b->stop, memory_order_relaxed)) { + uint64_t scheduled = 0; + uint64_t arrival = UINT64_MAX; + if (!w->query && o->target_insert_ops_s != 0) { + arrival = atomic_fetch_add_explicit( + &b->arrival_sequence, 1, memory_order_relaxed); + if (arrival >= o->records) { + break; + } + scheduled = b->start_ns + + (uint64_t)((__uint128_t)arrival * UINT64_C(1000000000) + / o->target_insert_ops_s); + wait_until(b, scheduled); + if (atomic_load_explicit(&b->stop, memory_order_relaxed)) { + break; + } + } + uint64_t id; + if (!w->query) { + uint64_t offset = o->target_insert_ops_s != 0 + ? arrival + : completed * o->inserts + w->index; + if (offset >= o->records) { + break; + } + id = o->id_base + offset; + } else if (o->full_query_range) { + id = o->id_base + next_random(&random) % o->records; + } else { + uint64_t source = next_random(&random) % o->inserts; + uint64_t available = atomic_load_explicit( + &b->workers[source].completed, memory_order_acquire); + if (!available) { + struct timespec delay = {.tv_nsec = 100000}; + nanosleep(&delay, NULL); + continue; + } + id = o->id_base + (next_random(&random) % available) * o->inserts + + source; + } + make_key(o, id, key); + uint64_t start = now_ns(); + atomic_store_explicit(&w->active_since_ns, start, memory_order_relaxed); + if (w->query) { + rc = splinterdb_lookup(b->db, slice_create(o->key_size, key), &result); + if (!rc && splinterdb_lookup_found(&result)) { + hits++; + } + } else { + rc = splinterdb_insert(b->db, + slice_create(o->key_size, key), + slice_create(o->value_size, value), + NULL); + } + uint64_t end = now_ns(); + record_latency(w, end - start); + histogram_add(&w->service_latency, end - start); + if (!w->query) { + uint64_t response = scheduled == 0 ? end - start : end - scheduled; + histogram_add(&w->response_latency, response); + record_max(&w->response_max_ns, response); + } + atomic_store_explicit(&w->active_since_ns, 0, memory_order_relaxed); + if (rc) { + fprintf(stderr, "worker %lu: operation failed: %d\n", w->index, rc); + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + break; + } + completed++; + atomic_store_explicit(&w->hits, hits, memory_order_relaxed); + atomic_store_explicit(&w->completed, completed, memory_order_release); + } + if (w->query) { + splinterdb_lookup_result_deinit(&result); + } + platform_deregister_thread(); + atomic_store(&w->done, true); + return NULL; +} + +/* + * Dedicated thread that calls splinterdb_durable_barrier() on a fixed period, + * independent of insert/query progress. If a barrier call takes longer than + * the period, the next call follows immediately (no attempt to catch up on + * skipped slots). + */ +static void * +run_barrier(void *arg) +{ + benchmark *b = arg; + const options *o = &b->opt; + int rc = platform_register_thread(); + if (rc) { + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + atomic_store(&b->barrier_done, true); + return NULL; + } + while (!atomic_load_explicit(&b->start, memory_order_acquire)) { + struct timespec delay = {.tv_nsec = 1000000}; + nanosleep(&delay, NULL); + } + uint64_t period_ns = o->barrier_ms * UINT64_C(1000000); + uint64_t next = now_ns() + period_ns; + while (!atomic_load_explicit(&b->stop, memory_order_relaxed)) { + uint64_t now = now_ns(); + if (now < next) { + uint64_t remaining = next - now; + struct timespec delay = {.tv_sec = remaining / 1000000000, + .tv_nsec = remaining % 1000000000}; + nanosleep(&delay, NULL); + continue; + } + uint64_t start = now_ns(); +#ifdef KVBENCH_NO_DURABLE_BARRIER + rc = ENOTSUP; +#else + #ifdef HAVE_SENTINEL_NOTIFICATION + rc = splinterdb_durable_barrier(b->db, NULL); +#else + rc = splinterdb_durable_barrier(b->db); +#endif +#endif + uint64_t elapsed = now_ns() - start; + if (rc) { + fprintf(stderr, "barrier: durable_barrier failed: %d\n", rc); + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + break; + } + atomic_fetch_add_explicit(&b->barrier_count, 1, memory_order_relaxed); + atomic_fetch_add_explicit( + &b->barrier_sum_ns, elapsed, memory_order_relaxed); + record_max(&b->barrier_max_ns, elapsed); + next += period_ns; + } + platform_deregister_thread(); + atomic_store(&b->barrier_done, true); + return NULL; +} + +static void +usage(const char *name) +{ + fprintf( + stderr, + "Usage: %s --db NEW_IMAGE --csv NEW_CSV [options]\n" + " --open open an existing image instead of creating one\n" + " --id-base N first logical id inserted (default 0)\n" + " --data-gib N logical key+value GiB (default 60)\n" + " --records N override logical data target\n" + " --cache-mib N default 3072\n" + " --disk-gib N image capacity (default 512; grows lazily)\n" + " --inserters N default 8\n" + " --readers N default 8\n" + " --memtable-bg N default 1\n" + " --normal-bg N default 4\n" + " --memtable-mib N default 24\n" + " --key-size N default 16, minimum 8\n" + " --value-size N default 16\n" + " --query-range inserted|all (default inserted)\n" + " --queue-scale N foreground task threshold (default 100)\n" + " --report-ms N default 1000\n" + " --seconds N optional time limit (0 = no limit)\n" + " --target-insert-ops-s N aggregate open-loop arrival rate; " + "requires --seconds (default 0 = closed loop)\n" + " --summary NEW_CSV write aggregate latency percentiles\n" + " --min-free-gib N stop before filesystem fills (default 8)\n" + " --seed N default 1\n" + " --barrier-ms N call splinterdb_durable_barrier from a " + "dedicated thread every N ms (default 0 = disabled)\n" + " --log-group-size-pages N automatic durability threshold " + "(0 = default, UINT64_MAX = disabled)\n" + " --trace NEW_CSV trace internal tasks and waits (optional)\n" + " --direct use O_DIRECT (default buffered I/O)\n" + " --no-log disable WAL (default enabled)\n" + "Automatic checkpoints are disabled. Existing files are refused.\n" + "Load measurements exclude create, final drain and close.\n", + name); +} + +static bool +parse_number(const char *s, uint64_t *out) +{ + char *end; + errno = 0; + unsigned long long value = strtoull(s, &end, 10); + if (errno || s == end || *end || *s == '-') { + return false; + } + *out = value; + return true; +} + +static bool +parse_options(int argc, char **argv, options *o) +{ + *o = (options){.data_gib = 60, + .cache_mib = 3072, + .disk_gib = 512, + .seed = 1, + .inserts = 8, + .queries = 8, + .memtable_bg = 1, + .normal_bg = 4, + .memtable_mib = 24, + .key_size = 16, + .value_size = 16, + .report_ms = 1000, + .min_free_gib = 8, + .queue_scale = 100, + .use_log = true}; + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "--direct")) { + o->direct = true; + continue; + } + if (!strcmp(argv[i], "--no-log")) { + o->use_log = false; + continue; + } + if (!strcmp(argv[i], "--open")) { + o->open_existing = true; + continue; + } + if (i + 1 >= argc) { + return false; + } + const char *name = argv[i++], *value = argv[i]; + if (!strcmp(name, "--db")) { + o->filename = value; + continue; + } + if (!strcmp(name, "--csv")) { + o->csv = value; + continue; + } + if (!strcmp(name, "--summary")) { + o->summary = value; + continue; + } + if (!strcmp(name, "--trace")) { + o->trace = value; + continue; + } + if (!strcmp(name, "--query-range")) { + if (strcmp(value, "inserted") && strcmp(value, "all")) { + return false; + } + o->full_query_range = !strcmp(value, "all"); + continue; + } + struct { + const char *name; + uint64_t *value; + } numbers[] = { + {"--data-gib", &o->data_gib}, + {"--records", &o->records}, + {"--cache-mib", &o->cache_mib}, + {"--disk-gib", &o->disk_gib}, + {"--inserters", &o->inserts}, + {"--readers", &o->queries}, + {"--memtable-bg", &o->memtable_bg}, + {"--normal-bg", &o->normal_bg}, + {"--memtable-mib", &o->memtable_mib}, + {"--key-size", &o->key_size}, + {"--value-size", &o->value_size}, + {"--report-ms", &o->report_ms}, + {"--seconds", &o->seconds}, + {"--min-free-gib", &o->min_free_gib}, + {"--seed", &o->seed}, + {"--id-base", &o->id_base}, + {"--queue-scale", &o->queue_scale}, + {"--barrier-ms", &o->barrier_ms}, + {"--log-group-size-pages", &o->log_group_size_pages}, + {"--target-insert-ops-s", &o->target_insert_ops_s}, + }; + bool found = false; + for (size_t j = 0; j < sizeof(numbers) / sizeof(numbers[0]); j++) { + if (!strcmp(name, numbers[j].name)) { + if (!parse_number(value, numbers[j].value)) { + return false; + } + found = true; + break; + } + } + if (!found) { + return false; + } + } + if (!o->filename || !o->csv || !o->inserts || o->inserts > MAX_WORKERS + || o->queries > MAX_WORKERS - o->inserts || o->key_size < 8 + || o->key_size > MAX_RECORD_PART || o->value_size > MAX_RECORD_PART + || !o->report_ms || o->report_ms > 60000 || !o->cache_mib + || o->cache_mib > UINT64_MAX / (1 << 20) || !o->disk_gib + || o->disk_gib > INT64_MAX / GIB || o->data_gib > UINT64_MAX / GIB + || o->min_free_gib > UINT64_MAX / GIB || !o->memtable_mib + || o->memtable_mib > UINT64_MAX / (1 << 20) || o->memtable_bg > 32 + || o->normal_bg > 32 + || o->inserts + o->queries + o->memtable_bg + o->normal_bg + 1 + > MAX_WORKERS + || o->seconds > UINT64_MAX / 1000000000 + || o->barrier_ms > UINT64_MAX / 1000000 + || (o->target_insert_ops_s != 0 && (o->seconds == 0 || o->queries != 0))) + { + return false; + } +#ifdef KVBENCH_NO_DURABLE_BARRIER + if (o->barrier_ms != 0) { + return false; + } +#endif +#ifdef KVBENCH_NO_TRACE + if (o->trace != NULL) { + return false; + } +#endif + if (!o->records) { + o->records = o->data_gib * GIB / (o->key_size + o->value_size); + } + return o->records > 0 && o->records <= UINT64_MAX / MAX_WORKERS + && o->records <= UINT64_MAX / (o->key_size + o->value_size) + && o->id_base <= UINT64_MAX - o->records; +} + +static void +process_io(uint64_t *reads, uint64_t *writes) +{ + *reads = *writes = 0; + FILE *file = fopen("/proc/self/io", "r"); + if (!file) { + return; + } + char name[64]; + uint64_t value; + while (fscanf(file, "%63s %" SCNu64, name, &value) == 2) { + if (!strcmp(name, "read_bytes:")) { + *reads = value; + } + if (!strcmp(name, "write_bytes:")) { + *writes = value; + } + } + fclose(file); +} + +static int +write_summary(const benchmark *b, uint64_t inserted, double elapsed_s) +{ + const options *o = &b->opt; + if (o->summary == NULL) { + return 0; + } + + latency_histogram insert_service = {0}, insert_response = {0}; + latency_histogram query_service = {0}; + for (uint64_t i = 0; i < o->inserts + o->queries; i++) { + if (b->workers[i].query) { + histogram_merge(&query_service, &b->workers[i].service_latency); + } else { + histogram_merge(&insert_service, &b->workers[i].service_latency); + histogram_merge(&insert_response, &b->workers[i].response_latency); + } + } + + FILE *summary = fopen(o->summary, "wx"); + if (summary == NULL) { + return errno; + } + fprintf(summary, + "target_insert_ops_s,achieved_insert_ops_s,elapsed_s,inserted," + "insert_service_mean_ms,insert_service_p50_ms,insert_service_p99_ms," + "insert_service_p999_ms,insert_service_max_ms," + "insert_response_mean_ms,insert_response_p50_ms," + "insert_response_p99_ms,insert_response_p999_ms," + "insert_response_max_ms,query_service_mean_ms,query_service_p99_ms," + "query_service_max_ms\n"); + fprintf( + summary, + "%lu,%.6f,%.6f,%lu,%.6f,%.6f,%.6f,%.6f,%.6f," + "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f\n", + o->target_insert_ops_s, + elapsed_s == 0 ? 0 : inserted / elapsed_s, + elapsed_s, + inserted, + insert_service.count ? insert_service.sum_ns / 1e6 / insert_service.count + : 0, + histogram_percentile_ms(&insert_service, 0.50), + histogram_percentile_ms(&insert_service, 0.99), + histogram_percentile_ms(&insert_service, 0.999), + insert_service.max_ns / 1e6, + insert_response.count + ? insert_response.sum_ns / 1e6 / insert_response.count + : 0, + histogram_percentile_ms(&insert_response, 0.50), + histogram_percentile_ms(&insert_response, 0.99), + histogram_percentile_ms(&insert_response, 0.999), + insert_response.max_ns / 1e6, + query_service.count ? query_service.sum_ns / 1e6 / query_service.count + : 0, + histogram_percentile_ms(&query_service, 0.99), + query_service.max_ns / 1e6); + int rc = ferror(summary) ? EIO : 0; + if (fclose(summary) != 0 && rc == 0) { + rc = errno; + } + return rc; +} + +int +main(int argc, char **argv) +{ + benchmark b = {0}; + if (argc == 2 && !strcmp(argv[1], "--help")) { + usage(argv[0]); + return 0; + } + if (!parse_options(argc, argv, &b.opt)) { + usage(argv[0]); + return 2; + } + const options *o = &b.opt; + if (o->trace) { +#ifdef KVBENCH_NO_TRACE + return 2; +#else + int trace_rc = platform_trace_open(o->trace); + if (trace_rc) { + fprintf(stderr, "trace open failed: %s\n", strerror(trace_rc)); + return 1; + } +#endif + } + FILE *csv = fopen(o->csv, "wx"); + if (!csv) { + perror(o->csv); + return 1; + } + int fd = open(o->filename, + O_RDWR | O_CLOEXEC | (o->open_existing ? 0 : O_CREAT | O_EXCL), + 0600); + if (fd < 0) { + perror(o->filename); + fclose(csv); + return 1; + } + struct statvfs space; + if (fstatvfs(fd, &space) != 0 + || (uint64_t)space.f_bavail * space.f_frsize < o->min_free_gib * GIB) + { + fprintf(stderr, "Insufficient free space\n"); + close(fd); + fclose(csv); + return 1; + } + + data_config data_cfg; + default_data_config_init(&data_cfg); + splinterdb_config cfg = {.filename = o->filename, + .disk_size = o->disk_gib * GIB, + .cache_size = o->cache_mib * (1 << 20), + .data_cfg = &data_cfg, + .io_flags = O_RDWR | (o->direct ? O_DIRECT : 0), + .num_memtable_bg_threads = o->memtable_bg, + .num_normal_bg_threads = o->normal_bg, + .memtable_capacity = o->memtable_mib * (1 << 20), + .queue_scale_percent = o->queue_scale, + .use_log = o->use_log, + .checkpoint_log_size_bytes = UINT64_MAX, + .use_stats = true}; +#ifndef KVBENCH_NO_LOG_GROUP_LIMIT + cfg.log_group_size_pages = o->log_group_size_pages; +#else + if (o->log_group_size_pages != 0) { + fprintf(stderr, "This build has no automatic log-group limit\n"); + return 1; + } +#endif + platform_set_log_streams(stderr, stderr); + fprintf( + stderr, + "version=%s records=%lu key=%lu value=%lu cache_mib=%lu " + "disk_gib=%lu inserters=%lu readers=%lu memtable_bg=%lu normal_bg=%lu " + "memtable_mib=%lu queue_scale=%lu log=%d checkpoints=disabled " + "direct=%d query_range=%s seed=%lu report_ms=%lu barrier_ms=%lu " + "target_insert_ops_s=%lu id_base=%lu mode=%s\n", + splinterdb_get_version(), + o->records, + o->key_size, + o->value_size, + o->cache_mib, + o->disk_gib, + o->inserts, + o->queries, + o->memtable_bg, + o->normal_bg, + o->memtable_mib, + o->queue_scale, + o->use_log, + o->direct, + o->full_query_range ? "all" : "inserted", + o->seed, + o->report_ms, + o->barrier_ms, + o->target_insert_ops_s, + o->id_base, + o->open_existing ? "open" : "create"); + int rc = o->open_existing ? splinterdb_open(&cfg, &b.db) + : splinterdb_create(&cfg, &b.db); + if (rc) { + fprintf( + stderr, "%s failed: %d\n", o->open_existing ? "open" : "create", rc); + close(fd); + fclose(csv); + return 1; + } + + signal(SIGINT, handle_signal); + signal(SIGTERM, handle_signal); + uint64_t started = 0; + for (uint64_t i = 0; i < o->inserts + o->queries; i++) { + worker *w = &b.workers[i]; + w->bench = &b; + w->index = i; + w->query = i >= o->inserts; + rc = pthread_create(&w->thread, NULL, run_worker, w); + if (rc) { + atomic_store(&b.error, rc); + atomic_store(&b.stop, true); + break; + } + started++; + } + if (o->barrier_ms && !atomic_load(&b.stop)) { + rc = pthread_create(&b.barrier_thread, NULL, run_barrier, &b); + if (rc) { + atomic_store(&b.error, rc); + atomic_store(&b.stop, true); + } else { + atomic_store(&b.barrier_started, true); + } + } + fprintf( + csv, + "elapsed_s,interval_s,inserted,logical_gib,insert_ops_s,query_ops_s," + "hit_pct,insert_max_ms,query_max_ms,active_max_ms,cpu_cores,max_rss_mib," + "read_mib_s,write_mib_s,image_gib,free_gib,inserters_running," + "barrier_ops_s,barrier_avg_ms,barrier_max_ms,target_insert_ops_s," + "offered_insert_ops_s,insert_backlog,response_max_ms"); + for (uint64_t i = 0; i < started; i++) { + fprintf(csv, ",%s%lu_ops_s", b.workers[i].query ? "q" : "i", i); + } + fputc('\n', csv); + fflush(csv); + uint64_t prev_completed[MAX_WORKERS] = {0}, prev_hits = 0; + uint64_t prev_barrier_count = 0, prev_barrier_sum_ns = 0; + uint64_t prev_read, prev_write; + process_io(&prev_read, &prev_write); + struct rusage usage_now; + getrusage(RUSAGE_SELF, &usage_now); + double prev_cpu = + usage_now.ru_utime.tv_sec + usage_now.ru_utime.tv_usec / 1e6 + + usage_now.ru_stime.tv_sec + usage_now.ru_stime.tv_usec / 1e6; + uint64_t start = now_ns(), previous = start; + b.start_ns = start; + fprintf( + stderr, "start_monotonic_ns=%lu main_address=%p\n", start, (void *)main); + atomic_store_explicit(&b.start, true, memory_order_release); + const char *reason = "complete"; + uint64_t inserted = 0; + while (true) { + struct timespec delay = {.tv_sec = o->report_ms / 1000, + .tv_nsec = (o->report_ms % 1000) * 1000000}; + nanosleep(&delay, NULL); + uint64_t now = now_ns(), delta_insert = 0, delta_query = 0, hits = 0; + uint64_t insert_max = 0, query_max = 0, response_max = 0, active_max = 0; + uint64_t inserters_running = 0; + double rates[MAX_WORKERS] = {0}; + double elapsed = (now - start) / 1e9, interval = (now - previous) / 1e9; + bool all_inserts_done = true; + inserted = 0; + for (uint64_t i = 0; i < started; i++) { + worker *w = &b.workers[i]; + uint64_t completed = atomic_load(&w->completed); + uint64_t count = completed - prev_completed[i]; + prev_completed[i] = completed; + rates[i] = count / interval; + uint64_t latency = atomic_exchange(&w->max_ns, 0); + uint64_t active = atomic_load(&w->active_since_ns); + if (active && active < now && active_max < now - active) { + active_max = now - active; + } + if (w->query) { + delta_query += count; + hits += atomic_load(&w->hits); + if (query_max < latency) { + query_max = latency; + } + } else { + inserted += completed; + delta_insert += count; + if (insert_max < latency) { + insert_max = latency; + } + uint64_t response = atomic_exchange(&w->response_max_ns, 0); + if (response_max < response) { + response_max = response; + } + if (!atomic_load(&w->done)) { + inserters_running++; + all_inserts_done = false; + } + } + } + uint64_t reads, writes; + process_io(&reads, &writes); + getrusage(RUSAGE_SELF, &usage_now); + double cpu = usage_now.ru_utime.tv_sec + usage_now.ru_utime.tv_usec / 1e6 + + usage_now.ru_stime.tv_sec + + usage_now.ru_stime.tv_usec / 1e6; + struct stat st = {0}; + if (fstat(fd, &st) != 0 || fstatvfs(fd, &space) != 0) { + atomic_store(&b.error, errno); + atomic_store(&b.stop, true); + } + double free_gib = (double)space.f_bavail * space.f_frsize / GIB; + uint64_t barrier_count = atomic_load(&b.barrier_count); + uint64_t barrier_sum_ns = atomic_load(&b.barrier_sum_ns); + uint64_t barrier_max_ns = atomic_exchange(&b.barrier_max_ns, 0); + uint64_t delta_barrier_count = barrier_count - prev_barrier_count; + uint64_t delta_barrier_sum = barrier_sum_ns - prev_barrier_sum_ns; + uint64_t offered = inserted; + if (o->target_insert_ops_s != 0) { + __uint128_t possible = (__uint128_t)(now - start) + * o->target_insert_ops_s / UINT64_C(1000000000); + offered = possible > o->records ? o->records : (uint64_t)possible; + } + fprintf(csv, + "%.6f,%.6f,%lu,%.6f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f," + "%.3f,%.6f,%.3f,%lu,%.3f,%.3f,%.3f,%lu,%.3f,%lu,%.3f", + elapsed, + interval, + inserted, + (double)inserted * (o->key_size + o->value_size) / GIB, + delta_insert / interval, + delta_query / interval, + delta_query ? (hits - prev_hits) * 100.0 / delta_query : 0, + insert_max / 1e6, + query_max / 1e6, + active_max / 1e6, + (cpu - prev_cpu) / interval, + usage_now.ru_maxrss / 1024.0, + (reads - prev_read) / (1048576.0 * interval), + (writes - prev_write) / (1048576.0 * interval), + (double)st.st_size / GIB, + free_gib, + inserters_running, + delta_barrier_count / interval, + delta_barrier_count + ? delta_barrier_sum / 1e6 / delta_barrier_count + : 0, + barrier_max_ns / 1e6, + o->target_insert_ops_s, + o->target_insert_ops_s ? (double)o->target_insert_ops_s : 0, + offered > inserted ? offered - inserted : 0, + response_max / 1e6); + for (uint64_t i = 0; i < started; i++) { + fprintf(csv, ",%.3f", rates[i]); + } + fputc('\n', csv); + if (fflush(csv) != 0) { + atomic_store(&b.error, errno); + atomic_store(&b.stop, true); + } + prev_hits = hits; + prev_read = reads; + prev_write = writes; + prev_cpu = cpu; + prev_barrier_count = barrier_count; + prev_barrier_sum_ns = barrier_sum_ns; + previous = now; + if (all_inserts_done || atomic_load(&b.stop)) { + break; + } + if (interrupted) { + reason = "signal"; + break; + } + if (o->seconds && elapsed >= o->seconds) { + reason = "time_limit"; + break; + } + if (free_gib < o->min_free_gib) { + reason = "free_space_limit"; + break; + } + } + atomic_store(&b.stop, true); + for (uint64_t i = 0; i < started; i++) { + pthread_join(b.workers[i].thread, NULL); + } + if (atomic_load(&b.barrier_started)) { + pthread_join(b.barrier_thread, NULL); + } + inserted = 0; + for (uint64_t i = 0; i < o->inserts; i++) { + inserted += atomic_load(&b.workers[i].completed); + } + double elapsed_s = (now_ns() - start) / 1e9; + fprintf(stderr, + "load_end reason=%s inserted=%lu elapsed_s=%.3f error=%d " + "barrier_count=%lu barrier_avg_ms=%.3f barrier_max_ms=%.3f\n", + reason, + inserted, + elapsed_s, + atomic_load(&b.error), + atomic_load(&b.barrier_count), + atomic_load(&b.barrier_count) ? atomic_load(&b.barrier_sum_ns) / 1e6 + / atomic_load(&b.barrier_count) + : 0, + atomic_load(&b.barrier_max_ns) / 1e6); + int summary_rc = write_summary(&b, inserted, elapsed_s); + if (summary_rc != 0) { + fprintf(stderr, "summary write failed: %s\n", strerror(summary_rc)); + } + uint64_t close_start = now_ns(); +#ifdef KVBENCH_LEGACY_CLOSE + splinterdb_close(&b.db); + rc = 0; +#else + rc = splinterdb_close(&b.db, false); +#endif + fprintf( + stderr, "close_s=%.3f close_rc=%d\n", (now_ns() - close_start) / 1e9, rc); + close(fd); + fclose(csv); + int trace_rc = 0; +#ifndef KVBENCH_NO_TRACE + trace_rc = platform_trace_close(); +#endif + bool incomplete = !o->seconds && inserted < o->records; + return rc || trace_rc || summary_rc || atomic_load(&b.error) || incomplete + ? 1 + : 0; +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/inventory.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/inventory.json new file mode 100644 index 000000000..426510779 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/inventory.json @@ -0,0 +1,65 @@ +{ + "audit.py": "0a35a54b0932296bd60df29d54b4a1e28a1c3a4ff680ab096ce6d94c0f696b6c", + "status.json": "205604ab3e1bae378e250d6c43e2bd578bc467ebe943d07956752349892ee675", + "build_all.py": "eb087dd5567dd000d7e0bf27d76839ac45e0ced00037f6f618e2494e5e518a20", + "run_matrix-fixtures.py": "776d2ee23705f3a60a54f4e78b4f305a24d4a124eeecfe75dfacf5a90e4329c5", + "feature-summaries.json": "be843d623a1047071f5ecf28698812b3a1a5570fb81ace0d2280c0aadaa0b3dc", + "host.json": "3f6265a71d00bb4c31f35d6774a1ac19bdc4b10ffd758947d96b0d0b81538eb3", + "branch-prefix-build.json": "1c739c9b4b71c2013e741a237b5695ab8be32cd0a018a95badcb443bf8fd4524", + "kvbench.c": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9", + "prefix_kvbench.c": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "control-drift.csv": "0c5f1c505305edd8f6c55943719aaceb9ff8ded781a746819df64bb305f0e941", + "preparation.json": "1de4fc5b02c3b6b5134859e33a99b881132ca60c193aa611370795131bb80c09", + "package.py": "8591b68385dafd2e808ed6b623a7f4e645c890b3aa1c023a49906061580fb79c", + "summary.csv": "4fdb17bf1add3d91e339606a108d9d85181766cb608403542413a6af2cf3946d", + "report.py": "5c1a9ef7925653b45ee3c211863706ba6cbf2924783a77c1efd7e0b83c3622a6", + "run_matrix.py": "536f10a1a7fd4b1e8e0250ea01cfe36793c7d6e2345f141092616ec06f64ee50", + "report.md": "9649eb4828bef7e39b3b28b1bdcd2ab3ddb72ceb0f71bb5d07c12605c8b417bc", + "run_job.py": "908d86de805e6efd41b423c919187f2df14715104f047e10fa8a6c57129cc773", + "repeat.py": "81fc83731f123067d5183231468513ad7243578ffc051a0d63073b684362fd53", + "audit.json": "ad2fc696155945dd8d7c31db1295ae1f824e7a4324f1523d290f106f95f87d03", + "benchmark-jobs.json": "a208b7be9c97f8c7d1d92fda93941d24a29cdf4d47f255946c33aab465f645c7", + "insert_benchmark.c": "75acbda52b2a8949f1d61710a8d89250d4dac63b12ec9803b89170f9c2cc0b26", + "main-build.json": "e9bf905fadeacebf8082f22d9772e86f17791ef5aa9d4537ce9ecc0fc245f520", + "fixtures/disk-main-random.log": "9f44a160497eabf26a2aa9695eaa55dd74985dd18d52d45ad58f87979dd97275", + "fixtures/resident-main-random.csv": "53b14d40824cb351838d8d791598c85d9521c9ea7787e53298d5c73bd0dc0d7a", + "fixtures/disk-branch-prefix-common.log": "b11a5b04f6ddd933f929c3865df4e2bd06ce651a72bf7e584dd5390996a3e75e", + "fixtures/resident-main-common.csv": "4569ca5e2d582575c3e68866098a0c19b590bef925cb4376e014d2a382d39357", + "fixtures/disk-main-common.log": "da29089bd2140d5730ff76b4639a024cb8b1b329befc7188ae63815d98cf030c", + "fixtures/resident-branch-prefix-random.csv": "1e38d20fa71a6de9afdc2f057796ca6e8abe5be3fcd825450dde46a6668f2334", + "fixtures/resident-branch-prefix-common.log": "a5f29c881b0aea3aa1d4796ff0aa76f008d8c77255987e1dd998d611a06167db", + "fixtures/resident-branch-prefix-common.csv": "6af2ef867e30a26e1a0e8cc30533b46b00e0c9bc97526d8d49933678f7d1623c", + "fixtures/manifest.json": "494155fb4cb7c54dcfefe3465c065dc47c3dcf8a574a9f703b86b20bea3ef68c", + "fixtures/resident-main-common.log": "a47d1404ca64590e9328650770b461a74beede07946a715b48cba9efe68aeff1", + "fixtures/disk-branch-prefix-common.csv": "9226e9a602269d5039015465332a2f0092e121514cf443dc15355b8982cac4a1", + "fixtures/disk-branch-prefix-random.log": "1c81c74b950464070a27ea33b414070bdd799e5ee1ef7a75c60f45110f6dcd21", + "fixtures/disk-main-common.csv": "3f69e21f32a526e0a5fc6665064e7b110d02e641855dfab9172be7809775c888", + "fixtures/disk-branch-prefix-random.csv": "95d2457f612158df1b5c5e03643fe2b68cbe35fc08749f2a0953436010eaf1d1", + "fixtures/disk-main-random.csv": "49fb27f0110fefed4a356ad27f5fce059ca8caa5fd35c5bec637001d44525df1", + "fixtures/resident-main-random.log": "6e5d5621436b2a3040731eec91b9115fa68fbe1c1efa5a79511abc3c9df1543f", + "fixtures/resident-branch-prefix-random.log": "8b1cf60c008ef9d5236f48e4ba5bec86187504809e77e5492da049123147e707", + "prefix-resident-common/01-branch-prefix.log": "2e39f08e79cc7e8253059d3e7f7f72e96e5a0803746db04c67a73d870e1afe17", + "prefix-resident-common/02-branch-prefix.log": "78fd26a69427bc99e3043e819895aaa3df89e69caac2f73fb072688cde0737b0", + "prefix-resident-common/03-main.log": "902192d5930a5eca8f186bddfaa28dd76726f27922b0abe417be119fc44f0d6f", + "prefix-resident-common/manifest.json": "044faaba3f0a603947359171571c448d76f8167bb842a6e655116653a110e309", + "prefix-resident-common/00-main.log": "81be21b00ecbed2be204e32274e68cc4d24993159e75690ea087b3c1200666c8", + "prefix-resident-common/results.csv": "f19990b60a99e8c5b370f94feee0dd9c0b5bca0ac4b10e468c9a286c8e479a1b", + "prefix-disk-random/01-branch-prefix.log": "e8e3fc5c397bc81464ae90c46f98dca02c65adad9f68952cf9cc6510439a68d7", + "prefix-disk-random/02-branch-prefix.log": "d7f487c19e519901fe055675d79d3770236eaac10383099b7769de207a276775", + "prefix-disk-random/03-main.log": "db7811cf8ee3db0777aea834b0b95a18087f88228eb96259da5d1728587b7a29", + "prefix-disk-random/manifest.json": "d28ba6cc39673b01907efe5706145e517e5ec2d0807b6eea03e3dbab45f91dd5", + "prefix-disk-random/00-main.log": "52f92b1b3b03ec70c368f511691860e03f02b9ca532c6a64875e6679b53f1746", + "prefix-disk-random/results.csv": "bac120d4b193584f5e96f7ba22cacfef84dd72a70aebc998eee294c98d57b9eb", + "prefix-disk-common/01-branch-prefix.log": "2ff3af1f12a4e985b2e6ec9597d1c8bde2efb433e464f5133d6bfe995a78a6de", + "prefix-disk-common/02-branch-prefix.log": "45409b0754d8f55324e38c4c2ea0d581dfcbc171e1f1b82c975c5235a8f3f749", + "prefix-disk-common/03-main.log": "54af21c34826d0545715b9d5c0c16a1337c15e8b937cb0fb0dcb7011226570ef", + "prefix-disk-common/manifest.json": "c00c57d1ef183b407b0f9ed8055cbbbf0c5d67b991e3f9d40be835d96557ff06", + "prefix-disk-common/00-main.log": "8d0024fdee92e235956a39eaa0af8e7c5d160dd13af124adf757428bfdefb2c1", + "prefix-disk-common/results.csv": "b2677f1d0169c4630b80339cdabe928641f1e878b9074839c1f68c5195c24b8b", + "prefix-resident-random/01-branch-prefix.log": "ad18f1ba8ff2a7aeb658b10fd5f1b14848cf021e28e644898f5a516591d4e8ad", + "prefix-resident-random/02-branch-prefix.log": "f800c70665b447549b9be2d0ad06598bee20062046839cad5130912e9f81620e", + "prefix-resident-random/03-main.log": "66593aeb81bd645d57696f350af69de5dd112425f95b43ce3a999b8418a81cb4", + "prefix-resident-random/manifest.json": "a022b3e1c5015995cf7299566d2100c8b99b9fb7f85596f9802354a892cf385f", + "prefix-resident-random/00-main.log": "71cf5be0548497291166644a6778581a973a08e9bf8d3cde8b8a391549c56453", + "prefix-resident-random/results.csv": "b3e42532f4eab763a7d198a300a023d39c2bd26a2e64f06e73aa77cf456626cb" +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/kvbench.c b/benchmarks/results-20261013/main-7bb5fab/benchmarks/kvbench.c new file mode 100644 index 000000000..9b91f4ef9 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/kvbench.c @@ -0,0 +1,1707 @@ +// kvbench.c -- SplinterDB public-API benchmark used to compare two versions. +// +// Uses only splinterdb/splinterdb.h + splinterdb/default_data_config.h + libc, +// so the same source builds against versions whose internals differ. The one +// public-API difference handled here is splinterdb_close(): +// -DKVBENCH_CLOSE_HAS_FORCE => int splinterdb_close(splinterdb **, bool32) +// otherwise => void splinterdb_close(splinterdb **) +// +// Key scheme: logical id in [0,N). Present key = 8-byte big-endian(2*id) +// followed by 16 bytes of fixed padding (24 bytes total), so memcmp order == +// id order. Absent ("negative") keys use 2*id+1, interleaved with present +// keys. Value = 100 bytes: id (LE u64), generation (LE u64), filler. +// +// Each invocation: create/open the DB, run the listed phases in order, close. +// Phase syntax (optional "@T" overrides the thread count): +// load:random | load:seq fixed-count insert of all N ids, then close +// (close timed separately as "drain") +// warm parallel full scan; verifies every id once +// point:uniform|zipf|seq|neg fixed-duration lookups +// range:uniform|zipf:L fixed-duration forward range queries +// ow:uniform|zipf fixed-duration overwrites (insert existing) +// One CSV row per phase is appended to --csv. + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splinterdb/default_data_config.h" +#include "splinterdb/splinterdb.h" + +#define KEY_SIZE 24 +#define VALUE_SIZE 100 +#define MAX_PHASES 64 +#define MAX_WORKERS 32 + +static const char KEY_PAD[16] = "kvbench-padding!"; + +/* ------------------------------------------------------------------------ */ +/* Time, RNG, permutations, zipf */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +now_ns(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000ull + ts.tv_nsec; +} + +/* Bijective 64-bit mixer (splitmix64 finalizer). */ +static inline uint64_t +mix(uint64_t x) +{ + x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9); + x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb); + return x ^ (x >> 31); +} + +static inline uint64_t +rng_next(uint64_t *s) +{ + *s += UINT64_C(0x9e3779b97f4a7c15); + return mix(*s); +} + +static inline double +rng_unit(uint64_t *s) +{ + return (double)(rng_next(s) >> 11) * 0x1.0p-53; +} + +/* + * Pseudo-random bijection on [0,n): a 4-round balanced Feistel network over + * 2*half bits (2^(2*half) >= n), with cycle-walking to stay inside [0,n). + */ +typedef struct { + uint64_t n; + unsigned half; + uint64_t mask; + uint64_t keys[4]; +} perm_t; + +static void +perm_init(perm_t *p, uint64_t n, uint64_t seed) +{ + unsigned bits = 1; + while (bits < 64 && (UINT64_C(1) << bits) < n) { + bits++; + } + p->n = n; + p->half = (bits + 1) / 2; + if (p->half < 1) { + p->half = 1; + } + p->mask = (UINT64_C(1) << p->half) - 1; + for (int r = 0; r < 4; r++) { + p->keys[r] = mix(seed * UINT64_C(0x632be59bd9b4e019) + r + 1); + } +} + +static inline uint64_t +feistel(const perm_t *p, uint64_t x) +{ + uint64_t l = x >> p->half, r = x & p->mask; + for (int i = 0; i < 4; i++) { + uint64_t t = l ^ (mix(r ^ p->keys[i]) & p->mask); + l = r; + r = t; + } + return (l << p->half) | r; +} + +static inline uint64_t +perm_apply(const perm_t *p, uint64_t i) +{ + uint64_t x = i; + do { + x = feistel(p, x); + } while (x >= p->n); + return x; +} + +/* YCSB-style zipfian over ranks [0,n). */ +typedef struct { + uint64_t n; + double theta, zetan, zeta2, alpha, eta, half_pow_theta; +} zipf_t; + +static double +zeta_sum(uint64_t n, double theta) +{ + uint64_t m = n < 2000000 ? n : 2000000; + double s = 0; + for (uint64_t i = 1; i <= m; i++) { + s += pow((double)i, -theta); + } + if (n > m) { + /* Euler-Maclaurin tail: sum_{k=m+1}^{n} k^-t */ + s += (pow((double)n, 1 - theta) - pow((double)m, 1 - theta)) / (1 - theta) + + 0.5 * (pow((double)n, -theta) - pow((double)m, -theta)); + } + return s; +} + +static void +zipf_init(zipf_t *z, uint64_t n, double theta) +{ + z->n = n; + z->theta = theta; + z->zetan = zeta_sum(n, theta); + z->zeta2 = 1.0 + pow(0.5, theta); + z->alpha = 1.0 / (1.0 - theta); + z->eta = + (1.0 - pow(2.0 / (double)n, 1.0 - theta)) / (1.0 - z->zeta2 / z->zetan); + z->half_pow_theta = pow(0.5, theta); +} + +static inline uint64_t +zipf_next(const zipf_t *z, uint64_t *rng) +{ + double u = rng_unit(rng); + double uz = u * z->zetan; + if (uz < 1.0) { + return 0; + } + if (uz < 1.0 + z->half_pow_theta) { + return 1; + } + uint64_t r = + (uint64_t)((double)z->n * pow(z->eta * u - z->eta + 1.0, z->alpha)); + return r >= z->n ? z->n - 1 : r; +} + +/* ------------------------------------------------------------------------ */ +/* Histogram: log2 buckets with 32 linear sub-buckets (~3% resolution) */ +/* ------------------------------------------------------------------------ */ + +#define HSUB_BITS 5 +#define HSUB (1u << HSUB_BITS) +#define HBUCKETS (64 * HSUB) + +typedef struct { + uint64_t b[HBUCKETS]; + uint64_t count, sum, max; +} hist_t; + +static inline unsigned +hidx(uint64_t v) +{ + if (v < HSUB) { + return (unsigned)v; + } + unsigned e = 63 - __builtin_clzll(v); + unsigned sub = (unsigned)((v >> (e - HSUB_BITS)) & (HSUB - 1)); + return (e - HSUB_BITS + 1) * HSUB + sub; +} + +static inline uint64_t +hval(unsigned idx) +{ + if (idx < HSUB) { + return idx; + } + unsigned e = idx / HSUB + HSUB_BITS - 1; + unsigned sub = idx % HSUB; + uint64_t lo = (UINT64_C(1) << e) | ((uint64_t)sub << (e - HSUB_BITS)); + uint64_t width = UINT64_C(1) << (e - HSUB_BITS); + return lo + width / 2; +} + +static inline void +hist_add(hist_t *h, uint64_t v) +{ + h->b[hidx(v)]++; + h->count++; + h->sum += v; + if (v > h->max) { + h->max = v; + } +} + +static void +hist_merge(hist_t *dst, const hist_t *src) +{ + for (unsigned i = 0; i < HBUCKETS; i++) { + dst->b[i] += src->b[i]; + } + dst->count += src->count; + dst->sum += src->sum; + if (src->max > dst->max) { + dst->max = src->max; + } +} + +static double +hist_pct_us(const hist_t *h, double p) +{ + if (!h->count) { + return NAN; + } + uint64_t rank = (uint64_t)ceil(p * (double)h->count); + if (rank < 1) { + rank = 1; + } + uint64_t acc = 0; + for (unsigned i = 0; i < HBUCKETS; i++) { + acc += h->b[i]; + if (acc >= rank) { + uint64_t v = hval(i); + return (double)(v > h->max ? h->max : v) / 1e3; + } + } + return (double)h->max / 1e3; +} + +static double +hist_mean_us(const hist_t *h) +{ + return h->count ? (double)h->sum / (double)h->count / 1e3 : NAN; +} + +/* ------------------------------------------------------------------------ */ +/* Options / global state */ +/* ------------------------------------------------------------------------ */ + +enum phase_kind { PH_LOAD, PH_WARM, PH_POINT, PH_RANGE, PH_OW }; +enum dist { D_UNIFORM, D_ZIPF, D_SEQ, D_NEG, D_RANDOM }; + +typedef struct { + char name[64]; + enum phase_kind kind; + enum dist dist; + uint64_t L; + int threads; +} phase_t; + +typedef struct { + const char *db, *csv, *hang_dir; + const char *vtag, *stag, *otag; + int rep; + bool create; + uint64_t n, cache_mib, disk_gib, memtable_mib; + int use_log, threads, mt_bg, normal_bg; + double secs, warmup; + uint64_t sabotage; + uint64_t hang_secs; + uint64_t seed; + int nphases; + phase_t phases[MAX_PHASES]; +} options; + +static options opt; +static splinterdb *kvs; +static data_config data_cfg; +static perm_t load_perm, zipf_perm; +static zipf_t zipf; +static uint64_t generation; /* value generation for overwrites */ + +enum { ST_WAIT = 0, ST_WARMUP = 1, ST_MEASURE = 2, ST_STOP = 3 }; +static _Atomic int run_state; +static _Atomic uint64_t seq_counter; + +/* Watchdog */ +enum { WD_IDLE, WD_OPS, WD_OPENCLOSE }; +static _Atomic int wd_mode; +static _Atomic uint64_t wd_mode_since_ns; +static const char *wd_what = ""; + +typedef struct worker { + pthread_t th; + int idx; + const phase_t *ph; + hist_t lat; + hist_t startup; + uint64_t ops, tuples, pt_ns, pt_div, deinit_ns, deinit_n; + uint64_t violations, errors, notfound, found; + uint64_t rng; + uint64_t measure_rng; + bool measure_rng_captured; + _Atomic uint64_t progress; + char first_violation[256]; +} worker_t; + +static worker_t *workers; +static int nworkers; + +/* ------------------------------------------------------------------------ */ +/* Keys / values */ +/* ------------------------------------------------------------------------ */ + +static inline void +make_key(uint64_t k, char *key) +{ + for (int i = 0; i < 8; i++) { + key[i] = (char)(k >> (56 - 8 * i)); + } + memcpy(key + 8, KEY_PAD, 16); +} + +static inline bool +decode_key(slice s, uint64_t *k) +{ + if (slice_length(s) != KEY_SIZE) { + return false; + } + const unsigned char *p = slice_data(s); + uint64_t x = 0; + for (int i = 0; i < 8; i++) { + x = (x << 8) | p[i]; + } + *k = x; + return memcmp(p + 8, KEY_PAD, 16) == 0; +} + +static inline void +make_value(uint64_t id, uint64_t gen, char *val) +{ + memcpy(val, &id, 8); + memcpy(val + 8, &gen, 8); + memset(val + 16, 'v', VALUE_SIZE - 16); +} + +static inline bool +value_id_ok(slice v, uint64_t id) +{ + if (slice_length(v) != VALUE_SIZE) { + return false; + } + uint64_t got; + memcpy(&got, slice_data(v), 8); + return got == id; +} + +static inline bool +value_generation_ok(slice v, uint64_t id, uint64_t expected_generation) +{ + if (!value_id_ok(v, id)) { + return false; + } + uint64_t got_generation; + memcpy(&got_generation, (const char *)slice_data(v) + 8, 8); + return got_generation == expected_generation; +} + +static void +violation(worker_t *w, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); + +static void +violation(worker_t *w, const char *fmt, ...) +{ + w->violations++; + if (w->violations <= 3) { + char buf[256]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + if (w->violations == 1) { + snprintf(w->first_violation, sizeof(w->first_violation), "%s", buf); + } + fprintf(stderr, "VIOLATION [thread %d]: %s\n", w->idx, buf); + } +} + +/* ------------------------------------------------------------------------ */ +/* Process metrics */ +/* ------------------------------------------------------------------------ */ + +typedef struct { + uint64_t t_ns; + double cpu_s; + uint64_t rd, wr; + uint64_t swpin, swpout; + uint64_t majflt; +} snap_t; + +static void +proc_io(uint64_t *rd, uint64_t *wr) +{ + *rd = *wr = 0; + FILE *f = fopen("/proc/self/io", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "read_bytes:")) { + *rd = v; + } else if (!strcmp(name, "write_bytes:")) { + *wr = v; + } + } + fclose(f); +} + +static void +vm_swap(uint64_t *in, uint64_t *out) +{ + *in = *out = 0; + FILE *f = fopen("/proc/vmstat", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "pswpin")) { + *in = v; + } else if (!strcmp(name, "pswpout")) { + *out = v; + } + } + fclose(f); +} + +static void +take_snap(snap_t *s) +{ + struct rusage ru; + getrusage(RUSAGE_SELF, &ru); + s->cpu_s = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6 + + ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6; + s->majflt = ru.ru_majflt; + proc_io(&s->rd, &s->wr); + vm_swap(&s->swpin, &s->swpout); + s->t_ns = now_ns(); +} + +/* ------------------------------------------------------------------------ */ +/* DB lifecycle */ +/* ------------------------------------------------------------------------ */ + +static void +fill_config(splinterdb_config *cfg) +{ + *cfg = (splinterdb_config){ + .filename = opt.db, + .cache_size = opt.cache_mib << 20, + .disk_size = opt.disk_gib << 30, + .data_cfg = &data_cfg, + .io_flags = O_RDWR | O_CREAT | O_DIRECT, + .io_perms = 0644, + .use_log = opt.use_log ? 1 : 0, + .memtable_capacity = opt.memtable_mib << 20, + .fanout = 8, + .num_memtable_bg_threads = (uint64)opt.mt_bg, + .num_normal_bg_threads = (uint64)opt.normal_bg, + .queue_scale_percent = 100, + }; +#ifdef KVBENCH_SPACE_MODE + cfg->use_stats = 1; +#endif +} + +static double open_secs; + +static void +db_open(bool create) +{ + splinterdb_config cfg; + fill_config(&cfg); + wd_what = create ? "create" : "open"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); + int rc = + create ? splinterdb_create(&cfg, &kvs) : splinterdb_open(&cfg, &kvs); + open_secs = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + if (rc) { + fprintf(stderr, "FATAL: splinterdb_%s failed rc=%d\n", wd_what, rc); + exit(3); + } + fprintf(stderr, "%s took %.3f s\n", wd_what, open_secs); +} + +static double +db_close(void) +{ +#ifdef KVBENCH_SPACE_MODE + /* Space/stats build only: dump insertion + allocator stats for the session. + */ + if (getenv("KVBENCH_STATS_BEFORE_CLOSE")) { + platform_set_log_streams(stdout, stderr); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + } +#endif + wd_what = "close"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); +#ifdef KVBENCH_CLOSE_HAS_FORCE + int rc = splinterdb_close(&kvs, 0); + if (rc) { + fprintf(stderr, + "FINDING: splinterdb_close(force=0) refused rc=%d; forcing\n", + rc); + rc = splinterdb_close(&kvs, 1); + if (rc) { + fprintf(stderr, "FINDING: splinterdb_close(force=1) rc=%d\n", rc); + } + } +#else + splinterdb_close(&kvs); +#endif + double s = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + kvs = NULL; + fprintf(stderr, "close took %.3f s\n", s); + return s; +} + +/* ------------------------------------------------------------------------ */ +/* Watchdog */ +/* ------------------------------------------------------------------------ */ + +static void +hang_dump(const char *why) +{ + char path[512], cmd[1024]; + snprintf(path, + sizeof(path), + "%s/hang-%s-%s-%d-%ld.txt", + opt.hang_dir ? opt.hang_dir : ".", + opt.vtag, + wd_what, + (int)getpid(), + (long)time(NULL)); + fprintf(stderr, + "HANG DETECTED (%s) during %s; dumping stacks to %s\n", + why, + wd_what, + path); + snprintf(cmd, + sizeof(cmd), + "gdb -batch -ex 'info threads' -ex 'thread apply all bt' -p %d > " + "'%s' 2>&1", + (int)getpid(), + path); + int rc = system(cmd); + fprintf(stderr, "gdb rc=%d; exiting with status 99\n", rc); + fflush(stderr); + _exit(99); +} + +static void * +watchdog_main(void *arg) +{ + (void)arg; + uint64_t last_prog = 0, last_change = now_ns(), last_report = now_ns(); + uint64_t last_report_prog = 0; + double last_cpu = -1; + uint64_t last_io = 0; + int last_mode = WD_IDLE; + for (;;) { + sleep(1); + int mode = atomic_load(&wd_mode); + uint64_t now = now_ns(); + if (mode != last_mode) { + last_mode = mode; + last_change = now; + last_prog = 0; + last_report_prog = 0; + last_report = now; + last_cpu = -1; + } + if (mode == WD_OPS) { + uint64_t prog = 0; + for (int i = 0; i < nworkers; i++) { + prog += + atomic_load_explicit(&workers[i].progress, memory_order_relaxed); + } + if (prog != last_prog) { + last_prog = prog; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no op progress for hang_secs"); + } + if (now - last_report >= 10ull * 1000000000ull) { + fprintf(stderr, + " [%s] progress %" PRIu64 " ops (+%.0f ops/s)\n", + wd_what, + prog, + (prog - last_report_prog) / ((now - last_report) / 1e9)); + last_report = now; + last_report_prog = prog; + } + } else if (mode == WD_OPENCLOSE) { + snap_t s; + take_snap(&s); + uint64_t io = s.rd + s.wr; + if (last_cpu < 0 || s.cpu_s - last_cpu > 0.05 || io != last_io) { + last_cpu = s.cpu_s; + last_io = io; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no CPU or IO progress for hang_secs"); + } + uint64_t since = atomic_load(&wd_mode_since_ns); + if (now - since > 2400ull * 1000000000ull) { + hang_dump("open/close exceeded 40 minutes"); + } + } + } + return NULL; +} + +/* ------------------------------------------------------------------------ */ +/* Worker bodies */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +pick_id(worker_t *w, enum dist d, uint64_t *seqpos, uint64_t lo, uint64_t hi) +{ + switch (d) { + case D_ZIPF: + return perm_apply(&zipf_perm, zipf_next(&zipf, &w->rng)); + case D_SEQ: + { + uint64_t id = *seqpos; + *seqpos = (id + 1 >= hi) ? lo : id + 1; + return id; + } + case D_UNIFORM: + case D_NEG: + default: + return rng_next(&w->rng) % opt.n; + } +} + +static inline void +wait_start(void) +{ + while (atomic_load_explicit(&run_state, memory_order_acquire) == ST_WAIT) { + struct timespec d = {.tv_nsec = 100000}; + nanosleep(&d, NULL); + } +} + +static void * +load_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + wait_start(); + uint64_t pos = lo, chunk_end = 0, cur = 0; + for (;;) { + uint64_t id; + if (w->ph->dist == D_RANDOM) { + if (pos >= hi) { + break; + } + id = perm_apply(&load_perm, pos++); + } else { + if (cur >= chunk_end) { + cur = atomic_fetch_add(&seq_counter, 64); + if (cur >= opt.n) { + break; + } + chunk_end = cur + 64 > opt.n ? opt.n : cur + 64; + } + id = cur++; + } + make_key(2 * id, key); + make_value(id, 0, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: insert id=%" PRIu64 " rc=%d\n", id, rc); + } + } + hist_add(&w->lat, t1 - t0); + w->ops++; + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + return NULL; +} + +static void * +warm_worker(void *arg) +{ + worker_t *w = arg; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + if ((opt.sabotage & 8) && w->idx == nworkers - 1) { + hi++; /* sabotage: expect one more id than exists */ + } + char key[KEY_SIZE]; + make_key(2 * lo, key); + wait_start(); + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator_init rc=%d\n", rc); + return NULL; + } + uint64_t expect = lo; + while (expect < hi && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk; + splinterdb_iterator_get_current(it, &k, &v); + if (!decode_key(k, &kk) || kk != 2 * expect || !value_id_ok(v, expect)) { + violation(w, + "warm: expected id %" PRIu64 " got key %" PRIu64 + " (len %" PRIu64 ")", + expect, + kk, + slice_length(k)); + if (kk > 2 * expect && (kk & 1) == 0) { + expect = kk / 2; /* resync after a gap */ + } + } + expect++; + w->ops++; + if ((w->ops & 1023) == 0) { + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + if (expect < hi) { + splinterdb_iterator_next(it); + } + } + rc = splinterdb_iterator_status(it); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator status rc=%d\n", rc); + } + if (expect != hi) { + violation(w, + "warm: range [%" PRIu64 ",%" PRIu64 ") ended at %" PRIu64, + lo, + hi, + expect); + } + splinterdb_iterator_deinit(it); + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + return NULL; +} + +static void * +point_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + char buf[256]; + splinterdb_lookup_result res; + splinterdb_lookup_result_init( + kvs, &res, SPLINTERDB_LOOKUP_VALUE, sizeof(buf), buf); + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + uint64_t seqpos = lo; + bool neg = w->ph->dist == D_NEG; + wait_start(); + uint64_t n = 0; + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, lo, hi); + bool q_neg = neg; + bool e_neg = neg; + if (opt.sabotage & 1) { + q_neg = true; /* sabotage: query absent key, expect present */ + } + if ((opt.sabotage & 16) && n > 1000) { + sleep(100000); /* test hook: simulate a hang for the watchdog */ + } + if (opt.sabotage & 2) { + q_neg = false; /* sabotage: query present key, expect absent */ + } + make_key(q_neg ? 2 * id + 1 : 2 * id, key); + uint64_t t0 = now_ns(); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &res); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: lookup id=%" PRIu64 " rc=%d\n", id, rc); + } + continue; + } + bool found = splinterdb_lookup_found(&res); + if (found) { + w->found++; + } else { + w->notfound++; + } + if (e_neg) { + if (found) { + violation(w, "negative key 2*%" PRIu64 "+1 found", id); + } + } else { + slice v; + if (!found) { + violation(w, "present id %" PRIu64 " not found", id); + } else if (splinterdb_lookup_result_value(&res, &v) != 0 + || !value_id_ok(v, id)) + { + violation(w, "present id %" PRIu64 " wrong value", id); + } + } + } + splinterdb_lookup_result_deinit(&res); + return NULL; +} + +static void * +range_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + uint64_t L = w->ph->L; + uint64_t seqpos = 0; + uint64_t n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t start = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + uint64_t expect = opt.n - start < L ? opt.n - start : L; + if (opt.sabotage & 4) { + expect++; /* sabotage: expect one extra tuple */ + } + make_key(2 * start, key); + uint64_t t0 = now_ns(), t1 = 0, tl = 0; + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator_init rc=%d\n", rc); + } + continue; + } + uint64_t got = 0; + bool bad = false; + while (got < L && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk = 0; + splinterdb_iterator_get_current(it, &k, &v); + if (!bad + && (!decode_key(k, &kk) || kk != 2 * (start + got) + || !value_id_ok(v, start + got))) + { + bad = true; + if (st == ST_MEASURE) { + violation(w, + "range start %" PRIu64 " tuple %" PRIu64 + ": expected key %" PRIu64 " got %" PRIu64, + start, + got, + 2 * (start + got), + kk); + } + } + got++; + if (got == 1) { + t1 = now_ns(); + } + if (got == L) { + tl = now_ns(); + break; + } + splinterdb_iterator_next(it); + } + int status = splinterdb_iterator_status(it); + uint64_t t2 = now_ns(); + splinterdb_iterator_deinit(it); + uint64_t t3 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + if (status) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator status rc=%d\n", status); + } + } + if (got != expect) { + violation(w, + "range start %" PRIu64 " L=%" PRIu64 ": got %" PRIu64 + " tuples, expected %" PRIu64, + start, + L, + got, + expect); + } + w->ops++; + w->tuples += got; + hist_add(&w->lat, t3 - t0); + if (got >= 1) { + hist_add(&w->startup, t1 - t0); + } + if (L > 1 && got == L) { + w->pt_ns += tl - t1; + w->pt_div += L - 1; + } + w->deinit_ns += t3 - t2; + w->deinit_n++; + } + return NULL; +} + +static void * +ow_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t seqpos = 0, n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + if (st == ST_MEASURE && !w->measure_rng_captured) { + w->measure_rng = w->rng; + w->measure_rng_captured = true; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + make_value(id, generation, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: overwrite id=%" PRIu64 " rc=%d\n", id, rc); + } + } + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + } + return NULL; +} + +/* + * Validate an untimed deterministic sample from the beginning of each + * overwrite worker's measured stream. Replaying the saved RNG state keeps all + * validation work out of the measured hot path. + */ +static void +verify_overwrite_sample(const phase_t *ph, int threads) +{ + enum { SAMPLES_PER_WORKER = 4096 }; + char key[KEY_SIZE], buffer[VALUE_SIZE]; + splinterdb_lookup_result result; + splinterdb_lookup_result_init( + kvs, &result, SPLINTERDB_LOOKUP_VALUE, sizeof(buffer), buffer); + + for (int i = 0; i < threads; i++) { + worker_t *original = &workers[i]; + if (original->ops == 0) { + continue; + } + if (!original->measure_rng_captured) { + original->errors++; + fprintf( + stderr, + "ERROR: overwrite verifier has no measurement RNG for thread %d\n", + i); + continue; + } + worker_t replay = {.rng = original->measure_rng}; + uint64_t seqpos = 0; + uint64_t samples = original->ops < SAMPLES_PER_WORKER + ? original->ops + : SAMPLES_PER_WORKER; + for (uint64_t sample = 0; sample < samples; sample++) { + uint64_t id = pick_id(&replay, ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &result); + if (rc != 0) { + original->errors++; + if (original->errors <= 3) { + fprintf(stderr, + "ERROR: overwrite verification id=%" PRIu64 " rc=%d\n", + id, + rc); + } + continue; + } + slice value; + if (!splinterdb_lookup_found(&result) + || splinterdb_lookup_result_value(&result, &value) != 0 + || !value_generation_ok(value, id, generation)) + { + violation(original, + "overwrite verification id=%" PRIu64 + " did not return generation %" PRIu64, + id, + generation); + } + } + } + splinterdb_lookup_result_deinit(&result); +} + +/* ------------------------------------------------------------------------ */ +/* Phase driver */ +/* ------------------------------------------------------------------------ */ + +static const char * +dist_name(enum dist d) +{ + switch (d) { + case D_UNIFORM: + return "uniform"; + case D_ZIPF: + return "zipf"; + case D_SEQ: + return "seq"; + case D_NEG: + return "neg"; + case D_RANDOM: + return "random"; + } + return "?"; +} + +static void +sleep_secs(double s) +{ + uint64_t end = now_ns() + (uint64_t)(s * 1e9); + for (;;) { + uint64_t now = now_ns(); + if (now >= end) { + break; + } + uint64_t rem = end - now; + struct timespec d = {.tv_sec = rem / 1000000000ull, + .tv_nsec = rem % 1000000000ull}; + nanosleep(&d, NULL); + } +} + +static void +file_sizes(uint64_t *apparent, uint64_t *alloc) +{ + struct stat st; + if (stat(opt.db, &st) == 0) { + *apparent = (uint64_t)st.st_size; + *alloc = (uint64_t)st.st_blocks * 512; + } else { + *apparent = *alloc = 0; + } +} + +static int csv_header_written; + +static void +csv_row(const phase_t *ph, + int threads, + hist_t *lat, + hist_t *startup, + uint64_t ops, + uint64_t tuples, + uint64_t pt_ns, + uint64_t pt_div, + uint64_t deinit_ns, + uint64_t deinit_n, + uint64_t viol, + uint64_t errs, + const snap_t *a, + const snap_t *b, + double insert_s, + double drain_s, + const snap_t *da, + const snap_t *db_, + uint64_t app, + uint64_t alc) +{ + double secs = (b->t_ns - a->t_ns) / 1e9; + double cpu = b->cpu_s - a->cpu_s; + uint64_t rd = b->rd - a->rd, wr = b->wr - a->wr; + double d_cpu = da ? db_->cpu_s - da->cpu_s : 0; + uint64_t d_rd = da ? db_->rd - da->rd : 0, d_wr = da ? db_->wr - da->wr : 0; + uint64_t swin = b->swpin - a->swpin + (da ? db_->swpin - da->swpin : 0); + uint64_t swout = b->swpout - a->swpout + (da ? db_->swpout - da->swpout : 0); + uint64_t majflt = b->majflt - a->majflt; + double logical = (double)ops * (KEY_SIZE + VALUE_SIZE); + double wamp = (ph->kind == PH_LOAD || ph->kind == PH_OW) && ops + ? (double)(wr + d_wr) / logical + : NAN; + double pt = pt_div ? (double)pt_ns / (double)pt_div : NAN; + double dmean = deinit_n ? (double)deinit_ns / (double)deinit_n / 1e3 : NAN; + + printf("== %-22s T=%-2d ops=%-10" PRIu64 " secs=%7.2f ops/s=%11.0f " + "lat us p50=%.2f p99=%.2f p99.9=%.2f max=%.1f mean=%.2f\n", + ph->name, + threads, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat)); + printf(" cpu=%.2fs ops/cpu-s=%.0f rd=%.1f B/op wr=%.1f B/op " + "violations=%" PRIu64 " errors=%" PRIu64 " swapin=%" PRIu64 + " swapout=%" PRIu64 " majflt=%" PRIu64 "\n", + cpu, + ops / cpu, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + viol, + errs, + swin, + swout, + majflt); + if (ph->kind == PH_RANGE) { + printf(" startup us p50=%.2f p99=%.2f mean=%.2f per-tuple=%.1f ns " + "deinit mean=%.2f us tuples/s=%.0f\n", + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples / secs); + } + if (da) { + printf( + " insert/run=%.2fs drain(close)=%.2fs total=%.2fs drain_cpu=%.2fs " + "drain_rd=%" PRIu64 " drain_wr=%" PRIu64 " wamp=%.3f " + "db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc); + } + fflush(stdout); + + if (!opt.csv) { + return; + } + FILE *f = fopen(opt.csv, "a"); + if (!f) { + perror(opt.csv); + return; + } + if (!csv_header_written) { + fseek(f, 0, SEEK_END); + if (ftell(f) == 0) { + fprintf(f, + "version,size,order,log,phase,threads,rep,n,ops,secs,ops_s," + "p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s," + "rd_bytes,wr_bytes,rd_B_op,wr_B_op," + "startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns," + "deinit_mean_us,tuples,tuples_s," + "insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp," + "db_apparent,db_alloc,open_s,violations,errors,swapin,swapout," + "majflt\n"); + } + csv_header_written = 1; + } + fprintf(f, + "%s,%s,%s,%d,%s,%d,%d,%" PRIu64 ",%" PRIu64 ",%.3f,%.1f," + "%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.1f," + "%" PRIu64 ",%" PRIu64 ",%.2f,%.2f," + "%.3f,%.3f,%.3f,%.2f," + "%.3f,%" PRIu64 ",%.1f," + "%.3f,%.3f,%.3f,%.3f,%" PRIu64 ",%" PRIu64 ",%.4f," + "%" PRIu64 ",%" PRIu64 ",%.3f,%" PRIu64 ",%" PRIu64 ",%" PRIu64 + ",%" PRIu64 ",%" PRIu64 "\n", + opt.vtag, + opt.stag, + opt.otag, + opt.use_log, + ph->name, + threads, + opt.rep, + opt.n, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat), + cpu, + ops / cpu, + rd, + wr, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples, + tuples / secs, + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc, + open_secs, + viol, + errs, + swin, + swout, + majflt); + fclose(f); +} + +static void +run_phase(const phase_t *ph, bool last) +{ + int T = ph->threads > 0 ? ph->threads : opt.threads; + nworkers = T; + workers = calloc((size_t)T, sizeof(worker_t)); + if (!workers) { + fprintf(stderr, "FATAL: out of memory\n"); + exit(3); + } + void *(*fn)(void *) = NULL; + switch (ph->kind) { + case PH_LOAD: + fn = load_worker; + break; + case PH_WARM: + fn = warm_worker; + break; + case PH_POINT: + fn = point_worker; + break; + case PH_RANGE: + fn = range_worker; + break; + case PH_OW: + fn = ow_worker; + break; + } + bool fixed_count = ph->kind == PH_LOAD || ph->kind == PH_WARM; + atomic_store(&run_state, ST_WAIT); + atomic_store(&seq_counter, 0); + for (int i = 0; i < T; i++) { + workers[i].idx = i; + workers[i].ph = ph; + workers[i].rng = mix(opt.seed * 1000003 + (uint64_t)i * 7919 + 17 + + (uint64_t)ph->kind * 131 + (uint64_t)ph->dist); + if (pthread_create(&workers[i].th, NULL, fn, &workers[i])) { + fprintf(stderr, "FATAL: pthread_create\n"); + exit(3); + } + } + fprintf(stderr, + "phase %s: T=%d dist=%s %s\n", + ph->name, + T, + dist_name(ph->dist), + fixed_count ? "(fixed count)" : "(fixed duration)"); + wd_what = ph->name; + atomic_store(&wd_mode, WD_OPS); + snap_t a, b; + if (fixed_count) { + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + take_snap(&b); + } else { + atomic_store_explicit(&run_state, ST_WARMUP, memory_order_release); + sleep_secs(opt.warmup); + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + sleep_secs(opt.secs); + atomic_store_explicit(&run_state, ST_STOP, memory_order_release); + take_snap(&b); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + } + atomic_store(&wd_mode, WD_IDLE); + + if (ph->kind == PH_OW) { + verify_overwrite_sample(ph, T); + } + + hist_t *lat = calloc(1, sizeof(hist_t)), + *startup = calloc(1, sizeof(hist_t)); + uint64_t ops = 0, tuples = 0, pt_ns = 0, pt_div = 0, dns = 0, dn = 0, + viol = 0, errs = 0, found = 0, notfound = 0; + for (int i = 0; i < T; i++) { + worker_t *w = &workers[i]; + hist_merge(lat, &w->lat); + hist_merge(startup, &w->startup); + ops += w->ops; + tuples += w->tuples; + pt_ns += w->pt_ns; + pt_div += w->pt_div; + dns += w->deinit_ns; + dn += w->deinit_n; + viol += w->violations; + errs += w->errors; + found += w->found; + notfound += w->notfound; + } + if (ph->kind == PH_WARM) { + tuples = ops; + if (ops != opt.n && !(opt.sabotage & 8)) { + fprintf(stderr, + "VIOLATION: warm scanned %" PRIu64 " tuples, expected %" PRIu64 + "\n", + ops, + opt.n); + viol++; + } + } + if (ph->kind == PH_POINT) { + fprintf(stderr, + " found=%" PRIu64 " notfound=%" PRIu64 "\n", + found, + notfound); + } + + double insert_s = (b.t_ns - a.t_ns) / 1e9, drain_s = 0; + snap_t da, dbs; + uint64_t app = 0, alc = 0; + bool closed = false; + if (ph->kind == PH_LOAD || last) { + take_snap(&da); + drain_s = db_close(); + take_snap(&dbs); + file_sizes(&app, &alc); + closed = true; + } + csv_row(ph, + T, + lat, + startup, + ops, + tuples, + pt_ns, + pt_div, + dns, + dn, + viol, + errs, + &a, + &b, + insert_s, + drain_s, + closed ? &da : NULL, + closed ? &dbs : NULL, + app, + alc); + if (viol) { + printf(" FINDING: %" PRIu64 + " correctness violations in %s (first: %s)\n", + viol, + ph->name, + workers[0].first_violation[0] ? workers[0].first_violation + : "see stderr"); + } + free(lat); + free(startup); + free(workers); + workers = NULL; + nworkers = 0; + if (closed && !last) { + db_open(false); + } +} + +/* ------------------------------------------------------------------------ */ +/* CLI */ +/* ------------------------------------------------------------------------ */ + +static void +usage(void) +{ + fprintf( + stderr, + "usage: kvbench --db PATH (--create|--open) --n N --cache-mib M " + "--disk-gib G --log 0|1\n" + " [--threads 6] [--mt-bg 1] [--normal-bg 4] [--memtable-mib 24]\n" + " [--secs 20] [--warmup 3] [--csv FILE] [--hang-dir DIR]\n" + " [--vtag S] [--stag S] [--otag S] [--rep R] [--seed S]\n" + " [--sabotage MASK] (1: point present->query absent; 2: point " + "neg->query present;\n" + " 4: range expects +1; 8: warm expects +1; 16: " + "point threads hang)\n" + " [--hang-secs 120] (no-progress timeout before gdb dump + exit 99\n" + " phase... load:random|load:seq warm point:uniform|zipf|seq|neg\n" + " range:uniform|zipf:L ow:uniform|zipf (suffix @T = " + "threads)\n"); + exit(2); +} + +static bool +parse_phase(const char *s, phase_t *ph) +{ + memset(ph, 0, sizeof(*ph)); + snprintf(ph->name, sizeof(ph->name), "%s", s); + char buf[64]; + snprintf(buf, sizeof(buf), "%s", s); + char *at = strchr(buf, '@'); + if (at) { + *at = 0; + ph->threads = atoi(at + 1); + } + char *a = strtok(buf, ":"), *b = strtok(NULL, ":"), *c = strtok(NULL, ":"); + if (!a) { + return false; + } + enum dist d = D_UNIFORM; + if (b) { + if (!strcmp(b, "uniform")) + d = D_UNIFORM; + else if (!strcmp(b, "zipf")) + d = D_ZIPF; + else if (!strcmp(b, "seq")) + d = D_SEQ; + else if (!strcmp(b, "neg")) + d = D_NEG; + else if (!strcmp(b, "random")) + d = D_RANDOM; + else + return false; + } + ph->dist = d; + if (!strcmp(a, "load")) { + ph->kind = PH_LOAD; + return b && (d == D_RANDOM || d == D_SEQ); + } else if (!strcmp(a, "warm")) { + ph->kind = PH_WARM; + return true; + } else if (!strcmp(a, "point")) { + ph->kind = PH_POINT; + return b != NULL; + } else if (!strcmp(a, "range")) { + ph->kind = PH_RANGE; + if (!b || !c || (d != D_UNIFORM && d != D_ZIPF)) { + return false; + } + ph->L = strtoull(c, NULL, 10); + return ph->L >= 1; + } else if (!strcmp(a, "ow")) { + ph->kind = PH_OW; + return b && (d == D_UNIFORM || d == D_ZIPF); + } + return false; +} + +int +main(int argc, char **argv) +{ + opt = (options){.threads = 6, + .mt_bg = 1, + .normal_bg = 4, + .memtable_mib = 24, + .secs = 20, + .warmup = 3, + .vtag = "?", + .stag = "?", + .otag = "?", + .rep = 1, + .seed = 42, + .hang_secs = 120, + .use_log = -1}; + int mode = -1; +#ifdef KVBENCH_SPACE_MODE + /* + * Space-check build only: open with use_stats, print insertion stats + * (which include allocator "Currently Allocated" extents, recomputed from + * the persisted allocator map at open), close. No phases, no writes. + */ + bool space_mode = false; +#endif + for (int i = 1; i < argc; i++) { + const char *s = argv[i]; +#define ARG(name) (!strcmp(s, name) && i + 1 < argc) + if (!strcmp(s, "--create")) + mode = 1; + else if (!strcmp(s, "--open")) + mode = 0; + else if (ARG("--db")) + opt.db = argv[++i]; + else if (ARG("--csv")) + opt.csv = argv[++i]; + else if (ARG("--hang-dir")) + opt.hang_dir = argv[++i]; + else if (ARG("--vtag")) + opt.vtag = argv[++i]; + else if (ARG("--stag")) + opt.stag = argv[++i]; + else if (ARG("--otag")) + opt.otag = argv[++i]; + else if (ARG("--rep")) + opt.rep = atoi(argv[++i]); + else if (ARG("--n")) + opt.n = strtoull(argv[++i], NULL, 0); + else if (ARG("--cache-mib")) + opt.cache_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--disk-gib")) + opt.disk_gib = strtoull(argv[++i], NULL, 0); + else if (ARG("--memtable-mib")) + opt.memtable_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--log")) + opt.use_log = atoi(argv[++i]); + else if (ARG("--threads")) + opt.threads = atoi(argv[++i]); + else if (ARG("--mt-bg")) + opt.mt_bg = atoi(argv[++i]); + else if (ARG("--normal-bg")) + opt.normal_bg = atoi(argv[++i]); + else if (ARG("--secs")) + opt.secs = atof(argv[++i]); + else if (ARG("--warmup")) + opt.warmup = atof(argv[++i]); + else if (ARG("--sabotage")) + opt.sabotage = strtoull(argv[++i], NULL, 0); + else if (ARG("--hang-secs")) + opt.hang_secs = strtoull(argv[++i], NULL, 0); + else if (ARG("--seed")) + opt.seed = strtoull(argv[++i], NULL, 0); +#ifdef KVBENCH_SPACE_MODE + else if (!strcmp(s, "space")) + space_mode = true; +#endif + else if (s[0] == '-') + usage(); + else { + if (opt.nphases >= MAX_PHASES + || !parse_phase(s, &opt.phases[opt.nphases])) + { + fprintf(stderr, "bad phase '%s'\n", s); + usage(); + } + opt.nphases++; + } +#undef ARG + } +#ifdef KVBENCH_SPACE_MODE + if (space_mode && opt.db && opt.cache_mib && opt.disk_gib + && opt.use_log >= 0) + { + default_data_config_init(&data_cfg); + platform_set_log_streams(stdout, stderr); + db_open(false); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + db_close(); + uint64_t app, alc; + file_sizes(&app, &alc); + printf("space: db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", app, alc); + return 0; + } +#endif + if (!opt.db || mode < 0 || !opt.n || !opt.cache_mib || !opt.disk_gib + || opt.use_log < 0 || !opt.nphases || opt.threads < 1 + || opt.threads > MAX_WORKERS) + { + usage(); + } + for (int i = 0; i < opt.nphases; i++) { + if (opt.phases[i].threads > MAX_WORKERS) { + usage(); + } + } + prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0); + setvbuf(stdout, NULL, _IOLBF, 0); + + default_data_config_init(&data_cfg); + perm_init(&load_perm, opt.n, opt.seed * 2 + 1); + perm_init(&zipf_perm, opt.n, opt.seed * 2 + 2); + zipf_init(&zipf, opt.n, 0.99); + generation = (uint64_t)time(NULL); + + printf("kvbench version=%s splinter=%s db=%s mode=%s n=%" PRIu64 + " cache_mib=%" PRIu64 " disk_gib=%" PRIu64 + " log=%d threads=%d mt_bg=%d normal_bg=%d memtable_mib=%" PRIu64 + " secs=%.1f warmup=%.1f rep=%d sabotage=%" PRIu64 "\n", + opt.vtag, + splinterdb_get_version(), + opt.db, + mode ? "create" : "open", + opt.n, + opt.cache_mib, + opt.disk_gib, + opt.use_log, + opt.threads, + opt.mt_bg, + opt.normal_bg, + opt.memtable_mib, + opt.secs, + opt.warmup, + opt.rep, + opt.sabotage); + + pthread_t wd; + pthread_create(&wd, NULL, watchdog_main, NULL); + + db_open(mode == 1); + for (int i = 0; i < opt.nphases; i++) { + run_phase(&opt.phases[i], i == opt.nphases - 1); + } + if (kvs) { + db_close(); + } + return 0; +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/main-build.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/main-build.json new file mode 100644 index 000000000..c34761093 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/main-build.json @@ -0,0 +1,230 @@ +{ + "tree": "/home/rob/projects/splinterdb", + "head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "library": "/home/rob/projects/splinterdb/build-main-7bb5fab/release/lib/libsplinterdb.a", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "binaries": { + "kvbench": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/include", + "-I", + "/home/rob/projects/splinterdb/src", + "-I", + "/home/rob/projects/splinterdb/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/kvbench.c", + "/home/rob/projects/splinterdb/build-main-7bb5fab/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/kvbench", + "binary_sha256": "f9a3dbd472dd5a6773abbd986dee047aec294108779eb731f678943aaeb89c5e", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + }, + "insert_benchmark": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/include", + "-I", + "/home/rob/projects/splinterdb/src", + "-I", + "/home/rob/projects/splinterdb/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/insert_benchmark.c", + "/home/rob/projects/splinterdb/build-main-7bb5fab/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/insert_benchmark", + "binary_sha256": "9c39506eca1e6dc3088f26df34ce0c3af5920baa767533552e4d723579947c6c", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/insert_benchmark.c", + "source_sha256": "75acbda52b2a8949f1d61710a8d89250d4dac63b12ec9803b89170f9c2cc0b26" + }, + "prefix_kvbench": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/include", + "-I", + "/home/rob/projects/splinterdb/src", + "-I", + "/home/rob/projects/splinterdb/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/prefix_kvbench.c", + "/home/rob/projects/splinterdb/build-main-7bb5fab/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/sources/prefix_kvbench.c", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51" + } + }, + "source_files_sha256": { + "include/splinterdb/data.h": "6d8984e702da446c2fe145eb2f6a576ca040cfd5740733c405d0d7387b243ec2", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "364073691c390663f6b732f57c3ee4bfecc9f68aca33ef6750d6106e04462dc8", + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "bc0621be7903d64e25059140005dafeea3f2a4a4ae0e658686501e52e4be934f", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "7d46871423a15992f697cabb363316183cb842a11c26017f8566267174e5ae45", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "f637081a194302c584cccfd8d717253817794b34bbca754bd2c9e597acc534b9", + "src/btree.h": "6ed244b6731c490f224c7b5fea7b5a9dc27eca1aa808e6dab6b44a0c7b511638", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "70caf9f8d7794dea8d2aeec339883ccfcfdfc29ce6c2e1edd2d0353c4a3975ea", + "src/core.h": "7cf4d086f6d4dcaa4cbd161fef786dbe3cc502ced4512b7fe547c2aa2020462e", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "49a2b0aec91a1c40784b8b3b54f016ef5504c79492b1393674123e27656a09bb", + "src/log_data.h": "06ab1d39b77abb01ec66a901fa52354908be26db8daef52899f5c03a6db2462e", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "df98421e597d1edeac871755f0473055b590791af8efad495575d20260e46a12", + "src/merge.h": "c17e2a0b6272ec52e6d1e80acd9df7dc85221f186e6c60e323c37b467dc5c41a", + "src/mini_allocator.c": "d9444da13fca2000f4128500b84be2b778300a4befc93f72e52b071b83c6491e", + "src/mini_allocator.h": "8d5242f5e4df5443baeab7a494a3c3b2f1491216abfd914c6dbc273370e45683", + "src/notification.c": "2f3bcda49d8ce35ad532fef8ec8f4aeca48bec280cdf6210c21d55cf2aa4a661", + "src/notification.h": "47eb73f5813d6f54658f339ce44d6a475f8f64f2b2eb6368261e839a090f083f", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "a145d39af39caf9dec6f1e1e24b6606ed615587d8dee52a23e0df410b2d07545", + "src/rc_allocator.h": "65f01decb7244b8f6a6c9e7acb47d4ccb4f2f3f369461e70aff33211f03ee39b", + "src/routing_filter.c": "3e722a880217cc4f5831f162dd6b3853a5d0d3f67ca3d3421b2144650657f73a", + "src/routing_filter.h": "579a3a4cc00b9cb125479b23eaa93e4a8309a195fe4082d988b629d4b95a2c91", + "src/shard_log.c": "ed1fcdb429d4fc26382546ecbce04154910275494e9fef522cf34b647cf5e734", + "src/shard_log.h": "07c5867b959eefd35e3e9f08e6c015a594f6331850844590e9c2b1126cd2716b", + "src/splinterdb.c": "e054c2dc9224c7de8bdb63206bb5150947f853d903e3b8012ba46fe1a66dba5f", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "34dd4c724e53c98f170c024c70dd22dae0a466806c167134200f92128420dfba", + "src/superblock.h": "72cd00ce0a7c43d1c25905d6bd39a400fa3245c133a3f559c58ae34a962157f2", + "src/task.c": "35886e598b4464af16e76497917955d3d55c6c077fbcf80fb3fd2284c8ddc08d", + "src/task.h": "35405e04fbdcef9bc5c5d6ef43debc4b0889d6bc4d8d530649b0c45a34012825", + "src/trunk.c": "892373ec383717289a6220b4351b670637e7c41877a97eb0edcb27a9e4e270f2", + "src/trunk.h": "05c5c5313f5a42b68482d03b58d2f17081c6da468a0ce888b0b0b38cc069baf2", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9" + }, + "library_build_configuration": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": { + "sha256": "5aa1a945982ec32bed4c489a7d08bea5e92d78220a31d095780e5978b5b537ee", + "text": "BUILD_ROOT=build-main-7bb5fab\nMAKEFLAGS= -j6 --jobserver-auth=fifo:/tmp/splinter-main-7bb5fab-benchmark-baseline-libs-icr_rin0/GMfifo4 -- BUILD_MODE=release BUILD_ROOT=build-main-7bb5fab\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/package.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/package.py new file mode 100644 index 000000000..d55883554 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/package.py @@ -0,0 +1,67 @@ +"""Produce compact per-project archives without fixtures or executables.""" +import csv,hashlib,json,shutil,subprocess +from pathlib import Path +COORD=Path(__file__).resolve().parent +OUT=Path('/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab') +DEST=COORD/'project-archives' +PROJECTS=['disk-format','filtered-ranges','log-group-limit','branch-prefix','lazy-merge','cache-directory','async-durable-barrier','cache-invalid-addresses'] +def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest() +def write(p,v):p.write_text(json.dumps(v,indent=2)+'\n') +def readcsv(p): + with p.open() as f:return list(csv.DictReader(f)) +def writecsv(p,rs): + if not rs:return + with p.open('w') as f: + w=csv.DictWriter(f,fieldnames=list(rs[0]),lineterminator='\n');w.writeheader();w.writerows(rs) +subprocess.run(['python3',str(COORD/'report.py')],check=True) +summary=readcsv(COORD/'summary.csv') +expected={'fixtures':12,'resident':23,'disk':23,'prefix-resident-common':4,'prefix-resident-random':4,'prefix-disk-common':4,'prefix-disk-random':4,'insert':31,'hash':4,'barrier':24,'repeat-warmup':1,'repeat-cache-invalid-addresses':4,'repeat-directory-bucket-atomic':4,'repeat-async-durable-barrier':4} +for mode,count in expected.items(): + manifest=json.loads((OUT/mode/'manifest.json').read_text()) + assert manifest['complete'] and len(manifest['runs'])==count and all(r['verified'] and r['returncode']==0 for r in manifest['runs']),mode + +for project in PROJECTS: + profiles=[project] if project!='cache-directory' else ['directory-'+x for x in ['direct','bucket','bucket-simd','bucket-atomic']] + versions=profiles+(['log-disabled','log-default'] if project=='log-group-limit' else []) + path=DEST/project;path.mkdir(parents=True,exist_ok=False) + own=[r for r in summary if r['version'] in versions] + for r in own:r.update(scope='new main versus updated feature; merge cost not isolated') + writecsv(path/'summary.csv',own) + source_names={'kvbench.c','insert_benchmark.c'} + fixtures=json.loads((OUT/'fixtures/manifest.json').read_text());assert fixtures['complete'] and all(r['verified'] for r in fixtures['runs']) + fixtures['runs']=[r for r in fixtures['runs'] if r['profile'] in ['main',*profiles] and (('ordinary' not in r['label']) if project=='branch-prefix' else ('ordinary' in r['label']))] + fixture_out=path/'fixtures';fixture_out.mkdir();write(fixture_out/'manifest.json',fixtures) + for record in fixtures['runs']: + for suffix in ['.csv','.log']: + file=OUT/'fixtures'/(record['label']+suffix);shutil.copyfile(file,fixture_out/file.name) + if project=='branch-prefix':source_names.add('prefix_kvbench.c') + if project=='async-durable-barrier':source_names.add('barrier_bench.c') + if project=='filtered-ranges':source_names.add('hash_range_benchmark.c') + for name in source_names:shutil.copyfile(COORD/'sources'/name,path/name) + for name in ['run_matrix.py','build_all.py','report.py','package.py','preparation.json','feature-summaries.json','host.json','run_matrix-fixtures.py','control-drift.csv','repeat.py','audit.json','audit.py','report.md','benchmark-jobs.json','run_job.py']:shutil.copyfile(COORD/name,path/name) + for profile in ['main',*profiles]: + build=json.loads((COORD/(profile+'-build.json')).read_text());build['binaries']={name:value for name,value in build['binaries'].items() if name+'.c' in source_names};write(path/(profile+'-build.json'),build) + tests=[] + for folder in OUT.iterdir(): + if not folder.is_dir() or folder.name=='fixtures' or not (folder/'manifest.json').exists():continue + m=json.loads((folder/'manifest.json').read_text()) + assert m.get('complete') and m['runs'] and all(r['verified'] for r in m['runs']),folder + selected=[r for r in m['runs'] if r['profile'] in profiles] + if folder.name=='repeat-warmup' and project in ['async-durable-barrier','cache-invalid-addresses','cache-directory']:selected=m['runs'] + if not selected:continue + target=path/folder.name;target.mkdir() + rr=[r for r in m['runs'] if r['profile'] in profiles+['main']] + m['runs']=rr;write(target/'manifest.json',m) + for r in rr: + for file in folder.glob(r['label']+'.*'): + if file.suffix in ['.csv','.log']:shutil.copyfile(file,target/file.name) + if (folder/'results.csv').exists(): + rows=readcsv(folder/'results.csv') + if 'version' in rows[0]:rows=[r for r in rows if r['version'] in versions+['main']] + elif 'label' in rows[0]:rows=[r for r in rows if r['label'] in [x['label'] for x in rr]] + writecsv(target/'results.csv',rows) + tests.append(dict(workload=folder.name,runs=len(rr),feature_runs=sum(r['profile'] in profiles for r in rr),warmup_runs=len(rr) if folder.name=='repeat-warmup' else 0,verified=sum(r['verified'] for r in rr),complete=m['complete'])) + assert own and tests,project + write(path/'status.json',dict(project=project,scope='new main versus updated feature; merge cost not isolated',workloads=tests,reported_errors=sum(int(r['errors']) for r in own),reported_violations=sum(int(r['violations']) for r in own),all_runs_verified=bool(tests) and all(x['verified']==x['runs'] and x['complete'] for x in tests))) + inventory={str(p.relative_to(path)):sha(p) for p in path.rglob('*') if p.is_file()};write(path/'inventory.json',inventory) +print(DEST) diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/00-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/00-main.log new file mode 100644 index 000000000..11a193a81 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/00-main.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=0 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.16 ops/s= 12754094 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.61s ops/cpu-s=3286717 rd=188.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=833871 notfound=0 +== point:uniform@8 T=8 ops=833871 secs= 5.00 ops/s= 166767 lat us p50=50.69 p99=95.23 p99.9=133.12 max=4143.1 mean=47.90 + cpu=5.53s ops/cpu-s=150845 rd=3528.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 324937 ops (+32492 ops/s) +== range:uniform:1@8 T=8 ops=336838 secs= 5.00 ops/s= 67365 lat us p50=111.62 p99=299.01 p99.9=430.08 max=8138.1 mean=118.68 + cpu=41.90s ops/cpu-s=8039 rd=14152.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=109.57 p99=290.82 mean=117.91 per-tuple=nan ns deinit mean=0.72 us tuples/s=67365 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.092 s +== range:uniform:10000@8 T=8 ops=4496 secs= 5.00 ops/s= 899 lat us p50=7405.57 p99=23330.82 p99.9=31719.42 max=34712.7 mean=8896.84 + cpu=17.25s ops/cpu-s=261 rd=2537534.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=364.54 p99=1196.03 mean=402.39 per-tuple=850.9 ns deinit mean=1.25 us tuples/s=8977298 + insert/run=5.00s drain(close)=0.09s total=5.09s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671330816 db_alloc=834437120 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/01-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/01-branch-prefix.log new file mode 100644 index 000000000..8f6283a3c --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/01-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=1 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.15 ops/s= 12910108 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.63s ops/cpu-s=3178437 rd=134.3 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=732889 notfound=0 +== point:uniform@8 T=8 ops=732889 secs= 5.00 ops/s= 146572 lat us p50=61.95 p99=107.52 p99.9=794.62 max=3079.5 mean=54.52 + cpu=4.42s ops/cpu-s=165890 rd=3207.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 296707 ops (+29669 ops/s) +== range:uniform:1@8 T=8 ops=304394 secs= 5.00 ops/s= 60876 lat us p50=115.71 p99=380.93 p99.9=1884.16 max=6156.4 mean=131.35 + cpu=41.56s ops/cpu-s=7324 rd=10943.9 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=113.66 p99=380.93 mean=130.36 per-tuple=nan ns deinit mean=0.94 us tuples/s=60876 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.097 s +== range:uniform:10000@8 T=8 ops=4844 secs= 5.00 ops/s= 969 lat us p50=6356.99 p99=27000.83 p99.9=45613.06 max=59140.5 mean=8249.10 + cpu=16.27s ops/cpu-s=298 rd=1806230.3 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=348.16 p99=1589.25 mean=401.63 per-tuple=786.3 ns deinit mean=1.37 us tuples/s=9671992 + insert/run=5.00s drain(close)=0.10s total=5.10s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3250065408 db_alloc=550490112 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/02-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/02-branch-prefix.log new file mode 100644 index 000000000..c25a419c1 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/02-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=2 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.16 ops/s= 12146167 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.70s ops/cpu-s=2864336 rd=134.2 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=745918 notfound=0 +== point:uniform@8 T=8 ops=745918 secs= 5.00 ops/s= 149177 lat us p50=61.95 p99=105.47 p99.9=149.50 max=2878.9 mean=53.57 + cpu=4.62s ops/cpu-s=161545 rd=3207.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 305669 ops (+30565 ops/s) +== range:uniform:1@8 T=8 ops=317236 secs= 5.00 ops/s= 63445 lat us p50=115.71 p99=348.16 p99.9=532.48 max=3819.8 mean=126.03 + cpu=41.68s ops/cpu-s=7612 rd=10925.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=113.66 p99=348.16 mean=125.04 per-tuple=nan ns deinit mean=0.94 us tuples/s=63445 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.081 s +== range:uniform:10000@8 T=8 ops=4946 secs= 5.00 ops/s= 989 lat us p50=6356.99 p99=23330.82 p99.9=29622.27 max=30458.8 mean=8085.81 + cpu=16.46s ops/cpu-s=300 rd=1823078.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=339.97 p99=1163.26 mean=375.84 per-tuple=772.4 ns deinit mean=1.43 us tuples/s=9875983 + insert/run=5.00s drain(close)=0.08s total=5.08s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3250065408 db_alloc=550490112 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/03-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/03-main.log new file mode 100644 index 000000000..b93c3f758 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/03-main.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=3 sabotage=0 +open took 0.041 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.18 ops/s= 11121947 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.67s ops/cpu-s=2985351 rd=188.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=685880 notfound=0 +== point:uniform@8 T=8 ops=685880 secs= 5.00 ops/s= 137171 lat us p50=62.98 p99=117.76 p99.9=149.50 max=2005.8 mean=58.26 + cpu=4.52s ops/cpu-s=151608 rd=3526.9 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 271418 ops (+27140 ops/s) +== range:uniform:1@8 T=8 ops=284082 secs= 5.00 ops/s= 56814 lat us p50=130.05 p99=356.35 p99.9=565.25 max=4520.2 mean=140.73 + cpu=41.81s ops/cpu-s=6795 rd=14152.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=130.05 p99=356.35 mean=139.95 per-tuple=nan ns deinit mean=0.73 us tuples/s=56814 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.081 s +== range:uniform:10000@8 T=8 ops=4064 secs= 5.00 ops/s= 813 lat us p50=7929.86 p99=28049.41 p99.9=37224.45 max=43252.8 mean=9847.14 + cpu=15.58s ops/cpu-s=261 rd=2530641.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=2 swapout=0 majflt=0 + startup us p50=405.50 p99=1359.87 mean=449.73 per-tuple=941.8 ns deinit mean=1.21 us tuples/s=8112826 + insert/run=5.00s drain(close)=0.08s total=5.08s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671330816 db_alloc=834437120 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/manifest.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/manifest.json new file mode 100644 index 000000000..708e01dbe --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/manifest.json @@ -0,0 +1,311 @@ +{ + "mode": "prefix-disk-common", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "io": "O_DIRECT", + "cpu_affinity": "0-11", + "scope": "Updated feature branches versus fresh main; not an isolation of merge cost", + "runner_sha256": "536f10a1a7fd4b1e8e0250ea01cfe36793c7d6e2345f141092616ec06f64ee50", + "runs": [ + { + "label": "00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/results.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907591.6135461, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907609.9149086, + "log_sha256": "8d0024fdee92e235956a39eaa0af8e7c5d160dd13af124adf757428bfdefb2c1", + "process_cpu_s": 78.40283099999994, + "process_read_bytes": 23283638272, + "process_write_bytes": 319488, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-common.db", + "fixture_sha256": "830b8a8131e519c61ce4f699bdf857dff08a5be7071e6be4a3065d17d5b9dc58", + "allocated_bytes": 834621440, + "apparent_bytes": 3671330816 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 834437120 + }, + { + "label": "01-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907610.6976256, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907628.9998405, + "log_sha256": "2ff3af1f12a4e985b2e6ec9597d1c8bde2efb433e464f5133d6bfe995a78a6de", + "process_cpu_s": 75.52613400000014, + "process_read_bytes": 17631457280, + "process_write_bytes": 319488, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-common.db", + "fixture_sha256": "878befa71de3feeeb30ca8cf2837ba163e5495378a72f3332b4f495ca3234b08", + "allocated_bytes": 550690816, + "apparent_bytes": 3250065408 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 550490112 + }, + { + "label": "02-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907629.63418, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907647.933148, + "log_sha256": "45409b0754d8f55324e38c4c2ea0d581dfcbc171e1f1b82c975c5235a8f3f749", + "process_cpu_s": 76.14158800000014, + "process_read_bytes": 18053763072, + "process_write_bytes": 315392, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-common.db", + "fixture_sha256": "878befa71de3feeeb30ca8cf2837ba163e5495378a72f3332b4f495ca3234b08", + "allocated_bytes": 550690816, + "apparent_bytes": 3250065408 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 550490112 + }, + { + "label": "03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common/results.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907648.7705991, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907667.126624, + "log_sha256": "54af21c34826d0545715b9d5c0c16a1337c15e8b937cb0fb0dcb7011226570ef", + "process_cpu_s": 75.03298799999988, + "process_read_bytes": 20464185344, + "process_write_bytes": 323584, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-common.db", + "fixture_sha256": "830b8a8131e519c61ce4f699bdf857dff08a5be7071e6be4a3065d17d5b9dc58", + "allocated_bytes": 834621440, + "apparent_bytes": 3671330816 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 834437120 + } + ], + "complete": true +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/results.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/results.csv new file mode 100644 index 000000000..f037d2a78 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-common/results.csv @@ -0,0 +1,17 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,warm,8,0,2000000,2000000,0.157,12754094.5,nan,nan,nan,0.000,nan,0.609,3286716.7,376864768,32768,188.43,0.02,nan,nan,nan,nan,nan,2000000,12754094.5,0.157,0.000,0.157,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,disk,0,0,point:uniform@8,8,0,2000000,833871,5.000,166767.1,50.688,95.232,133.120,4143.108,47.904,5.528,150845.5,2942513152,0,3528.74,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,disk,0,0,range:uniform:1@8,8,0,2000000,336838,5.000,67364.5,111.616,299.008,430.080,8138.052,118.684,41.898,8039.5,4767051776,0,14152.36,0.00,109.568,290.816,117.915,nan,0.722,336838,67364.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,disk,0,0,range:uniform:10000@8,8,0,2000000,4496,5.000,899.2,7405.568,23330.816,31719.424,34712.748,8896.838,17.250,260.6,11408752640,0,2537533.95,0.00,364.544,1196.032,402.395,850.93,1.251,44888346,8977297.6,5.000,0.092,5.093,0.008,0,274432,nan,3671330816,834437120,0.007,0,0,0,0,0 +branch-prefix,disk,1,0,warm,8,1,2000000,2000000,0.155,12910108.0,nan,nan,nan,0.000,nan,0.629,3178437.5,268693504,32768,134.35,0.02,nan,nan,nan,nan,nan,2000000,12910108.0,0.155,0.000,0.155,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,disk,1,0,point:uniform@8,8,1,2000000,732889,5.000,146572.1,61.952,107.520,794.624,3079.479,54.520,4.418,165889.9,2350792704,0,3207.57,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,disk,1,0,range:uniform:1@8,8,1,2000000,304394,5.000,60876.0,115.712,380.928,1884.160,6156.397,131.346,41.563,7323.6,3331264512,0,10943.92,0.00,113.664,380.928,130.363,nan,0.938,304394,60876.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,disk,1,0,range:uniform:10000@8,8,1,2000000,4844,5.000,968.8,6356.992,27000.832,45613.056,59140.486,8249.105,16.274,297.7,8749379584,0,1806230.30,0.00,348.160,1589.248,401.626,786.32,1.370,48362165,9671992.4,5.000,0.097,5.098,0.006,0,274432,nan,3250065408,550490112,0.007,0,0,0,0,0 +branch-prefix,disk,2,0,warm,8,2,2000000,2000000,0.165,12146166.5,nan,nan,nan,0.000,nan,0.698,2864336.4,268328960,32768,134.16,0.02,nan,nan,nan,nan,nan,2000000,12146166.5,0.165,0.000,0.165,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,disk,2,0,point:uniform@8,8,2,2000000,745918,5.000,149177.3,61.952,105.472,149.504,2878.929,53.566,4.617,161545.3,2392563712,0,3207.54,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,disk,2,0,range:uniform:1@8,8,2,2000000,317236,5.000,63444.5,115.712,348.160,532.480,3819.751,126.025,41.677,7611.8,3465826304,0,10925.07,0.00,113.664,348.160,125.035,nan,0.944,317236,63444.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,disk,2,0,range:uniform:10000@8,8,2,2000000,4946,5.000,989.2,6356.992,23330.816,29622.272,30458.830,8085.812,16.462,300.4,9016946688,0,1823078.59,0.00,339.968,1163.264,375.844,772.37,1.430,49382165,9875983.2,5.000,0.081,5.081,0.007,0,274432,nan,3250065408,550490112,0.007,0,0,0,0,0 +main,disk,3,0,warm,8,3,2000000,2000000,0.180,11121947.4,nan,nan,nan,0.000,nan,0.670,2985350.9,377163776,32768,188.58,0.02,nan,nan,nan,nan,nan,2000000,11121947.4,0.180,0.000,0.180,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +main,disk,3,0,point:uniform@8,8,3,2000000,685880,5.000,137171.0,62.976,117.760,149.504,2005.806,58.256,4.524,151608.3,2419056640,0,3526.94,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +main,disk,3,0,range:uniform:1@8,8,3,2000000,284082,5.000,56813.9,130.048,356.352,565.248,4520.159,140.728,41.806,6795.2,4020363264,0,14152.12,0.00,130.048,356.352,139.955,nan,0.727,284082,56813.9,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.041,0,0,0,0,0 +main,disk,3,0,range:uniform:10000@8,8,3,2000000,4064,5.000,812.8,7929.856,28049.408,37224.448,43252.775,9847.136,15.583,260.8,10284527616,0,2530641.64,0.00,405.504,1359.872,449.728,941.82,1.207,40565785,8112825.8,5.000,0.081,5.081,0.009,0,274432,nan,3671330816,834437120,0.041,0,0,2,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/00-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/00-main.log new file mode 100644 index 000000000..b9edc0f39 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/00-main.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=0 sabotage=0 +open took 0.072 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.18 ops/s= 11403141 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.64s ops/cpu-s=3113466 rd=187.9 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=678137 notfound=0 +== point:uniform@8 T=8 ops=678137 secs= 5.00 ops/s= 135623 lat us p50=64.00 p99=117.76 p99.9=153.60 max=2616.5 mean=58.82 + cpu=4.73s ops/cpu-s=143270 rd=3528.3 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 268841 ops (+26882 ops/s) +== range:uniform:1@8 T=8 ops=282170 secs= 5.00 ops/s= 56431 lat us p50=133.12 p99=364.54 p99.9=548.86 max=4384.5 mean=141.56 + cpu=41.79s ops/cpu-s=6753 rd=14169.2 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=130.05 p99=356.35 mean=140.78 per-tuple=nan ns deinit mean=0.74 us tuples/s=56431 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.089 s +== range:uniform:10000@8 T=8 ops=4069 secs= 5.00 ops/s= 814 lat us p50=7929.86 p99=27000.83 p99.9=36175.87 max=38653.4 mean=9829.48 + cpu=15.91s ops/cpu-s=256 rd=2534528.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=405.50 p99=1228.80 mean=440.43 per-tuple=941.0 ns deinit mean=1.33 us tuples/s=8122783 + insert/run=5.00s drain(close)=0.09s total=5.09s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=832897024 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/01-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/01-branch-prefix.log new file mode 100644 index 000000000..4e18abab7 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/01-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=1 sabotage=0 +open took 0.039 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.19 ops/s= 10677551 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.70s ops/cpu-s=2854753 rd=188.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=683380 notfound=0 +== point:uniform@8 T=8 ops=683380 secs= 5.00 ops/s= 136671 lat us p50=62.98 p99=117.76 p99.9=149.50 max=2157.2 mean=58.37 + cpu=4.58s ops/cpu-s=149286 rd=3527.9 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 269398 ops (+26938 ops/s) +== range:uniform:1@8 T=8 ops=282120 secs= 5.00 ops/s= 56421 lat us p50=133.12 p99=356.35 p99.9=512.00 max=4098.0 mean=141.59 + cpu=41.83s ops/cpu-s=6744 rd=14158.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=130.05 p99=356.35 mean=140.58 per-tuple=nan ns deinit mean=0.96 us tuples/s=56421 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.067 s +== range:uniform:10000@8 T=8 ops=4061 secs= 5.00 ops/s= 812 lat us p50=8060.93 p99=27000.83 p99.9=35127.30 max=42617.0 mean=9851.52 + cpu=15.51s ops/cpu-s=262 rd=2503588.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=405.50 p99=1228.80 mean=447.27 per-tuple=942.6 ns deinit mean=1.51 us tuples/s=8106854 + insert/run=5.00s drain(close)=0.07s total=5.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=833986560 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/02-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/02-branch-prefix.log new file mode 100644 index 000000000..88ecd2600 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/02-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=2 sabotage=0 +open took 0.055 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.17 ops/s= 12003155 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.67s ops/cpu-s=3003427 rd=188.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=774224 notfound=0 +== point:uniform@8 T=8 ops=774224 secs= 5.00 ops/s= 154840 lat us p50=52.74 p99=101.38 p99.9=137.22 max=1724.4 mean=51.51 + cpu=4.91s ops/cpu-s=157581 rd=3529.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 300061 ops (+30004 ops/s) +== range:uniform:1@8 T=8 ops=313811 secs= 5.00 ops/s= 62759 lat us p50=119.81 p99=315.39 p99.9=454.66 max=4156.9 mean=127.26 + cpu=41.92s ops/cpu-s=7487 rd=14140.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=117.76 p99=315.39 mean=126.26 per-tuple=nan ns deinit mean=0.96 us tuples/s=62759 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.056 s +== range:uniform:10000@8 T=8 ops=4215 secs= 5.00 ops/s= 843 lat us p50=7405.57 p99=27000.83 p99.9=36175.87 max=39281.4 mean=9492.13 + cpu=16.15s ops/cpu-s=261 rd=2548938.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=364.54 p99=1097.73 mean=400.80 per-tuple=911.0 ns deinit mean=1.73 us tuples/s=8415359 + insert/run=5.00s drain(close)=0.06s total=5.06s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=833990656 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/03-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/03-main.log new file mode 100644 index 000000000..d97dd8f50 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/03-main.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=5.0 warmup=1.0 rep=3 sabotage=0 +open took 0.048 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.20 ops/s= 10019751 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.72s ops/cpu-s=2796131 rd=188.9 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=865419 notfound=0 +== point:uniform@8 T=8 ops=865419 secs= 5.00 ops/s= 173077 lat us p50=49.66 p99=95.23 p99.9=729.09 max=2106.7 mean=46.06 + cpu=5.63s ops/cpu-s=153657 rd=3529.8 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 339533 ops (+33951 ops/s) +== range:uniform:1@8 T=8 ops=353848 secs= 5.00 ops/s= 70766 lat us p50=103.42 p99=282.62 p99.9=1622.02 max=5039.8 mean=112.85 + cpu=42.10s ops/cpu-s=8406 rd=14161.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=103.42 p99=282.62 mean=112.06 per-tuple=nan ns deinit mean=0.74 us tuples/s=70766 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) +close took 0.065 s +== range:uniform:10000@8 T=8 ops=4562 secs= 5.00 ops/s= 912 lat us p50=7012.35 p99=25427.97 p99.9=52953.09 max=64163.5 mean=8768.53 + cpu=17.61s ops/cpu-s=259 rd=2532193.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=331.78 p99=1392.64 mean=377.71 per-tuple=840.6 ns deinit mean=1.28 us tuples/s=9109299 + insert/run=5.00s drain(close)=0.06s total=5.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=832897024 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/manifest.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/manifest.json new file mode 100644 index 000000000..795334a3b --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/manifest.json @@ -0,0 +1,311 @@ +{ + "mode": "prefix-disk-random", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "io": "O_DIRECT", + "cpu_affinity": "0-11", + "scope": "Updated feature branches versus fresh main; not an isolation of merge cost", + "runner_sha256": "536f10a1a7fd4b1e8e0250ea01cfe36793c7d6e2345f141092616ec06f64ee50", + "runs": [ + { + "label": "00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/results.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907668.052851, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907687.0153246, + "log_sha256": "52f92b1b3b03ec70c368f511691860e03f02b9ca532c6a64875e6679b53f1746", + "process_cpu_s": 76.22299600000002, + "process_read_bytes": 20431261696, + "process_write_bytes": 319488, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-random.db", + "fixture_sha256": "ca874e9d980e52ea52e0ccf8f41b266a6263675b49dfefc880e5c1bbabd27b63", + "allocated_bytes": 833347584, + "apparent_bytes": 3671592960 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 832897024 + }, + { + "label": "01-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907687.883826, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907706.7953205, + "log_sha256": "e8e3fc5c397bc81464ae90c46f98dca02c65adad9f68952cf9cc6510439a68d7", + "process_cpu_s": 75.59039499999977, + "process_read_bytes": 20297166848, + "process_write_bytes": 319488, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-random.db", + "fixture_sha256": "16b2a30021c7181c624f3fd92abee235b4443bf13e228376e34ab11e68224549", + "allocated_bytes": 834170880, + "apparent_bytes": 3671592960 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 833986560 + }, + { + "label": "02-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907707.5910716, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907726.4911072, + "log_sha256": "d7f487c19e519901fe055675d79d3770236eaac10383099b7769de207a276775", + "process_cpu_s": 76.96159800000015, + "process_read_bytes": 21897162752, + "process_write_bytes": 315392, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-branch-prefix-random.db", + "fixture_sha256": "16b2a30021c7181c624f3fd92abee235b4443bf13e228376e34ab11e68224549", + "allocated_bytes": 834170880, + "apparent_bytes": 3671592960 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 833990656 + }, + { + "label": "03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/scratch.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "5", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random/results.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-disk-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791907727.395917, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907746.2974908, + "log_sha256": "db7811cf8ee3db0777aea834b0b95a18087f88228eb96259da5d1728587b7a29", + "process_cpu_s": 79.79420700000009, + "process_read_bytes": 23908737024, + "process_write_bytes": 323584, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/disk-main-random.db", + "fixture_sha256": "ca874e9d980e52ea52e0ccf8f41b266a6263675b49dfefc880e5c1bbabd27b63", + "allocated_bytes": 833347584, + "apparent_bytes": 3671592960 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 832897024 + } + ], + "complete": true +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/results.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/results.csv new file mode 100644 index 000000000..82dc223c1 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-disk-random/results.csv @@ -0,0 +1,17 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,warm,8,0,2000000,2000000,0.175,11403141.4,nan,nan,nan,0.000,nan,0.642,3113465.6,375840768,32768,187.92,0.02,nan,nan,nan,nan,nan,2000000,11403141.4,0.175,0.000,0.175,0.000,0,0,nan,0,0,0.072,0,0,0,0,0 +main,disk,0,0,point:uniform@8,8,0,2000000,678137,5.000,135623.0,64.000,117.760,153.600,2616.489,58.816,4.733,143269.6,2392637440,0,3528.25,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.072,0,0,0,0,0 +main,disk,0,0,range:uniform:1@8,8,0,2000000,282170,5.000,56431.4,133.120,364.544,548.864,4384.462,141.565,41.786,6752.7,3998134272,0,14169.24,0.00,130.048,356.352,140.776,nan,0.742,282170,56431.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.072,0,0,0,0,0 +main,disk,0,0,range:uniform:10000@8,8,0,2000000,4069,5.000,813.8,7929.856,27000.832,36175.872,38653.358,9829.482,15.911,255.7,10312994816,0,2534528.09,0.00,405.504,1228.800,440.430,941.02,1.331,40615785,8122783.2,5.000,0.089,5.089,0.009,0,274432,nan,3671592960,832897024,0.072,0,0,0,0,0 +branch-prefix,disk,1,0,warm,8,1,2000000,2000000,0.187,10677551.3,nan,nan,nan,0.000,nan,0.701,2854753.0,377171968,32768,188.59,0.02,nan,nan,nan,nan,nan,2000000,10677551.3,0.187,0.000,0.187,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +branch-prefix,disk,1,0,point:uniform@8,8,1,2000000,683380,5.000,136671.3,62.976,117.760,149.504,2157.151,58.369,4.578,149285.7,2410926080,0,3527.94,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +branch-prefix,disk,1,0,range:uniform:1@8,8,1,2000000,282120,5.000,56421.2,133.120,356.352,512.000,4098.007,141.587,41.833,6744.0,3994374144,0,14158.42,0.00,130.048,356.352,140.582,nan,0.958,282120,56421.2,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +branch-prefix,disk,1,0,range:uniform:10000@8,8,1,2000000,4061,5.000,812.2,8060.928,27000.832,35127.296,42616.981,9851.519,15.509,261.8,10167070720,0,2503587.96,0.00,405.504,1228.800,447.269,942.62,1.509,40535785,8106853.6,5.000,0.067,5.067,0.007,0,274432,nan,3671592960,833986560,0.039,0,0,0,0,0 +branch-prefix,disk,2,0,warm,8,2,2000000,2000000,0.167,12003155.4,nan,nan,nan,0.000,nan,0.666,3003426.9,376066048,32768,188.03,0.02,nan,nan,nan,nan,nan,2000000,12003155.4,0.167,0.000,0.167,0.000,0,0,nan,0,0,0.055,0,0,0,0,1 +branch-prefix,disk,2,0,point:uniform@8,8,2,2000000,774224,5.000,154839.7,52.736,101.376,137.216,1724.397,51.505,4.913,157581.2,2732314624,0,3529.10,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.055,0,0,0,0,0 +branch-prefix,disk,2,0,range:uniform:1@8,8,2,2000000,313811,5.000,62759.4,119.808,315.392,454.656,4156.876,127.264,41.916,7486.7,4437479424,0,14140.61,0.00,117.760,315.392,126.261,nan,0.956,313811,62759.4,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.055,0,0,0,0,0 +branch-prefix,disk,2,0,range:uniform:10000@8,8,2,2000000,4215,5.000,843.0,7405.568,27000.832,36175.872,39281.387,9492.131,16.152,261.0,10743775232,0,2548938.37,0.00,364.544,1097.728,400.800,910.98,1.731,42078346,8415359.2,5.000,0.056,5.056,0.007,0,274432,nan,3671592960,833990656,0.055,0,0,0,0,0 +main,disk,3,0,warm,8,3,2000000,2000000,0.200,10019750.9,nan,nan,nan,0.000,nan,0.715,2796131.3,377708544,32768,188.85,0.02,nan,nan,nan,nan,nan,2000000,10019750.9,0.200,0.000,0.200,0.000,0,0,nan,0,0,0.048,0,0,0,0,0 +main,disk,3,0,point:uniform@8,8,3,2000000,865419,5.000,173077.1,49.664,95.232,729.088,2106.724,46.058,5.632,153656.8,3054764032,0,3529.81,0.00,nan,nan,nan,nan,nan,0,0.0,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.048,0,0,0,0,0 +main,disk,3,0,range:uniform:1@8,8,3,2000000,353848,5.000,70766.5,103.424,282.624,1622.016,5039.764,112.849,42.096,8405.8,5010862080,0,14161.06,0.00,103.424,282.624,112.064,nan,0.737,353848,70766.5,5.000,0.000,5.000,0.000,0,0,nan,0,0,0.048,0,0,0,0,0 +main,disk,3,0,range:uniform:10000@8,8,3,2000000,4562,5.000,912.4,7012.352,25427.968,52953.088,64163.495,8768.534,17.608,259.1,11551866880,0,2532193.53,0.00,331.776,1392.640,377.708,840.55,1.282,45548346,9109299.2,5.000,0.065,5.065,0.007,0,274432,nan,3671592960,832897024,0.048,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/00-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/00-main.log new file mode 100644 index 000000000..f8ef9a770 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/00-main.log @@ -0,0 +1,25 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=0 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12559602 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2733323 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=22794078 notfound=0 +== point:uniform@8 T=8 ops=22794078 secs= 6.00 ops/s= 3798858 lat us p50=1.97 p99=2.78 p99.9=7.23 max=471.2 mean=2.02 + cpu=47.99s ops/cpu-s=474951 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3935923 ops (+393566 ops/s) +== range:uniform:1@8 T=8 ops=5954385 secs= 6.00 ops/s= 992359 lat us p50=7.10 p99=11.14 p99.9=19.20 max=98.8 mean=8.01 + cpu=47.99s ops/cpu-s=124068 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=10.62 mean=7.55 per-tuple=nan ns deinit mean=0.41 us tuples/s=992359 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 24226 ops (+1844544833998518784 ops/s) +== range:uniform:10000@8 T=8 ops=20835 secs= 6.00 ops/s= 3472 lat us p50=2457.60 p99=4653.06 p99.9=5308.42 max=5785.4 mean=2303.51 + cpu=48.02s ops/cpu-s=434 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.83 p99=16.64 mean=9.39 per-tuple=235.0 ns deinit mean=0.64 us tuples/s=33884738 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.105 s +== ow:uniform@8 T=8 ops=13646417 secs= 6.00 ops/s= 2274317 lat us p50=1.52 p99=6.21 p99.9=57.86 max=220057.2 mean=3.48 + cpu=41.36s ops/cpu-s=329915 rd=147.0 B/op wr=188.9 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.11s total=6.11s drain_cpu=0.04s drain_rd=270336 drain_wr=47882240 wamp=1.173 db_apparent=8589934592 db_alloc=2685440000 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/01-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/01-branch-prefix.log new file mode 100644 index 000000000..992529a60 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/01-branch-prefix.log @@ -0,0 +1,25 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=1 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 18001084 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=4419011 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=25611533 notfound=0 +== point:uniform@8 T=8 ops=25611533 secs= 6.00 ops/s= 4268429 lat us p50=1.74 p99=2.46 p99.9=2.91 max=427.3 mean=1.80 + cpu=47.99s ops/cpu-s=533715 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 4090586 ops (+409031 ops/s) +== range:uniform:1@8 T=8 ops=6113910 secs= 6.00 ops/s= 1018943 lat us p50=6.72 p99=10.88 p99.9=19.71 max=5132.5 mean=7.79 + cpu=47.98s ops/cpu-s=127425 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.34 p99=10.11 mean=7.25 per-tuple=nan ns deinit mean=0.49 us tuples/s=1018943 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 24412 ops (+1844545457779958528 ops/s) +== range:uniform:10000@8 T=8 ops=20977 secs= 6.00 ops/s= 3496 lat us p50=2392.06 p99=4784.13 p99.9=5308.42 max=5801.6 mean=2287.97 + cpu=47.99s ops/cpu-s=437 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.62 p99=16.00 mean=8.37 per-tuple=233.6 ns deinit mean=0.69 us tuples/s=34107420 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.069 s +== ow:uniform@8 T=8 ops=15306118 secs= 6.00 ops/s= 2550919 lat us p50=1.52 p99=6.34 p99.9=32.00 max=134014.9 mean=3.08 + cpu=44.72s ops/cpu-s=342280 rd=78.3 B/op wr=108.5 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.07s total=6.07s drain_cpu=0.03s drain_rd=28672 drain_wr=38453248 wamp=0.677 db_apparent=8589934592 db_alloc=1803984896 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/02-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/02-branch-prefix.log new file mode 100644 index 000000000..76077f469 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/02-branch-prefix.log @@ -0,0 +1,25 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=2 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 18368335 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=3949993 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=26013577 notfound=0 +== point:uniform@8 T=8 ops=26013577 secs= 6.00 ops/s= 4335418 lat us p50=1.74 p99=2.40 p99.9=3.04 max=446.1 mean=1.77 + cpu=47.99s ops/cpu-s=542071 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=337 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 4058814 ops (+405854 ops/s) +== range:uniform:1@8 T=8 ops=6163122 secs= 6.00 ops/s= 1027147 lat us p50=6.72 p99=10.88 p99.9=19.20 max=103.6 mean=7.73 + cpu=48.00s ops/cpu-s=128407 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.21 p99=10.11 mean=7.20 per-tuple=nan ns deinit mean=0.48 us tuples/s=1027147 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 25264 ops (+1844549745689448704 ops/s) +== range:uniform:10000@8 T=8 ops=21659 secs= 6.00 ops/s= 3610 lat us p50=1949.70 p99=5308.42 p99.9=5570.56 max=6015.9 mean=2215.93 + cpu=47.99s ops/cpu-s=451 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.36 p99=14.98 mean=8.00 per-tuple=226.4 ns deinit mean=0.68 us tuples/s=35227605 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.111 s +== ow:uniform@8 T=8 ops=14744687 secs= 6.00 ops/s= 2457344 lat us p50=1.55 p99=5.95 p99.9=34.30 max=157605.9 mean=3.19 + cpu=43.71s ops/cpu-s=337338 rd=81.8 B/op wr=110.1 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.11s total=6.11s drain_cpu=0.04s drain_rd=45056 drain_wr=41607168 wamp=0.689 db_apparent=8589279232 db_alloc=1764179968 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/03-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/03-main.log new file mode 100644 index 000000000..d0f56a7ac --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/03-main.log @@ -0,0 +1,25 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=3 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15370088 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3231331 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=23880600 notfound=0 +== point:uniform@8 T=8 ops=23880600 secs= 6.00 ops/s= 3979950 lat us p50=1.87 p99=2.66 p99.9=8.32 max=504.6 mean=1.93 + cpu=47.99s ops/cpu-s=497664 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3947506 ops (+394723 ops/s) +== range:uniform:1@8 T=8 ops=5980442 secs= 6.00 ops/s= 996704 lat us p50=7.10 p99=10.88 p99.9=20.74 max=98.5 mean=7.98 + cpu=47.99s ops/cpu-s=124609 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=10.37 mean=7.51 per-tuple=nan ns deinit mean=0.42 us tuples/s=996704 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 25212 ops (+1844545594266805504 ops/s) +== range:uniform:10000@8 T=8 ops=21656 secs= 6.00 ops/s= 3609 lat us p50=2392.06 p99=5046.27 p99.9=5177.34 max=5288.7 mean=2216.37 + cpu=48.00s ops/cpu-s=451 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.00 p99=13.70 mean=8.72 per-tuple=226.3 ns deinit mean=0.57 us tuples/s=35215012 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.089 s +== ow:uniform@8 T=8 ops=13827922 secs= 6.00 ops/s= 2304560 lat us p50=1.52 p99=6.08 p99.9=58.88 max=189504.8 mean=3.43 + cpu=42.01s ops/cpu-s=329171 rd=144.9 B/op wr=188.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.09s total=6.09s drain_cpu=0.03s drain_rd=114688 drain_wr=49676288 wamp=1.168 db_apparent=8586395648 db_alloc=2698842112 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/manifest.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/manifest.json new file mode 100644 index 000000000..127665ed8 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/manifest.json @@ -0,0 +1,315 @@ +{ + "mode": "prefix-resident-common", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "io": "O_DIRECT", + "cpu_affinity": "0-11", + "scope": "Updated feature branches versus fresh main; not an isolation of merge cost", + "runner_sha256": "536f10a1a7fd4b1e8e0250ea01cfe36793c7d6e2345f141092616ec06f64ee50", + "runs": [ + { + "label": "00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907361.972576, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907390.3571775, + "log_sha256": "81be21b00ecbed2be204e32274e68cc4d24993159e75690ea087b3c1200666c8", + "process_cpu_s": 216.744831, + "process_read_bytes": 2119090176, + "process_write_bytes": 2950668288, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-common.db", + "fixture_sha256": "f46e09ff5cf4059f0d4b8e82c586323274ca1af83a3e6197389ebb28aabda858", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 2685440000 + }, + { + "label": "01-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907390.4441426, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907418.7822747, + "log_sha256": "2e39f08e79cc7e8253059d3e7f7f72e96e5a0803746db04c67a73d870e1afe17", + "process_cpu_s": 220.53080200000005, + "process_read_bytes": 1304731648, + "process_write_bytes": 1907474432, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-common.db", + "fixture_sha256": "f37cb48c6fb00b08adccea6eebc85a25e2c12f3ada74432d96dd06abb1eaaa30", + "allocated_bytes": 26128384, + "apparent_bytes": 207360000 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 1803984896 + }, + { + "label": "02-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907418.84805, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907447.1998322, + "log_sha256": "78fd26a69427bc99e3043e819895aaa3df89e69caac2f73fb072688cde0737b0", + "process_cpu_s": 219.52149100000003, + "process_read_bytes": 1264095232, + "process_write_bytes": 1860485120, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-common.db", + "fixture_sha256": "f37cb48c6fb00b08adccea6eebc85a25e2c12f3ada74432d96dd06abb1eaaa30", + "allocated_bytes": 26128384, + "apparent_bytes": 207360000 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 1764179968 + }, + { + "label": "03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common/results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-common", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907447.2844353, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907475.6244526, + "log_sha256": "902192d5930a5eca8f186bddfaa28dd76726f27922b0abe417be119fc44f0d6f", + "process_cpu_s": 217.44334900000004, + "process_read_bytes": 2123800576, + "process_write_bytes": 2979278848, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-common.db", + "fixture_sha256": "f46e09ff5cf4059f0d4b8e82c586323274ca1af83a3e6197389ebb28aabda858", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 2698842112 + } + ], + "complete": true +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/results.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/results.csv new file mode 100644 index 000000000..5a665aca7 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-common/results.csv @@ -0,0 +1,21 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.016,12559602.4,nan,nan,nan,0.000,nan,0.073,2733323.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12559602.4,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,point:uniform@8,8,0,200000,22794078,6.000,3798858.3,1.968,2.784,7.232,471.170,2.024,47.992,474951.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,5954385,6.000,992358.5,7.104,11.136,19.200,98.833,8.009,47.993,124067.5,0,0,0.00,0.00,6.720,10.624,7.547,nan,0.415,5954385,992358.5,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,20835,6.000,3472.3,2457.600,4653.056,5308.416,5785.391,2303.512,48.025,433.8,0,4096,0.00,0.20,8.832,16.640,9.394,234.97,0.639,203317709,33884737.6,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,ow:uniform@8,8,0,200000,13646417,6.000,2274316.9,1.520,6.208,57.856,220057.151,3.475,41.363,329914.5,2005544960,2578157568,146.96,188.93,nan,nan,nan,nan,nan,0,0.0,6.000,0.105,6.105,0.042,270336,47882240,1.1734,8589934592,2685440000,0.007,0,0,0,0,0 +branch-prefix,resident,1,0,warm,8,1,200000,200000,0.011,18001084.0,nan,nan,nan,0.000,nan,0.045,4419010.6,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,18001084.0,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,1,0,point:uniform@8,8,1,200000,25611533,6.000,4268429.4,1.744,2.464,2.912,427.312,1.797,47.987,533715.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,1,0,range:uniform:1@8,8,1,200000,6113910,6.000,1018943.3,6.720,10.880,19.712,5132.538,7.791,47.981,127424.7,0,0,0.00,0.00,6.336,10.112,7.251,nan,0.491,6113910,1018943.3,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,1,0,range:uniform:10000@8,8,1,200000,20977,6.000,3496.0,2392.064,4784.128,5308.416,5801.577,2287.968,47.992,437.1,0,4096,0.00,0.20,7.616,16.000,8.368,233.55,0.691,204654135,34107420.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,1,0,ow:uniform@8,8,1,200000,15306118,6.000,2550918.9,1.520,6.336,32.000,134014.906,3.082,44.718,342280.3,1198952448,1661190144,78.33,108.53,nan,nan,nan,nan,nan,0,0.0,6.000,0.069,6.070,0.029,28672,38453248,0.6771,8589934592,1803984896,0.005,0,0,0,0,0 +branch-prefix,resident,2,0,warm,8,2,200000,200000,0.011,18368335.3,nan,nan,nan,0.000,nan,0.051,3949993.1,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,18368335.3,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,2,0,point:uniform@8,8,2,200000,26013577,6.000,4335417.7,1.744,2.400,3.040,446.092,1.770,47.989,542070.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.005,0,0,337,0,0 +branch-prefix,resident,2,0,range:uniform:1@8,8,2,200000,6163122,6.000,1027146.6,6.720,10.880,19.200,103.595,7.731,47.997,128406.6,0,0,0.00,0.00,6.208,10.112,7.201,nan,0.481,6163122,1027146.6,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,2,0,range:uniform:10000@8,8,2,200000,21659,6.000,3609.7,1949.696,5308.416,5570.560,6015.912,2215.935,47.991,451.3,0,4096,0.00,0.19,7.360,14.976,7.998,226.40,0.684,211374727,35227604.6,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,2,0,ow:uniform@8,8,2,200000,14744687,6.000,2457344.4,1.552,5.952,34.304,157605.904,3.194,43.709,337337.6,1205473280,1624092672,81.76,110.15,nan,nan,nan,nan,nan,0,0.0,6.000,0.111,6.111,0.040,45056,41607168,0.6888,8589279232,1764179968,0.005,0,0,0,0,0 +main,resident,3,0,warm,8,3,200000,200000,0.013,15370088.3,nan,nan,nan,0.000,nan,0.062,3231331.0,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15370088.3,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +main,resident,3,0,point:uniform@8,8,3,200000,23880600,6.000,3979950.2,1.872,2.656,8.320,504.574,1.933,47.985,497663.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,5980442,6.000,996704.2,7.104,10.880,20.736,98.464,7.975,47.993,124609.4,0,0,0.00,0.00,6.720,10.368,7.509,nan,0.420,5980442,996704.2,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,21656,6.000,3609.2,2392.064,5046.272,5177.344,5288.654,2216.366,47.998,451.2,0,4096,0.00,0.19,8.000,13.696,8.719,226.30,0.567,211299106,35215011.6,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +main,resident,3,0,ow:uniform@8,8,3,200000,13827922,6.000,2304559.8,1.520,6.080,58.880,189504.801,3.429,42.008,329171.0,2003456000,2599260160,144.88,187.97,nan,nan,nan,nan,nan,0,0.0,6.000,0.089,6.090,0.032,114688,49676288,1.1681,8586395648,2698842112,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/00-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/00-main.log new file mode 100644 index 000000000..485806eff --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/00-main.log @@ -0,0 +1,25 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=0 sabotage=0 +open took 0.039 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12315509 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2887044 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=24538572 notfound=0 +== point:uniform@8 T=8 ops=24538572 secs= 6.00 ops/s= 4089596 lat us p50=1.74 p99=2.46 p99.9=6.59 max=239.2 mean=1.81 + cpu=47.99s ops/cpu-s=511341 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3878612 ops (+387835 ops/s) +== range:uniform:1@8 T=8 ops=5927637 secs= 6.00 ops/s= 987903 lat us p50=7.10 p99=11.14 p99.9=19.20 max=115.8 mean=7.93 + cpu=47.99s ops/cpu-s=123509 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.59 p99=10.37 mean=7.45 per-tuple=nan ns deinit mean=0.43 us tuples/s=987903 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 32063 ops (+1844542896257878784 ops/s) +== range:uniform:10000@8 T=8 ops=27707 secs= 6.00 ops/s= 4618 lat us p50=1720.32 p99=3244.03 p99.9=3440.64 max=3984.7 mean=1732.23 + cpu=47.99s ops/cpu-s=577 rd=0.0 B/op wr=0.1 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.86 p99=13.70 mean=9.94 per-tuple=176.4 ns deinit mean=0.67 us tuples/s=45042500 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.171 s +== ow:uniform@8 T=8 ops=13087394 secs= 6.00 ops/s= 2181154 lat us p50=1.49 p99=6.21 p99.9=59.90 max=225395.2 mean=3.55 + cpu=39.91s ops/cpu-s=327893 rd=131.6 B/op wr=182.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.17s total=6.17s drain_cpu=0.08s drain_rd=26099712 drain_wr=20742144 wamp=1.119 db_apparent=8589877248 db_alloc=2580168704 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/01-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/01-branch-prefix.log new file mode 100644 index 000000000..988ccf9f1 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/01-branch-prefix.log @@ -0,0 +1,25 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15693053 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3098613 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=24083110 notfound=0 +== point:uniform@8 T=8 ops=24083110 secs= 6.00 ops/s= 4013702 lat us p50=1.81 p99=2.59 p99.9=7.74 max=328.2 mean=1.84 + cpu=47.98s ops/cpu-s=501957 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=15 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 4164772 ops (+416449 ops/s) +== range:uniform:1@8 T=8 ops=6287437 secs= 6.00 ops/s= 1047869 lat us p50=6.46 p99=10.37 p99.9=18.69 max=487.8 mean=7.48 + cpu=47.99s ops/cpu-s=131024 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.08 p99=9.60 mean=6.98 per-tuple=nan ns deinit mean=0.45 us tuples/s=1047869 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 26841 ops (+1844548496461169408 ops/s) +== range:uniform:10000@8 T=8 ops=23100 secs= 6.00 ops/s= 3850 lat us p50=1916.93 p99=6356.99 p99.9=6619.14 max=6925.7 mean=2077.53 + cpu=47.99s ops/cpu-s=481 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=14.98 mean=9.84 per-tuple=211.8 ns deinit mean=0.79 us tuples/s=37559678 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.128 s +== ow:uniform@8 T=8 ops=13809925 secs= 6.00 ops/s= 2301559 lat us p50=1.46 p99=5.82 p99.9=57.86 max=182135.8 mean=3.34 + cpu=42.16s ops/cpu-s=327522 rd=145.0 B/op wr=187.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.13s total=6.13s drain_cpu=0.03s drain_rd=131072 drain_wr=49561600 wamp=1.164 db_apparent=8589148160 db_alloc=2683387904 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/02-branch-prefix.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/02-branch-prefix.log new file mode 100644 index 000000000..16ea5dd6d --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/02-branch-prefix.log @@ -0,0 +1,25 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 919b61f0-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=2 sabotage=0 +open took 0.039 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 11218731 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.08s ops/cpu-s=2561082 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=23482436 notfound=0 +== point:uniform@8 T=8 ops=23482436 secs= 6.00 ops/s= 3913587 lat us p50=1.84 p99=2.59 p99.9=6.98 max=1727.4 mean=1.89 + cpu=47.99s ops/cpu-s=489289 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 4117402 ops (+411712 ops/s) +== range:uniform:1@8 T=8 ops=6129861 secs= 6.00 ops/s= 1021601 lat us p50=6.59 p99=10.88 p99.9=20.22 max=685.5 mean=7.66 + cpu=47.98s ops/cpu-s=127749 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.21 p99=10.37 mean=7.15 per-tuple=nan ns deinit mean=0.46 us tuples/s=1021601 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 26927 ops (+1844542070330801664 ops/s) +== range:uniform:10000@8 T=8 ops=23319 secs= 6.00 ops/s= 3886 lat us p50=1851.39 p99=5570.56 p99.9=5832.70 max=5975.1 mean=2058.05 + cpu=48.03s ops/cpu-s=486 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=14.72 mean=9.84 per-tuple=209.8 ns deinit mean=0.77 us tuples/s=37899457 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.126 s +== ow:uniform@8 T=8 ops=12948061 secs= 6.00 ops/s= 2157932 lat us p50=1.46 p99=5.70 p99.9=56.83 max=269371.1 mean=3.58 + cpu=39.59s ops/cpu-s=327013 rd=135.6 B/op wr=185.1 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.13s total=6.13s drain_cpu=0.03s drain_rd=389120 drain_wr=15093760 wamp=1.136 db_apparent=8589803520 db_alloc=2589319168 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/03-main.log b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/03-main.log new file mode 100644 index 000000000..3c6668f57 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/03-main.log @@ -0,0 +1,25 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 7bb5fab3 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=6.0 warmup=1.0 rep=3 sabotage=0 +open took 0.040 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12313583 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.08s ops/cpu-s=2597807 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=23172019 notfound=0 +== point:uniform@8 T=8 ops=23172019 secs= 6.00 ops/s= 3861855 lat us p50=1.84 p99=2.66 p99.9=6.98 max=94.5 mean=1.92 + cpu=48.00s ops/cpu-s=482779 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 4042218 ops (+404196 ops/s) +== range:uniform:1@8 T=8 ops=6166554 secs= 6.00 ops/s= 1027722 lat us p50=6.72 p99=10.37 p99.9=19.71 max=102.0 mean=7.63 + cpu=47.99s ops/cpu-s=128496 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.34 p99=9.86 mean=7.18 per-tuple=nan ns deinit mean=0.41 us tuples/s=1027722 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 28214 ops (+1844545122096218880 ops/s) +== range:uniform:10000@8 T=8 ops=24380 secs= 6.00 ops/s= 4063 lat us p50=1753.09 p99=5570.56 p99.9=5701.63 max=6199.7 mean=1968.43 + cpu=48.00s ops/cpu-s=508 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.09 p99=14.72 mean=9.54 per-tuple=200.8 ns deinit mean=0.66 us tuples/s=39634379 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.114 s +== ow:uniform@8 T=8 ops=14082417 secs= 6.00 ops/s= 2346979 lat us p50=1.49 p99=6.08 p99.9=52.74 max=191298.4 mean=3.28 + cpu=42.44s ops/cpu-s=331854 rd=142.1 B/op wr=186.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=6.00s drain(close)=0.11s total=6.11s drain_cpu=0.04s drain_rd=16384 drain_wr=52764672 wamp=1.157 db_apparent=8589279232 db_alloc=2719121408 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/manifest.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/manifest.json new file mode 100644 index 000000000..899524866 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/manifest.json @@ -0,0 +1,315 @@ +{ + "mode": "prefix-resident-random", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "io": "O_DIRECT", + "cpu_affinity": "0-11", + "scope": "Updated feature branches versus fresh main; not an isolation of merge cost", + "runner_sha256": "536f10a1a7fd4b1e8e0250ea01cfe36793c7d6e2345f141092616ec06f64ee50", + "runs": [ + { + "label": "00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907475.7424479, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907504.7349174, + "log_sha256": "71cf5be0548497291166644a6778581a973a08e9bf8d3cde8b8a391549c56453", + "process_cpu_s": 215.7734849999999, + "process_read_bytes": 1985667072, + "process_write_bytes": 2795261952, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-random.db", + "fixture_sha256": "33cccf3217cbc9ae09c4a0a2ac62c0bacb8f6fa1858a0c1957a702d8e2f078b8", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 2580168704 + }, + { + "label": "01-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907504.8477964, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907533.2876048, + "log_sha256": "ad18f1ba8ff2a7aeb658b10fd5f1b14848cf021e28e644898f5a516591d4e8ad", + "process_cpu_s": 217.74764199999976, + "process_read_bytes": 2119380992, + "process_write_bytes": 2967490560, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-random.db", + "fixture_sha256": "8cca25877ee38aef2c506b684adb204c7c347d6ebc68850441050aff549651dd", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 2683387904 + }, + { + "label": "02-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907533.3901722, + "binary_sha256": "3324bd237ade5b428a6897703b6ec7452be58b90e492c0fb21349ddfc59175b9", + "library_sha256": "cc0ce2bd178feed732ea7ac7f7ac3b0ec05d55be320e84e3fbdf6eb707ad0410", + "source_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "verified": true, + "returncode": 0, + "finished": 1791907562.3832219, + "log_sha256": "f800c70665b447549b9be2d0ad06598bee20062046839cad5130912e9f81620e", + "process_cpu_s": 215.41245700000024, + "process_read_bytes": 2008588288, + "process_write_bytes": 2817228800, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-branch-prefix-random.db", + "fixture_sha256": "8cca25877ee38aef2c506b684adb204c7c347d6ebc68850441050aff549651dd", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 2589319168 + }, + { + "label": "03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/benchmarks/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "6", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random/results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/prefix-resident-random", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "ow:uniform@8" + ], + "started": 1791907562.491272, + "binary_sha256": "f0853a27c665c080a1addef88e382382747d207b39a5318dd3f22afad5fe5fba", + "library_sha256": "20944ac1b2f8420bd8f868d20894e462f9c3c240e4380e9c1242287cbb394f9a", + "source_head": "7bb5fab305b9c6179e31f75998dabea833537a08", + "verified": true, + "returncode": 0, + "finished": 1791907590.9852326, + "log_sha256": "66593aeb81bd645d57696f350af69de5dd112425f95b43ce3a999b8418a81cb4", + "process_cpu_s": 217.99731300000002, + "process_read_bytes": 2121596928, + "process_write_bytes": 3007508480, + "verification_kind": "query key/value/range validation and successful close", + "errors": 0, + "violations": 0, + "fixture": { + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab/fixtures/resident-main-random.db", + "fixture_sha256": "33cccf3217cbc9ae09c4a0a2ac62c0bacb8f6fa1858a0c1957a702d8e2f078b8", + "allocated_bytes": 37408768, + "apparent_bytes": 237375488 + }, + "fixture_copy_fsynced": true, + "db_allocated_bytes": 2719121408 + } + ], + "complete": true +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/results.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/results.csv new file mode 100644 index 000000000..bf02e6b62 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix-resident-random/results.csv @@ -0,0 +1,21 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.016,12315509.1,nan,nan,nan,0.000,nan,0.069,2887044.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12315509.1,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.039,0,0,0,0,1 +main,resident,0,0,point:uniform@8,8,0,200000,24538572,6.000,4089596.1,1.744,2.464,6.592,239.246,1.806,47.989,511341.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,5927637,6.000,987903.4,7.104,11.136,19.200,115.811,7.928,47.994,123509.0,0,0,0.00,0.00,6.592,10.368,7.447,nan,0.433,5927637,987903.4,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,27707,6.000,4617.6,1720.320,3244.032,3440.640,3984.682,1732.233,47.994,577.3,0,4096,0.00,0.15,9.856,13.696,9.943,176.44,0.674,270267528,45042500.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +main,resident,0,0,ow:uniform@8,8,0,200000,13087394,6.000,2181154.0,1.488,6.208,59.904,225395.164,3.551,39.914,327892.9,1722953728,2381574144,131.65,181.97,nan,nan,nan,nan,nan,0,0.0,6.000,0.171,6.172,0.080,26099712,20742144,1.1193,8589877248,2580168704,0.039,0,0,0,0,0 +branch-prefix,resident,1,0,warm,8,1,200000,200000,0.013,15693052.7,nan,nan,nan,0.000,nan,0.065,3098613.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15693052.7,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +branch-prefix,resident,1,0,point:uniform@8,8,1,200000,24083110,6.000,4013702.3,1.808,2.592,7.744,328.197,1.845,47.978,501957.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.006,0,0,15,0,0 +branch-prefix,resident,1,0,range:uniform:1@8,8,1,200000,6287437,6.000,1047868.6,6.464,10.368,18.688,487.824,7.478,47.987,131023.6,0,0,0.00,0.00,6.080,9.600,6.977,nan,0.455,6287437,1047868.6,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +branch-prefix,resident,1,0,range:uniform:10000@8,8,1,200000,23100,6.000,3849.8,1916.928,6356.992,6619.136,6925.684,2077.532,47.992,481.3,0,4096,0.00,0.18,9.344,14.976,9.838,211.76,0.793,225368430,37559678.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +branch-prefix,resident,1,0,ow:uniform@8,8,1,200000,13809925,6.000,2301558.9,1.456,5.824,57.856,182135.819,3.343,42.165,327521.7,2002001920,2587553792,144.97,187.37,nan,nan,nan,nan,nan,0,0.0,6.000,0.128,6.128,0.032,131072,49561600,1.1644,8589148160,2683387904,0.006,0,0,0,0,0 +branch-prefix,resident,2,0,warm,8,2,200000,200000,0.018,11218731.2,nan,nan,nan,0.000,nan,0.078,2561081.8,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,11218731.2,0.018,0.000,0.018,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +branch-prefix,resident,2,0,point:uniform@8,8,2,200000,23482436,6.000,3913586.5,1.840,2.592,6.976,1727.378,1.888,47.993,489289.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +branch-prefix,resident,2,0,range:uniform:1@8,8,2,200000,6129861,6.000,1021601.1,6.592,10.880,20.224,685.514,7.659,47.984,127749.3,0,0,0.00,0.00,6.208,10.368,7.148,nan,0.463,6129861,1021601.1,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +branch-prefix,resident,2,0,range:uniform:10000@8,8,2,200000,23319,6.000,3886.3,1851.392,5570.560,5832.704,5975.125,2058.050,48.028,485.5,0,4096,0.00,0.18,9.344,14.720,9.838,209.80,0.766,227407735,37899457.1,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.039,0,0,0,0,0 +branch-prefix,resident,2,0,ow:uniform@8,8,2,200000,12948061,6.000,2157932.1,1.456,5.696,56.832,269371.129,3.581,39.595,327012.9,1755389952,2397200384,135.57,185.14,nan,nan,nan,nan,nan,0,0.0,6.000,0.126,6.126,0.028,389120,15093760,1.1360,8589803520,2589319168,0.039,0,0,0,0,0 +main,resident,3,0,warm,8,3,200000,200000,0.016,12313583.1,nan,nan,nan,0.000,nan,0.077,2597807.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12313583.1,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +main,resident,3,0,point:uniform@8,8,3,200000,23172019,6.000,3861855.4,1.840,2.656,6.976,94.531,1.921,47.997,482778.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,6166554,6.000,1027722.4,6.720,10.368,19.712,101.990,7.628,47.990,128496.1,0,0,0.00,0.00,6.336,9.856,7.177,nan,0.406,6166554,1027722.4,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,24380,6.000,4063.2,1753.088,5570.560,5701.632,6199.746,1968.433,47.998,507.9,0,4096,0.00,0.17,9.088,14.720,9.537,200.84,0.664,237816742,39634378.7,6.000,0.000,6.000,0.000,0,0,nan,0,0,0.040,0,0,0,0,0 +main,resident,3,0,ow:uniform@8,8,3,200000,14082417,6.000,2346979.3,1.488,6.080,52.736,191298.350,3.277,42.436,331853.8,2000707584,2618650624,142.07,185.95,nan,nan,nan,nan,nan,0,0.0,6.000,0.114,6.114,0.035,16384,52764672,1.1567,8589279232,2719121408,0.040,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix_kvbench.c b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix_kvbench.c new file mode 100644 index 000000000..77215f553 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/prefix_kvbench.c @@ -0,0 +1,1765 @@ +// kvbench.c -- SplinterDB public-API benchmark used to compare two versions. +// +// Uses only splinterdb/splinterdb.h + splinterdb/default_data_config.h + libc, +// so the same source builds against versions whose internals differ. The one +// public-API difference handled here is splinterdb_close(): +// -DKVBENCH_CLOSE_HAS_FORCE => int splinterdb_close(splinterdb **, bool32) +// otherwise => void splinterdb_close(splinterdb **) +// +// Key scheme: logical id in [0,N). Present key = 8-byte big-endian(2*id) +// followed by 16 bytes of fixed padding (24 bytes total), so memcmp order == +// id order. Absent ("negative") keys use 2*id+1, interleaved with present +// keys. Value = 100 bytes: id (LE u64), generation (LE u64), filler. +// +// Each invocation: create/open the DB, run the listed phases in order, close. +// Phase syntax (optional "@T" overrides the thread count): +// load:random | load:seq fixed-count insert of all N ids, then close +// (close timed separately as "drain") +// warm parallel full scan; verifies every id once +// point:uniform|zipf|seq|neg fixed-duration lookups +// range:uniform|zipf:L fixed-duration forward range queries +// ow:uniform|zipf fixed-duration overwrites (insert existing) +// One CSV row per phase is appended to --csv. + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splinterdb/default_data_config.h" +#include "splinterdb/splinterdb.h" + +#define KEY_SIZE 64 +#define VALUE_SIZE 100 +#define MAX_PHASES 64 +#define MAX_WORKERS 32 + + + +/* ------------------------------------------------------------------------ */ +/* Time, RNG, permutations, zipf */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +now_ns(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000ull + ts.tv_nsec; +} + +/* Bijective 64-bit mixer (splitmix64 finalizer). */ +static inline uint64_t +mix(uint64_t x) +{ + x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9); + x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb); + return x ^ (x >> 31); +} + +static inline uint64_t +rng_next(uint64_t *s) +{ + *s += UINT64_C(0x9e3779b97f4a7c15); + return mix(*s); +} + +static inline double +rng_unit(uint64_t *s) +{ + return (double)(rng_next(s) >> 11) * 0x1.0p-53; +} + +/* + * Pseudo-random bijection on [0,n): a 4-round balanced Feistel network over + * 2*half bits (2^(2*half) >= n), with cycle-walking to stay inside [0,n). + */ +typedef struct { + uint64_t n; + unsigned half; + uint64_t mask; + uint64_t keys[4]; +} perm_t; + +static void +perm_init(perm_t *p, uint64_t n, uint64_t seed) +{ + unsigned bits = 1; + while (bits < 64 && (UINT64_C(1) << bits) < n) { + bits++; + } + p->n = n; + p->half = (bits + 1) / 2; + if (p->half < 1) { + p->half = 1; + } + p->mask = (UINT64_C(1) << p->half) - 1; + for (int r = 0; r < 4; r++) { + p->keys[r] = mix(seed * UINT64_C(0x632be59bd9b4e019) + r + 1); + } +} + +static inline uint64_t +feistel(const perm_t *p, uint64_t x) +{ + uint64_t l = x >> p->half, r = x & p->mask; + for (int i = 0; i < 4; i++) { + uint64_t t = l ^ (mix(r ^ p->keys[i]) & p->mask); + l = r; + r = t; + } + return (l << p->half) | r; +} + +static inline uint64_t +perm_apply(const perm_t *p, uint64_t i) +{ + uint64_t x = i; + do { + x = feistel(p, x); + } while (x >= p->n); + return x; +} + +/* YCSB-style zipfian over ranks [0,n). */ +typedef struct { + uint64_t n; + double theta, zetan, zeta2, alpha, eta, half_pow_theta; +} zipf_t; + +static double +zeta_sum(uint64_t n, double theta) +{ + uint64_t m = n < 2000000 ? n : 2000000; + double s = 0; + for (uint64_t i = 1; i <= m; i++) { + s += pow((double)i, -theta); + } + if (n > m) { + /* Euler-Maclaurin tail: sum_{k=m+1}^{n} k^-t */ + s += (pow((double)n, 1 - theta) - pow((double)m, 1 - theta)) / (1 - theta) + + 0.5 * (pow((double)n, -theta) - pow((double)m, -theta)); + } + return s; +} + +static void +zipf_init(zipf_t *z, uint64_t n, double theta) +{ + z->n = n; + z->theta = theta; + z->zetan = zeta_sum(n, theta); + z->zeta2 = 1.0 + pow(0.5, theta); + z->alpha = 1.0 / (1.0 - theta); + z->eta = + (1.0 - pow(2.0 / (double)n, 1.0 - theta)) / (1.0 - z->zeta2 / z->zetan); + z->half_pow_theta = pow(0.5, theta); +} + +static inline uint64_t +zipf_next(const zipf_t *z, uint64_t *rng) +{ + double u = rng_unit(rng); + double uz = u * z->zetan; + if (uz < 1.0) { + return 0; + } + if (uz < 1.0 + z->half_pow_theta) { + return 1; + } + uint64_t r = + (uint64_t)((double)z->n * pow(z->eta * u - z->eta + 1.0, z->alpha)); + return r >= z->n ? z->n - 1 : r; +} + +/* ------------------------------------------------------------------------ */ +/* Histogram: log2 buckets with 32 linear sub-buckets (~3% resolution) */ +/* ------------------------------------------------------------------------ */ + +#define HSUB_BITS 5 +#define HSUB (1u << HSUB_BITS) +#define HBUCKETS (64 * HSUB) + +typedef struct { + uint64_t b[HBUCKETS]; + uint64_t count, sum, max; +} hist_t; + +static inline unsigned +hidx(uint64_t v) +{ + if (v < HSUB) { + return (unsigned)v; + } + unsigned e = 63 - __builtin_clzll(v); + unsigned sub = (unsigned)((v >> (e - HSUB_BITS)) & (HSUB - 1)); + return (e - HSUB_BITS + 1) * HSUB + sub; +} + +static inline uint64_t +hval(unsigned idx) +{ + if (idx < HSUB) { + return idx; + } + unsigned e = idx / HSUB + HSUB_BITS - 1; + unsigned sub = idx % HSUB; + uint64_t lo = (UINT64_C(1) << e) | ((uint64_t)sub << (e - HSUB_BITS)); + uint64_t width = UINT64_C(1) << (e - HSUB_BITS); + return lo + width / 2; +} + +static inline void +hist_add(hist_t *h, uint64_t v) +{ + h->b[hidx(v)]++; + h->count++; + h->sum += v; + if (v > h->max) { + h->max = v; + } +} + +static void +hist_merge(hist_t *dst, const hist_t *src) +{ + for (unsigned i = 0; i < HBUCKETS; i++) { + dst->b[i] += src->b[i]; + } + dst->count += src->count; + dst->sum += src->sum; + if (src->max > dst->max) { + dst->max = src->max; + } +} + +static double +hist_pct_us(const hist_t *h, double p) +{ + if (!h->count) { + return NAN; + } + uint64_t rank = (uint64_t)ceil(p * (double)h->count); + if (rank < 1) { + rank = 1; + } + uint64_t acc = 0; + for (unsigned i = 0; i < HBUCKETS; i++) { + acc += h->b[i]; + if (acc >= rank) { + uint64_t v = hval(i); + return (double)(v > h->max ? h->max : v) / 1e3; + } + } + return (double)h->max / 1e3; +} + +static double +hist_mean_us(const hist_t *h) +{ + return h->count ? (double)h->sum / (double)h->count / 1e3 : NAN; +} + +/* ------------------------------------------------------------------------ */ +/* Options / global state */ +/* ------------------------------------------------------------------------ */ + +enum phase_kind { PH_LOAD, PH_WARM, PH_POINT, PH_RANGE, PH_OW }; +enum dist { D_UNIFORM, D_ZIPF, D_SEQ, D_NEG, D_RANDOM }; + +typedef struct { + char name[64]; + enum phase_kind kind; + enum dist dist; + uint64_t L; + int threads; +} phase_t; + +typedef struct { + const char *db, *csv, *hang_dir; + const char *vtag, *stag, *otag; + int rep; + bool create; + uint64_t n, cache_mib, disk_gib, memtable_mib; + int use_log, threads, mt_bg, normal_bg; + double secs, warmup; + uint64_t sabotage; + uint64_t hang_secs; + uint64_t seed; + int nphases; + phase_t phases[MAX_PHASES]; +} options; + +static options opt; +static splinterdb *kvs; +static data_config data_cfg; +static perm_t load_perm, zipf_perm; +static zipf_t zipf; +static uint64_t generation; /* value generation for overwrites */ + +enum { ST_WAIT = 0, ST_WARMUP = 1, ST_MEASURE = 2, ST_STOP = 3 }; +static _Atomic int run_state; +static _Atomic uint64_t seq_counter; + +/* Watchdog */ +enum { WD_IDLE, WD_OPS, WD_OPENCLOSE }; +static _Atomic int wd_mode; +static _Atomic uint64_t wd_mode_since_ns; +static const char *wd_what = ""; + +typedef struct worker { + pthread_t th; + int idx; + const phase_t *ph; + hist_t lat; + hist_t startup; + uint64_t ops, tuples, pt_ns, pt_div, deinit_ns, deinit_n; + uint64_t violations, errors, notfound, found; + uint64_t rng; + uint64_t measure_rng; + bool measure_rng_captured; + _Atomic uint64_t progress; + char first_violation[256]; +} worker_t; + +static worker_t *workers; +static int nworkers; + +/* ------------------------------------------------------------------------ */ +/* Keys / values */ +/* ------------------------------------------------------------------------ */ + + +static int prefix_pattern; +static uint64_t *prefix_random_words; + +static int +prefix_word_compare(const void *a, const void *b) +{ + uint64_t x = *(const uint64_t *)a, y = *(const uint64_t *)b; + return (x > y) - (x < y); +} + +static int +prefix_nonlexical_compare(const data_config *cfg, user_key a, user_key b) +{ + (void)cfg; + if (slice_length(a.key) != KEY_SIZE || slice_length(b.key) != KEY_SIZE) + abort(); + return memcmp((const char *)slice_data(a.key) + 56, + (const char *)slice_data(b.key) + 56, 8); +} + +static void +prefix_configure(void) +{ + const char *pattern = getenv("PREFIX_PATTERN"); + if (pattern == NULL || strcmp(pattern, "common") == 0) prefix_pattern = 0; + else if (strcmp(pattern, "random") == 0) prefix_pattern = 1; + else if (strcmp(pattern, "nonlexical") == 0) prefix_pattern = 2; + else { fprintf(stderr, "Unknown PREFIX_PATTERN %s\n", pattern); exit(2); } + if (prefix_pattern == 2) data_cfg.key_compare = prefix_nonlexical_compare; +#ifdef KVBENCH_PREFIX_SUPPORT + data_cfg.key_compare_is_lexical = prefix_pattern != 2 + && getenv("PREFIX_DISABLE") == NULL; +#endif + if (prefix_pattern == 1) { + if (opt.n > SIZE_MAX / 2 / sizeof(uint64_t)) abort(); + prefix_random_words = malloc(2 * opt.n * sizeof(uint64_t)); + if (!prefix_random_words) abort(); + for (uint64_t i = 0; i < 2 * opt.n; i++) + prefix_random_words[i] = mix(i + opt.seed * 1000003); + qsort(prefix_random_words, 2 * opt.n, sizeof(uint64_t), prefix_word_compare); + } + printf("prefix-pattern=%s key_bytes=%d compression_disabled=%s\n", + pattern ? pattern : "common", KEY_SIZE, + getenv("PREFIX_DISABLE") ? "true" : "false"); +} + +static inline void +prefix_encode_word(uint64_t word, char *key) +{ + for (int i = 0; i < 8; i++) key[i] = (char)(word >> (56 - 8 * i)); +} + +static inline void +make_key(uint64_t k, char *key) +{ + if (prefix_pattern == 0) { + memset(key, 'p', 48); + prefix_encode_word(k, key + 48); + } else { + for (unsigned i = 0; i < 7; i++) + prefix_encode_word(mix(k + (uint64_t)i * UINT64_C(0x9e3779b97f4a7c15)), + key + i * 8); + if (prefix_pattern == 1) prefix_encode_word(prefix_random_words[k], key); + } + prefix_encode_word(k, key + 56); +} + +static inline bool +decode_key(slice s, uint64_t *k) +{ + if (slice_length(s) != KEY_SIZE) return false; + const unsigned char *bytes = slice_data(s); + uint64_t rank = 0; + for (unsigned i = 56; i < 64; i++) rank = (rank << 8) | bytes[i]; + if (rank >= 2 * opt.n) return false; + char expected[KEY_SIZE]; + make_key(rank, expected); + *k = rank; + return memcmp(bytes, expected, KEY_SIZE) == 0; +} + +static inline void +make_value(uint64_t id, uint64_t gen, char *val) +{ + memcpy(val, &id, 8); + memcpy(val + 8, &gen, 8); + memset(val + 16, 'v', VALUE_SIZE - 16); +} + +static inline bool +value_id_ok(slice v, uint64_t id) +{ + if (slice_length(v) != VALUE_SIZE) { + return false; + } + uint64_t got; + memcpy(&got, slice_data(v), 8); + return got == id; +} + +static inline bool +value_generation_ok(slice v, uint64_t id, uint64_t expected_generation) +{ + if (!value_id_ok(v, id)) { + return false; + } + uint64_t got_generation; + memcpy(&got_generation, (const char *)slice_data(v) + 8, 8); + return got_generation == expected_generation; +} + +static void +violation(worker_t *w, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); + +static void +violation(worker_t *w, const char *fmt, ...) +{ + w->violations++; + if (w->violations <= 3) { + char buf[256]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + if (w->violations == 1) { + snprintf(w->first_violation, sizeof(w->first_violation), "%s", buf); + } + fprintf(stderr, "VIOLATION [thread %d]: %s\n", w->idx, buf); + } +} + +/* ------------------------------------------------------------------------ */ +/* Process metrics */ +/* ------------------------------------------------------------------------ */ + +typedef struct { + uint64_t t_ns; + double cpu_s; + uint64_t rd, wr; + uint64_t swpin, swpout; + uint64_t majflt; +} snap_t; + +static void +proc_io(uint64_t *rd, uint64_t *wr) +{ + *rd = *wr = 0; + FILE *f = fopen("/proc/self/io", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "read_bytes:")) { + *rd = v; + } else if (!strcmp(name, "write_bytes:")) { + *wr = v; + } + } + fclose(f); +} + +static void +vm_swap(uint64_t *in, uint64_t *out) +{ + *in = *out = 0; + FILE *f = fopen("/proc/vmstat", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "pswpin")) { + *in = v; + } else if (!strcmp(name, "pswpout")) { + *out = v; + } + } + fclose(f); +} + +static void +take_snap(snap_t *s) +{ + struct rusage ru; + getrusage(RUSAGE_SELF, &ru); + s->cpu_s = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6 + + ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6; + s->majflt = ru.ru_majflt; + proc_io(&s->rd, &s->wr); + vm_swap(&s->swpin, &s->swpout); + s->t_ns = now_ns(); +} + +/* ------------------------------------------------------------------------ */ +/* DB lifecycle */ +/* ------------------------------------------------------------------------ */ + +static void +fill_config(splinterdb_config *cfg) +{ + *cfg = (splinterdb_config){ + .filename = opt.db, + .cache_size = opt.cache_mib << 20, + .disk_size = opt.disk_gib << 30, + .data_cfg = &data_cfg, + .io_flags = O_RDWR | O_CREAT | O_DIRECT, + .io_perms = 0644, + .use_log = opt.use_log ? 1 : 0, + .memtable_capacity = opt.memtable_mib << 20, + .fanout = 8, + .num_memtable_bg_threads = (uint64)opt.mt_bg, + .num_normal_bg_threads = (uint64)opt.normal_bg, + .queue_scale_percent = 100, + }; +#ifdef KVBENCH_SPACE_MODE + cfg->use_stats = 1; +#endif +} + +static double open_secs; + +static void +db_open(bool create) +{ + splinterdb_config cfg; + fill_config(&cfg); + wd_what = create ? "create" : "open"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); + int rc = + create ? splinterdb_create(&cfg, &kvs) : splinterdb_open(&cfg, &kvs); + open_secs = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + if (rc) { + fprintf(stderr, "FATAL: splinterdb_%s failed rc=%d\n", wd_what, rc); + exit(3); + } + fprintf(stderr, "%s took %.3f s\n", wd_what, open_secs); +} + +static double +db_close(void) +{ +#ifdef KVBENCH_SPACE_MODE + /* Space/stats build only: dump insertion + allocator stats for the session. + */ + if (getenv("KVBENCH_STATS_BEFORE_CLOSE")) { + platform_set_log_streams(stdout, stderr); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + } +#endif + wd_what = "close"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); +#ifdef KVBENCH_CLOSE_HAS_FORCE + int rc = splinterdb_close(&kvs, 0); + if (rc) { + fprintf(stderr, + "FINDING: splinterdb_close(force=0) refused rc=%d; forcing\n", + rc); + rc = splinterdb_close(&kvs, 1); + if (rc) { + fprintf(stderr, "FINDING: splinterdb_close(force=1) rc=%d\n", rc); + } + } +#else + splinterdb_close(&kvs); +#endif + double s = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + kvs = NULL; + fprintf(stderr, "close took %.3f s\n", s); + return s; +} + +/* ------------------------------------------------------------------------ */ +/* Watchdog */ +/* ------------------------------------------------------------------------ */ + +static void +hang_dump(const char *why) +{ + char path[512], cmd[1024]; + snprintf(path, + sizeof(path), + "%s/hang-%s-%s-%d-%ld.txt", + opt.hang_dir ? opt.hang_dir : ".", + opt.vtag, + wd_what, + (int)getpid(), + (long)time(NULL)); + fprintf(stderr, + "HANG DETECTED (%s) during %s; dumping stacks to %s\n", + why, + wd_what, + path); + snprintf(cmd, + sizeof(cmd), + "gdb -batch -ex 'info threads' -ex 'thread apply all bt' -p %d > " + "'%s' 2>&1", + (int)getpid(), + path); + int rc = system(cmd); + fprintf(stderr, "gdb rc=%d; exiting with status 99\n", rc); + fflush(stderr); + _exit(99); +} + +static void * +watchdog_main(void *arg) +{ + (void)arg; + uint64_t last_prog = 0, last_change = now_ns(), last_report = now_ns(); + uint64_t last_report_prog = 0; + double last_cpu = -1; + uint64_t last_io = 0; + int last_mode = WD_IDLE; + for (;;) { + sleep(1); + int mode = atomic_load(&wd_mode); + uint64_t now = now_ns(); + if (mode != last_mode) { + last_mode = mode; + last_change = now; + last_prog = 0; + last_report_prog = 0; + last_report = now; + last_cpu = -1; + } + if (mode == WD_OPS) { + uint64_t prog = 0; + for (int i = 0; i < nworkers; i++) { + prog += + atomic_load_explicit(&workers[i].progress, memory_order_relaxed); + } + if (prog != last_prog) { + last_prog = prog; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no op progress for hang_secs"); + } + if (now - last_report >= 10ull * 1000000000ull) { + fprintf(stderr, + " [%s] progress %" PRIu64 " ops (+%.0f ops/s)\n", + wd_what, + prog, + (prog - last_report_prog) / ((now - last_report) / 1e9)); + last_report = now; + last_report_prog = prog; + } + } else if (mode == WD_OPENCLOSE) { + snap_t s; + take_snap(&s); + uint64_t io = s.rd + s.wr; + if (last_cpu < 0 || s.cpu_s - last_cpu > 0.05 || io != last_io) { + last_cpu = s.cpu_s; + last_io = io; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no CPU or IO progress for hang_secs"); + } + uint64_t since = atomic_load(&wd_mode_since_ns); + if (now - since > 2400ull * 1000000000ull) { + hang_dump("open/close exceeded 40 minutes"); + } + } + } + return NULL; +} + +/* ------------------------------------------------------------------------ */ +/* Worker bodies */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +pick_id(worker_t *w, enum dist d, uint64_t *seqpos, uint64_t lo, uint64_t hi) +{ + switch (d) { + case D_ZIPF: + return perm_apply(&zipf_perm, zipf_next(&zipf, &w->rng)); + case D_SEQ: + { + uint64_t id = *seqpos; + *seqpos = (id + 1 >= hi) ? lo : id + 1; + return id; + } + case D_UNIFORM: + case D_NEG: + default: + return rng_next(&w->rng) % opt.n; + } +} + +static inline void +wait_start(void) +{ + while (atomic_load_explicit(&run_state, memory_order_acquire) == ST_WAIT) { + struct timespec d = {.tv_nsec = 100000}; + nanosleep(&d, NULL); + } +} + +static void * +load_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + wait_start(); + uint64_t pos = lo, chunk_end = 0, cur = 0; + for (;;) { + uint64_t id; + if (w->ph->dist == D_RANDOM) { + if (pos >= hi) { + break; + } + id = perm_apply(&load_perm, pos++); + } else { + if (cur >= chunk_end) { + cur = atomic_fetch_add(&seq_counter, 64); + if (cur >= opt.n) { + break; + } + chunk_end = cur + 64 > opt.n ? opt.n : cur + 64; + } + id = cur++; + } + make_key(2 * id, key); + make_value(id, 0, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: insert id=%" PRIu64 " rc=%d\n", id, rc); + } + } + hist_add(&w->lat, t1 - t0); + w->ops++; + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + return NULL; +} + +static void * +warm_worker(void *arg) +{ + worker_t *w = arg; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + if ((opt.sabotage & 8) && w->idx == nworkers - 1) { + hi++; /* sabotage: expect one more id than exists */ + } + char key[KEY_SIZE]; + make_key(2 * lo, key); + wait_start(); + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator_init rc=%d\n", rc); + return NULL; + } + uint64_t expect = lo; + while (expect < hi && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk; + splinterdb_iterator_get_current(it, &k, &v); + if (!decode_key(k, &kk) || kk != 2 * expect || !value_id_ok(v, expect)) { + violation(w, + "warm: expected id %" PRIu64 " got key %" PRIu64 + " (len %" PRIu64 ")", + expect, + kk, + slice_length(k)); + if (kk > 2 * expect && (kk & 1) == 0) { + expect = kk / 2; /* resync after a gap */ + } + } + expect++; + w->ops++; + if ((w->ops & 1023) == 0) { + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + if (expect < hi) { + splinterdb_iterator_next(it); + } + } + rc = splinterdb_iterator_status(it); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator status rc=%d\n", rc); + } + if (expect != hi) { + violation(w, + "warm: range [%" PRIu64 ",%" PRIu64 ") ended at %" PRIu64, + lo, + hi, + expect); + } + splinterdb_iterator_deinit(it); + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + return NULL; +} + +static void * +point_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + char buf[256]; + splinterdb_lookup_result res; + splinterdb_lookup_result_init( + kvs, &res, SPLINTERDB_LOOKUP_VALUE, sizeof(buf), buf); + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + uint64_t seqpos = lo; + bool neg = w->ph->dist == D_NEG; + wait_start(); + uint64_t n = 0; + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, lo, hi); + bool q_neg = neg; + bool e_neg = neg; + if (opt.sabotage & 1) { + q_neg = true; /* sabotage: query absent key, expect present */ + } + if ((opt.sabotage & 16) && n > 1000) { + sleep(100000); /* test hook: simulate a hang for the watchdog */ + } + if (opt.sabotage & 2) { + q_neg = false; /* sabotage: query present key, expect absent */ + } + make_key(q_neg ? 2 * id + 1 : 2 * id, key); + uint64_t t0 = now_ns(); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &res); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: lookup id=%" PRIu64 " rc=%d\n", id, rc); + } + continue; + } + bool found = splinterdb_lookup_found(&res); + if (found) { + w->found++; + } else { + w->notfound++; + } + if (e_neg) { + if (found) { + violation(w, "negative key 2*%" PRIu64 "+1 found", id); + } + } else { + slice v; + if (!found) { + violation(w, "present id %" PRIu64 " not found", id); + } else if (splinterdb_lookup_result_value(&res, &v) != 0 + || !value_id_ok(v, id)) + { + violation(w, "present id %" PRIu64 " wrong value", id); + } + } + } + splinterdb_lookup_result_deinit(&res); + return NULL; +} + +static void * +range_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + uint64_t L = w->ph->L; + uint64_t seqpos = 0; + uint64_t n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t start = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + uint64_t expect = opt.n - start < L ? opt.n - start : L; + if (opt.sabotage & 4) { + expect++; /* sabotage: expect one extra tuple */ + } + make_key(2 * start, key); + uint64_t t0 = now_ns(), t1 = 0, tl = 0; + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator_init rc=%d\n", rc); + } + continue; + } + uint64_t got = 0; + bool bad = false; + while (got < L && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk = 0; + splinterdb_iterator_get_current(it, &k, &v); + if (!bad + && (!decode_key(k, &kk) || kk != 2 * (start + got) + || !value_id_ok(v, start + got))) + { + bad = true; + if (st == ST_MEASURE) { + violation(w, + "range start %" PRIu64 " tuple %" PRIu64 + ": expected key %" PRIu64 " got %" PRIu64, + start, + got, + 2 * (start + got), + kk); + } + } + got++; + if (got == 1) { + t1 = now_ns(); + } + if (got == L) { + tl = now_ns(); + break; + } + splinterdb_iterator_next(it); + } + int status = splinterdb_iterator_status(it); + uint64_t t2 = now_ns(); + splinterdb_iterator_deinit(it); + uint64_t t3 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + if (status) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator status rc=%d\n", status); + } + } + if (got != expect) { + violation(w, + "range start %" PRIu64 " L=%" PRIu64 ": got %" PRIu64 + " tuples, expected %" PRIu64, + start, + L, + got, + expect); + } + w->ops++; + w->tuples += got; + hist_add(&w->lat, t3 - t0); + if (got >= 1) { + hist_add(&w->startup, t1 - t0); + } + if (L > 1 && got == L) { + w->pt_ns += tl - t1; + w->pt_div += L - 1; + } + w->deinit_ns += t3 - t2; + w->deinit_n++; + } + return NULL; +} + +static void * +ow_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t seqpos = 0, n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + if (st == ST_MEASURE && !w->measure_rng_captured) { + w->measure_rng = w->rng; + w->measure_rng_captured = true; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + make_value(id, generation, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: overwrite id=%" PRIu64 " rc=%d\n", id, rc); + } + } + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + } + return NULL; +} + +/* + * Validate an untimed deterministic sample from the beginning of each + * overwrite worker's measured stream. Replaying the saved RNG state keeps all + * validation work out of the measured hot path. + */ +static void +verify_overwrite_sample(const phase_t *ph, int threads) +{ + enum { SAMPLES_PER_WORKER = 4096 }; + char key[KEY_SIZE], buffer[VALUE_SIZE]; + splinterdb_lookup_result result; + splinterdb_lookup_result_init( + kvs, &result, SPLINTERDB_LOOKUP_VALUE, sizeof(buffer), buffer); + + for (int i = 0; i < threads; i++) { + worker_t *original = &workers[i]; + if (original->ops == 0) { + continue; + } + if (!original->measure_rng_captured) { + original->errors++; + fprintf( + stderr, + "ERROR: overwrite verifier has no measurement RNG for thread %d\n", + i); + continue; + } + worker_t replay = {.rng = original->measure_rng}; + uint64_t seqpos = 0; + uint64_t samples = original->ops < SAMPLES_PER_WORKER + ? original->ops + : SAMPLES_PER_WORKER; + for (uint64_t sample = 0; sample < samples; sample++) { + uint64_t id = pick_id(&replay, ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &result); + if (rc != 0) { + original->errors++; + if (original->errors <= 3) { + fprintf(stderr, + "ERROR: overwrite verification id=%" PRIu64 " rc=%d\n", + id, + rc); + } + continue; + } + slice value; + if (!splinterdb_lookup_found(&result) + || splinterdb_lookup_result_value(&result, &value) != 0 + || !value_generation_ok(value, id, generation)) + { + violation(original, + "overwrite verification id=%" PRIu64 + " did not return generation %" PRIu64, + id, + generation); + } + } + } + splinterdb_lookup_result_deinit(&result); +} + +/* ------------------------------------------------------------------------ */ +/* Phase driver */ +/* ------------------------------------------------------------------------ */ + +static const char * +dist_name(enum dist d) +{ + switch (d) { + case D_UNIFORM: + return "uniform"; + case D_ZIPF: + return "zipf"; + case D_SEQ: + return "seq"; + case D_NEG: + return "neg"; + case D_RANDOM: + return "random"; + } + return "?"; +} + +static void +sleep_secs(double s) +{ + uint64_t end = now_ns() + (uint64_t)(s * 1e9); + for (;;) { + uint64_t now = now_ns(); + if (now >= end) { + break; + } + uint64_t rem = end - now; + struct timespec d = {.tv_sec = rem / 1000000000ull, + .tv_nsec = rem % 1000000000ull}; + nanosleep(&d, NULL); + } +} + +static void +file_sizes(uint64_t *apparent, uint64_t *alloc) +{ + struct stat st; + if (stat(opt.db, &st) == 0) { + *apparent = (uint64_t)st.st_size; + *alloc = (uint64_t)st.st_blocks * 512; + } else { + *apparent = *alloc = 0; + } +} + +static int csv_header_written; + +static void +csv_row(const phase_t *ph, + int threads, + hist_t *lat, + hist_t *startup, + uint64_t ops, + uint64_t tuples, + uint64_t pt_ns, + uint64_t pt_div, + uint64_t deinit_ns, + uint64_t deinit_n, + uint64_t viol, + uint64_t errs, + const snap_t *a, + const snap_t *b, + double insert_s, + double drain_s, + const snap_t *da, + const snap_t *db_, + uint64_t app, + uint64_t alc) +{ + double secs = (b->t_ns - a->t_ns) / 1e9; + double cpu = b->cpu_s - a->cpu_s; + uint64_t rd = b->rd - a->rd, wr = b->wr - a->wr; + double d_cpu = da ? db_->cpu_s - da->cpu_s : 0; + uint64_t d_rd = da ? db_->rd - da->rd : 0, d_wr = da ? db_->wr - da->wr : 0; + uint64_t swin = b->swpin - a->swpin + (da ? db_->swpin - da->swpin : 0); + uint64_t swout = b->swpout - a->swpout + (da ? db_->swpout - da->swpout : 0); + uint64_t majflt = b->majflt - a->majflt; + double logical = (double)ops * (KEY_SIZE + VALUE_SIZE); + double wamp = (ph->kind == PH_LOAD || ph->kind == PH_OW) && ops + ? (double)(wr + d_wr) / logical + : NAN; + double pt = pt_div ? (double)pt_ns / (double)pt_div : NAN; + double dmean = deinit_n ? (double)deinit_ns / (double)deinit_n / 1e3 : NAN; + + printf("== %-22s T=%-2d ops=%-10" PRIu64 " secs=%7.2f ops/s=%11.0f " + "lat us p50=%.2f p99=%.2f p99.9=%.2f max=%.1f mean=%.2f\n", + ph->name, + threads, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat)); + printf(" cpu=%.2fs ops/cpu-s=%.0f rd=%.1f B/op wr=%.1f B/op " + "violations=%" PRIu64 " errors=%" PRIu64 " swapin=%" PRIu64 + " swapout=%" PRIu64 " majflt=%" PRIu64 "\n", + cpu, + ops / cpu, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + viol, + errs, + swin, + swout, + majflt); + if (ph->kind == PH_RANGE) { + printf(" startup us p50=%.2f p99=%.2f mean=%.2f per-tuple=%.1f ns " + "deinit mean=%.2f us tuples/s=%.0f\n", + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples / secs); + } + if (da) { + printf( + " insert/run=%.2fs drain(close)=%.2fs total=%.2fs drain_cpu=%.2fs " + "drain_rd=%" PRIu64 " drain_wr=%" PRIu64 " wamp=%.3f " + "db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc); + } + fflush(stdout); + + if (!opt.csv) { + return; + } + FILE *f = fopen(opt.csv, "a"); + if (!f) { + perror(opt.csv); + return; + } + if (!csv_header_written) { + fseek(f, 0, SEEK_END); + if (ftell(f) == 0) { + fprintf(f, + "version,size,order,log,phase,threads,rep,n,ops,secs,ops_s," + "p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s," + "rd_bytes,wr_bytes,rd_B_op,wr_B_op," + "startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns," + "deinit_mean_us,tuples,tuples_s," + "insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp," + "db_apparent,db_alloc,open_s,violations,errors,swapin,swapout," + "majflt\n"); + } + csv_header_written = 1; + } + fprintf(f, + "%s,%s,%s,%d,%s,%d,%d,%" PRIu64 ",%" PRIu64 ",%.3f,%.1f," + "%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.1f," + "%" PRIu64 ",%" PRIu64 ",%.2f,%.2f," + "%.3f,%.3f,%.3f,%.2f," + "%.3f,%" PRIu64 ",%.1f," + "%.3f,%.3f,%.3f,%.3f,%" PRIu64 ",%" PRIu64 ",%.4f," + "%" PRIu64 ",%" PRIu64 ",%.3f,%" PRIu64 ",%" PRIu64 ",%" PRIu64 + ",%" PRIu64 ",%" PRIu64 "\n", + opt.vtag, + opt.stag, + opt.otag, + opt.use_log, + ph->name, + threads, + opt.rep, + opt.n, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat), + cpu, + ops / cpu, + rd, + wr, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples, + tuples / secs, + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc, + open_secs, + viol, + errs, + swin, + swout, + majflt); + fclose(f); +} + +static void +run_phase(const phase_t *ph, bool last) +{ + int T = ph->threads > 0 ? ph->threads : opt.threads; + nworkers = T; + workers = calloc((size_t)T, sizeof(worker_t)); + if (!workers) { + fprintf(stderr, "FATAL: out of memory\n"); + exit(3); + } + void *(*fn)(void *) = NULL; + switch (ph->kind) { + case PH_LOAD: + fn = load_worker; + break; + case PH_WARM: + fn = warm_worker; + break; + case PH_POINT: + fn = point_worker; + break; + case PH_RANGE: + fn = range_worker; + break; + case PH_OW: + fn = ow_worker; + break; + } + bool fixed_count = ph->kind == PH_LOAD || ph->kind == PH_WARM; + atomic_store(&run_state, ST_WAIT); + atomic_store(&seq_counter, 0); + for (int i = 0; i < T; i++) { + workers[i].idx = i; + workers[i].ph = ph; + workers[i].rng = mix(opt.seed * 1000003 + (uint64_t)i * 7919 + 17 + + (uint64_t)ph->kind * 131 + (uint64_t)ph->dist); + if (pthread_create(&workers[i].th, NULL, fn, &workers[i])) { + fprintf(stderr, "FATAL: pthread_create\n"); + exit(3); + } + } + fprintf(stderr, + "phase %s: T=%d dist=%s %s\n", + ph->name, + T, + dist_name(ph->dist), + fixed_count ? "(fixed count)" : "(fixed duration)"); + wd_what = ph->name; + atomic_store(&wd_mode, WD_OPS); + snap_t a, b; + if (fixed_count) { + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + take_snap(&b); + } else { + atomic_store_explicit(&run_state, ST_WARMUP, memory_order_release); + sleep_secs(opt.warmup); + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + sleep_secs(opt.secs); + atomic_store_explicit(&run_state, ST_STOP, memory_order_release); + take_snap(&b); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + } + atomic_store(&wd_mode, WD_IDLE); + + if (ph->kind == PH_OW) { + verify_overwrite_sample(ph, T); + } + + hist_t *lat = calloc(1, sizeof(hist_t)), + *startup = calloc(1, sizeof(hist_t)); + uint64_t ops = 0, tuples = 0, pt_ns = 0, pt_div = 0, dns = 0, dn = 0, + viol = 0, errs = 0, found = 0, notfound = 0; + for (int i = 0; i < T; i++) { + worker_t *w = &workers[i]; + hist_merge(lat, &w->lat); + hist_merge(startup, &w->startup); + ops += w->ops; + tuples += w->tuples; + pt_ns += w->pt_ns; + pt_div += w->pt_div; + dns += w->deinit_ns; + dn += w->deinit_n; + viol += w->violations; + errs += w->errors; + found += w->found; + notfound += w->notfound; + } + if (ph->kind == PH_WARM) { + tuples = ops; + if (ops != opt.n && !(opt.sabotage & 8)) { + fprintf(stderr, + "VIOLATION: warm scanned %" PRIu64 " tuples, expected %" PRIu64 + "\n", + ops, + opt.n); + viol++; + } + } + if (ph->kind == PH_POINT) { + fprintf(stderr, + " found=%" PRIu64 " notfound=%" PRIu64 "\n", + found, + notfound); + } + + double insert_s = (b.t_ns - a.t_ns) / 1e9, drain_s = 0; + snap_t da, dbs; + uint64_t app = 0, alc = 0; + bool closed = false; + if (ph->kind == PH_LOAD || last) { + take_snap(&da); + drain_s = db_close(); + take_snap(&dbs); + file_sizes(&app, &alc); + closed = true; + } + csv_row(ph, + T, + lat, + startup, + ops, + tuples, + pt_ns, + pt_div, + dns, + dn, + viol, + errs, + &a, + &b, + insert_s, + drain_s, + closed ? &da : NULL, + closed ? &dbs : NULL, + app, + alc); + if (viol) { + printf(" FINDING: %" PRIu64 + " correctness violations in %s (first: %s)\n", + viol, + ph->name, + workers[0].first_violation[0] ? workers[0].first_violation + : "see stderr"); + } + free(lat); + free(startup); + free(workers); + workers = NULL; + nworkers = 0; + if (closed && !last) { + db_open(false); + } +} + +/* ------------------------------------------------------------------------ */ +/* CLI */ +/* ------------------------------------------------------------------------ */ + +static void +usage(void) +{ + fprintf( + stderr, + "usage: kvbench --db PATH (--create|--open) --n N --cache-mib M " + "--disk-gib G --log 0|1\n" + " [--threads 6] [--mt-bg 1] [--normal-bg 4] [--memtable-mib 24]\n" + " [--secs 20] [--warmup 3] [--csv FILE] [--hang-dir DIR]\n" + " [--vtag S] [--stag S] [--otag S] [--rep R] [--seed S]\n" + " [--sabotage MASK] (1: point present->query absent; 2: point " + "neg->query present;\n" + " 4: range expects +1; 8: warm expects +1; 16: " + "point threads hang)\n" + " [--hang-secs 120] (no-progress timeout before gdb dump + exit 99\n" + " phase... load:random|load:seq warm point:uniform|zipf|seq|neg\n" + " range:uniform|zipf:L ow:uniform|zipf (suffix @T = " + "threads)\n"); + exit(2); +} + +static bool +parse_phase(const char *s, phase_t *ph) +{ + memset(ph, 0, sizeof(*ph)); + snprintf(ph->name, sizeof(ph->name), "%s", s); + char buf[64]; + snprintf(buf, sizeof(buf), "%s", s); + char *at = strchr(buf, '@'); + if (at) { + *at = 0; + ph->threads = atoi(at + 1); + } + char *a = strtok(buf, ":"), *b = strtok(NULL, ":"), *c = strtok(NULL, ":"); + if (!a) { + return false; + } + enum dist d = D_UNIFORM; + if (b) { + if (!strcmp(b, "uniform")) + d = D_UNIFORM; + else if (!strcmp(b, "zipf")) + d = D_ZIPF; + else if (!strcmp(b, "seq")) + d = D_SEQ; + else if (!strcmp(b, "neg")) + d = D_NEG; + else if (!strcmp(b, "random")) + d = D_RANDOM; + else + return false; + } + ph->dist = d; + if (!strcmp(a, "load")) { + ph->kind = PH_LOAD; + return b && (d == D_RANDOM || d == D_SEQ); + } else if (!strcmp(a, "warm")) { + ph->kind = PH_WARM; + return true; + } else if (!strcmp(a, "point")) { + ph->kind = PH_POINT; + return b != NULL; + } else if (!strcmp(a, "range")) { + ph->kind = PH_RANGE; + if (!b || !c || (d != D_UNIFORM && d != D_ZIPF)) { + return false; + } + ph->L = strtoull(c, NULL, 10); + return ph->L >= 1; + } else if (!strcmp(a, "ow")) { + ph->kind = PH_OW; + return b && (d == D_UNIFORM || d == D_ZIPF); + } + return false; +} + +int +main(int argc, char **argv) +{ + opt = (options){.threads = 6, + .mt_bg = 1, + .normal_bg = 4, + .memtable_mib = 24, + .secs = 20, + .warmup = 3, + .vtag = "?", + .stag = "?", + .otag = "?", + .rep = 1, + .seed = 42, + .hang_secs = 120, + .use_log = -1}; + int mode = -1; +#ifdef KVBENCH_SPACE_MODE + /* + * Space-check build only: open with use_stats, print insertion stats + * (which include allocator "Currently Allocated" extents, recomputed from + * the persisted allocator map at open), close. No phases, no writes. + */ + bool space_mode = false; +#endif + for (int i = 1; i < argc; i++) { + const char *s = argv[i]; +#define ARG(name) (!strcmp(s, name) && i + 1 < argc) + if (!strcmp(s, "--create")) + mode = 1; + else if (!strcmp(s, "--open")) + mode = 0; + else if (ARG("--db")) + opt.db = argv[++i]; + else if (ARG("--csv")) + opt.csv = argv[++i]; + else if (ARG("--hang-dir")) + opt.hang_dir = argv[++i]; + else if (ARG("--vtag")) + opt.vtag = argv[++i]; + else if (ARG("--stag")) + opt.stag = argv[++i]; + else if (ARG("--otag")) + opt.otag = argv[++i]; + else if (ARG("--rep")) + opt.rep = atoi(argv[++i]); + else if (ARG("--n")) + opt.n = strtoull(argv[++i], NULL, 0); + else if (ARG("--cache-mib")) + opt.cache_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--disk-gib")) + opt.disk_gib = strtoull(argv[++i], NULL, 0); + else if (ARG("--memtable-mib")) + opt.memtable_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--log")) + opt.use_log = atoi(argv[++i]); + else if (ARG("--threads")) + opt.threads = atoi(argv[++i]); + else if (ARG("--mt-bg")) + opt.mt_bg = atoi(argv[++i]); + else if (ARG("--normal-bg")) + opt.normal_bg = atoi(argv[++i]); + else if (ARG("--secs")) + opt.secs = atof(argv[++i]); + else if (ARG("--warmup")) + opt.warmup = atof(argv[++i]); + else if (ARG("--sabotage")) + opt.sabotage = strtoull(argv[++i], NULL, 0); + else if (ARG("--hang-secs")) + opt.hang_secs = strtoull(argv[++i], NULL, 0); + else if (ARG("--seed")) + opt.seed = strtoull(argv[++i], NULL, 0); +#ifdef KVBENCH_SPACE_MODE + else if (!strcmp(s, "space")) + space_mode = true; +#endif + else if (s[0] == '-') + usage(); + else { + if (opt.nphases >= MAX_PHASES + || !parse_phase(s, &opt.phases[opt.nphases])) + { + fprintf(stderr, "bad phase '%s'\n", s); + usage(); + } + opt.nphases++; + } +#undef ARG + } +#ifdef KVBENCH_SPACE_MODE + if (space_mode && opt.db && opt.cache_mib && opt.disk_gib + && opt.use_log >= 0) + { + default_data_config_init(&data_cfg); prefix_configure(); + platform_set_log_streams(stdout, stderr); + db_open(false); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + db_close(); + uint64_t app, alc; + file_sizes(&app, &alc); + printf("space: db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", app, alc); + return 0; + } +#endif + if (!opt.db || mode < 0 || !opt.n || !opt.cache_mib || !opt.disk_gib + || opt.use_log < 0 || !opt.nphases || opt.threads < 1 + || opt.threads > MAX_WORKERS) + { + usage(); + } + for (int i = 0; i < opt.nphases; i++) { + if (opt.phases[i].threads > MAX_WORKERS) { + usage(); + } + } + prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0); + setvbuf(stdout, NULL, _IOLBF, 0); + + default_data_config_init(&data_cfg); prefix_configure(); + perm_init(&load_perm, opt.n, opt.seed * 2 + 1); + perm_init(&zipf_perm, opt.n, opt.seed * 2 + 2); + zipf_init(&zipf, opt.n, 0.99); + generation = (uint64_t)time(NULL); + + printf("kvbench version=%s splinter=%s db=%s mode=%s n=%" PRIu64 + " cache_mib=%" PRIu64 " disk_gib=%" PRIu64 + " log=%d threads=%d mt_bg=%d normal_bg=%d memtable_mib=%" PRIu64 + " secs=%.1f warmup=%.1f rep=%d sabotage=%" PRIu64 "\n", + opt.vtag, + splinterdb_get_version(), + opt.db, + mode ? "create" : "open", + opt.n, + opt.cache_mib, + opt.disk_gib, + opt.use_log, + opt.threads, + opt.mt_bg, + opt.normal_bg, + opt.memtable_mib, + opt.secs, + opt.warmup, + opt.rep, + opt.sabotage); + + pthread_t wd; + pthread_create(&wd, NULL, watchdog_main, NULL); + + db_open(mode == 1); + for (int i = 0; i < opt.nphases; i++) { + run_phase(&opt.phases[i], i == opt.nphases - 1); + } + if (kvs) { + db_close(); + } + return 0; +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/preparation.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/preparation.json new file mode 100644 index 000000000..2a6d4b750 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/preparation.json @@ -0,0 +1,20 @@ +{ + "main": "7bb5fab305b9c6179e31f75998dabea833537a08", + "sources": { + "hash_range_benchmark.c": "bed236eceff4c7c1ce1570f55ddf35aac1858f53520c9447f24f5a32c055b6fe", + "kvbench.c": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9", + "prefix_kvbench.c": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "barrier_bench.c": "1784a5d6d1b627858a0c8a9a6f718cd7d002a562e680d5cbdde23829167c015c", + "insert_benchmark.c": "75acbda52b2a8949f1d61710a8d89250d4dac63b12ec9803b89170f9c2cc0b26" + }, + "source_notes": { + "kvbench.c": "Byte-identical copy of campaign baseline/benchmarks/kvbench.c", + "prefix_kvbench.c": "Frozen campaign prefix workload generated from the same baseline kvbench, 64-byte common/random keys", + "insert_benchmark.c": "Frozen log-group-limit branch harness, with a compile-time two-argument blocking durable-barrier adapter for async branch", + "barrier_bench.c": "Frozen async-durable-barrier branch common harness with compile-time main/candidate API adapters", + "hash_range_benchmark.c": "Frozen filtered-ranges branch public-API probe; candidate routing hash versus main application filtering" + }, + "query_order": "Main control, all variants forward, main control, all variants reverse, main control", + "scope": "Screen feature branches freshly based on main; historical measurements remain historical. This does not isolate merge overhead.", + "expected_minutes": 35 +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/repeat.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/repeat.py new file mode 100644 index 000000000..a6045a183 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/repeat.py @@ -0,0 +1,19 @@ +"""Nearby warmed ABBA controls; invoke under run_job.py benchmark.""" +import argparse +import run_matrix as r +p=argparse.ArgumentParser();p.add_argument('profile',choices=['warmup','cache-invalid-addresses','directory-bucket-atomic','async-durable-barrier']);a=p.parse_args() +def interrupted(signum,frame):raise InterruptedError(f'benchmark interrupted by signal {signum}') +for sig in [r.signal.SIGTERM,r.signal.SIGHUP]:r.signal.signal(sig,interrupted) +original=r.kvargs +def longer(*args,**kwargs): + kwargs['secs']=10 + return original(*args,**kwargs) +r.kvargs=longer +folder,m=r.newmode('repeat-'+a.profile) +m['runner_sha256']=r.sha(__file__) +m['shared_runner_sha256']=r.sha(r.__file__) +m['scope']='Nearby main ABBA controls after broad screening; all earlier samples retained' +if a.profile=='warmup':m['scope']='Recorded workload warmup before nearby ABBA comparisons; retained separately from their samples' +phases=['warm']+(['point:uniform@1'] if a.profile=='cache-invalid-addresses' else [])+['point:uniform@8','range:uniform:1@8'] +for i,name in enumerate(['main'] if a.profile=='warmup' else ['main',a.profile,a.profile,'main']):r.query_one(folder,m,i,name,'resident',phases) +m['complete']=True;r.save(folder/'manifest.json',m) diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/report.md b/benchmarks/results-20261013/main-7bb5fab/benchmarks/report.md new file mode 100644 index 000000000..c6d09c230 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/report.md @@ -0,0 +1,237 @@ +# Fresh main integration benchmark screening + +These compare current feature branches with main 7bb5fab. They do not isolate the cost of merging main. Short runs are screening evidence, not proof of performance neutrality. All databases are on verified real disk with O_DIRECT; copied fixtures are fsynced before opening. Query samples use serial-built immutable fixtures, with separate equivalent fixtures for incompatible formats. Main controls bracket forward and reverse variant sweeps. + +| Workload | Phase | Branch | Change | Sample range overlap | +| --- | --- | --- | ---: | --- | +| resident | point:uniform@1 | disk-format | -1.21% | True | +| resident | point:uniform@1 | filtered-ranges | -1.11% | True | +| resident | point:uniform@1 | log-group-limit | -3.24% | True | +| resident | point:uniform@1 | lazy-merge | -2.99% | True | +| resident | point:uniform@1 | async-durable-barrier | -3.58% | True | +| resident | point:uniform@1 | cache-invalid-addresses | -4.60% | False | +| resident | point:uniform@1 | directory-direct | -3.66% | True | +| resident | point:uniform@1 | directory-bucket | -13.61% | False | +| resident | point:uniform@1 | directory-bucket-simd | -14.75% | False | +| resident | point:uniform@1 | directory-bucket-atomic | -11.59% | False | +| resident | point:uniform@8 | disk-format | -1.92% | True | +| resident | point:uniform@8 | filtered-ranges | -1.37% | True | +| resident | point:uniform@8 | log-group-limit | -3.94% | True | +| resident | point:uniform@8 | lazy-merge | -4.99% | True | +| resident | point:uniform@8 | async-durable-barrier | -5.29% | True | +| resident | point:uniform@8 | cache-invalid-addresses | -7.08% | True | +| resident | point:uniform@8 | directory-direct | -6.43% | True | +| resident | point:uniform@8 | directory-bucket | -25.62% | False | +| resident | point:uniform@8 | directory-bucket-simd | -25.20% | False | +| resident | point:uniform@8 | directory-bucket-atomic | -11.45% | False | +| resident | range:uniform:1@1 | disk-format | +1.54% | True | +| resident | range:uniform:1@1 | filtered-ranges | -0.07% | True | +| resident | range:uniform:1@1 | log-group-limit | -2.20% | True | +| resident | range:uniform:1@1 | lazy-merge | +4.48% | True | +| resident | range:uniform:1@1 | async-durable-barrier | -0.38% | True | +| resident | range:uniform:1@1 | cache-invalid-addresses | -2.25% | True | +| resident | range:uniform:1@1 | directory-direct | -0.18% | True | +| resident | range:uniform:1@1 | directory-bucket | -7.11% | False | +| resident | range:uniform:1@1 | directory-bucket-simd | -6.10% | False | +| resident | range:uniform:1@1 | directory-bucket-atomic | -5.32% | False | +| resident | range:uniform:1@8 | disk-format | -4.07% | True | +| resident | range:uniform:1@8 | filtered-ranges | -3.38% | True | +| resident | range:uniform:1@8 | log-group-limit | -4.75% | True | +| resident | range:uniform:1@8 | lazy-merge | +1.35% | True | +| resident | range:uniform:1@8 | async-durable-barrier | -6.06% | False | +| resident | range:uniform:1@8 | cache-invalid-addresses | -4.95% | True | +| resident | range:uniform:1@8 | directory-direct | -4.39% | True | +| resident | range:uniform:1@8 | directory-bucket | -18.35% | False | +| resident | range:uniform:1@8 | directory-bucket-simd | -18.65% | False | +| resident | range:uniform:1@8 | directory-bucket-atomic | -7.65% | False | +| resident | range:uniform:10000@8 | disk-format | -2.41% | True | +| resident | range:uniform:10000@8 | filtered-ranges | +1.43% | True | +| resident | range:uniform:10000@8 | log-group-limit | -1.49% | True | +| resident | range:uniform:10000@8 | lazy-merge | -5.38% | True | +| resident | range:uniform:10000@8 | async-durable-barrier | -4.49% | True | +| resident | range:uniform:10000@8 | cache-invalid-addresses | -2.56% | True | +| resident | range:uniform:10000@8 | directory-direct | -8.56% | False | +| resident | range:uniform:10000@8 | directory-bucket | -6.41% | True | +| resident | range:uniform:10000@8 | directory-bucket-simd | -6.44% | False | +| resident | range:uniform:10000@8 | directory-bucket-atomic | -6.85% | True | +| disk | point:uniform@8 | disk-format | -0.81% | True | +| disk | point:uniform@8 | filtered-ranges | -3.82% | True | +| disk | point:uniform@8 | log-group-limit | -0.25% | True | +| disk | point:uniform@8 | lazy-merge | -0.22% | True | +| disk | point:uniform@8 | async-durable-barrier | -2.05% | True | +| disk | point:uniform@8 | cache-invalid-addresses | -2.24% | True | +| disk | point:uniform@8 | directory-direct | -1.93% | True | +| disk | point:uniform@8 | directory-bucket | -2.54% | True | +| disk | point:uniform@8 | directory-bucket-simd | -2.53% | True | +| disk | point:uniform@8 | directory-bucket-atomic | -1.32% | True | +| disk | range:uniform:1@8 | disk-format | -0.78% | True | +| disk | range:uniform:1@8 | filtered-ranges | -1.67% | True | +| disk | range:uniform:1@8 | log-group-limit | -0.59% | True | +| disk | range:uniform:1@8 | lazy-merge | -0.98% | True | +| disk | range:uniform:1@8 | async-durable-barrier | -2.40% | True | +| disk | range:uniform:1@8 | cache-invalid-addresses | -2.34% | True | +| disk | range:uniform:1@8 | directory-direct | -3.11% | True | +| disk | range:uniform:1@8 | directory-bucket | -2.79% | True | +| disk | range:uniform:1@8 | directory-bucket-simd | -3.56% | True | +| disk | range:uniform:1@8 | directory-bucket-atomic | -2.25% | True | +| disk | range:uniform:10000@8 | disk-format | -0.41% | True | +| disk | range:uniform:10000@8 | filtered-ranges | -1.80% | True | +| disk | range:uniform:10000@8 | log-group-limit | +0.11% | True | +| disk | range:uniform:10000@8 | lazy-merge | -1.24% | True | +| disk | range:uniform:10000@8 | async-durable-barrier | -2.13% | True | +| disk | range:uniform:10000@8 | cache-invalid-addresses | -2.08% | True | +| disk | range:uniform:10000@8 | directory-direct | -2.14% | True | +| disk | range:uniform:10000@8 | directory-bucket | -2.08% | True | +| disk | range:uniform:10000@8 | directory-bucket-simd | -3.48% | True | +| disk | range:uniform:10000@8 | directory-bucket-atomic | -1.09% | True | +| prefix-resident-common | point:uniform@8 | branch-prefix | +10.61% | False | +| prefix-resident-common | range:uniform:1@8 | branch-prefix | +2.87% | False | +| prefix-resident-common | range:uniform:10000@8 | branch-prefix | +0.34% | True | +| prefix-resident-common | ow:uniform@8 | branch-prefix | +9.38% | False | +| prefix-resident-random | point:uniform@8 | branch-prefix | -0.30% | True | +| prefix-resident-random | range:uniform:1@8 | branch-prefix | +2.67% | True | +| prefix-resident-random | range:uniform:10000@8 | branch-prefix | -10.88% | False | +| prefix-resident-random | ow:uniform@8 | branch-prefix | -1.52% | True | +| prefix-disk-common | point:uniform@8 | branch-prefix | -2.69% | True | +| prefix-disk-common | range:uniform:1@8 | branch-prefix | +0.11% | True | +| prefix-disk-common | range:uniform:10000@8 | branch-prefix | +14.37% | False | +| prefix-disk-random | point:uniform@8 | branch-prefix | -5.57% | True | +| prefix-disk-random | range:uniform:1@8 | branch-prefix | -6.30% | True | +| prefix-disk-random | range:uniform:10000@8 | branch-prefix | -4.11% | True | +| repeat-directory-bucket-atomic | point:uniform@8 | directory-bucket-atomic | -6.18% | True | +| repeat-directory-bucket-atomic | range:uniform:1@8 | directory-bucket-atomic | -3.89% | True | +| repeat-async-durable-barrier | point:uniform@8 | async-durable-barrier | -0.52% | True | +| repeat-async-durable-barrier | range:uniform:1@8 | async-durable-barrier | -2.28% | True | +| repeat-cache-invalid-addresses | point:uniform@1 | cache-invalid-addresses | -4.54% | False | +| repeat-cache-invalid-addresses | point:uniform@8 | cache-invalid-addresses | -3.64% | True | +| repeat-cache-invalid-addresses | range:uniform:1@8 | cache-invalid-addresses | +0.03% | True | +| insert | WAL1 | disk-format | -0.88% | True | +| insert | WAL1 | filtered-ranges | -1.02% | False | +| insert | WAL1 | lazy-merge | -0.49% | True | +| insert | WAL1 | async-durable-barrier | -1.08% | True | +| insert | WAL1 | cache-invalid-addresses | -3.00% | False | +| insert | WAL1 | directory-direct | -1.91% | False | +| insert | WAL1 | directory-bucket | -5.46% | False | +| insert | WAL1 | directory-bucket-simd | -3.79% | False | +| insert | WAL1 | directory-bucket-atomic | -3.32% | False | +| insert | WAL1 | log-disabled | -1.34% | True | +| insert | WAL1 | log-default | -42.70% | False | +| insert | WAL0 | cache-invalid-addresses | +6.27% | True | +| insert | WAL0 | directory-bucket-atomic | +6.39% | False | + +Detailed throughput ranges, CPU/op, I/O/op and p99 are in summary.csv. Raw commands, source/library/executable hashes, verification and logs remain in the per-workload manifest and adjacent artifacts. + +{ + "insert": { + "runs": 31, + "complete": true, + "verified": 31 + }, + "repeat-warmup": { + "runs": 1, + "complete": true, + "verified": 1 + }, + "barrier": { + "runs": 24, + "complete": true, + "verified": 24 + }, + "repeat-directory-bucket-atomic": { + "runs": 4, + "complete": true, + "verified": 4 + }, + "fixtures": { + "runs": 12, + "complete": true, + "verified": 12 + }, + "disk": { + "runs": 23, + "complete": true, + "verified": 23 + }, + "repeat-async-durable-barrier": { + "runs": 4, + "complete": true, + "verified": 4 + }, + "prefix-resident-common": { + "runs": 4, + "complete": true, + "verified": 4 + }, + "hash": { + "runs": 4, + "complete": true, + "verified": 4 + }, + "resident": { + "runs": 23, + "complete": true, + "verified": 23 + }, + "repeat-cache-invalid-addresses": { + "runs": 4, + "complete": true, + "verified": 4 + }, + "prefix-disk-random": { + "runs": 4, + "complete": true, + "verified": 4 + }, + "prefix-disk-common": { + "runs": 4, + "complete": true, + "verified": 4 + }, + "prefix-resident-random": { + "runs": 4, + "complete": true, + "verified": 4 + } +} + +## Main control drift + +All controls are retained. Large variation in these unchanged-main samples prevents attributing small feature differences to code. The measured cause of this variation is unknown. Nearby ABBA repeats are separate evidence; they do not replace these results. + +| Regime | Phase | First ops/s | Middle ops/s | Last ops/s | Middle vs first | Last vs first | +| --- | --- | ---: | ---: | ---: | ---: | ---: | +| resident | point:uniform@1 | 1,261,757.3 | 1,152,531.0 | 1,148,133.5 | -8.66% | -9.01% | +| resident | point:uniform@8 | 6,445,634.1 | 5,270,841.2 | 5,463,995.8 | -18.23% | -15.23% | +| resident | range:uniform:1@1 | 114,690.1 | 105,447.5 | 105,112.6 | -8.06% | -8.35% | +| resident | range:uniform:1@8 | 600,376.6 | 532,530.7 | 549,552.3 | -11.30% | -8.47% | +| resident | range:uniform:10000@8 | 4,305.3 | 3,785.8 | 3,929.7 | -12.07% | -8.72% | +| disk | point:uniform@8 | 153,061.5 | 162,899.9 | 168,110.0 | +6.43% | +9.83% | +| disk | range:uniform:1@8 | 63,458.1 | 63,625.4 | 64,975.4 | +0.26% | +2.39% | +| disk | range:uniform:10000@8 | 841.4 | 835.2 | 840.0 | -0.74% | -0.17% | + +## Interpretation and limits + +These samples support feature tradeoffs, not an isolated estimate of merge overhead. There are two samples per candidate and two or three main controls; non-overlap is a descriptive range check, not a statistical confidence interval. Unchanged main controls drifted substantially, including in nearby repeats. The cause is unproven. + +The invalid-address checks reproduce a roughly 4.5% resident single-thread point-query loss: broad screening -4.60%, nearby warmed ABBA -4.54% with non-overlapping sample ranges. Its repeated eight-thread point query (-3.64%) overlaps main, and repeated one-result/eight-thread range query (+0.03%) does not reproduce the initial apparent loss. Atomic directory nearby repeats (-6.18% point and -3.89% short range) and async-barrier ordinary-query repeats (-0.52% point and -2.28% short range) all overlap main; their smaller effects remain inconclusive. The scalar/SIMD directory variants show larger resident feature costs in the broad screen. These are comparisons of the whole features to main, not newly introduced merge regressions. + +Prefix compression improves several common-prefix workloads, but the random-key resident long-range screen loses 10.88% with non-overlapping samples. The default 64-page automatic log-group durability threshold loses 42.7% insert throughput in the short WAL-enabled screen; this is the cost of added automatic durability versus main without automatic barriers. Disabling the threshold gives -1.3% with overlapping ranges. These tradeoffs require workload-specific judgment, not a blanket performance-neutral claim. + +All timed processes passed their declared verification. Query runs validate keys/values/ranges and close successfully. Insert-only runs validate API returns, positive insert counts and close, but do not perform readback. Barrier runs crash after the final completed barrier, reopen and verify every key/value. Hash-filter runs compare checksums and expected output counts. Every measured ordinary resident and focused-repeat query phase has zero physical read bytes. The retained pre-repeat warmup runs point and one-result range queries at eight threads for 10 seconds each; it is not pooled with comparison controls. + +Separate correctness testing reproduced an inherited small-cache async progress stall on main and invalid-addresses under restricted CPU scheduling. That limitation is documented in the branch correctness evidence; it was not repaired in these merges, and no benchmark run stalled. + +Barrier measurements are short and show substantial run-to-run I/O variation in some configurations. In particular, WAL-enabled/no-background-worker candidate sync spans about 60k to 194k updates/s, while main spans 63k to 65k; its +99% mean alone is not a stable speedup estimate. Async launch latency is distinct from durability completion. These runs use depth 1: completion is observed by waiting or polling before the next insert batch. Greater-depth harness modes may include intervening inserts in observed completion, but were not measured here. + +| Barrier config | Candidate mode | Main updates/s range | Candidate updates/s range | Mean change | Mean launch p99 us | Mean observed completion p99 us | +| --- | --- | ---: | ---: | ---: | ---: | ---: | +| wal0-workers0 | sync | 31,072–40,897 | 57,552–58,998 | +61.95% | 15769.34 | 15769.34 | +| wal0-workers0 | async | 31,072–40,897 | 59,568–60,181 | +66.39% | 0.98 | 14594.80 | +| wal0-workers1 | sync | 32,686–33,069 | 32,567–33,066 | -0.19% | 21671.51 | 21671.51 | +| wal0-workers1 | async | 32,686–33,069 | 31,925–33,322 | -0.77% | 2.90 | 23050.30 | +| wal1-workers0 | sync | 63,288–64,560 | 60,090–194,153 | +98.86% | 4118.68 | 4118.68 | +| wal1-workers0 | async | 63,288–64,560 | 200,298–273,650 | +270.71% | 3.51 | 2190.87 | +| wal1-workers1 | sync | 61,607–63,583 | 67,545–69,246 | +9.27% | 4940.58 | 4940.58 | +| wal1-workers1 | async | 61,607–63,583 | 78,489–80,079 | +26.66% | 6.17 | 4128.32 | + +Hash-filter API versus application filtering: mean latency changes for limits 1/2/10/100 are -5.70%/-16.71%/+0.56%/-9.59%; output checksums match. Full ranges, visited tuple counts, CPU/I/O and provenance are retained in the raw results and feature-summaries.json. diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/report.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/report.py new file mode 100644 index 000000000..eb2212fd6 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/report.py @@ -0,0 +1,127 @@ +import csv,json,statistics +from pathlib import Path +OUT=Path('/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-7bb5fab') +COORD=Path(__file__).resolve().parent +allrows=[] +def read(path): + with path.open() as f:return list(csv.DictReader(f)) +def verified_manifest(folder): + p=folder/'manifest.json' + if not p.exists():return None + m=json.loads(p.read_text()) + if not m.get('complete'):return None + assert m['runs'] and all(r.get('verified') and r.get('returncode')==0 for r in m['runs']),folder + return m +def summary(mode,group,version,rs,base,rate='ops_s'): + rates=[float(r[rate]) for r in rs];baseline=[float(r[rate]) for r in base] + avg=statistics.fmean + return dict(workload=mode,phase=group,version=version,samples=len(rs),ops_s_mean=avg(rates),ops_s_min=min(rates),ops_s_max=max(rates),baseline_ops_s_mean=avg(baseline),baseline_ops_s_min=min(baseline),baseline_ops_s_max=max(baseline),delta_pct=100*(avg(rates)/avg(baseline)-1),ranges_overlap=max(min(rates),min(baseline))<=min(max(rates),max(baseline))) +for mode in ['resident','disk','prefix-resident-common','prefix-resident-random','prefix-disk-common','prefix-disk-random',*[p.name for p in OUT.glob('repeat-*')]]: + folder=OUT/mode + if not (folder/'results.csv').exists() or not (folder/'manifest.json').exists():continue + m=verified_manifest(folder) + if m is None:continue + rr=read(folder/'results.csv') + for run in m['runs']: + command=run['command']; order=command[command.index('--otag')+1] + own=[r for r in rr if r['order']==order] + phases=command[command.index('warm'):] + assert len(own)==len(phases) and [r['phase'] for r in own]==phases and all(r['version']==run['profile'] for r in own),run['label'] + assert len(rr)==sum(len(run['command'][run['command'].index('warm'):]) for run in m['runs']) + for phase in dict.fromkeys(r['phase'] for r in rr if r['phase']!='warm'): + bas=[r for r in rr if r['version']=='main' and r['phase']==phase] + if mode=='resident' or mode.startswith('repeat-'):assert all(int(r['rd_bytes'])==0 for r in rr if r['phase']!='warm'), 'resident queries performed physical reads' + for version in dict.fromkeys(r['version'] for r in rr): + rs=[r for r in rr if r['version']==version and r['phase']==phase] + if not rs or not bas:continue + s=summary(mode,phase,version,rs,bas) + s.update(errors=sum(int(r['errors']) for r in rs),violations=sum(int(r['violations']) for r in rs),cpu_us_op=statistics.fmean(1e6*float(r['cpu_s'])/int(r['ops']) for r in rs),read_B_op=statistics.fmean(float(r['rd_B_op']) for r in rs),write_B_op=statistics.fmean(float(r['wr_B_op']) for r in rs),p99_us=statistics.fmean(float(r['p99_us']) for r in rs));allrows.append(s) +folder=OUT/'insert' +if (folder/'results.csv').exists() and verified_manifest(folder): + m=verified_manifest(folder);rr=read(folder/'results.csv') + assert len(rr)==len(m['runs']) + assert {f"wal{r['wal']}-{int(r['index']):02d}-{r['version']}" for r in rr}=={r['label'] for r in m['runs']} + for wal in dict.fromkeys(r['wal'] for r in rr): + bas=[r for r in rr if r['version']=='main' and r['wal']==wal] + for version in dict.fromkeys(r['version'] for r in rr if r['wal']==wal): + rs=[r for r in rr if r['version']==version and r['wal']==wal];s=summary('insert','WAL'+wal,version,rs,bas) + s.update(errors=sum(int(r['errors']) for r in rs),violations=sum(int(r['violations']) for r in rs));s.update({k:statistics.fmean(float(r[k]) for r in rs) for k in ['cpu_us_op','read_B_op','write_B_op','p99_us']});allrows.append(s) +if allrows: + with (COORD/'summary.csv').open('w') as f: + w=csv.DictWriter(f,fieldnames=list(allrows[0]),lineterminator='\n');w.writeheader();w.writerows(allrows) +lines=['# Fresh main integration benchmark screening','','These compare current feature branches with main 7bb5fab. They do not isolate the cost of merging main. Short runs are screening evidence, not proof of performance neutrality. All databases are on verified real disk with O_DIRECT; copied fixtures are fsynced before opening. Query samples use serial-built immutable fixtures, with separate equivalent fixtures for incompatible formats. Main controls bracket forward and reverse variant sweeps.','', '| Workload | Phase | Branch | Change | Sample range overlap |','| --- | --- | --- | ---: | --- |'] +for r in allrows: + if r['version']=='main':continue + lines.append(f"| {r['workload']} | {r['phase']} | {r['version']} | {r['delta_pct']:+.2f}% | {r['ranges_overlap']} |") +counts={} +for p in OUT.glob('*/manifest.json'): + m=json.loads(p.read_text());counts[p.parent.name]=dict(runs=len(m['runs']),complete=m.get('complete',False),verified=sum(r.get('verified',False) for r in m['runs'])) +(COORD/'counts.json').write_text(json.dumps(counts,indent=2)+'\n') +lines+=['','Detailed throughput ranges, CPU/op, I/O/op and p99 are in summary.csv. Raw commands, source/library/executable hashes, verification and logs remain in the per-workload manifest and adjacent artifacts.','',json.dumps(counts,indent=2)] +(COORD/'report.md').write_text('\n'.join(lines)+'\n') +print(json.dumps(counts,indent=2)) +feature_summaries={} +p=OUT/'hash/manifest.json' +if p.exists() and verified_manifest(p.parent): + m=verified_manifest(p.parent);hh=[] + for limit in ['1','2','10','100']: + groups={profile:[r for run in m['runs'] if run['profile']==profile and run['verified'] for r in run['rows'] if r['limit']==limit] for profile in ['main','filtered-ranges']} + if not all(groups.values()):continue + mean=lambda name:statistics.fmean(float(r['ns_per_query']) for r in groups[name]) + for profile,rr in groups.items(): + costs=[float(r['ns_per_query']) for r in rr] + hh.append(dict(profile=profile,limit=int(limit),samples=len(rr),ns_per_query_mean=statistics.fmean(costs),ns_per_query_min=min(costs),ns_per_query_max=max(costs),latency_delta_main_pct=100*(mean(profile)/mean('main')-1),visited_mean=statistics.fmean(int(r['visited']) for r in rr),verified=True,verification_kind='successful process with harness assertions and matching result checksums')) + feature_summaries['hash']=hh +p=OUT/'barrier/results.csv' +if p.exists() and verified_manifest(p.parent): + m=verified_manifest(p.parent);rr=read(p);bb=[] + assert len(rr)==len(m['runs']) and {r['label'] for r in rr}=={r['label'] for r in m['runs']} + for wal in ['0','1']: + for workers in ['0','1']: + cases=[('main','sync'),('async-durable-barrier','sync'),('async-durable-barrier','async')] + base=[r for r in rr if r['log']==wal and r['workers']==workers and '-main-' in r['label']] + if not base:continue + for profile,mode in cases: + rs=[r for r in rr if r['log']==wal and r['workers']==workers and f'-{profile}-' in r['label'] and r['mode']==mode] + if not rs:continue + s=summary('barrier',f'wal{wal}-workers{workers}-{mode}',profile,rs,base,rate='updates_s') + s.update(launch_p99_us=statistics.fmean(float(r['launch_p99_us']) for r in rs),completion_p99_us=statistics.fmean(float(r['observed_completion_p99_us']) for r in rs),verified=all(int(r['verified'])==1 for r in rs),verification_kind='crash after completed final barrier, reopen and full key/value readback',cpu_us_update=statistics.fmean(1e6*float(r['cpu_s'])/(int(r['batch'])*int(r['barriers'])) for r in rs),read_bytes_update=statistics.fmean(int(r['read_bytes'])/(int(r['batch'])*int(r['barriers'])) for r in rs),write_bytes_update=statistics.fmean(int(r['write_bytes'])/(int(r['batch'])*int(r['barriers'])) for r in rs));bb.append(s) + feature_summaries['barrier']=bb +(COORD/'feature-summaries.json').write_text(json.dumps(feature_summaries,indent=2)+'\n') +controls=[] +for folder in OUT.iterdir(): + p=folder/'results.csv' + if not folder.is_dir() or not p.exists():continue + rr=read(p) + if not rr or not {'version','phase','ops_s'}.issubset(rr[0]):continue + for phase in dict.fromkeys(r['phase'] for r in rr if r['phase']!='warm'): + rs=[r for r in rr if r['version']=='main' and r['phase']==phase] + if not rs:continue + first=float(rs[0]['ops_s']) + for r in rs:controls.append(dict(workload=folder.name,phase=phase,order=r['order'],ops_s=float(r['ops_s']),change_from_first_pct=100*(float(r['ops_s'])/first-1),cpu_us_op=1e6*float(r['cpu_s'])/int(r['ops']),read_bytes=int(r['rd_bytes']))) +if controls: + with (COORD/'control-drift.csv').open('w') as f: + w=csv.DictWriter(f,fieldnames=list(controls[0]),lineterminator='\n');w.writeheader();w.writerows(controls) +with (COORD/'report.md').open('a') as f: + f.write('\n## Main control drift\n\n') + f.write('All controls are retained. Large variation in these unchanged-main samples prevents attributing small feature differences to code. The measured cause of this variation is unknown. Nearby ABBA repeats are separate evidence; they do not replace these results.\n\n') + f.write('| Regime | Phase | First ops/s | Middle ops/s | Last ops/s | Middle vs first | Last vs first |\n| --- | --- | ---: | ---: | ---: | ---: | ---: |\n') + for mode in ['resident','disk']: + for phase in dict.fromkeys(r['phase'] for r in controls if r['workload']==mode): + rr=[r for r in controls if r['workload']==mode and r['phase']==phase] + if len(rr)!=3:continue + f.write(f"| {mode} | {phase} | {rr[0]['ops_s']:,.1f} | {rr[1]['ops_s']:,.1f} | {rr[2]['ops_s']:,.1f} | {rr[1]['change_from_first_pct']:+.2f}% | {rr[2]['change_from_first_pct']:+.2f}% |\n") + +with (COORD/'report.md').open('a') as f: + f.write('\n## Interpretation and limits\n\n') + f.write('These samples support feature tradeoffs, not an isolated estimate of merge overhead. There are two samples per candidate and two or three main controls; non-overlap is a descriptive range check, not a statistical confidence interval. Unchanged main controls drifted substantially, including in nearby repeats. The cause is unproven.\n\n') + f.write('The invalid-address checks reproduce a roughly 4.5% resident single-thread point-query loss: broad screening -4.60%, nearby warmed ABBA -4.54% with non-overlapping sample ranges. Its repeated eight-thread point query (-3.64%) overlaps main, and repeated one-result/eight-thread range query (+0.03%) does not reproduce the initial apparent loss. Atomic directory nearby repeats (-6.18% point and -3.89% short range) and async-barrier ordinary-query repeats (-0.52% point and -2.28% short range) all overlap main; their smaller effects remain inconclusive. The scalar/SIMD directory variants show larger resident feature costs in the broad screen. These are comparisons of the whole features to main, not newly introduced merge regressions.\n\n') + f.write('Prefix compression improves several common-prefix workloads, but the random-key resident long-range screen loses 10.88% with non-overlapping samples. The default 64-page automatic log-group durability threshold loses 42.7% insert throughput in the short WAL-enabled screen; this is the cost of added automatic durability versus main without automatic barriers. Disabling the threshold gives -1.3% with overlapping ranges. These tradeoffs require workload-specific judgment, not a blanket performance-neutral claim.\n\n') + f.write('All timed processes passed their declared verification. Query runs validate keys/values/ranges and close successfully. Insert-only runs validate API returns, positive insert counts and close, but do not perform readback. Barrier runs crash after the final completed barrier, reopen and verify every key/value. Hash-filter runs compare checksums and expected output counts. Every measured ordinary resident and focused-repeat query phase has zero physical read bytes. The retained pre-repeat warmup runs point and one-result range queries at eight threads for 10 seconds each; it is not pooled with comparison controls.\n\n') + f.write('Separate correctness testing reproduced an inherited small-cache async progress stall on main and invalid-addresses under restricted CPU scheduling. That limitation is documented in the branch correctness evidence; it was not repaired in these merges, and no benchmark run stalled.\n\n') + f.write('Barrier measurements are short and show substantial run-to-run I/O variation in some configurations. In particular, WAL-enabled/no-background-worker candidate sync spans about 60k to 194k updates/s, while main spans 63k to 65k; its +99% mean alone is not a stable speedup estimate. Async launch latency is distinct from durability completion. These runs use depth 1: completion is observed by waiting or polling before the next insert batch. Greater-depth harness modes may include intervening inserts in observed completion, but were not measured here.\n\n') + f.write('| Barrier config | Candidate mode | Main updates/s range | Candidate updates/s range | Mean change | Mean launch p99 us | Mean observed completion p99 us |\n| --- | --- | ---: | ---: | ---: | ---: | ---: |\n') + for r in feature_summaries.get('barrier',[]): + if r['version']=='main':continue + f.write(f"| {r['phase'].rsplit('-',1)[0]} | {r['phase'].rsplit('-',1)[1]} | {r['baseline_ops_s_min']:,.0f}–{r['baseline_ops_s_max']:,.0f} | {r['ops_s_min']:,.0f}–{r['ops_s_max']:,.0f} | {r['delta_pct']:+.2f}% | {r['launch_p99_us']:.2f} | {r['completion_p99_us']:.2f} |\n") + f.write('\nHash-filter API versus application filtering: mean latency changes for limits 1/2/10/100 are -5.70%/-16.71%/+0.56%/-9.59%; output checksums match. Full ranges, visited tuple counts, CPU/I/O and provenance are retained in the raw results and feature-summaries.json.\n') diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_job.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_job.py new file mode 100644 index 000000000..299c91084 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_job.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Coordinate this campaign's builds/tests and disk-backed benchmarks.""" +import argparse +import fcntl +import json +import os +from pathlib import Path +import subprocess +import tempfile +import time + +ROOT = Path(__file__).resolve().parent.parent +p = argparse.ArgumentParser() +p.add_argument('mode', choices=['build', 'test', 'benchmark']) +p.add_argument('--name', required=True) +p.add_argument('--db-dir', type=Path) +p.add_argument('command', nargs=argparse.REMAINDER) +a = p.parse_args() +command = a.command[1:] if a.command[:1] == ['--'] else a.command +if not command: + p.error('command required after --') +if a.mode == 'benchmark': + if a.db_dir is None: + p.error('benchmark requires --db-dir') + a.db_dir.mkdir(parents=True, exist_ok=True) + db_dir = a.db_dir.resolve() + if not db_dir.is_relative_to(ROOT / 'benchmarks'): + p.error('benchmark database directory must be under the campaign benchmarks directory') + fs = subprocess.check_output(['findmnt', '-n', '-o', 'FSTYPE,SOURCE', '-T', str(db_dir)], text=True).strip() + if fs.split()[0] in {'tmpfs', 'ramfs'} or not fs.split()[1].startswith('/dev/'): + p.error('benchmark storage must be a verified disk filesystem: ' + fs) + bench_lock = open(ROOT / 'coordination' / 'benchmark.lock', 'a+') + fcntl.flock(bench_lock, fcntl.LOCK_EX) + print('Benchmark database storage:', fs, str(db_dir), flush=True) +machine_lock = open(ROOT / 'coordination' / 'machine.lock', 'a+') +fcntl.flock(machine_lock, fcntl.LOCK_EX if a.mode == 'benchmark' else fcntl.LOCK_SH) +record = dict(name=a.name, mode=a.mode, cwd=os.getcwd(), command=command, + started=time.time(), pid=os.getpid()) +if a.db_dir is not None: + record['db_dir'] = str(a.db_dir.resolve()) +print('Starting', a.name, a.mode, flush=True) +try: + # Tool commands run in distinct PID namespaces; GNU make's FIFO names + # otherwise collide when several builds choose /tmp/GMfifo8. + with tempfile.TemporaryDirectory(prefix='splinter-' + a.name + '-', dir='/tmp') as temporary: + environment = dict(os.environ, TMPDIR=temporary) + result = subprocess.run(command, env=environment) + record['returncode'] = result.returncode +finally: + record['finished'] = time.time() + with open(ROOT / 'coordination' / 'jobs.jsonl', 'a') as journal: + fcntl.flock(journal, fcntl.LOCK_EX) + journal.write(json.dumps(record) + '\n') +raise SystemExit(result.returncode) diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix-fixtures.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix-fixtures.py new file mode 100644 index 000000000..e6ff54325 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix-fixtures.py @@ -0,0 +1,152 @@ +"""Fresh main integration screening. Invoke every mode under run_job.py benchmark.""" +import argparse,csv,hashlib,json,os,re,resource,signal,statistics,subprocess,time +from pathlib import Path +ROOT=Path('/home/rob/projects/splinterdb'); CAMP=ROOT/'.cache/projects-20261011' +COORD=Path(__file__).resolve().parent; OUT=CAMP/'benchmarks/main-7bb5fab' +VARIANTS=['disk-format','filtered-ranges','log-group-limit','lazy-merge','async-durable-barrier','cache-invalid-addresses','directory-direct','directory-bucket','directory-bucket-simd','directory-bucket-atomic'] +ORDER=['main',*VARIANTS,'main',*reversed(VARIANTS),'main'] +def sha(path): + h=hashlib.sha256() + with Path(path).open('rb') as f: + for b in iter(lambda:f.read(1024*1024),b''):h.update(b) + return h.hexdigest() +def save(path,value):path.write_text(json.dumps(value,indent=2)+'\n') +def rows(path): + with path.open() as f:return list(csv.DictReader(f)) +def csvwrite(path,data): + if not data:return + with path.open('w') as f: + w=csv.DictWriter(f,fieldnames=list(data[0]),lineterminator='\n');w.writeheader();w.writerows(data) +def build(name): + r=json.loads((COORD/(name+'-build.json')).read_text()) + assert sha(r['library'])==r['library_sha256'],name + for filename,expected in r['source_files_sha256'].items():assert sha(Path(r['tree'])/filename)==expected,(name,filename) + for b in r['binaries'].values():assert sha(b['binary'])==b['binary_sha256'],name + return r +def cmdrun(folder,manifest,label,profile,binary,args,env=None,timeout=600): + b=build(profile);exe=b['binaries'][binary] + cmd=['taskset','-c','0-11',exe['binary'],*map(str,args)] + rec=dict(label=label,profile=profile,command=cmd,started=time.time(),binary_sha256=exe['binary_sha256'],library_sha256=b['library_sha256'],source_head=b['head'],verified=False) + print(label,flush=True) + log=folder/(label+'.log') + try: + before=resource.getrusage(resource.RUSAGE_CHILDREN) + with log.open('w') as f: + p=subprocess.Popen(cmd,env=dict(os.environ,**(env or {})),stdout=f,stderr=subprocess.STDOUT,start_new_session=True) + try:p.wait(timeout=timeout) + except BaseException: + try:os.killpg(p.pid,signal.SIGKILL) + except ProcessLookupError:pass + p.wait() + raise + after=resource.getrusage(resource.RUSAGE_CHILDREN) + rec.update(returncode=p.returncode,finished=time.time(),log_sha256=sha(log),process_cpu_s=(after.ru_utime+after.ru_stime-before.ru_utime-before.ru_stime),process_read_bytes=512*(after.ru_inblock-before.ru_inblock),process_write_bytes=512*(after.ru_oublock-before.ru_oublock)) + except BaseException as e: + rec.update(exception=str(e),finished=time.time());manifest['runs'].append(rec);save(folder/'manifest.json',manifest);raise + manifest['runs'].append(rec);save(folder/'manifest.json',manifest) + assert p.returncode==0,rec + assert 'FINDING: splinterdb_close' not in log.read_text(),rec + return rec + +def newmode(mode): + folder=OUT/mode;folder.mkdir(parents=True,exist_ok=False) + fs=subprocess.check_output(['findmnt','-n','-o','FSTYPE,SOURCE','-T',str(folder)],text=True).strip();assert fs.split()[0] not in ['tmpfs','ramfs'] and fs.split()[1].startswith('/dev/') + manifest=dict(mode=mode,storage=fs,io='O_DIRECT',cpu_affinity='0-11',scope='Updated feature branches versus fresh main; not an isolation of merge cost',runner_sha256=sha(__file__),runs=[]) + save(folder/'manifest.json',manifest);return folder,manifest + +def kvargs(db,csvpath,profile,regime,index,secs=6,prefix=False,create=False): + return ['--db',db,'--create' if create else '--open','--n',200000 if regime=='resident' else 2000000,'--cache-mib',128 if regime=='resident' else 64,'--disk-gib',8,'--log',0,'--threads',1 if create else 8,'--mt-bg',0,'--normal-bg',0,'--memtable-mib',4,'--secs',secs,'--warmup',1,'--csv',csvpath,'--vtag',profile,'--stag',regime,'--otag',index,'--rep',index,'--seed',42,'--hang-secs',60,'--hang-dir',str(csvpath.parent)] +def verifykv(csvpath,index,count): + rr=[r for r in rows(csvpath) if r['order']==str(index)] + assert len(rr)==count,(index,len(rr),count) + assert all(int(r['ops'])>0 and int(r['errors'])==0 and int(r['violations'])==0 for r in rr),rr + return rr + +def fixtures(): + folder,m=newmode('fixtures');ff={} + for regime in ['resident','disk']: + for profile,pattern in [('main','ordinary'),('disk-format','ordinary'),('main','common'),('branch-prefix','common'),('main','random'),('branch-prefix','random')]: + label=f'{regime}-{profile}-{pattern}';db=folder/(label+'.db');binary='kvbench' if pattern=='ordinary' else 'prefix_kvbench' + rec=cmdrun(folder,m,label,profile,binary,kvargs(db,folder/(label+'.csv'),profile,regime,0,secs=1,create=True)+['load:random'],dict(PREFIX_PATTERN=pattern) if pattern!='ordinary' else None) + verifykv(folder/(label+'.csv'),0,1) + with db.open('rb') as f:os.fsync(f.fileno()) + rec.update(verified=True,fixture=str(db),fixture_sha256=sha(db),allocated_bytes=db.stat().st_blocks*512,apparent_bytes=db.stat().st_size) + ff[label]={k:rec[k] for k in ['fixture','fixture_sha256','allocated_bytes','apparent_bytes']};save(folder/'manifest.json',m);save(folder/'fixtures.json',ff) + m['complete']=True;save(folder/'manifest.json',m) + +def query_one(folder,m,index,profile,regime,phases,pattern='ordinary'): + f=json.loads((OUT/'fixtures/fixtures.json').read_text());owner=profile if profile in ['disk-format','branch-prefix'] else 'main' + fixture=f[f'{regime}-{owner}-{pattern}'];src=Path(fixture['fixture']);before=src.stat() + db=folder/'scratch.db';assert not db.exists() + subprocess.run(['cp','--reflink=auto','--sparse=always',str(src),str(db)],check=True) + with db.open('rb') as image:os.fsync(image.fileno()) + label=f'{index:02d}-{profile}';csvpath=folder/'results.csv';binary='kvbench' if pattern=='ordinary' else 'prefix_kvbench' + rec=cmdrun(folder,m,label,profile,binary,kvargs(db,csvpath,profile,regime,index,secs=6 if regime=='resident' else 5)+phases,dict(PREFIX_PATTERN=pattern) if pattern!='ordinary' else None) + rr=verifykv(csvpath,index,len(phases)) + rec.update(verified=True,fixture=fixture,fixture_copy_fsynced=True,db_allocated_bytes=db.stat().st_blocks*512) + assert src.stat().st_mtime_ns==before.st_mtime_ns + save(folder/'manifest.json',m);db.unlink() + +def queries(regime): + folder,m=newmode(regime) + phases=['warm','point:uniform@1','point:uniform@8','range:uniform:1@1','range:uniform:1@8','range:uniform:10000@8'] if regime=='resident' else ['warm','point:uniform@8','range:uniform:1@8','range:uniform:10000@8'] + m.update(order=ORDER,phases=phases) + for i,profile in enumerate(ORDER):query_one(folder,m,i,profile,regime,phases) + m['complete']=True;save(folder/'manifest.json',m) + +def prefix(): + for regime in ['resident','disk']: + for pattern in ['common','random']: + folder,m=newmode(f'prefix-{regime}-{pattern}') + phases=['warm','point:uniform@8','range:uniform:1@8','range:uniform:10000@8'] + if regime=='resident':phases+=['ow:uniform@8'] + for i,profile in enumerate(['main','branch-prefix','branch-prefix','main']):query_one(folder,m,i,profile,regime,phases,pattern) + m['complete']=True;save(folder/'manifest.json',m) + +def insert(): + folder,m=newmode('insert');data=[] + profiles=['disk-format','filtered-ranges','lazy-merge','async-durable-barrier','cache-invalid-addresses','directory-direct','directory-bucket','directory-bucket-simd','directory-bucket-atomic','log-disabled','log-default'] + for wal,versions in [(1,['main',*profiles,'main',*reversed(profiles),'main']),(0,['main','cache-invalid-addresses','directory-bucket-atomic','directory-bucket-atomic','cache-invalid-addresses','main'])]: + for i,version in enumerate(versions): + profile='log-group-limit' if version.startswith('log-') else version + label=f'wal{wal}-{i:02d}-{version}';stem=folder/label;db=folder/'scratch.db';assert not db.exists() + args=['--db',db,'--csv',str(stem)+'.csv','--summary',str(stem)+'.summary.csv','--records',100000000,'--seconds',5,'--report-ms',100,'--cache-mib',256,'--disk-gib',16,'--direct','--inserters',8,'--readers',0,'--memtable-bg',1,'--normal-bg',3,'--memtable-mib',8,'--key-size',16,'--value-size',16,'--min-free-gib',12,'--seed',42] + if not wal:args+=['--no-log'] + if version.startswith('log-'):args+=['--log-group-size-pages',2**64-1 if version=='log-disabled' else 0] + rec=cmdrun(folder,m,label,profile,'insert_benchmark',args,timeout=240) + summary=rows(Path(str(stem)+'.summary.csv'));assert len(summary)==1;summary=summary[0];inserted=int(summary['inserted']);assert inserted>0 + log=(folder/(label+'.log')).read_text();assert re.search(r'load_end .* error=0(?: |\n)',log) + close=re.search(r'close_s=([\d.]+) close_rc=0',log);assert close + interval=rows(Path(str(stem)+'.csv'));cpu=sum(float(r['cpu_cores'])*float(r['interval_s']) for r in interval) + data.append(dict(wal=wal,version=version,index=i,ops_s=float(summary['achieved_insert_ops_s']),inserted=inserted,close_s=float(close[1]),drain_ops_s=inserted/(float(summary['elapsed_s'])+float(close[1])),cpu_us_op=cpu*1e6/inserted,p99_us=1000*float(summary['insert_service_p99_ms']),max_ms=float(summary['insert_service_max_ms']),read_B_op=sum(float(r['read_mib_s'])*float(r['interval_s']) for r in interval)*2**20/inserted,write_B_op=sum(float(r['write_mib_s'])*float(r['interval_s']) for r in interval)*2**20/inserted)) + rec.update(verified=True,allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);csvwrite(folder/'results.csv',data);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +def hash_range(): + folder,m=newmode('hash');reference=None + for i,profile in enumerate(['main','filtered-ranges','filtered-ranges','main']): + label=f'{i}-{profile}';db=folder/'scratch.db';rec=cmdrun(folder,m,label,profile,'hash_range_benchmark',[db,16384,1000],timeout=900) + lines=(folder/(label+'.log')).read_text().splitlines();start=next(j for j,x in enumerate(lines) if x.startswith('mode,keys_per_tenant,'));rr=list(csv.DictReader(lines[start:]));assert len(rr)==4 + checks=[x['checksum'] for x in rr] + if reference is None:reference=checks + assert checks==reference + rec.update(verified=True,rows=rr,allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +def barrier(): + folder,m=newmode('barrier') + for wal in [0,1]: + for workers in [0,1]: + order=[('main','sync'),('async-durable-barrier','sync'),('async-durable-barrier','async'),('async-durable-barrier','async'),('async-durable-barrier','sync'),('main','sync')] + for i,(profile,mode) in enumerate(order): + label=f'wal{wal}-workers{workers}-{i}-{profile}-{mode}';db=folder/'scratch.db';csvpath=folder/'results.csv' + rec=cmdrun(folder,m,label,profile,'barrier_bench',[db,csvpath,label,mode,wal,workers,256,2048 if wal else 512],dict(BARRIER_DEPTH='1')) + rr=rows(csvpath);assert rr[-1]['label']==label and int(rr[-1]['verified'])==1 + rec.update(verified=True,allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +if __name__=='__main__': + def interrupted(signum,frame):raise InterruptedError(f'benchmark interrupted by signal {signum}') + for signum in [signal.SIGTERM,signal.SIGHUP]:signal.signal(signum,interrupted) + p=argparse.ArgumentParser();p.add_argument('mode',choices=['fixtures','resident','disk','prefix','insert','hash','barrier']);a=p.parse_args() + {'fixtures':fixtures,'resident':lambda:queries('resident'),'disk':lambda:queries('disk'),'prefix':prefix,'insert':insert,'hash':hash_range,'barrier':barrier}[a.mode]() diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix.py b/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix.py new file mode 100644 index 000000000..532cb8667 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/run_matrix.py @@ -0,0 +1,156 @@ +"""Fresh main integration screening. Invoke every mode under run_job.py benchmark.""" +import argparse,csv,hashlib,json,os,re,resource,signal,statistics,subprocess,time +from pathlib import Path +ROOT=Path('/home/rob/projects/splinterdb'); CAMP=ROOT/'.cache/projects-20261011' +COORD=Path(__file__).resolve().parent; OUT=CAMP/'benchmarks/main-7bb5fab' +VARIANTS=['disk-format','filtered-ranges','log-group-limit','lazy-merge','async-durable-barrier','cache-invalid-addresses','directory-direct','directory-bucket','directory-bucket-simd','directory-bucket-atomic'] +ORDER=['main',*VARIANTS,'main',*reversed(VARIANTS),'main'] +def sha(path): + h=hashlib.sha256() + with Path(path).open('rb') as f: + for b in iter(lambda:f.read(1024*1024),b''):h.update(b) + return h.hexdigest() +def save(path,value):path.write_text(json.dumps(value,indent=2)+'\n') +def rows(path): + with path.open() as f:return list(csv.DictReader(f)) +def csvwrite(path,data): + if not data:return + with path.open('w') as f: + w=csv.DictWriter(f,fieldnames=list(data[0]),lineterminator='\n');w.writeheader();w.writerows(data) +def build(name): + r=json.loads((COORD/(name+'-build.json')).read_text()) + assert sha(r['library'])==r['library_sha256'],name + for filename,expected in r['source_files_sha256'].items():assert sha(Path(r['tree'])/filename)==expected,(name,filename) + for b in r['binaries'].values(): + assert sha(b['binary'])==b['binary_sha256'],name + assert sha(b['source'])==b['source_sha256'],(name,b['source']) + return r +def cmdrun(folder,manifest,label,profile,binary,args,env=None,timeout=600): + b=build(profile);exe=b['binaries'][binary] + cmd=['taskset','-c','0-11',exe['binary'],*map(str,args)] + rec=dict(label=label,profile=profile,command=cmd,started=time.time(),binary_sha256=exe['binary_sha256'],library_sha256=b['library_sha256'],source_head=b['head'],verified=False) + print(label,flush=True) + log=folder/(label+'.log') + try: + before=resource.getrusage(resource.RUSAGE_CHILDREN) + with log.open('w') as f: + p=subprocess.Popen(cmd,env=dict(os.environ,**(env or {})),stdout=f,stderr=subprocess.STDOUT,start_new_session=True) + try:p.wait(timeout=timeout) + except BaseException: + try:os.killpg(p.pid,signal.SIGKILL) + except ProcessLookupError:pass + p.wait() + raise + after=resource.getrusage(resource.RUSAGE_CHILDREN) + rec.update(returncode=p.returncode,finished=time.time(),log_sha256=sha(log),process_cpu_s=(after.ru_utime+after.ru_stime-before.ru_utime-before.ru_stime),process_read_bytes=512*(after.ru_inblock-before.ru_inblock),process_write_bytes=512*(after.ru_oublock-before.ru_oublock)) + except BaseException as e: + rec.update(exception=str(e),finished=time.time());manifest['runs'].append(rec);save(folder/'manifest.json',manifest);raise + manifest['runs'].append(rec);save(folder/'manifest.json',manifest) + assert p.returncode==0,rec + assert 'FINDING: splinterdb_close' not in log.read_text(),rec + return rec + +def newmode(mode): + folder=OUT/mode;folder.mkdir(parents=True,exist_ok=False) + fs=subprocess.check_output(['findmnt','-n','-o','FSTYPE,SOURCE','-T',str(folder)],text=True).strip();assert fs.split()[0] not in ['tmpfs','ramfs'] and fs.split()[1].startswith('/dev/') + manifest=dict(mode=mode,storage=fs,io='O_DIRECT',cpu_affinity='0-11',scope='Updated feature branches versus fresh main; not an isolation of merge cost',runner_sha256=sha(__file__),runs=[]) + save(folder/'manifest.json',manifest);return folder,manifest + +def kvargs(db,csvpath,profile,regime,index,secs=6,prefix=False,create=False): + return ['--db',db,'--create' if create else '--open','--n',200000 if regime=='resident' else 2000000,'--cache-mib',128 if regime=='resident' else 64,'--disk-gib',8,'--log',0,'--threads',1 if create else 8,'--mt-bg',0,'--normal-bg',0,'--memtable-mib',4,'--secs',secs,'--warmup',1,'--csv',csvpath,'--vtag',profile,'--stag',regime,'--otag',index,'--rep',index,'--seed',42,'--hang-secs',60,'--hang-dir',str(csvpath.parent)] +def verifykv(csvpath,index,count): + rr=[r for r in rows(csvpath) if r['order']==str(index)] + assert len(rr)==count,(index,len(rr),count) + assert all(int(r['ops'])>0 and int(r['errors'])==0 and int(r['violations'])==0 for r in rr),rr + assert all(int(r['ops'])==int(r['n']) for r in rr if r['phase']=='warm' or r['phase'].startswith('load:')),rr + return rr + +def fixtures(): + folder,m=newmode('fixtures');ff={} + for regime in ['resident','disk']: + for profile,pattern in [('main','ordinary'),('disk-format','ordinary'),('main','common'),('branch-prefix','common'),('main','random'),('branch-prefix','random')]: + label=f'{regime}-{profile}-{pattern}';db=folder/(label+'.db');binary='kvbench' if pattern=='ordinary' else 'prefix_kvbench' + rec=cmdrun(folder,m,label,profile,binary,kvargs(db,folder/(label+'.csv'),profile,regime,0,secs=1,create=True)+['load:random'],dict(PREFIX_PATTERN=pattern) if pattern!='ordinary' else None) + verifykv(folder/(label+'.csv'),0,1) + with db.open('rb') as f:os.fsync(f.fileno()) + rec.update(verified=True,verification_kind='load API errors and operation count; query phases later validate data',errors=0,violations=0,fixture=str(db),fixture_sha256=sha(db),allocated_bytes=db.stat().st_blocks*512,apparent_bytes=db.stat().st_size) + ff[label]={k:rec[k] for k in ['fixture','fixture_sha256','allocated_bytes','apparent_bytes']};save(folder/'manifest.json',m);save(folder/'fixtures.json',ff) + m['complete']=True;save(folder/'manifest.json',m) + +def query_one(folder,m,index,profile,regime,phases,pattern='ordinary'): + f=json.loads((OUT/'fixtures/fixtures.json').read_text());owner=profile if profile in ['disk-format','branch-prefix'] else 'main' + fixture=f[f'{regime}-{owner}-{pattern}'];src=Path(fixture['fixture']);before=src.stat() + db=folder/'scratch.db';assert not db.exists() + subprocess.run(['cp','--reflink=auto','--sparse=always',str(src),str(db)],check=True) + with db.open('rb') as image:os.fsync(image.fileno()) + label=f'{index:02d}-{profile}';csvpath=folder/'results.csv';binary='kvbench' if pattern=='ordinary' else 'prefix_kvbench' + rec=cmdrun(folder,m,label,profile,binary,kvargs(db,csvpath,profile,regime,index,secs=6 if regime=='resident' else 5)+phases,dict(PREFIX_PATTERN=pattern) if pattern!='ordinary' else None) + rr=verifykv(csvpath,index,len(phases)) + rec.update(verified=True,verification_kind='query key/value/range validation and successful close',errors=sum(int(r['errors']) for r in rr),violations=sum(int(r['violations']) for r in rr),fixture=fixture,fixture_copy_fsynced=True,db_allocated_bytes=db.stat().st_blocks*512) + assert src.stat().st_mtime_ns==before.st_mtime_ns + save(folder/'manifest.json',m);db.unlink() + +def queries(regime): + folder,m=newmode(regime) + phases=['warm','point:uniform@1','point:uniform@8','range:uniform:1@1','range:uniform:1@8','range:uniform:10000@8'] if regime=='resident' else ['warm','point:uniform@8','range:uniform:1@8','range:uniform:10000@8'] + m.update(order=ORDER,phases=phases) + for i,profile in enumerate(ORDER):query_one(folder,m,i,profile,regime,phases) + m['complete']=True;save(folder/'manifest.json',m) + +def prefix(): + for regime in ['resident','disk']: + for pattern in ['common','random']: + folder,m=newmode(f'prefix-{regime}-{pattern}') + phases=['warm','point:uniform@8','range:uniform:1@8','range:uniform:10000@8'] + if regime=='resident':phases+=['ow:uniform@8'] + for i,profile in enumerate(['main','branch-prefix','branch-prefix','main']):query_one(folder,m,i,profile,regime,phases,pattern) + m['complete']=True;save(folder/'manifest.json',m) + +def insert(): + folder,m=newmode('insert');data=[] + profiles=['disk-format','filtered-ranges','lazy-merge','async-durable-barrier','cache-invalid-addresses','directory-direct','directory-bucket','directory-bucket-simd','directory-bucket-atomic','log-disabled','log-default'] + for wal,versions in [(1,['main',*profiles,'main',*reversed(profiles),'main']),(0,['main','cache-invalid-addresses','directory-bucket-atomic','directory-bucket-atomic','cache-invalid-addresses','main'])]: + for i,version in enumerate(versions): + profile='log-group-limit' if version.startswith('log-') else version + label=f'wal{wal}-{i:02d}-{version}';stem=folder/label;db=folder/'scratch.db';assert not db.exists() + args=['--db',db,'--csv',str(stem)+'.csv','--summary',str(stem)+'.summary.csv','--records',100000000,'--seconds',5,'--report-ms',100,'--cache-mib',256,'--disk-gib',16,'--direct','--inserters',8,'--readers',0,'--memtable-bg',1,'--normal-bg',3,'--memtable-mib',8,'--key-size',16,'--value-size',16,'--min-free-gib',12,'--seed',42] + if not wal:args+=['--no-log'] + if version.startswith('log-'):args+=['--log-group-size-pages',2**64-1 if version=='log-disabled' else 0] + rec=cmdrun(folder,m,label,profile,'insert_benchmark',args,timeout=240) + summary=rows(Path(str(stem)+'.summary.csv'));assert len(summary)==1;summary=summary[0];inserted=int(summary['inserted']);assert inserted>0 + log=(folder/(label+'.log')).read_text();error_match=re.search(r'load_end .* error=([0-9]+)(?: |\n)',log);assert error_match and int(error_match[1])==0 + close=re.search(r'close_s=([\d.]+) close_rc=0',log);assert close + interval=rows(Path(str(stem)+'.csv'));cpu=sum(float(r['cpu_cores'])*float(r['interval_s']) for r in interval) + data.append(dict(wal=wal,version=version,index=i,errors=int(error_match[1]),violations=0,verification_kind='API return, positive insert count, successful close; no readback',ops_s=float(summary['achieved_insert_ops_s']),inserted=inserted,close_s=float(close[1]),drain_ops_s=inserted/(float(summary['elapsed_s'])+float(close[1])),cpu_us_op=cpu*1e6/inserted,p99_us=1000*float(summary['insert_service_p99_ms']),max_ms=float(summary['insert_service_max_ms']),read_B_op=sum(float(r['read_mib_s'])*float(r['interval_s']) for r in interval)*2**20/inserted,write_B_op=sum(float(r['write_mib_s'])*float(r['interval_s']) for r in interval)*2**20/inserted)) + rec.update(verified=True,errors=int(error_match[1]),verification_kind='API return, positive insert count, successful close; no readback',allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);csvwrite(folder/'results.csv',data);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +def hash_range(): + folder,m=newmode('hash');reference=None + for i,profile in enumerate(['main','filtered-ranges','filtered-ranges','main']): + label=f'{i}-{profile}';db=folder/'scratch.db';rec=cmdrun(folder,m,label,profile,'hash_range_benchmark',[db,16384,1000],timeout=900) + lines=(folder/(label+'.log')).read_text().splitlines();start=next(j for j,x in enumerate(lines) if x.startswith('mode,keys_per_tenant,'));rr=list(csv.DictReader(lines[start:]));assert len(rr)==4 + assert [int(r['limit']) for r in rr]==[1,2,10,100] and all(int(r['queries'])==1000 and int(r['keys_per_tenant'])==16384 for r in rr),rr + checks=[x['checksum'] for x in rr] + if reference is None:reference=checks + assert checks==reference + rec.update(verified=True,rows=rr,allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +def barrier(): + folder,m=newmode('barrier') + for wal in [0,1]: + for workers in [0,1]: + order=[('main','sync'),('async-durable-barrier','sync'),('async-durable-barrier','async'),('async-durable-barrier','async'),('async-durable-barrier','sync'),('main','sync')] + for i,(profile,mode) in enumerate(order): + label=f'wal{wal}-workers{workers}-{i}-{profile}-{mode}';db=folder/'scratch.db';csvpath=folder/'results.csv' + rec=cmdrun(folder,m,label,profile,'barrier_bench',[db,csvpath,label,mode,wal,workers,256,2048 if wal else 512],dict(BARRIER_DEPTH='1')) + rr=rows(csvpath);assert rr[-1]['label']==label and int(rr[-1]['verified'])==1 + rec.update(verified=True,allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +if __name__=='__main__': + def interrupted(signum,frame):raise InterruptedError(f'benchmark interrupted by signal {signum}') + for signum in [signal.SIGTERM,signal.SIGHUP]:signal.signal(signum,interrupted) + p=argparse.ArgumentParser();p.add_argument('mode',choices=['fixtures','resident','disk','prefix','insert','hash','barrier']);a=p.parse_args() + {'fixtures':fixtures,'resident':lambda:queries('resident'),'disk':lambda:queries('disk'),'prefix':prefix,'insert':insert,'hash':hash_range,'barrier':barrier}[a.mode]() diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/status.json b/benchmarks/results-20261013/main-7bb5fab/benchmarks/status.json new file mode 100644 index 000000000..9d66f1ed6 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/status.json @@ -0,0 +1,41 @@ +{ + "project": "branch-prefix", + "scope": "new main versus updated feature; merge cost not isolated", + "workloads": [ + { + "workload": "prefix-resident-common", + "runs": 4, + "feature_runs": 2, + "verified": 4, + "complete": true, + "warmup_runs": 0 + }, + { + "workload": "prefix-disk-random", + "runs": 4, + "feature_runs": 2, + "verified": 4, + "complete": true, + "warmup_runs": 0 + }, + { + "workload": "prefix-disk-common", + "runs": 4, + "feature_runs": 2, + "verified": 4, + "complete": true, + "warmup_runs": 0 + }, + { + "workload": "prefix-resident-random", + "runs": 4, + "feature_runs": 2, + "verified": 4, + "complete": true, + "warmup_runs": 0 + } + ], + "reported_errors": 0, + "reported_violations": 0, + "all_runs_verified": true +} diff --git a/benchmarks/results-20261013/main-7bb5fab/benchmarks/summary.csv b/benchmarks/results-20261013/main-7bb5fab/benchmarks/summary.csv new file mode 100644 index 000000000..a6fc7ea07 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/benchmarks/summary.csv @@ -0,0 +1,15 @@ +workload,phase,version,samples,ops_s_mean,ops_s_min,ops_s_max,baseline_ops_s_mean,baseline_ops_s_min,baseline_ops_s_max,delta_pct,ranges_overlap,errors,violations,cpu_us_op,read_B_op,write_B_op,p99_us,scope +prefix-resident-common,point:uniform@8,branch-prefix,2,4301923.550000001,4268429.4,4335417.7,3889404.25,3798858.3,3979950.2,10.60623358963011,False,0,0,1.8592077701283292,0.0,0.0,2.432,new main versus updated feature; merge cost not isolated +prefix-resident-common,range:uniform:1@8,branch-prefix,2,1023044.95,1018943.3,1027146.6,994531.35,992358.5,996704.2,2.8670388319081086,False,0,0,7.817807922921359,0.0,0.0,10.88,new main versus updated feature; merge cost not isolated +prefix-resident-common,range:uniform:10000@8,branch-prefix,2,3552.85,3496.0,3609.7,3540.75,3472.3,3609.2,0.34173550801384067,True,0,0,2251.7961641850457,0.0,0.195,5046.272,new main versus updated feature; merge cost not isolated +prefix-resident-common,ow:uniform@8,branch-prefix,2,2504131.65,2457344.4,2550918.9,2289438.3499999996,2274316.9,2304559.8,9.377553232652037,False,0,0,2.9429833331821147,80.045,109.34,6.144,new main versus updated feature; merge cost not isolated +prefix-resident-random,point:uniform@8,branch-prefix,2,3963644.4,3913586.5,4013702.3,3975725.75,3861855.4,4089596.1,-0.3038778517356233,True,0,0,2.0179837076758558,0.0,0.0,2.592,new main versus updated feature; merge cost not isolated +prefix-resident-random,range:uniform:1@8,branch-prefix,2,1034734.85,1021601.1,1047868.6,1007812.9,987903.4,1027722.4,2.6713242110713242,True,0,0,7.730056837189105,0.0,0.0,10.624,new main versus updated feature; merge cost not isolated +prefix-resident-random,range:uniform:10000@8,branch-prefix,2,3868.05,3849.8,3886.3,4340.4,4063.2,4617.6,-10.882637544926721,False,0,0,2068.591901258825,0.0,0.18,5963.776,new main versus updated feature; merge cost not isolated +prefix-resident-random,ow:uniform@8,branch-prefix,2,2229745.5,2157932.1,2301558.9,2264066.65,2181154.0,2346979.3,-1.5159072282611374,True,0,0,3.055612856711746,140.26999999999998,186.255,5.76,new main versus updated feature; merge cost not isolated +prefix-disk-common,point:uniform@8,branch-prefix,2,147874.7,146572.1,149177.3,151969.05,137171.0,166767.1,-2.6941999045200116,True,0,0,6.108943202651296,3207.5550000000003,0.0,106.496,new main versus updated feature; merge cost not isolated +prefix-disk-common,range:uniform:1@8,branch-prefix,2,62160.25,60876.0,63444.5,62089.2,56813.9,67364.5,0.11443213956694454,True,0,0,133.95940355600158,10934.494999999999,0.0,364.544,new main versus updated feature; merge cost not isolated +prefix-disk-common,range:uniform:10000@8,branch-prefix,2,979.0,968.8,989.2,856.0,812.8,899.2,14.369158878504674,False,0,0,3343.9831434655302,1814654.445,0.0,25165.824,new main versus updated feature; merge cost not isolated +prefix-disk-random,point:uniform@8,branch-prefix,2,145755.5,136671.3,154839.7,154350.05,135623.0,173077.1,-5.568219770579919,True,0,0,6.522381717079954,3528.52,0.0,109.56800000000001,new main versus updated feature; merge cost not isolated +prefix-disk-random,range:uniform:1@8,branch-prefix,2,59590.3,56421.2,62759.4,63598.95,56431.4,70766.5,-6.303012864206082,True,0,0,140.9258584920766,14149.515,0.0,335.87199999999996,new main versus updated feature; merge cost not isolated +prefix-disk-random,range:uniform:10000@8,branch-prefix,2,827.6,812.2,843.0,863.0999999999999,813.8,912.4,-4.11308075541651,True,0,0,3825.519282893175,2526263.165,0.0,27000.832,new main versus updated feature; merge cost not isolated diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/README.md b/benchmarks/results-20261013/main-7bb5fab/tests/README.md new file mode 100644 index 000000000..76f153fab --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/README.md @@ -0,0 +1,11 @@ +# branch-prefix: correctness evidence for main integration + +Branch: `robj/branch-prefix`. Merge head when archived: `3024eec0dda2d74ae6ee96adbaffcdf465585a38`. Integrated main: `7bb5fab305b9c6179e31f75998dabea833537a08`. + +`validate.py debug` and `validate.py release` selected quick, btree, superblock, and blob cases. `debug-results.json` and `release-results.json` record commands, executable hashes, and 77 passing cases per mode. The quick suite includes prefix point lookups, iteration, reopen, and handle handoff. + +Build logs describe compilation; JSON records retain the exact executed commands and available source, binary, and log hashes. The archive includes intermediate failures as well as successful final validation; an early failed log is not a claim that the final build failed. Tests with databases used real disk storage under the workspace. `shared/run_job.py` is the coordination wrapper used to serialize timed work against builds and tests. Its syntax is `python3 run_job.py --name NAME test -- COMMAND`; build jobs use the `build` mode. + +`shared/before.json` records the original project heads and backup refs. The scripts are archived byte for byte for command provenance; they contain original workspace paths and may depend on their original directory layout. Do not run them directly from this archive without adapting paths and choosing fresh scratch locations. + +Original evidence directory: `/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix`. Only regular files with `.json`, `.log`, `.py`, `.gdb`, or `.md` extensions and at most 1 MiB each were copied. Scratch directories, databases, executables, core dumps, symlinks, bytecode, and shared benchmark outputs are excluded. Raw logs retain their original bytes. `archive-manifest.json` hashes every archived file except itself; it does not hash database files. diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/archive-manifest.json b/benchmarks/results-20261013/main-7bb5fab/tests/archive-manifest.json new file mode 100644 index 000000000..7ff8365f2 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/archive-manifest.json @@ -0,0 +1,142 @@ +{ + "project": "branch-prefix", + "branch": "robj/branch-prefix", + "merge_head": "3024eec0dda2d74ae6ee96adbaffcdf465585a38", + "integrated_main": "7bb5fab305b9c6179e31f75998dabea833537a08", + "files": [ + { + "path": "README.md", + "bytes": 1887, + "sha256": "aa07a642a35ed8960d60bc806351a5fb2b8686ce70cfcf5afd7f588a5f4d3820", + "source": "generated archive guide" + }, + { + "path": "debug-blob.log", + "bytes": 319, + "sha256": "f68e584fc108c24bbed3c01bb22bad1bfdc5a330f938c6f799badaf7736cf5de", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/debug-blob.log" + }, + { + "path": "debug-btree.log", + "bytes": 448, + "sha256": "08bdb2849c344dd919ef595814e83157a7f198551585059b6b7177ba599fdea9", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/debug-btree.log" + }, + { + "path": "debug-build.log", + "bytes": 13152, + "sha256": "ea406c8082403a4a184ea32b097f3d3fab38c73cf0a9f086f3ae810c6458d79c", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/debug-build.log" + }, + { + "path": "debug-quick.log", + "bytes": 4005, + "sha256": "ff420edb080aacfadc961e9578592062d935ddb6b301dc04e57b4578b23d5ba2", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/debug-quick.log" + }, + { + "path": "debug-results.json", + "bytes": 2389, + "sha256": "afa555a6d8381fd36d0f6af6f8543d8802132954fe59f19ed3e51d4c6f8824cf", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/debug-results.json" + }, + { + "path": "debug-superblock.log", + "bytes": 2030, + "sha256": "ce8f373e651be079421f983c55a4ecaf7390e2a244ffe465ab6fe0480db173e3", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/debug-superblock.log" + }, + { + "path": "debug-tests.log", + "bytes": 2242, + "sha256": "aefccc97d75e60b6c43b3eb03a11cd12bde0be5ab5dfe456f275b3c9a61332bc", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/debug-tests.log" + }, + { + "path": "kvbench-build.log", + "bytes": 320, + "sha256": "c2d29076000b1f194479e527ddca47ac881d4580a11c75d10dfa40d1af87b038", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/kvbench-build.log" + }, + { + "path": "release-blob.log", + "bytes": 319, + "sha256": "fc56ed8d22c0de9cd45503f5ce14efb4a3bb858428b61c2c409c9e5d0ff5c047", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-blob.log" + }, + { + "path": "release-btree.log", + "bytes": 447, + "sha256": "944240f8b9608708a3f23e609104f64e437fff5962e6f09ca62a8a086bff0456", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-btree.log" + }, + { + "path": "release-build.log", + "bytes": 13372, + "sha256": "75884dfafb11f4a0f00892c01395e1ecadb90cef0ac622373e0d157f6cddca2f", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-build.log" + }, + { + "path": "release-libs.log", + "bytes": 176, + "sha256": "9b12919c5cb6c1023469ee3dc8c24272a86e4ce9e8717b4dec5a30b2e7b3ab02", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-libs.log" + }, + { + "path": "release-quick.log", + "bytes": 4004, + "sha256": "a9c563de4a052a66cf05c01a49d33c7d91fefc9b63c3deae8d0ab1fd813f0144", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-quick.log" + }, + { + "path": "release-results.json", + "bytes": 2414, + "sha256": "4aabf17366109b53a26b805b182d956bb57fed3796d4a98414c9c015386686fc", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-results.json" + }, + { + "path": "release-superblock.log", + "bytes": 2030, + "sha256": "5536ef09f9d3b7b40871add22169cb31b12bc1080dc29f1f8b9a6ecf0732214f", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-superblock.log" + }, + { + "path": "release-tests.log", + "bytes": 2277, + "sha256": "17ec2a04103575e282e04046e88bcbd32970454d7f65abc2782dc48366cf7029", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/release-tests.log" + }, + { + "path": "shared/before.json", + "bytes": 4460, + "sha256": "133ae8f9f5fda20e884fd1d283d857d389a96cef6a74a82b7a17fa094a0cc6e5", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/before.json" + }, + { + "path": "shared/run_job.py", + "bytes": 2461, + "sha256": "908d86de805e6efd41b423c919187f2df14715104f047e10fa8a6c57129cc773", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/run_job.py" + }, + { + "path": "shared/test_root_branches.py", + "bytes": 3223, + "sha256": "36f5b93940442f3806266d12284fe4da2927b56b4f1882c957df7519696d3da7", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/test_root_branches.py" + }, + { + "path": "source-manifest.json", + "bytes": 17007, + "sha256": "563c6d5865c3d7b305e41f21da5ab4476acd6f154a366c636e50c2e983496d0a", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/source-manifest.json" + }, + { + "path": "validate.py", + "bytes": 1569, + "sha256": "590b5ab354f540780c61f2da9e198e50293b7ae2f3c02fc0f4595ec56da2930a", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/validate.py" + } + ], + "manifest_excludes_itself": true, + "archived_payload_bytes": 80551 +} diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/debug-blob.log b/benchmarks/results-20261013/main-7bb5fab/tests/debug-blob.log new file mode 100644 index 000000000..b7bd1bd0d --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/debug-blob.log @@ -0,0 +1,6 @@ +Running 1 CTests, suite name 'splinter', test case 'test_blob_'. +TEST 1/4 splinter:test_blob_checksums [OK] +TEST 2/4 splinter:test_blob_descriptor_sizes [OK] +TEST 3/4 splinter:test_blob_trees [OK] +TEST 4/4 splinter:test_blob_height_three_and_large_stats [OK] +RESULTS: 4 tests (4 ok, 0 failed, 0 skipped) ran in 1700 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/debug-btree.log b/benchmarks/results-20261013/main-7bb5fab/tests/debug-btree.log new file mode 100644 index 000000000..ee0aa37c3 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/debug-btree.log @@ -0,0 +1,10 @@ +Running 1 CTests, suite name 'btree', test case 'all'. +TEST 1/8 btree:test_compressed_suffix_copy [OK] +TEST 2/8 btree:test_leaf_hdr [OK] +TEST 3/8 btree:test_leaf_hdr_search [OK] +TEST 4/8 btree:test_index_hdr [OK] +TEST 5/8 btree:test_index_hdr_search [OK] +TEST 6/8 btree:test_leaf_split [OK] +TEST 7/8 btree:test_defragmented_leaf_bytes [OK] +TEST 8/8 btree:test_defragmented_index_bytes [OK] +RESULTS: 8 tests (8 ok, 0 failed, 0 skipped) ran in 14 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/debug-build.log b/benchmarks/results-20261013/main-7bb5fab/tests/debug-build.log new file mode 100644 index 000000000..fb2d18323 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/debug-build.log @@ -0,0 +1,117 @@ +Starting main-7bb5fab-prefix-debug-build build +Checking for mismatched config...No mismatched config found +Saving config to build-main-7bb5fab/debug/build-config.e33dfc688a9c2bf2dad4e17ef758ec3e +Compiling src/PackedArray.c [build-main-7bb5fab/debug/obj/src/PackedArray.o] +Compiling src/batch_rwlock.c [build-main-7bb5fab/debug/obj/src/batch_rwlock.o] +Compiling src/core.c [build-main-7bb5fab/debug/obj/src/core.o] +Compiling src/default_data_config.c [build-main-7bb5fab/debug/obj/src/default_data_config.o] +Compiling src/memtable.c [build-main-7bb5fab/debug/obj/src/memtable.o] +Compiling src/merge.c [build-main-7bb5fab/debug/obj/src/merge.o] +Compiling src/notification.c [build-main-7bb5fab/debug/obj/src/notification.o] +Compiling src/routing_filter.c [build-main-7bb5fab/debug/obj/src/routing_filter.o] +Compiling src/shard_log.c [build-main-7bb5fab/debug/obj/src/shard_log.o] +Compiling src/splinterdb.c [build-main-7bb5fab/debug/obj/src/splinterdb.o] +Compiling src/superblock.c [build-main-7bb5fab/debug/obj/src/superblock.o] +Compiling src/trunk.c [build-main-7bb5fab/debug/obj/src/trunk.o] +Compiling tests/functional/avlTree.c [build-main-7bb5fab/debug/obj/tests/functional/avlTree.o] +Compiling tests/functional/btree_test.c [build-main-7bb5fab/debug/obj/tests/functional/btree_test.o] +Compiling tests/functional/cache_test.c [build-main-7bb5fab/debug/obj/tests/functional/cache_test.o] +Compiling tests/functional/driver_test.c [build-main-7bb5fab/debug/obj/tests/functional/driver_test.o] +Compiling tests/functional/filter_test.c [build-main-7bb5fab/debug/obj/tests/functional/filter_test.o] +Compiling tests/functional/io_apis_test.c [build-main-7bb5fab/debug/obj/tests/functional/io_apis_test.o] +Compiling tests/functional/log_test.c [build-main-7bb5fab/debug/obj/tests/functional/log_test.o] +Compiling tests/functional/scan_benchmark.c [build-main-7bb5fab/debug/obj/tests/functional/scan_benchmark.o] +Compiling tests/functional/splinter_test.c [build-main-7bb5fab/debug/obj/tests/functional/splinter_test.o] +Compiling tests/functional/test_async.c [build-main-7bb5fab/debug/obj/tests/functional/test_async.o] +Compiling tests/functional/test_dispatcher.c [build-main-7bb5fab/debug/obj/tests/functional/test_dispatcher.o] +Compiling tests/functional/test_functionality.c [build-main-7bb5fab/debug/obj/tests/functional/test_functionality.o] +Compiling tests/functional/test_splinter_shadow.c [build-main-7bb5fab/debug/obj/tests/functional/test_splinter_shadow.o] +Compiling tests/functional/ycsb_test.c [build-main-7bb5fab/debug/obj/tests/functional/ycsb_test.o] +Compiling tests/config.c [build-main-7bb5fab/debug/obj/tests/config.o] +Compiling tests/test_common.c [build-main-7bb5fab/debug/obj/tests/test_common.o] +Compiling tests/test_data.c [build-main-7bb5fab/debug/obj/tests/test_data.o] +Compiling src/allocator.c [build-main-7bb5fab/debug/obj/src/allocator.o] +Compiling src/blob.c [build-main-7bb5fab/debug/obj/src/blob.o] +Compiling src/blob_build.c [build-main-7bb5fab/debug/obj/src/blob_build.o] +Compiling src/btree.c [build-main-7bb5fab/debug/obj/src/btree.o] +Compiling src/clockcache.c [build-main-7bb5fab/debug/obj/src/clockcache.o] +Compiling src/data_blob_build.c [build-main-7bb5fab/debug/obj/src/data_blob_build.o] +Compiling src/data_internal.c [build-main-7bb5fab/debug/obj/src/data_internal.o] +Compiling src/histogram.c [build-main-7bb5fab/debug/obj/src/histogram.o] +Compiling src/mini_allocator.c [build-main-7bb5fab/debug/obj/src/mini_allocator.o] +Compiling src/ondisk_ref.c [build-main-7bb5fab/debug/obj/src/ondisk_ref.o] +Compiling src/platform_linux/laio.c [build-main-7bb5fab/debug/obj/src/platform_linux/laio.o] +Compiling src/platform_linux/platform_assert.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_assert.o] +Compiling src/platform_linux/platform_buffer.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_buffer.o] +Compiling src/platform_linux/platform_condvar.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_condvar.o] +Compiling src/platform_linux/platform_heap.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_heap.o] +Compiling src/platform_linux/platform_io.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_io.o] +Compiling src/platform_linux/platform_log.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_log.o] +Compiling src/platform_linux/platform_mutex.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_mutex.o] +Compiling src/platform_linux/platform_threads.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_threads.o] +Compiling src/platform_linux/platform_trace.c [build-main-7bb5fab/debug/obj/src/platform_linux/platform_trace.o] +Compiling src/platform_linux/shmalloc.c [build-main-7bb5fab/debug/obj/src/platform_linux/shmalloc.o] +Compiling src/rc_allocator.c [build-main-7bb5fab/debug/obj/src/rc_allocator.o] +Compiling src/task.c [build-main-7bb5fab/debug/obj/src/task.o] +Compiling src/util.c [build-main-7bb5fab/debug/obj/src/util.o] +Compiling src/writeback_set.c [build-main-7bb5fab/debug/obj/src/writeback_set.o] +Compiling tests/unit/btree_stress_test.c [build-main-7bb5fab/debug/obj/tests/unit/btree_stress_test.o] +Compiling tests/unit/btree_test.c [build-main-7bb5fab/debug/obj/tests/unit/btree_test.o] +Compiling tests/unit/btree_test_common.c [build-main-7bb5fab/debug/obj/tests/unit/btree_test_common.o] +Compiling tests/unit/limitations_test.c [build-main-7bb5fab/debug/obj/tests/unit/limitations_test.o] +Compiling tests/unit/main.c [build-main-7bb5fab/debug/obj/tests/unit/main.o] +Compiling tests/unit/merge_test.c [build-main-7bb5fab/debug/obj/tests/unit/merge_test.o] +Compiling tests/unit/misc_test.c [build-main-7bb5fab/debug/obj/tests/unit/misc_test.o] +Compiling tests/unit/platform_apis_test.c [build-main-7bb5fab/debug/obj/tests/unit/platform_apis_test.o] +Compiling tests/unit/platform_threads_test.c [build-main-7bb5fab/debug/obj/tests/unit/platform_threads_test.o] +Compiling tests/unit/splinterdb_heap_id_mgmt_test.c [build-main-7bb5fab/debug/obj/tests/unit/splinterdb_heap_id_mgmt_test.o] +Compiling tests/unit/splinterdb_optimize_test.c [build-main-7bb5fab/debug/obj/tests/unit/splinterdb_optimize_test.o] +Compiling tests/unit/splinterdb_quick_test.c [build-main-7bb5fab/debug/obj/tests/unit/splinterdb_quick_test.o] +Compiling tests/unit/splinterdb_stress_test.c [build-main-7bb5fab/debug/obj/tests/unit/splinterdb_stress_test.o] +Compiling tests/unit/superblock_test.c [build-main-7bb5fab/debug/obj/tests/unit/superblock_test.o] +Compiling tests/unit/task_system_test.c [build-main-7bb5fab/debug/obj/tests/unit/task_system_test.o] +Compiling tests/unit/trunk_async_test.c [build-main-7bb5fab/debug/obj/tests/unit/trunk_async_test.o] +Compiling tests/unit/trunk_gc_test.c [build-main-7bb5fab/debug/obj/tests/unit/trunk_gc_test.o] +Compiling tests/unit/trunk_split_test.c [build-main-7bb5fab/debug/obj/tests/unit/trunk_split_test.o] +Compiling tests/unit/unit_tests_common.c [build-main-7bb5fab/debug/obj/tests/unit/unit_tests_common.o] +Compiling tests/unit/util_test.c [build-main-7bb5fab/debug/obj/tests/unit/util_test.o] +Compiling tests/unit/vector_test.c [build-main-7bb5fab/debug/obj/tests/unit/vector_test.o] +Compiling tests/unit/writable_buffer_test.c [build-main-7bb5fab/debug/obj/tests/unit/writable_buffer_test.o] +Compiling tests/unit/writeback_set_test.c [build-main-7bb5fab/debug/obj/tests/unit/writeback_set_test.o] +Linking build-main-7bb5fab/debug/bin/unit/btree_stress_test +Linking build-main-7bb5fab/debug/bin/unit/btree_test +Compiling tests/unit/config_parse_test.c [build-main-7bb5fab/debug/obj/tests/unit/config_parse_test.o] +Compiling tests/unit/large_inserts_stress_test.c [build-main-7bb5fab/debug/obj/tests/unit/large_inserts_stress_test.o] +Linking build-main-7bb5fab/debug/bin/unit/misc_test +Linking build-main-7bb5fab/debug/bin/unit/platform_apis_test +Linking build-main-7bb5fab/debug/bin/unit/platform_threads_test +Compiling tests/unit/splinter_test.c [build-main-7bb5fab/debug/obj/tests/unit/splinter_test.o] +Compiling tests/unit/splinterdb_forked_child_test.c [build-main-7bb5fab/debug/obj/tests/unit/splinterdb_forked_child_test.o] +Linking build-main-7bb5fab/debug/bin/unit/util_test +Linking build-main-7bb5fab/debug/bin/unit/vector_test +Linking build-main-7bb5fab/debug/bin/unit/writeback_set_test +In file included from src/PackedArray.c:296, + from src/PackedArray.c:356: +src/PackedArray.c: In function ‘__PackedArray_unpack_21’: +src/PackedArray.c:177: note: ‘-Wmisleading-indentation’ is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers + 177 | PACKEDARRAY_IMPL_UNPACK_CASE_BREAK +src/PackedArray.c:177: note: adding ‘-flarge-source-files’ will allow for more column-tracking support, at the expense of compilation time and memory +Linking build-main-7bb5fab/debug/lib/libsplinterdb.so +Linking build-main-7bb5fab/debug/bin/driver_test +Linking build-main-7bb5fab/debug/bin/unit_test +Linking build-main-7bb5fab/debug/bin/unit/config_parse_test +Linking build-main-7bb5fab/debug/bin/unit/large_inserts_stress_test +Linking build-main-7bb5fab/debug/bin/unit/limitations_test +Linking build-main-7bb5fab/debug/bin/unit/merge_test +Linking build-main-7bb5fab/debug/bin/unit/splinter_test +Linking build-main-7bb5fab/debug/bin/unit/splinterdb_forked_child_test +Linking build-main-7bb5fab/debug/bin/unit/splinterdb_heap_id_mgmt_test +Linking build-main-7bb5fab/debug/bin/unit/splinterdb_optimize_test +Linking build-main-7bb5fab/debug/bin/unit/splinterdb_quick_test +Linking build-main-7bb5fab/debug/bin/unit/splinterdb_stress_test +Linking build-main-7bb5fab/debug/bin/unit/superblock_test +Linking build-main-7bb5fab/debug/bin/unit/task_system_test +Linking build-main-7bb5fab/debug/bin/unit/trunk_async_test +Linking build-main-7bb5fab/debug/bin/unit/trunk_gc_test +Linking build-main-7bb5fab/debug/bin/unit/trunk_split_test +Linking build-main-7bb5fab/debug/bin/unit/writable_buffer_test diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/debug-quick.log b/benchmarks/results-20261013/main-7bb5fab/tests/debug-quick.log new file mode 100644 index 000000000..2cc23e68c --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/debug-quick.log @@ -0,0 +1,56 @@ +Running 1 CTests, suite name 'splinterdb_quick', test case 'all'. +TEST 1/50 splinterdb_quick:test_get_config_returns_effective_config [OK] +TEST 2/50 splinterdb_quick:test_get_cost_stats [OK] +TEST 3/50 splinterdb_quick:test_checkpoint_log_grace_default [OK] +TEST 4/50 splinterdb_quick:test_durable_barrier [OK] +TEST 5/50 splinterdb_quick:test_logged_large_value_replaces_old_value [OK] +TEST 6/50 splinterdb_quick:test_basic_flow [OK] +TEST 7/50 splinterdb_quick:test_pthread_auto_registration [OK] +TEST 8/50 splinterdb_quick:test_result_auto_registration_with_stats [OK] +TEST 9/50 splinterdb_quick:test_stats_reset_clears_cache_io [OK] +TEST 10/50 splinterdb_quick:test_final_merge_error_propagation [OK] +TEST 11/50 splinterdb_quick:test_fetch_and_update_catches_up_after_rotation [OK] +TEST 12/50 splinterdb_quick:test_fetch_and_update_rejects_incorporated_boundary [OK] +TEST 13/50 splinterdb_quick:test_range_init_error_cleanup_preserves_branches setup_ordered_iterators: exception: Cannot allocate memory +core_apply_to_range: range iterator init failed: Cannot allocate memory +[OK] +TEST 14/50 splinterdb_quick:stats_reset_excludes_active_operations [OK] +TEST 15/50 splinterdb_quick:test_apis_for_large_key [OK] +TEST 16/50 splinterdb_quick:test_key_size_gt_max_inline_key_size [OK] +TEST 17/50 splinterdb_quick:test_value_size_gt_max_value_size [OK] +TEST 18/50 splinterdb_quick:test_large_lookup_survives_memtable_recycle [OK] +TEST 19/50 splinterdb_quick:test_iterator_survives_memtable_recycle [OK] +TEST 20/50 splinterdb_quick:test_variable_length_values [OK] +TEST 21/50 splinterdb_quick:test_branch_prefix_roundtrip [OK] +TEST 22/50 splinterdb_quick:test_basic_iterator [OK] +TEST 23/50 splinterdb_quick:test_iterator_delete_current [OK] +TEST 24/50 splinterdb_quick:test_empty_iterator [OK] +TEST 25/50 splinterdb_quick:test_bounded_iterator [OK] +TEST 26/50 splinterdb_quick:test_bounded_iterator_start_normalization [OK] +TEST 27/50 splinterdb_quick:test_splinterdb_iterator_with_startkey [OK] +TEST 28/50 splinterdb_quick:test_splinterdb_iterator_with_non_existent_startkey [OK] +TEST 29/50 splinterdb_quick:test_splinterdb_iterator_with_missing_startkey_in_sequence [OK] +TEST 30/50 splinterdb_quick:test_iterator_prev_and_next [OK] +TEST 31/50 splinterdb_quick:test_iterator_reversal_on_key_in_two_branches [OK] +TEST 32/50 splinterdb_quick:test_iterator_reversal_with_three_branches [OK] +TEST 33/50 splinterdb_quick:test_rewriting_keys_does_not_grow_trunk [OK] +TEST 34/50 splinterdb_quick:test_close_and_reopen [OK] +TEST 35/50 splinterdb_quick:test_logged_close_and_reopen [OK] +TEST 36/50 splinterdb_quick:test_repeated_insert_close_reopen [OK] +TEST 37/50 splinterdb_quick:test_custom_data_config [OK] +TEST 38/50 splinterdb_quick:test_existence_only_memtable_lookup [OK] +TEST 39/50 splinterdb_quick:test_existence_only_trunk_lookup_skips_branches [OK] +TEST 40/50 splinterdb_quick:test_write_api_returns_old_value [OK] +TEST 41/50 splinterdb_quick:test_write_api_old_result_existence_only [OK] +TEST 42/50 splinterdb_quick:test_write_api_old_result_custom_merge_semantics [OK] +TEST 43/50 splinterdb_quick:test_write_api_old_result_merges_memtable_and_trunk [OK] +TEST 44/50 splinterdb_quick:test_write_api_old_result_respects_trunk_delete_shadow [OK] +TEST 45/50 splinterdb_quick:test_iterator_custom_comparator [OK] +TEST 46/50 splinterdb_quick:test_iterator_init_bug [OK] +TEST 47/50 splinterdb_quick:test_splinterdb_create_w_background_threads [OK] +TEST 48/50 splinterdb_quick:test_splinterdb_create_w_all_background_threads [OK] +TEST 49/50 splinterdb_quick:test_iterator_thread_handoff [OK] +TEST 50/50 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery [OK] +RESULTS: 50 tests (50 ok, 0 failed, 0 skipped) ran in 10928 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/debug-results.json b/benchmarks/results-20261013/main-7bb5fab/tests/debug-results.json new file mode 100644 index 000000000..260064f0e --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/debug-results.json @@ -0,0 +1,67 @@ +[ + { + "name": "quick", + "mode": "debug", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-quick", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/splinterdb_quick_test" + ], + "binary_sha256": "3c79ee1f4cf46d3c700d2297da80e104c4bd2661dba71ba2fbe8e611f0a453c7", + "started": 1791904503.6462114, + "returncode": 0, + "finished": 1791904514.5982203, + "tests": 50, + "passed": 50, + "failed": 0, + "skipped": 0 + }, + { + "name": "btree", + "mode": "debug", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-btree", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/btree_test" + ], + "binary_sha256": "a98f52dfee0b9880d335c19e8a435cfb5616c0bf0509b3f2ca29b31f1633d82d", + "started": 1791904514.5994582, + "returncode": 0, + "finished": 1791904514.6155782, + "tests": 8, + "passed": 8, + "failed": 0, + "skipped": 0 + }, + { + "name": "superblock", + "mode": "debug", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-superblock", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/superblock_test" + ], + "binary_sha256": "64858eeb6fd56af808628b6ac8a35ac5582938b006e294a05cb9e04f752a4ebd", + "started": 1791904514.6161194, + "returncode": 0, + "finished": 1791904514.6808631, + "tests": 15, + "passed": 15, + "failed": 0, + "skipped": 0 + }, + { + "name": "blob", + "mode": "debug", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-blob", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/splinter_test", + "test_blob_" + ], + "binary_sha256": "67d1c6444f127b5e03a8fc568af7f8b1a57ed729f654b1213159b9ef19bcc440", + "started": 1791904514.6815746, + "returncode": 0, + "finished": 1791904516.400889, + "tests": 4, + "passed": 4, + "failed": 0, + "skipped": 0 + } +] diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/debug-superblock.log b/benchmarks/results-20261013/main-7bb5fab/tests/debug-superblock.log new file mode 100644 index 000000000..1d75a999d --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/debug-superblock.log @@ -0,0 +1,34 @@ +Running 1 CTests, suite name 'superblock', test case 'all'. +TEST 1/15 superblock:test_format_sets_fresh_state [OK] +TEST 2/15 superblock:test_rejects_other_experiment_formats superblock_mount: no valid superblock found +superblock_read_bootstrap: no valid superblock found +superblock_mount: no valid superblock found +superblock_read_bootstrap: no valid superblock found +superblock_mount: no valid superblock found +superblock_read_bootstrap: no valid superblock found +[OK] +TEST 3/15 superblock:test_snapshot_persists_state [OK] +TEST 4/15 superblock:test_two_log_checkpoint_transitions [OK] +TEST 5/15 superblock:test_snapshot_preserves_unincorporated_sealed_log [OK] +TEST 6/15 superblock:test_two_log_checkpoint_torn_begin [OK] +TEST 7/15 superblock:test_torn_write_falls_back_to_older_generation [OK] +TEST 8/15 superblock:test_generation_wrap_selects_newest_slot [OK] +TEST 9/15 superblock:test_both_slots_corrupt_is_not_found superblock_mount: no valid superblock found +[OK] +TEST 10/15 superblock:test_mount_rejects_invalid_metadata superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +[OK] +TEST 11/15 superblock:test_slot_read_error_falls_back_to_peer [OK] +TEST 12/15 superblock:test_both_slot_read_errors_are_reported superblock_mount: no readable valid superblock found: Input/output error +[OK] +TEST 13/15 superblock:test_read_geometry superblock_read_bootstrap: no valid superblock found +[OK] +TEST 14/15 superblock:test_read_bootstrap_allocation_state superblock_read_bootstrap: no valid superblock found +[OK] +TEST 15/15 superblock:test_bootstrap_geometry_metadata_budget Device geometry needs 134217728 bytes of cache lookup metadata, which exceeds the configured cache budget of 67108864 bytes. +Failed to open existing SplinterDB device 'db' with specified configuration: No space left on device +[OK] +RESULTS: 15 tests (15 ok, 0 failed, 0 skipped) ran in 31 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/debug-tests.log b/benchmarks/results-20261013/main-7bb5fab/tests/debug-tests.log new file mode 100644 index 000000000..ff8cc6030 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/debug-tests.log @@ -0,0 +1,9 @@ +Starting main-7bb5fab-prefix-debug-tests test +Running debug quick +{'name': 'quick', 'mode': 'debug', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-quick', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/splinterdb_quick_test'], 'binary_sha256': '3c79ee1f4cf46d3c700d2297da80e104c4bd2661dba71ba2fbe8e611f0a453c7', 'started': 1791904503.6462114, 'returncode': 0, 'finished': 1791904514.5982203, 'tests': 50, 'passed': 50, 'failed': 0, 'skipped': 0} +Running debug btree +{'name': 'btree', 'mode': 'debug', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-btree', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/btree_test'], 'binary_sha256': 'a98f52dfee0b9880d335c19e8a435cfb5616c0bf0509b3f2ca29b31f1633d82d', 'started': 1791904514.5994582, 'returncode': 0, 'finished': 1791904514.6155782, 'tests': 8, 'passed': 8, 'failed': 0, 'skipped': 0} +Running debug superblock +{'name': 'superblock', 'mode': 'debug', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-superblock', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/superblock_test'], 'binary_sha256': '64858eeb6fd56af808628b6ac8a35ac5582938b006e294a05cb9e04f752a4ebd', 'started': 1791904514.6161194, 'returncode': 0, 'finished': 1791904514.6808631, 'tests': 15, 'passed': 15, 'failed': 0, 'skipped': 0} +Running debug blob +{'name': 'blob', 'mode': 'debug', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-debug-blob', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/debug/bin/unit/splinter_test', 'test_blob_'], 'binary_sha256': '67d1c6444f127b5e03a8fc568af7f8b1a57ed729f654b1213159b9ef19bcc440', 'started': 1791904514.6815746, 'returncode': 0, 'finished': 1791904516.400889, 'tests': 4, 'passed': 4, 'failed': 0, 'skipped': 0} diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/kvbench-build.log b/benchmarks/results-20261013/main-7bb5fab/tests/kvbench-build.log new file mode 100644 index 000000000..b11871631 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/kvbench-build.log @@ -0,0 +1,4 @@ +Starting main-7bb5fab-prefix-kvbench-build build +lto-wrapper: warning: using serial compilation of 14 LTRANS jobs +lto-wrapper: note: see the ‘-flto’ option documentation for more information +/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/prefix_kvbench diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-blob.log b/benchmarks/results-20261013/main-7bb5fab/tests/release-blob.log new file mode 100644 index 000000000..42a891f8c --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-blob.log @@ -0,0 +1,6 @@ +Running 1 CTests, suite name 'splinter', test case 'test_blob_'. +TEST 1/4 splinter:test_blob_descriptor_sizes [OK] +TEST 2/4 splinter:test_blob_trees [OK] +TEST 3/4 splinter:test_blob_height_three_and_large_stats [OK] +TEST 4/4 splinter:test_blob_checksums [OK] +RESULTS: 4 tests (4 ok, 0 failed, 0 skipped) ran in 1232 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-btree.log b/benchmarks/results-20261013/main-7bb5fab/tests/release-btree.log new file mode 100644 index 000000000..bc047b296 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-btree.log @@ -0,0 +1,10 @@ +Running 1 CTests, suite name 'btree', test case 'all'. +TEST 1/8 btree:test_leaf_hdr [OK] +TEST 2/8 btree:test_leaf_hdr_search [OK] +TEST 3/8 btree:test_index_hdr [OK] +TEST 4/8 btree:test_index_hdr_search [OK] +TEST 5/8 btree:test_leaf_split [OK] +TEST 6/8 btree:test_defragmented_leaf_bytes [OK] +TEST 7/8 btree:test_defragmented_index_bytes [OK] +TEST 8/8 btree:test_compressed_suffix_copy [OK] +RESULTS: 8 tests (8 ok, 0 failed, 0 skipped) ran in 2 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-build.log b/benchmarks/results-20261013/main-7bb5fab/tests/release-build.log new file mode 100644 index 000000000..5a5d8e442 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-build.log @@ -0,0 +1,117 @@ +Starting main-7bb5fab-prefix-release-build build +Checking for mismatched config...No mismatched config found +Saving config to build-main-7bb5fab/release/build-config.fb6bc8eeb8390429253883c09491f5bd +Compiling src/PackedArray.c [build-main-7bb5fab/release/obj/src/PackedArray.o] +Compiling src/batch_rwlock.c [build-main-7bb5fab/release/obj/src/batch_rwlock.o] +Compiling src/core.c [build-main-7bb5fab/release/obj/src/core.o] +Compiling src/default_data_config.c [build-main-7bb5fab/release/obj/src/default_data_config.o] +Compiling src/memtable.c [build-main-7bb5fab/release/obj/src/memtable.o] +Compiling src/merge.c [build-main-7bb5fab/release/obj/src/merge.o] +Compiling src/notification.c [build-main-7bb5fab/release/obj/src/notification.o] +Compiling src/routing_filter.c [build-main-7bb5fab/release/obj/src/routing_filter.o] +Compiling src/shard_log.c [build-main-7bb5fab/release/obj/src/shard_log.o] +Compiling src/splinterdb.c [build-main-7bb5fab/release/obj/src/splinterdb.o] +Compiling src/superblock.c [build-main-7bb5fab/release/obj/src/superblock.o] +Compiling src/trunk.c [build-main-7bb5fab/release/obj/src/trunk.o] +Compiling tests/functional/avlTree.c [build-main-7bb5fab/release/obj/tests/functional/avlTree.o] +Compiling tests/functional/btree_test.c [build-main-7bb5fab/release/obj/tests/functional/btree_test.o] +Compiling tests/functional/cache_test.c [build-main-7bb5fab/release/obj/tests/functional/cache_test.o] +Compiling tests/functional/driver_test.c [build-main-7bb5fab/release/obj/tests/functional/driver_test.o] +Compiling tests/functional/filter_test.c [build-main-7bb5fab/release/obj/tests/functional/filter_test.o] +Compiling tests/functional/io_apis_test.c [build-main-7bb5fab/release/obj/tests/functional/io_apis_test.o] +Compiling tests/functional/log_test.c [build-main-7bb5fab/release/obj/tests/functional/log_test.o] +Compiling tests/functional/scan_benchmark.c [build-main-7bb5fab/release/obj/tests/functional/scan_benchmark.o] +Compiling tests/functional/splinter_test.c [build-main-7bb5fab/release/obj/tests/functional/splinter_test.o] +Compiling tests/functional/test_async.c [build-main-7bb5fab/release/obj/tests/functional/test_async.o] +Compiling tests/functional/test_dispatcher.c [build-main-7bb5fab/release/obj/tests/functional/test_dispatcher.o] +Compiling tests/functional/test_functionality.c [build-main-7bb5fab/release/obj/tests/functional/test_functionality.o] +Compiling tests/functional/test_splinter_shadow.c [build-main-7bb5fab/release/obj/tests/functional/test_splinter_shadow.o] +Compiling tests/functional/ycsb_test.c [build-main-7bb5fab/release/obj/tests/functional/ycsb_test.o] +Compiling tests/config.c [build-main-7bb5fab/release/obj/tests/config.o] +Compiling tests/test_common.c [build-main-7bb5fab/release/obj/tests/test_common.o] +Compiling tests/test_data.c [build-main-7bb5fab/release/obj/tests/test_data.o] +Compiling src/allocator.c [build-main-7bb5fab/release/obj/src/allocator.o] +Compiling src/blob.c [build-main-7bb5fab/release/obj/src/blob.o] +Compiling src/blob_build.c [build-main-7bb5fab/release/obj/src/blob_build.o] +Compiling src/btree.c [build-main-7bb5fab/release/obj/src/btree.o] +Compiling src/clockcache.c [build-main-7bb5fab/release/obj/src/clockcache.o] +Compiling src/data_blob_build.c [build-main-7bb5fab/release/obj/src/data_blob_build.o] +Compiling src/data_internal.c [build-main-7bb5fab/release/obj/src/data_internal.o] +Compiling src/histogram.c [build-main-7bb5fab/release/obj/src/histogram.o] +Compiling src/mini_allocator.c [build-main-7bb5fab/release/obj/src/mini_allocator.o] +Compiling src/ondisk_ref.c [build-main-7bb5fab/release/obj/src/ondisk_ref.o] +Compiling src/platform_linux/laio.c [build-main-7bb5fab/release/obj/src/platform_linux/laio.o] +Compiling src/platform_linux/platform_assert.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_assert.o] +Compiling src/platform_linux/platform_buffer.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_buffer.o] +Compiling src/platform_linux/platform_condvar.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_condvar.o] +Compiling src/platform_linux/platform_heap.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_heap.o] +Compiling src/platform_linux/platform_io.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_io.o] +Compiling src/platform_linux/platform_log.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_log.o] +Compiling src/platform_linux/platform_mutex.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_mutex.o] +Compiling src/platform_linux/platform_threads.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_threads.o] +Compiling src/platform_linux/platform_trace.c [build-main-7bb5fab/release/obj/src/platform_linux/platform_trace.o] +Compiling src/platform_linux/shmalloc.c [build-main-7bb5fab/release/obj/src/platform_linux/shmalloc.o] +Compiling src/rc_allocator.c [build-main-7bb5fab/release/obj/src/rc_allocator.o] +Compiling src/task.c [build-main-7bb5fab/release/obj/src/task.o] +Compiling src/util.c [build-main-7bb5fab/release/obj/src/util.o] +Compiling src/writeback_set.c [build-main-7bb5fab/release/obj/src/writeback_set.o] +Compiling tests/unit/btree_stress_test.c [build-main-7bb5fab/release/obj/tests/unit/btree_stress_test.o] +Compiling tests/unit/btree_test.c [build-main-7bb5fab/release/obj/tests/unit/btree_test.o] +Compiling tests/unit/btree_test_common.c [build-main-7bb5fab/release/obj/tests/unit/btree_test_common.o] +Compiling tests/unit/limitations_test.c [build-main-7bb5fab/release/obj/tests/unit/limitations_test.o] +Compiling tests/unit/main.c [build-main-7bb5fab/release/obj/tests/unit/main.o] +Compiling tests/unit/merge_test.c [build-main-7bb5fab/release/obj/tests/unit/merge_test.o] +Compiling tests/unit/misc_test.c [build-main-7bb5fab/release/obj/tests/unit/misc_test.o] +Compiling tests/unit/platform_apis_test.c [build-main-7bb5fab/release/obj/tests/unit/platform_apis_test.o] +Compiling tests/unit/platform_threads_test.c [build-main-7bb5fab/release/obj/tests/unit/platform_threads_test.o] +Compiling tests/unit/splinterdb_heap_id_mgmt_test.c [build-main-7bb5fab/release/obj/tests/unit/splinterdb_heap_id_mgmt_test.o] +Compiling tests/unit/splinterdb_optimize_test.c [build-main-7bb5fab/release/obj/tests/unit/splinterdb_optimize_test.o] +Compiling tests/unit/splinterdb_quick_test.c [build-main-7bb5fab/release/obj/tests/unit/splinterdb_quick_test.o] +Compiling tests/unit/splinterdb_stress_test.c [build-main-7bb5fab/release/obj/tests/unit/splinterdb_stress_test.o] +Compiling tests/unit/superblock_test.c [build-main-7bb5fab/release/obj/tests/unit/superblock_test.o] +Compiling tests/unit/task_system_test.c [build-main-7bb5fab/release/obj/tests/unit/task_system_test.o] +Compiling tests/unit/trunk_async_test.c [build-main-7bb5fab/release/obj/tests/unit/trunk_async_test.o] +Compiling tests/unit/trunk_gc_test.c [build-main-7bb5fab/release/obj/tests/unit/trunk_gc_test.o] +Compiling tests/unit/trunk_split_test.c [build-main-7bb5fab/release/obj/tests/unit/trunk_split_test.o] +Compiling tests/unit/unit_tests_common.c [build-main-7bb5fab/release/obj/tests/unit/unit_tests_common.o] +Compiling tests/unit/util_test.c [build-main-7bb5fab/release/obj/tests/unit/util_test.o] +Compiling tests/unit/vector_test.c [build-main-7bb5fab/release/obj/tests/unit/vector_test.o] +Compiling tests/unit/writable_buffer_test.c [build-main-7bb5fab/release/obj/tests/unit/writable_buffer_test.o] +Compiling tests/unit/writeback_set_test.c [build-main-7bb5fab/release/obj/tests/unit/writeback_set_test.o] +Compiling tests/unit/config_parse_test.c [build-main-7bb5fab/release/obj/tests/unit/config_parse_test.o] +Compiling tests/unit/large_inserts_stress_test.c [build-main-7bb5fab/release/obj/tests/unit/large_inserts_stress_test.o] +Linking build-main-7bb5fab/release/bin/unit/misc_test +Linking build-main-7bb5fab/release/bin/unit/platform_apis_test +Linking build-main-7bb5fab/release/bin/unit/platform_threads_test +Compiling tests/unit/splinter_test.c [build-main-7bb5fab/release/obj/tests/unit/splinter_test.o] +Compiling tests/unit/splinterdb_forked_child_test.c [build-main-7bb5fab/release/obj/tests/unit/splinterdb_forked_child_test.o] +Linking build-main-7bb5fab/release/bin/unit/util_test +Linking build-main-7bb5fab/release/bin/unit/vector_test +Linking build-main-7bb5fab/release/bin/unit/writeback_set_test +In file included from src/PackedArray.c:296, + from src/PackedArray.c:356: +src/PackedArray.c: In function ‘__PackedArray_unpack_21’: +src/PackedArray.c:177: note: ‘-Wmisleading-indentation’ is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers + 177 | PACKEDARRAY_IMPL_UNPACK_CASE_BREAK +src/PackedArray.c:177: note: adding ‘-flarge-source-files’ will allow for more column-tracking support, at the expense of compilation time and memory +Linking build-main-7bb5fab/release/bin/unit/btree_stress_test +Linking build-main-7bb5fab/release/bin/unit/btree_test +Linking build-main-7bb5fab/release/lib/libsplinterdb.so +Linking build-main-7bb5fab/release/bin/driver_test +Linking build-main-7bb5fab/release/bin/unit_test +Linking build-main-7bb5fab/release/bin/unit/config_parse_test +Linking build-main-7bb5fab/release/bin/unit/large_inserts_stress_test +Linking build-main-7bb5fab/release/bin/unit/limitations_test +Linking build-main-7bb5fab/release/bin/unit/merge_test +Linking build-main-7bb5fab/release/bin/unit/splinter_test +Linking build-main-7bb5fab/release/bin/unit/splinterdb_forked_child_test +Linking build-main-7bb5fab/release/bin/unit/splinterdb_heap_id_mgmt_test +Linking build-main-7bb5fab/release/bin/unit/splinterdb_optimize_test +Linking build-main-7bb5fab/release/bin/unit/splinterdb_quick_test +Linking build-main-7bb5fab/release/bin/unit/splinterdb_stress_test +Linking build-main-7bb5fab/release/bin/unit/superblock_test +Linking build-main-7bb5fab/release/bin/unit/task_system_test +Linking build-main-7bb5fab/release/bin/unit/trunk_async_test +Linking build-main-7bb5fab/release/bin/unit/trunk_gc_test +Linking build-main-7bb5fab/release/bin/unit/trunk_split_test +Linking build-main-7bb5fab/release/bin/unit/writable_buffer_test diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-libs.log b/benchmarks/results-20261013/main-7bb5fab/tests/release-libs.log new file mode 100644 index 000000000..d97c5bced --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-libs.log @@ -0,0 +1,3 @@ +Starting main-7bb5fab-prefix-release-libs build +Checking for mismatched config...No mismatched config found +Building archive build-main-7bb5fab/release/lib/libsplinterdb.a diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-quick.log b/benchmarks/results-20261013/main-7bb5fab/tests/release-quick.log new file mode 100644 index 000000000..8b1bf8f0f --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-quick.log @@ -0,0 +1,56 @@ +Running 1 CTests, suite name 'splinterdb_quick', test case 'all'. +TEST 1/50 splinterdb_quick:test_get_cost_stats [OK] +TEST 2/50 splinterdb_quick:test_checkpoint_log_grace_default [OK] +TEST 3/50 splinterdb_quick:test_durable_barrier [OK] +TEST 4/50 splinterdb_quick:test_logged_large_value_replaces_old_value [OK] +TEST 5/50 splinterdb_quick:test_basic_flow [OK] +TEST 6/50 splinterdb_quick:test_pthread_auto_registration [OK] +TEST 7/50 splinterdb_quick:test_result_auto_registration_with_stats [OK] +TEST 8/50 splinterdb_quick:test_stats_reset_clears_cache_io [OK] +TEST 9/50 splinterdb_quick:test_final_merge_error_propagation [OK] +TEST 10/50 splinterdb_quick:test_fetch_and_update_catches_up_after_rotation [OK] +TEST 11/50 splinterdb_quick:test_fetch_and_update_rejects_incorporated_boundary [OK] +TEST 12/50 splinterdb_quick:test_range_init_error_cleanup_preserves_branches setup_ordered_iterators: exception: Cannot allocate memory +core_apply_to_range: range iterator init failed: Cannot allocate memory +[OK] +TEST 13/50 splinterdb_quick:stats_reset_excludes_active_operations [OK] +TEST 14/50 splinterdb_quick:test_apis_for_large_key [OK] +TEST 15/50 splinterdb_quick:test_key_size_gt_max_inline_key_size [OK] +TEST 16/50 splinterdb_quick:test_value_size_gt_max_value_size [OK] +TEST 17/50 splinterdb_quick:test_large_lookup_survives_memtable_recycle [OK] +TEST 18/50 splinterdb_quick:test_iterator_survives_memtable_recycle [OK] +TEST 19/50 splinterdb_quick:test_variable_length_values [OK] +TEST 20/50 splinterdb_quick:test_branch_prefix_roundtrip [OK] +TEST 21/50 splinterdb_quick:test_basic_iterator [OK] +TEST 22/50 splinterdb_quick:test_iterator_delete_current [OK] +TEST 23/50 splinterdb_quick:test_empty_iterator [OK] +TEST 24/50 splinterdb_quick:test_bounded_iterator [OK] +TEST 25/50 splinterdb_quick:test_bounded_iterator_start_normalization [OK] +TEST 26/50 splinterdb_quick:test_splinterdb_iterator_with_startkey [OK] +TEST 27/50 splinterdb_quick:test_splinterdb_iterator_with_non_existent_startkey [OK] +TEST 28/50 splinterdb_quick:test_splinterdb_iterator_with_missing_startkey_in_sequence [OK] +TEST 29/50 splinterdb_quick:test_iterator_prev_and_next [OK] +TEST 30/50 splinterdb_quick:test_iterator_reversal_on_key_in_two_branches [OK] +TEST 31/50 splinterdb_quick:test_iterator_reversal_with_three_branches [OK] +TEST 32/50 splinterdb_quick:test_rewriting_keys_does_not_grow_trunk [OK] +TEST 33/50 splinterdb_quick:test_close_and_reopen [OK] +TEST 34/50 splinterdb_quick:test_logged_close_and_reopen [OK] +TEST 35/50 splinterdb_quick:test_repeated_insert_close_reopen [OK] +TEST 36/50 splinterdb_quick:test_custom_data_config [OK] +TEST 37/50 splinterdb_quick:test_existence_only_memtable_lookup [OK] +TEST 38/50 splinterdb_quick:test_existence_only_trunk_lookup_skips_branches [OK] +TEST 39/50 splinterdb_quick:test_write_api_returns_old_value [OK] +TEST 40/50 splinterdb_quick:test_write_api_old_result_existence_only [OK] +TEST 41/50 splinterdb_quick:test_write_api_old_result_custom_merge_semantics [OK] +TEST 42/50 splinterdb_quick:test_write_api_old_result_merges_memtable_and_trunk [OK] +TEST 43/50 splinterdb_quick:test_write_api_old_result_respects_trunk_delete_shadow [OK] +TEST 44/50 splinterdb_quick:test_iterator_custom_comparator [OK] +TEST 45/50 splinterdb_quick:test_iterator_init_bug [OK] +TEST 46/50 splinterdb_quick:test_splinterdb_create_w_background_threads [OK] +TEST 47/50 splinterdb_quick:test_splinterdb_create_w_all_background_threads [OK] +TEST 48/50 splinterdb_quick:test_iterator_thread_handoff [OK] +TEST 49/50 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery [OK] +TEST 50/50 splinterdb_quick:test_get_config_returns_effective_config [OK] +RESULTS: 50 tests (50 ok, 0 failed, 0 skipped) ran in 9960 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-results.json b/benchmarks/results-20261013/main-7bb5fab/tests/release-results.json new file mode 100644 index 000000000..d7b576101 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-results.json @@ -0,0 +1,67 @@ +[ + { + "name": "quick", + "mode": "release", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-quick", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/splinterdb_quick_test" + ], + "binary_sha256": "7cacdd8c7613662ea8c818fc1d29f9b0a7a59629e5c9691fb57e528d29c41ae4", + "started": 1791904526.8338897, + "returncode": 0, + "finished": 1791904536.8287897, + "tests": 50, + "passed": 50, + "failed": 0, + "skipped": 0 + }, + { + "name": "btree", + "mode": "release", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-btree", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/btree_test" + ], + "binary_sha256": "2845b392bd943153f83e4a5461d697af555921c6b07b8f0976e7f8b87936242e", + "started": 1791904536.8305018, + "returncode": 0, + "finished": 1791904536.8384242, + "tests": 8, + "passed": 8, + "failed": 0, + "skipped": 0 + }, + { + "name": "superblock", + "mode": "release", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-superblock", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/superblock_test" + ], + "binary_sha256": "adbb3e34f2598c1007e2fe417a9754396975918c4b4fd8b88a74a88f66d6b1b7", + "started": 1791904536.8393273, + "returncode": 0, + "finished": 1791904536.8712857, + "tests": 15, + "passed": 15, + "failed": 0, + "skipped": 0 + }, + { + "name": "blob", + "mode": "release", + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-blob", + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/splinter_test", + "test_blob_" + ], + "binary_sha256": "694eebb046706dd1a513ac5c052f8c216220f47fe53752b1474b3fe35fb87c54", + "started": 1791904536.8734038, + "returncode": 0, + "finished": 1791904538.1400166, + "tests": 4, + "passed": 4, + "failed": 0, + "skipped": 0 + } +] diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-superblock.log b/benchmarks/results-20261013/main-7bb5fab/tests/release-superblock.log new file mode 100644 index 000000000..df5e6b55c --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-superblock.log @@ -0,0 +1,34 @@ +Running 1 CTests, suite name 'superblock', test case 'all'. +TEST 1/15 superblock:test_rejects_other_experiment_formats superblock_mount: no valid superblock found +superblock_read_bootstrap: no valid superblock found +superblock_mount: no valid superblock found +superblock_read_bootstrap: no valid superblock found +superblock_mount: no valid superblock found +superblock_read_bootstrap: no valid superblock found +[OK] +TEST 2/15 superblock:test_snapshot_persists_state [OK] +TEST 3/15 superblock:test_two_log_checkpoint_transitions [OK] +TEST 4/15 superblock:test_snapshot_preserves_unincorporated_sealed_log [OK] +TEST 5/15 superblock:test_two_log_checkpoint_torn_begin [OK] +TEST 6/15 superblock:test_torn_write_falls_back_to_older_generation [OK] +TEST 7/15 superblock:test_generation_wrap_selects_newest_slot [OK] +TEST 8/15 superblock:test_both_slots_corrupt_is_not_found superblock_mount: no valid superblock found +[OK] +TEST 9/15 superblock:test_mount_rejects_invalid_metadata superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +[OK] +TEST 10/15 superblock:test_slot_read_error_falls_back_to_peer [OK] +TEST 11/15 superblock:test_both_slot_read_errors_are_reported superblock_mount: no readable valid superblock found: Input/output error +[OK] +TEST 12/15 superblock:test_read_geometry superblock_read_bootstrap: no valid superblock found +[OK] +TEST 13/15 superblock:test_read_bootstrap_allocation_state superblock_read_bootstrap: no valid superblock found +[OK] +TEST 14/15 superblock:test_bootstrap_geometry_metadata_budget Device geometry needs 134217728 bytes of cache lookup metadata, which exceeds the configured cache budget of 67108864 bytes. +Failed to open existing SplinterDB device 'db' with specified configuration: No space left on device +[OK] +TEST 15/15 superblock:test_format_sets_fresh_state [OK] +RESULTS: 15 tests (15 ok, 0 failed, 0 skipped) ran in 24 ms diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/release-tests.log b/benchmarks/results-20261013/main-7bb5fab/tests/release-tests.log new file mode 100644 index 000000000..b9b99e94e --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/release-tests.log @@ -0,0 +1,9 @@ +Starting main-7bb5fab-prefix-release-tests test +Running release quick +{'name': 'quick', 'mode': 'release', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-quick', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/splinterdb_quick_test'], 'binary_sha256': '7cacdd8c7613662ea8c818fc1d29f9b0a7a59629e5c9691fb57e528d29c41ae4', 'started': 1791904526.8338897, 'returncode': 0, 'finished': 1791904536.8287897, 'tests': 50, 'passed': 50, 'failed': 0, 'skipped': 0} +Running release btree +{'name': 'btree', 'mode': 'release', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-btree', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/btree_test'], 'binary_sha256': '2845b392bd943153f83e4a5461d697af555921c6b07b8f0976e7f8b87936242e', 'started': 1791904536.8305018, 'returncode': 0, 'finished': 1791904536.8384242, 'tests': 8, 'passed': 8, 'failed': 0, 'skipped': 0} +Running release superblock +{'name': 'superblock', 'mode': 'release', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-superblock', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/superblock_test'], 'binary_sha256': 'adbb3e34f2598c1007e2fe417a9754396975918c4b4fd8b88a74a88f66d6b1b7', 'started': 1791904536.8393273, 'returncode': 0, 'finished': 1791904536.8712857, 'tests': 15, 'passed': 15, 'failed': 0, 'skipped': 0} +Running release blob +{'name': 'blob', 'mode': 'release', 'cwd': '/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/scratch-release-blob', 'command': ['/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-7bb5fab/release/bin/unit/splinter_test', 'test_blob_'], 'binary_sha256': '694eebb046706dd1a513ac5c052f8c216220f47fe53752b1474b3fe35fb87c54', 'started': 1791904536.8734038, 'returncode': 0, 'finished': 1791904538.1400166, 'tests': 4, 'passed': 4, 'failed': 0, 'skipped': 0} diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/shared/before.json b/benchmarks/results-20261013/main-7bb5fab/tests/shared/before.json new file mode 100644 index 000000000..2143ea26f --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/shared/before.json @@ -0,0 +1,97 @@ +{ + "main": "db3047a812d9b193b87f92fc0be7b75e923b89ee", + "target": "7bb5fab305b9c6179e31f75998dabea833537a08", + "projects": [ + { + "name": "cache-errors", + "branch": "robj/cache-errors", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-errors", + "head": "2907e97e90a7861e789192485e0892522a9feb3a", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/cache-errors" + }, + { + "name": "cache-handoff", + "branch": "robj/cache-handoff", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-handoff", + "head": "c76b6923eb5b915792e1e8303d266fb072f9348f", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/cache-handoff" + }, + { + "name": "disk-format", + "branch": "robj/disk-format", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/disk-format", + "head": "fb878f134c245276629828203a186dd2f26df981", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/disk-format" + }, + { + "name": "filtered-ranges", + "branch": "robj/filtered-ranges", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/filtered-ranges", + "head": "b8ce54bf9b793c3576a9f96c19d4a51846e83269", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/filtered-ranges" + }, + { + "name": "log-group-limit", + "branch": "robj/log-group-limit", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit", + "head": "f295866abe0cd5d16c7954c7748afc2ddcdc6843", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/log-group-limit" + }, + { + "name": "branch-pointers", + "branch": "robj/branch-pointers", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-pointers", + "head": "37787ae95aadc84fca543af0592a24448576dcd9", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/branch-pointers" + }, + { + "name": "branch-prefix", + "branch": "robj/branch-prefix", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "head": "919b61f04355248a26d054a0a7948d5fbb33832a", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/branch-prefix" + }, + { + "name": "lazy-merge", + "branch": "robj/lazy-merge", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/lazy-merge", + "head": "9754337703a754546bd2ab38028856df185f897a", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/lazy-merge" + }, + { + "name": "cache-directory", + "branch": "robj/cache-directory", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory", + "head": "9ecae65d8f0dd114132adf06fa326cb2389f5dc0", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/cache-directory" + }, + { + "name": "async-durable-barrier", + "branch": "robj/async-durable-barrier", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/async-durable-barrier", + "head": "c99b1dcd66ed3648eb592f45182eb8021a94cd7e", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/async-durable-barrier" + }, + { + "name": "cache-errors-direct24", + "branch": "robj/cache-errors-direct24", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-errors-direct24", + "head": "573ba9ef6a2fe8d1293017556c29036340ea98ff", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/cache-errors-direct24" + }, + { + "name": "cache-errors-null", + "branch": "robj/cache-errors-null", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-errors-null", + "head": "7d1f0a56ebc253bccc1bd74799eed7bf6e0d7fb3", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/cache-errors-null" + }, + { + "name": "cache-invalid-addresses", + "branch": "robj/cache-invalid-addresses", + "worktree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses", + "head": "193ba3e485df4e7438ee0fda78bb162258e3f054", + "backup_ref": "refs/heads/backup/projects-before-main-7bb5fab/cache-invalid-addresses" + } + ] +} diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/shared/run_job.py b/benchmarks/results-20261013/main-7bb5fab/tests/shared/run_job.py new file mode 100644 index 000000000..299c91084 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/shared/run_job.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Coordinate this campaign's builds/tests and disk-backed benchmarks.""" +import argparse +import fcntl +import json +import os +from pathlib import Path +import subprocess +import tempfile +import time + +ROOT = Path(__file__).resolve().parent.parent +p = argparse.ArgumentParser() +p.add_argument('mode', choices=['build', 'test', 'benchmark']) +p.add_argument('--name', required=True) +p.add_argument('--db-dir', type=Path) +p.add_argument('command', nargs=argparse.REMAINDER) +a = p.parse_args() +command = a.command[1:] if a.command[:1] == ['--'] else a.command +if not command: + p.error('command required after --') +if a.mode == 'benchmark': + if a.db_dir is None: + p.error('benchmark requires --db-dir') + a.db_dir.mkdir(parents=True, exist_ok=True) + db_dir = a.db_dir.resolve() + if not db_dir.is_relative_to(ROOT / 'benchmarks'): + p.error('benchmark database directory must be under the campaign benchmarks directory') + fs = subprocess.check_output(['findmnt', '-n', '-o', 'FSTYPE,SOURCE', '-T', str(db_dir)], text=True).strip() + if fs.split()[0] in {'tmpfs', 'ramfs'} or not fs.split()[1].startswith('/dev/'): + p.error('benchmark storage must be a verified disk filesystem: ' + fs) + bench_lock = open(ROOT / 'coordination' / 'benchmark.lock', 'a+') + fcntl.flock(bench_lock, fcntl.LOCK_EX) + print('Benchmark database storage:', fs, str(db_dir), flush=True) +machine_lock = open(ROOT / 'coordination' / 'machine.lock', 'a+') +fcntl.flock(machine_lock, fcntl.LOCK_EX if a.mode == 'benchmark' else fcntl.LOCK_SH) +record = dict(name=a.name, mode=a.mode, cwd=os.getcwd(), command=command, + started=time.time(), pid=os.getpid()) +if a.db_dir is not None: + record['db_dir'] = str(a.db_dir.resolve()) +print('Starting', a.name, a.mode, flush=True) +try: + # Tool commands run in distinct PID namespaces; GNU make's FIFO names + # otherwise collide when several builds choose /tmp/GMfifo8. + with tempfile.TemporaryDirectory(prefix='splinter-' + a.name + '-', dir='/tmp') as temporary: + environment = dict(os.environ, TMPDIR=temporary) + result = subprocess.run(command, env=environment) + record['returncode'] = result.returncode +finally: + record['finished'] = time.time() + with open(ROOT / 'coordination' / 'jobs.jsonl', 'a') as journal: + fcntl.flock(journal, fcntl.LOCK_EX) + journal.write(json.dumps(record) + '\n') +raise SystemExit(result.returncode) diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/shared/test_root_branches.py b/benchmarks/results-20261013/main-7bb5fab/tests/shared/test_root_branches.py new file mode 100644 index 000000000..c83e1f546 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/shared/test_root_branches.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python3 +"""Focused merge regression checks; invoke inside run_job.py test.""" +import hashlib +import json +from pathlib import Path +import re +import subprocess +import sys +import time + +project, mode = sys.argv[1:] +campaign = Path(__file__).resolve().parents[2] +tree = campaign / 'worktrees' / project +out = Path(__file__).resolve().parent / project +scratch = out / ('scratch-' + mode) +scratch.mkdir(parents=True, exist_ok=True) +build = tree / 'build-main-7bb5fab' +link = scratch / build.name +if not link.exists(): + link.symlink_to(build, target_is_directory=True) +base = build / mode / 'bin' +commands = [] +unit = lambda name: str(base / 'unit' / (name + '_test')) +if project == 'cache-invalid-addresses': + commands.append(('writeback', [unit('writeback_set')])) +else: + commands.append(('merge', [unit('merge')])) +commands.append(('quick', [unit('splinterdb_quick')])) +core_options = ['--db-location', str(scratch / 'core.db'), + '--cache-capacity-mib', '128', '--db-capacity-gib', '64'] +commands += [('cache-core', [unit('splinter'), *core_options, 'test_cache_read_errors_']), + ('blob-core', [unit('splinter'), *core_options, 'test_blob_'])] +if project == 'cache-invalid-addresses' and mode == 'debug': + for flag in ['prefetch-admission', 'async']: + commands.append((flag, [str(base / 'driver_test'), 'cache_test', '--' + flag, + '--db-location', str(scratch / (flag + '.db')), + '--cache-capacity-mib', '32', '--db-capacity-gib', '1'])) +if project == 'filtered-ranges': + commands.append(('filter', [str(base / 'driver_test'), 'filter_test', + '--db-location', str(scratch / 'filter.db'), + '--cache-capacity-mib', '64', '--db-capacity-gib', '4'])) +validation = out / ('validation-' + mode + '.json') +old_records = json.loads(validation.read_text()) if validation.exists() else [] +records = [] +for name, cmd in commands: + previous = next((r for r in old_records if r['name'] == name), None) + if previous and previous['returncode'] == 0 and previous['command'] == cmd: + records.append(previous) + continue + print(project, mode, name, flush=True) + log = out / (mode + '-' + name + '.log') + if log.exists(): + log.rename(log.with_suffix('.initial.log')) + (out / (mode + '-' + name + '.initial.json')).write_text(json.dumps(previous, indent=2) + '\n') + record = dict(name=name, command=cmd, started=time.time()) + with log.open('w') as stream: + result = subprocess.run(cmd, cwd=scratch, stdout=stream, stderr=subprocess.STDOUT) + content = log.read_text() + record.update(returncode=result.returncode, finished=time.time(), + log_sha256=hashlib.sha256(log.read_bytes()).hexdigest(), + summaries=[line for line in content.splitlines() if 'RESULTS:' in line]) + records.append(record) + validation.write_text(json.dumps(records, indent=2) + '\n') + if result.returncode: + raise SystemExit(result.returncode) + if name not in ['prefetch-admission', 'async', 'filter']: + assert re.search(r'RESULTS: [1-9][0-9]* tests', content), (name, content) diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/source-manifest.json b/benchmarks/results-20261013/main-7bb5fab/tests/source-manifest.json new file mode 100644 index 000000000..cf9e39e59 --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/source-manifest.json @@ -0,0 +1,174 @@ +{ + "branch": "robj/branch-prefix", + "before": "919b61f04355248a26d054a0a7948d5fbb33832a", + "merged_main": "7bb5fab305b9c6179e31f75998dabea833537a08", + "build_root": "build-main-7bb5fab", + "source_sha256": { + "Makefile": "ce683f9cf159e411025527fe8bf77269a7ed7c6da6db2094d102f722d55dfae8", + "include/splinterdb/data.h": "58b47863d92bea53e50ff28d97d594b05675e122a6d7193fdfb19f5deda4df4d", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "364073691c390663f6b732f57c3ee4bfecc9f68aca33ef6750d6106e04462dc8", + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "bc0621be7903d64e25059140005dafeea3f2a4a4ae0e658686501e52e4be934f", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "7d46871423a15992f697cabb363316183cb842a11c26017f8566267174e5ae45", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "2c26b56a2c779faec79eccf7928032204d5907687e63455850eeb51e0ee106c3", + "src/btree.h": "47789ba7191a88faa21ae5b13fa02f7ab59dd698b2207654fe5fcaf422ecbc87", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "70caf9f8d7794dea8d2aeec339883ccfcfdfc29ce6c2e1edd2d0353c4a3975ea", + "src/core.h": "7cf4d086f6d4dcaa4cbd161fef786dbe3cc502ced4512b7fe547c2aa2020462e", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "49a2b0aec91a1c40784b8b3b54f016ef5504c79492b1393674123e27656a09bb", + "src/log_data.h": "06ab1d39b77abb01ec66a901fa52354908be26db8daef52899f5c03a6db2462e", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "df98421e597d1edeac871755f0473055b590791af8efad495575d20260e46a12", + "src/merge.h": "c17e2a0b6272ec52e6d1e80acd9df7dc85221f186e6c60e323c37b467dc5c41a", + "src/mini_allocator.c": "d9444da13fca2000f4128500b84be2b778300a4befc93f72e52b071b83c6491e", + "src/mini_allocator.h": "8d5242f5e4df5443baeab7a494a3c3b2f1491216abfd914c6dbc273370e45683", + "src/notification.c": "2f3bcda49d8ce35ad532fef8ec8f4aeca48bec280cdf6210c21d55cf2aa4a661", + "src/notification.h": "47eb73f5813d6f54658f339ce44d6a475f8f64f2b2eb6368261e839a090f083f", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "a145d39af39caf9dec6f1e1e24b6606ed615587d8dee52a23e0df410b2d07545", + "src/rc_allocator.h": "65f01decb7244b8f6a6c9e7acb47d4ccb4f2f3f369461e70aff33211f03ee39b", + "src/routing_filter.c": "3e722a880217cc4f5831f162dd6b3853a5d0d3f67ca3d3421b2144650657f73a", + "src/routing_filter.h": "579a3a4cc00b9cb125479b23eaa93e4a8309a195fe4082d988b629d4b95a2c91", + "src/shard_log.c": "ed1fcdb429d4fc26382546ecbce04154910275494e9fef522cf34b647cf5e734", + "src/shard_log.h": "07c5867b959eefd35e3e9f08e6c015a594f6331850844590e9c2b1126cd2716b", + "src/splinterdb.c": "e054c2dc9224c7de8bdb63206bb5150947f853d903e3b8012ba46fe1a66dba5f", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "34dd4c724e53c98f170c024c70dd22dae0a466806c167134200f92128420dfba", + "src/superblock.h": "cee4253a99b71e75e67d2d5abc28e2eb34faec5a3297cd0371b67ec66a3dbc6c", + "src/task.c": "35886e598b4464af16e76497917955d3d55c6c077fbcf80fb3fd2284c8ddc08d", + "src/task.h": "35405e04fbdcef9bc5c5d6ef43debc4b0889d6bc4d8d530649b0c45a34012825", + "src/trunk.c": "892373ec383717289a6220b4351b670637e7c41877a97eb0edcb27a9e4e270f2", + "src/trunk.h": "05c5c5313f5a42b68482d03b58d2f17081c6da468a0ce888b0b0b38cc069baf2", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "tests/config.c": "e44ffe45687560ef6605bd086709251d53cccfbadbc94fd3bdfd0106721f3698", + "tests/config.h": "c1f80b62a51e77255d8d91ace4b2e6777c7311010167149430edd41a6d5ce142", + "tests/functional/README.md": "c95907cfe5f4aaebc303d0d94cdcbd51e78d717ec11e4c5ecea6b8efaf723be0", + "tests/functional/avlTree.c": "5c24865aa50a21c626dacb2bd6172ff182a25e3532f5aee73a25aeb47c6bb043", + "tests/functional/avlTree.h": "39d82dc2b4c99a635c095800efcd060e7c95822a1194de0f03524a970040ac86", + "tests/functional/btree_test.c": "947e350af87b4e6d3bcb6320d1fac40a2ed6adf37ea725216de2019140ff710f", + "tests/functional/cache_test.c": "549f326d035fbb81cf9f272a66948f34f30313495624c6320e4a75b47c042e48", + "tests/functional/driver_test.c": "aef8d611eae488b287a796007c2a4e2a5f2e7f3f3190dce51be0e2be78ecb765", + "tests/functional/filter_test.c": "566f232b849bfe3e7973154dd31a229fc78b168b319efbd3c59a7445cb63279c", + "tests/functional/io_apis_test.c": "be9b36b3af71975782f42ecc8087a922dea828d82049844d0833845cc1698ec5", + "tests/functional/log_test.c": "b9715610200c4279089d74c4dc9c3035000c62b311db9b4d52e171f477e39de3", + "tests/functional/random.h": "8b6567f2e066099fc21d9f6548b561169ffadb0da07150be7bf940c86d146082", + "tests/functional/scan_benchmark.c": "555f1157c220c4f2924bd2089abdcda527a3acde440bc0c922c9c58c2ddedfd1", + "tests/functional/splinter_test.c": "b6c2e683dd48e23bc5d035e5d00142012f64085a21cff563b44d54fbaf2c7b9c", + "tests/functional/splinter_test.h": "9eb16fb6c779b27df477213c341031421d383c1c72051f2f42abec4c3c5b0f79", + "tests/functional/test.h": "e495226245728b72d4108f627642e98d7fba399f6fca3b733e18e4d2b218fb30", + "tests/functional/test_async.c": "258f7c56c6c500c783e659b69b157d3c9a06812fcbc31a8fb165b6c66f213acd", + "tests/functional/test_async.h": "c3530305b730c3d9a2c3c73ed438ee7ccd6c5c45cd26e0e02e6a821350b1d778", + "tests/functional/test_dispatcher.c": "60eaa54ce5ffd0d50095722ecd488b448e875fa07a44acc4ba560534c16d67b9", + "tests/functional/test_functionality.c": "d7b71e53f78b88257a10d8cc4fddd3daa48d704a89f6b4c5590af507da4637cd", + "tests/functional/test_functionality.h": "d065e9b63d00f37a88ee9cf962a1280040d7ee4684a1141a506e393fa38913b0", + "tests/functional/test_splinter_shadow.c": "4b856d30739b5ae544b65f514a55cc9d91cbc550044c498bedc51e8d5da26bd5", + "tests/functional/test_splinter_shadow.h": "a1b23c891db62785db9c4f80035ea1060de68c79aa0230dd6dbc03a8fe0b118d", + "tests/functional/ycsb_test.c": "5b1be412e93cfe56b8578051583fa231c138e2acee1afe4b3d1dfb925e0ad26f", + "tests/test_common.c": "fd1d18926096852a7dcfb54622d534d76a8ec62437ce72143c261f402587e493", + "tests/test_common.h": "3691f4e6bdaedb246dc9edea3d62a5cc69b456240492ba6cca8a2320c27cd595", + "tests/test_data.c": "48433bcf29a2e5ce1540a7b479bf0ddf85278e3d2a3c5ca6d8e4538cd1f0012f", + "tests/test_data.h": "61af4814f5d37200fa2393fc40abc7aa19acf4af322ca159390da3332af2952a", + "tests/unit/README.md": "9d4dc976f63738ebe5b73d446e2d6de088f29b26e2683f3c3c552c964949de2d", + "tests/unit/btree_stress_test.c": "acc2736efac2a4e862eba774454268656eb468320475a457f0ff3ceded6bd30d", + "tests/unit/btree_test.c": "21965dc066c355f80cbec2bbd146facf47512f3e82bbe705b039c4543b98b909", + "tests/unit/btree_test_common.c": "3fa17ff41ec7afa5e7204aeb68767a7fcb7e1c7cf81695ef9506876a2af324bf", + "tests/unit/btree_test_common.h": "b7b30bdc02449e81d2fe263c0ef74a4a28c728f717d1ea20d16e3f1acb10a6a2", + "tests/unit/config_parse_test.c": "700a56f940237508e1ce647cc011f2f42c503aab262f930fd1baf0f265a9a112", + "tests/unit/ctest.h": "db9f53f9da859ff1d72be00efb993ca551720e0acaf747236e34e031368c7a16", + "tests/unit/large_inserts_stress_test.c": "df90d2de303f72829779f23cad3881cc65465d5d1a22fcdaf10000b23430b7ae", + "tests/unit/limitations_test.c": "e851344911b8c835578ccd9ae777b79369d339a375cca1468a12c70f03a9efe3", + "tests/unit/main.c": "a4a3ca6e237e3f40f07682c6528b1ef6f32105afc6071810e15411ad297b7a38", + "tests/unit/merge_test.c": "cf5c1c8010324e1e7629b482bb77796c837abcc5e88eb2de8f97aed11f4bb692", + "tests/unit/misc_test.c": "4ec5cf57c933275ccdf532a529ae79909840f7d41d36b842a4cb9d9a291ea05b", + "tests/unit/platform_apis_test.c": "c3623021ae04b4305b0971cfb2760f895c5b6908310a6e4c192f65769262c860", + "tests/unit/platform_threads_test.c": "bd8e8bb58926344add7b38357c15237687165da8995b052f02612967b6bd8af5", + "tests/unit/splinter_test.c": "01ef44f24acee4b326328933e78e6c8dd84118198ee5445fd703a646b2d407bf", + "tests/unit/splinterdb_forked_child_test.c": "32bf91450ba812947ecdc7551ea2996823c05808159786ce746eba0265010a72", + "tests/unit/splinterdb_heap_id_mgmt_test.c": "43729def7a6d91cf66f5bc1fe2e6f0a4a45d63ebbb55887ed10a5eafcdc8235e", + "tests/unit/splinterdb_optimize_test.c": "b5e3295bcc6ee44437f329005f92d02590d90ca1d96a98439721fff32649cd5d", + "tests/unit/splinterdb_quick_test.c": "436fc8b6f10a0e4554bcc74267703c53f31c272e05e484dbc706de642223f87b", + "tests/unit/splinterdb_stress_test.c": "21a7f8725c82e4d8ec780131eff514294304aba322d8a2650ae893efaaf66f3a", + "tests/unit/superblock_test.c": "91a13552820b9864366f36f6224fe3edbbe7417effddb86e828f3440017ba555", + "tests/unit/task_system_test.c": "bd8ad9ca2632f17a6353f3c1e4d0849d98604e6b3a30f9c0c0b7ee13904a3024", + "tests/unit/trunk_async_test.c": "00c51d4302a48e09bdfacf217d45fc3c935f59bac130ded3f3164cc64ec5713b", + "tests/unit/trunk_gc_test.c": "00d6134ad82ed061cbc16d4b19fc21f41432c4b7c5a4b7ade80c3bed3b2dfdca", + "tests/unit/trunk_split_test.c": "187c3f337099e4b110f8ea1b045c522b32f663b860807c0f819bd9264f9264a8", + "tests/unit/unit_test_template_dot_c": "ffb5e31229ca59caaece995122fcefe11f360ae45953caae0b5d4a72b2a6bcf7", + "tests/unit/unit_tests.h": "4e15f58455d8d759e9fad8432a02b1ec70f3a47a3e74eb39ea11b6a2ad44af42", + "tests/unit/unit_tests_common.c": "7a47eb40fadea397842e2f56932083d7e8840f08834788d6774b1f688288e735", + "tests/unit/util_test.c": "e992dff255d18e84673ea3954eb2da314de0815e64d55fd1980018b22444508b", + "tests/unit/vector_test.c": "463c0ae5b0c7525844f198c6859988a1bc33274d26cace87b9229673bc7c5186", + "tests/unit/writable_buffer_test.c": "3418d6ae29c5bc09dda485c1c1fe1768a1a3fc66b9b6bfdd05aa50e52516241e", + "tests/unit/writeback_set_test.c": "7bef6ea2a4a9d13fe0d83549cadd8e9497018068ac397ac8c31edea6909ee398" + } +} diff --git a/benchmarks/results-20261013/main-7bb5fab/tests/validate.py b/benchmarks/results-20261013/main-7bb5fab/tests/validate.py new file mode 100644 index 000000000..331740e4e --- /dev/null +++ b/benchmarks/results-20261013/main-7bb5fab/tests/validate.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +import hashlib,json,re,subprocess,sys,time +from pathlib import Path +OUT=Path(__file__).resolve().parent +TREE=Path('/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix') +B=TREE/'build-main-7bb5fab' +mode=sys.argv[1] +cases=[('quick','splinterdb_quick_test',[]),('btree','btree_test',[]),('superblock','superblock_test',[]),('blob','splinter_test',['test_blob_'])] +records=[] +for name,suite,args in cases: + scratch=OUT/('scratch-'+mode+'-'+name) + scratch.mkdir(exist_ok=True) + link=scratch/'build-main-7bb5fab' + if not link.exists(): link.symlink_to(B,target_is_directory=True) + exe=B/mode/'bin/unit'/suite + command=[str(exe),*args] + record=dict(name=name,mode=mode,cwd=str(scratch),command=command,binary_sha256=hashlib.sha256(exe.read_bytes()).hexdigest(),started=time.time()) + print('Running',mode,name,flush=True) + with (OUT/(mode+'-'+name+'.log')).open('w') as log: + p=subprocess.run(command,cwd=scratch,stdout=log,stderr=subprocess.STDOUT,timeout=600) + record.update(returncode=p.returncode,finished=time.time()) + text=(OUT/(mode+'-'+name+'.log')).read_text() + counts=re.findall(r'RESULTS: (\d+) tests \((\d+) ok, (\d+) failed, (\d+) skipped\)',text) + if counts: + record.update(zip(['tests','passed','failed','skipped'],map(int,counts[-1]))) + records.append(record) + (OUT/(mode+'-results.json')).write_text(json.dumps(records,indent=2)+'\n') + print(record,flush=True) + assert p.returncode==0 and record.get('passed',0)>0 and record.get('failed',-1)==0 diff --git a/docs/branch-prefix-experiment.md b/docs/branch-prefix-experiment.md index 562c89b99..7baabb7b7 100644 --- a/docs/branch-prefix-experiment.md +++ b/docs/branch-prefix-experiment.md @@ -165,3 +165,13 @@ logs, commands, binary hashes, and the source manifest are recorded in the main checkout under `.cache/projects-20261011/coordination/main-7bb5fab/branch-prefix/`. The performance measurements above predate this merge and do not establish the performance of the merged implementation. + +## Fresh benchmarks after main integration (2026-10-13) + +Common-prefix resident point throughput improved 10.61%, while the random-key resident long-range workload lost 10.88%, both with non-overlapping sample ranges. Common-prefix disk long-range throughput improved about 14.4%. The experiment retains a workload-dependent cost; it is not performance neutral. + +These are updated-feature comparisons against main `7bb5fab`, not an isolated +measurement of merge cost. Main controls drifted; observed range overlap is +descriptive, not a statistical confidence interval. Exact samples, build/source +hashes, commands, verification scope and fresh correctness evidence are in +[the integration archive](../benchmarks/results-20261013/main-7bb5fab/README.md). From 773a11927a76c7ecb41c00d75f91df163b1fd288 Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Tue, 13 Oct 2026 23:47:48 -0700 Subject: [PATCH 06/11] Record serialized integration screen against main fc0bc8f7 --- .../main-fc0bc8f7-screen/.clang-format | 2 + .../main-fc0bc8f7-screen/README.txt | 25 + .../archive-manifest.json | 57 + .../branch-prefix-build.json | 233 +++ .../main-fc0bc8f7-screen/branch-summary.log | 42 + .../main-fc0bc8f7-screen/build_benchmarks.py | 69 + .../cache-invalid-addresses-build.json | 195 ++ .../directory-bucket-atomic-build.json | 196 ++ .../directory-bucket-build.json | 196 ++ .../directory-bucket-simd-build.json | 196 ++ .../directory-direct-build.json | 196 ++ .../harnesses/insert_benchmark.c | 998 ++++++++++ .../main-fc0bc8f7-screen/harnesses/kvbench.c | 1707 ++++++++++++++++ .../harnesses/prefix_kvbench.c | 1765 +++++++++++++++++ .../main-fc0bc8f7-screen/host.json | 14 + .../imported-run_matrix.py | 156 ++ .../main-fc0bc8f7-screen/log-async-build.json | 158 ++ .../main-fc0bc8f7-screen/log-sync-build.json | 158 ++ .../main-fc0bc8f7-screen/main-build.json | 232 +++ .../run_benchmarks-screen.py | 107 + .../main-fc0bc8f7-screen/run_job.py | 54 + .../runs/common-0-main.log | 21 + .../runs/common-1-branch-prefix.log | 21 + .../runs/common-2-branch-prefix.log | 21 + .../runs/common-3-main.log | 21 + .../runs/common-results.csv | 17 + .../runs/fixture-branch-prefix-common.csv | 2 + .../runs/fixture-branch-prefix-common.log | 8 + .../runs/fixture-branch-prefix-random.csv | 2 + .../runs/fixture-branch-prefix-random.log | 8 + .../runs/fixture-main-common.csv | 2 + .../runs/fixture-main-common.log | 8 + .../runs/fixture-main-ordinary.csv | 2 + .../runs/fixture-main-ordinary.log | 7 + .../runs/fixture-main-random.csv | 2 + .../runs/fixture-main-random.log | 8 + .../main-fc0bc8f7-screen/runs/manifest.json | 1757 ++++++++++++++++ .../runs/ordinary-0-main.log | 20 + .../ordinary-1-cache-invalid-addresses.log | 20 + .../runs/ordinary-10-directory-direct.log | 20 + .../ordinary-11-cache-invalid-addresses.log | 20 + .../runs/ordinary-12-main.log | 20 + .../runs/ordinary-2-directory-direct.log | 20 + .../runs/ordinary-3-directory-bucket.log | 20 + .../runs/ordinary-4-directory-bucket-simd.log | 20 + .../ordinary-5-directory-bucket-atomic.log | 20 + .../runs/ordinary-6-main.log | 20 + .../ordinary-7-directory-bucket-atomic.log | 20 + .../runs/ordinary-8-directory-bucket-simd.log | 20 + .../runs/ordinary-9-directory-bucket.log | 20 + .../runs/ordinary-results.csv | 53 + .../runs/random-0-main.log | 21 + .../runs/random-1-branch-prefix.log | 21 + .../runs/random-2-branch-prefix.log | 21 + .../runs/random-3-main.log | 21 + .../runs/random-results.csv | 17 + 56 files changed, 9077 insertions(+) create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/.clang-format create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/README.txt create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/archive-manifest.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/branch-prefix-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/branch-summary.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/build_benchmarks.py create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/cache-invalid-addresses-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-atomic-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-simd-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/directory-direct-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/insert_benchmark.c create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/kvbench.c create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/prefix_kvbench.c create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/host.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/imported-run_matrix.py create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/log-async-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/log-sync-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/main-build.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/run_benchmarks-screen.py create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/run_job.py create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-0-main.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-1-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-2-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-3-main.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-results.csv create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.csv create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.csv create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.csv create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.csv create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.csv create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/manifest.json create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-0-main.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-1-cache-invalid-addresses.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-10-directory-direct.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-11-cache-invalid-addresses.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-12-main.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-2-directory-direct.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-3-directory-bucket.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-4-directory-bucket-simd.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-5-directory-bucket-atomic.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-6-main.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-7-directory-bucket-atomic.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-8-directory-bucket-simd.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-9-directory-bucket.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-results.csv create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-0-main.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-1-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-2-branch-prefix.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-3-main.log create mode 100644 benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-results.csv diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/.clang-format b/benchmarks/results-20261013/main-fc0bc8f7-screen/.clang-format new file mode 100644 index 000000000..9d159247d --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/.clang-format @@ -0,0 +1,2 @@ +DisableFormat: true +SortIncludes: false diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/README.txt b/benchmarks/results-20261013/main-fc0bc8f7-screen/README.txt new file mode 100644 index 000000000..d31b552ab --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/README.txt @@ -0,0 +1,25 @@ +Fresh integration screen on main fc0bc8f7 + +26 serialized O_DIRECT real-disk invocations:5 fixture loads plus21 query runs. +Databases:ext4 /dev/mapper/snafu-root_crypt. CPU0-11,200000 records,128MiB cache, +3-second measured query phases,8threads. Two samples per candidate;main controls +bookend/interleave. Values and range ordering validated, zero errors/violations. +This resident screen is not a full performance matrix or tail-neutrality claim. + +Alternative cache directories retain substantial point/short-range costs: +scalar/SIMD point around25% slower;atomic point6.25%,short scans9.10% slower. +Invalid-address results overlap main ranges (point-0.25%,short-4.39%). +Prefix common-key point/short scans about2% higher;long scans lower with wide +overlapping ranges. Random-key results also overlap main. Preserve earlier +workload-dependent caveats;this screen does not isolate the cost of merging. + +Each build record hashes compiled source,library,harness,executable and config, +and verified_runtime_commit identifies the committed runtime exactly. The head +field may precede commit because builds occurred before evidence was committed. +Runtime hash checks against committed source all passed. Archive omits binaries +and databases;original commands/paths are retained. + +The executed driver is run_benchmarks-screen.py (hash in runs/manifest.json). +It imports imported-run_matrix.py from the recorded campaign location. Later +build helper records include build-config metadata. PREFIX_PATTERN and disabled +state were audited from every prefix harness log;compression_disabled=false. diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/archive-manifest.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/archive-manifest.json new file mode 100644 index 000000000..d7ac1e51d --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/archive-manifest.json @@ -0,0 +1,57 @@ +{ + "log-sync-build.json": "ee840093403178f7bf01ecf77ed76ca327072b17325f7cf52f3489982b52ee80", + "directory-bucket-build.json": "536d0367fe02a8683cfdb9f2d10240370f1122baf7517d09a19325a8e528bd21", + ".clang-format": "f8405bf75d1ab2ed2e69b525a538b409b801812a7c71225da7bb46434f7dcc18", + "host.json": "1b5c083c200833db9300f5280d4a427b08fff146c09f4d039e875a8b7cf20d1b", + "README.txt": "96b915492dbd5910bd3f2be404149a19b8dca8fd166bf00cba0ef911fe1c5325", + "log-async-build.json": "9cbbe115bc96ed61102cbb6e4675bd34e1c8232fdc1903d38714990982b87561", + "branch-prefix-build.json": "cc63913592751b087160a65b7e05d80b51fb38a34f505a2f873d55374deb1482", + "build_benchmarks.py": "b0d5d339d4aa5984a9776ec53e317acf857471a00970b62d870859cc1a3303e9", + "directory-bucket-simd-build.json": "22201216ff59a4d8d82edeff4f0aec1b5f6cba9b281c7e8cae5eb6f4aedc8af6", + "imported-run_matrix.py": "536f10a1a7fd4b1e8e0250ea01cfe36793c7d6e2345f141092616ec06f64ee50", + "cache-invalid-addresses-build.json": "c2bcce04c0931c54e1a4f9c67141696f3e5400dcefebd561be67dbdff578815e", + "branch-summary.log": "1b6ddb2643d1aacc0878c66eb4eef68421735c6da688ca3f272925fdf41b56d0", + "directory-bucket-atomic-build.json": "980ee48d0bdac6b419ae0d3c7410c958403aab3056afb4b4eb005393f321fb36", + "run_job.py": "908d86de805e6efd41b423c919187f2df14715104f047e10fa8a6c57129cc773", + "run_benchmarks-screen.py": "283a0b06d41b61bb6f8eae78fa3be28883b07b41966f8453b6bc19233f2fc48f", + "directory-direct-build.json": "708ee340cf95405fc03ad6407ce4bd01c5156f579eb76dedfc5373e9a060d9f1", + "main-build.json": "8ce2dbc33f76ad635d78f6f3fb1904c2b3408a12aeca10504d7ee4a8a78b10cc", + "harnesses/kvbench.c": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9", + "harnesses/prefix_kvbench.c": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "harnesses/insert_benchmark.c": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4", + "runs/ordinary-12-main.log": "4c63cdfb549fba47a0e57ac7d494c551759b3d7776bc8bfac672e151f005ce3f", + "runs/fixture-main-ordinary.log": "ec24ffc5ed923d68c10142bdd8921a7fcb8ed58bd37d0d61d6c3c000254ce10b", + "runs/ordinary-9-directory-bucket.log": "8c7816859b271ce9337faf3f687b951a09ea561afb7e41d2bd4124684a035560", + "runs/ordinary-8-directory-bucket-simd.log": "a77a95913bf5e26ad82a7db384201e0b5733dbe9b400bed2a1692d7073a7ab9a", + "runs/ordinary-0-main.log": "1f5d5a4d7cc0806312c0acc2bc372c62df385f4f369a0c750de4e7dc672ca8e9", + "runs/ordinary-10-directory-direct.log": "a8a9413c4853daa7a02bbaa53c1eaf08c1eb3a53f88e453a00d1704ce347fea5", + "runs/random-1-branch-prefix.log": "03e31f3adfd2b96874d3f6658f912faadda30d7c732d21094b4e3d97b4cc3764", + "runs/fixture-branch-prefix-common.log": "ecb2f7cb3cbe4c825d92c5f3c6f1cfe8f13323382a64c7d22233e46dc15ce74e", + "runs/ordinary-7-directory-bucket-atomic.log": "755d7fec7b2b17887c69a39a81f75642874e5049e6cf0b1062f48458a87b11e7", + "runs/manifest.json": "31647b3b32d1ed09c33c65c719057c034c0b910cfa1673ccb4514999bd01cdb1", + "runs/ordinary-1-cache-invalid-addresses.log": "d5f4d3ba17042fc4bc49d8361a68c9d08f84f0c67f30b5116a60a65831fc3bbe", + "runs/fixture-main-random.csv": "ffe18612ca478f8b83c3c094a35c43bbf7a96b719c65df14cd05610f97576d5e", + "runs/common-results.csv": "f255481860e025252551bb1ca899f9a5c8929e4298db8e10267d755fd1f7f3a6", + "runs/fixture-main-ordinary.csv": "90b3ffd2ca31f0c348184a42b18b81bf8067da3faa4d584868467d704411b0e5", + "runs/common-0-main.log": "ddc4fee0c9a2d7b54f5837177c1db1e29fb0fb4ec1e3ec5ad5d96d8ec41af62c", + "runs/common-1-branch-prefix.log": "adc2a2dca4986f4ae87d901a5c90882c5f9f900ac3213d346e96bcc3a4b5b243", + "runs/fixture-main-random.log": "c75d5666625b43ecf66c59d80abc902affce1583a78e2273fa95924592bc3727", + "runs/ordinary-5-directory-bucket-atomic.log": "587eef33408ce4d0c51d94bffebfa70d13fa36acdef92d9bc5d4bc8d1fec2293", + "runs/fixture-main-common.csv": "cf49e40c100fc3dadbc2dd064200b0d52450aecf438dd87798e46eb51657f7c5", + "runs/fixture-branch-prefix-random.csv": "b5b37d997e50ca659c74cdc8d4c59b91c83639de8f08e3abe7f2a5655e1d1726", + "runs/fixture-branch-prefix-common.csv": "a3f23b1793ef75bc232d8b08e0aec78232d8f6634aa067f750f2d37598172a21", + "runs/random-3-main.log": "98a03b068a5157fac5b85f036012fb3afc63ce4fb0293cc12ec6932854fdb2bb", + "runs/common-2-branch-prefix.log": "a6f93fe7aaef848dfdb2cdf86fb0bbc13a459fc4493244f015d4139ac204f91f", + "runs/ordinary-11-cache-invalid-addresses.log": "b1bbe94a0f1fe166088d979dc8a0065f998aa867a8e506109e9e8b6b1041634f", + "runs/ordinary-2-directory-direct.log": "cb28adb38b2b22073f8e75f1fdfc049615065a5359e3fcf2f3865e6e5fc25b48", + "runs/ordinary-4-directory-bucket-simd.log": "488425c15969e707ef9d24ba626a9ad09810b4e6f255f45530b3c4cbd0a9fc7c", + "runs/random-results.csv": "1024edec33e5a4517197c560de55f2b293a4810ff171bea722a52f040d03e5e1", + "runs/fixture-branch-prefix-random.log": "81bde8489c71c772a3bc336e1808077a75ed081965be097529f9d74a573a9a58", + "runs/ordinary-6-main.log": "9c56215fca60ec0d53ffd68452d87f6c96e245aab8edbe75431749859c1fd302", + "runs/common-3-main.log": "a50d12509f7e55a73a2bbd5e33c42d89dbb4440965ff6a0bbc6efac8c155ca35", + "runs/ordinary-3-directory-bucket.log": "32ea1a879823e98e5533ff94c85170f1077a743c00746a02a914ad715ac03fa2", + "runs/random-0-main.log": "d0c1da7e9f21b859e6c0f7e7925527139e100db6f9cdd203d11099c5aad0b028", + "runs/fixture-main-common.log": "4e6a1eae1130ebf28013220575a11954444f00b42af2820e6724ae53e7ebade2", + "runs/ordinary-results.csv": "12e81f5643532ddfbbd28c90d72e45c1ab7b5237fa3d3707146b55b71e8c1b22", + "runs/random-2-branch-prefix.log": "f7ebdf631982d76650bc542dc6dd6dab8ae21a4e7e6da0cea3052bada1f53338" +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/branch-prefix-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/branch-prefix-build.json new file mode 100644 index 000000000..a21a0a50e --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/branch-prefix-build.json @@ -0,0 +1,233 @@ +{ + "profile": "branch-prefix", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "head": "100800cb1a11a60a259869f4b195d9572b9da86c", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "library_sha256": "bc960553ec64162d7531c3de1ae38d361838c262cf041eeab46f9180675feaf1", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "fa4361b3aad52f2ba60a9e1964ef765fb5c0efb68d82487afab4ca66cae1999b", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "3e7eb447259e7901b915b52b7545e2d5088475171af1716dd9c849dab4c3d1b9", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "b601c29a5dbcbf5ad5c0859ca87a3e9dc2088a10cad77327ee4f1c7f46c02f91", + "src/shard_log.h": "bde00a5cbe72e72ac7133006796e61f046ae758e8e4667aa610e184ed6ef4fd7", + "src/splinterdb.c": "dfb8412a91370d831fb5181d84a6d6f0c2cb8183866847dca9d7bc2596f08404", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "8a6533879de25f1e448a866c4c03304037e40c6e39e20923c0557e9c87d4fda0" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/insert_benchmark", + "binary_sha256": "99b23ee3f6351c2810b32c2d60576a9dcb267bcc373c5476e5f595f2c5825510", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + }, + "kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/kvbench", + "binary_sha256": "74f9390dc0512effbc1630962df7f4a6c9fa44c1c635c38d84ec7f2edd5ffc65", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + }, + "prefix_kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench", + "binary_sha256": "fc2a0b259b70e57cb659ab6778b99bc8e3d6c4dfbb22731a1079d1e9d7180719", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/prefix_kvbench.c", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51" + } + }, + "verified_runtime_commit": "19302e1a5b1d0208e2af92adff2e045566dcb146", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-fc0bc8f7/release/build-config.fb6bc8eeb8390429253883c09491f5bd": { + "sha256": "267ec476381983cf889134d1c4d86d65720e844a278482a4a0a67fb7dea8c554", + "text": "BUILD_ROOT=build-main-fc0bc8f7\nMAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-prefix-main-fc0-release-build-3tfr74p6/GMfifo7 -- BUILD_MODE=release BUILD_ROOT=build-main-fc0bc8f7\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/branch-summary.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/branch-summary.log new file mode 100644 index 000000000..f4560ab6e --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/branch-summary.log @@ -0,0 +1,42 @@ +Main fc0bc8f7 integration and asynchronous log policy +All database files use verified real ext4 disk and O_DIRECT; jobs are serialized. +These are short closed-loop samples; sample ranges are not confidence intervals. + +Branch screen, ordinary: resident200k records,3-second measured phases,8threads;2 candidate samples. +Prefix format uses separate images with identical logical tuples. Warm/point/range values validated. + cache-invalid-addresses point:uniform@8 mean=5212952/s range=[5161738,5264167] vsMain=-0.25% + directory-bucket point:uniform@8 mean=3840181/s range=[3721427,3958934] vsMain=-26.52% + directory-bucket-atomic point:uniform@8 mean=4899326/s range=[4802080,4996572] vsMain=-6.25% + directory-bucket-simd point:uniform@8 mean=3923342/s range=[3876651,3970033] vsMain=-24.93% + directory-direct point:uniform@8 mean=5044760/s range=[5005074,5084446] vsMain=-3.47% + main point:uniform@8 mean=5226056/s range=[4934240,5379428] vsMain=+0.00% + cache-invalid-addresses range:uniform:10000@8 mean=3776/s range=[3753,3800] vsMain=+2.59% + directory-bucket range:uniform:10000@8 mean=3627/s range=[3517,3737] vsMain=-1.46% + directory-bucket-atomic range:uniform:10000@8 mean=3521/s range=[3488,3554] vsMain=-4.34% + directory-bucket-simd range:uniform:10000@8 mean=3732/s range=[3688,3776] vsMain=+1.39% + directory-direct range:uniform:10000@8 mean=3686/s range=[3581,3791] vsMain=+0.13% + main range:uniform:10000@8 mean=3681/s range=[3523,3903] vsMain=+0.00% + cache-invalid-addresses range:uniform:1@8 mean=493541/s range=[477968,509115] vsMain=-4.39% + directory-bucket range:uniform:1@8 mean=428708/s range=[427649,429768] vsMain=-16.95% + directory-bucket-atomic range:uniform:1@8 mean=469227/s range=[469028,469426] vsMain=-9.10% + directory-bucket-simd range:uniform:1@8 mean=426481/s range=[416446,436515] vsMain=-17.38% + directory-direct range:uniform:1@8 mean=504860/s range=[495761,513960] vsMain=-2.20% + main range:uniform:1@8 mean=516223/s range=[493451,545448] vsMain=+0.00% + +Branch screen, common: resident200k records,3-second measured phases,8threads;2 candidate samples. +Prefix format uses separate images with identical logical tuples. Warm/point/range values validated. + branch-prefix point:uniform@8 mean=4310843/s range=[4231833,4389853] vsMain=+1.95% + main point:uniform@8 mean=4228331/s range=[4215987,4240675] vsMain=+0.00% + branch-prefix range:uniform:10000@8 mean=3694/s range=[3628,3760] vsMain=-9.52% + main range:uniform:10000@8 mean=4083/s range=[3705,4460] vsMain=+0.00% + branch-prefix range:uniform:1@8 mean=1132655/s range=[1132470,1132839] vsMain=+1.99% + main range:uniform:1@8 mean=1110507/s range=[1109478,1111537] vsMain=+0.00% + +Branch screen, random: resident200k records,3-second measured phases,8threads;2 candidate samples. +Prefix format uses separate images with identical logical tuples. Warm/point/range values validated. + branch-prefix point:uniform@8 mean=4058881/s range=[3966374,4151388] vsMain=-0.73% + main point:uniform@8 mean=4088600/s range=[3948079,4229122] vsMain=+0.00% + branch-prefix range:uniform:10000@8 mean=3411/s range=[3125,3697] vsMain=-5.91% + main range:uniform:10000@8 mean=3626/s range=[3395,3856] vsMain=+0.00% + branch-prefix range:uniform:1@8 mean=1043180/s range=[1025362,1060998] vsMain=-1.90% + main range:uniform:1@8 mean=1063372/s range=[1042880,1083863] vsMain=+0.00% diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/build_benchmarks.py b/benchmarks/results-20261013/main-fc0bc8f7-screen/build_benchmarks.py new file mode 100644 index 000000000..c0e33d2ef --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/build_benchmarks.py @@ -0,0 +1,69 @@ +"""Build identical harness sources against separately compiled branch libraries.""" +import hashlib +import json +import shutil +import subprocess +import sys +from pathlib import Path + +ROOT = Path('/home/rob/projects/splinterdb') +CAMP = ROOT / '.cache/projects-20261011' +OUT = Path(__file__).resolve().parent + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + +profiles = { + 'main': (OUT / 'sources/main', 'build'), + 'log-sync': (OUT / 'sources/log-sync', 'build'), + 'log-async': (CAMP / 'worktrees/log-group-limit', 'build-main-fc0bc8f7'), + 'branch-prefix': (CAMP / 'worktrees/branch-prefix', 'build-main-fc0bc8f7'), + 'cache-invalid-addresses': (CAMP / 'worktrees/cache-invalid-addresses', 'build-main-fc0bc8f7'), +} +for variant in ['direct', 'bucket', 'bucket-simd', 'bucket-atomic']: + profiles['directory-' + variant] = (CAMP / 'worktrees/cache-directory', 'build-main-fc0bc8f7/' + variant) + +sources = OUT / 'harnesses' +sources.mkdir(exist_ok=True) +for name, source in { + 'insert_benchmark': OUT / 'sources/log-sync/benchmarks/insert_benchmark.c', + 'kvbench': CAMP / 'coordination/main-7bb5fab/benchmarks/sources/kvbench.c', + 'prefix_kvbench': CAMP / 'coordination/main-7bb5fab/benchmarks/sources/prefix_kvbench.c', +}.items(): + target = sources / (name + '.c') + if target.exists(): + assert sha(target) == sha(source) + else: + shutil.copyfile(source, target) + +for profile in sys.argv[1:]: + tree, build = profiles[profile] + lib = tree / build / 'release/lib/libsplinterdb.a' + head = json.loads((tree / 'source.json').read_text())['commit'] if (tree / 'source.json').exists() else subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd=tree, text=True).strip() + record = dict(profile=profile, tree=str(tree), head=head, library=str(lib), library_sha256=sha(lib), source_files_sha256={}, binaries={}) + record['library_build_configs'] = {str(p): {'sha256': sha(p), 'text': p.read_text()} for p in sorted(lib.parent.parent.glob('build-config.*'))} + for subdir in ['src', 'include']: + for path in sorted((tree / subdir).rglob('*')): + if path.is_file(): + record['source_files_sha256'][str(path.relative_to(tree))] = sha(path) + binaries = ['insert_benchmark'] if profile.startswith('log-') else ['insert_benchmark', 'kvbench'] + if profile in ['main', 'branch-prefix']: + binaries.append('prefix_kvbench') + for name in binaries: + source = sources / (name + '.c') + exe = OUT / 'bin' / profile / name + exe.parent.mkdir(parents=True, exist_ok=True) + macros = [] + if name == 'insert_benchmark' and not profile.startswith('log-'): + macros += ['-DKVBENCH_NO_LOG_GROUP_LIMIT'] + if name in ['kvbench', 'prefix_kvbench']: + macros += ['-DKVBENCH_CLOSE_HAS_FORCE'] + if name == 'prefix_kvbench': + macros += ['-DKVBENCH_SPACE_MODE'] + if profile == 'branch-prefix': + macros += ['-DKVBENCH_PREFIX_SUPPORT'] + command = ['gcc', '-D_GNU_SOURCE', '-ggdb', '-Wall', '-pthread', '-Werror', '-DXXH_STATIC_LINKING_ONLY', '-fPIC', '-DSPLINTERDB_PLATFORM_DIR=platform_linux', '-O3', '-ffast-math', '-flto', '-march=native', *macros, '-I', str(tree / 'include'), '-I', str(tree / 'src'), '-I', str(tree / 'src/platform_linux'), str(source), str(lib), '-laio', '-lxxhash', '-lm', '-lpthread', '-o', str(exe)] + print('Building', profile, name, flush=True) + subprocess.run(command, check=True) + record['binaries'][name] = dict(command=command, binary=str(exe), binary_sha256=sha(exe), source=str(source), source_sha256=sha(source)) + (OUT / (profile + '-build.json')).write_text(json.dumps(record, indent=2) + '\n') diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/cache-invalid-addresses-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/cache-invalid-addresses-build.json new file mode 100644 index 000000000..4e8405d1b --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/cache-invalid-addresses-build.json @@ -0,0 +1,195 @@ +{ + "profile": "cache-invalid-addresses", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses", + "head": "d70fd5b21fe489d9956f89cbb10abafb00b30191", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "library_sha256": "25d2a1d3e62b987ee8393f2ba50be459564edded1b53c884e8c43ebcfea26adc", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "b4abc6b19ddcc1732367434dede1b91d616ec1340c3273fad803e11ad56416fc", + "src/clockcache.c": "14bfdbb00476f9070b21a4fe0cdb7918e3021e4240201cc516e0a6b671844026", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "fa4361b3aad52f2ba60a9e1964ef765fb5c0efb68d82487afab4ca66cae1999b", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "3e7eb447259e7901b915b52b7545e2d5088475171af1716dd9c849dab4c3d1b9", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "b601c29a5dbcbf5ad5c0859ca87a3e9dc2088a10cad77327ee4f1c7f46c02f91", + "src/shard_log.h": "bde00a5cbe72e72ac7133006796e61f046ae758e8e4667aa610e184ed6ef4fd7", + "src/splinterdb.c": "dfb8412a91370d831fb5181d84a6d6f0c2cb8183866847dca9d7bc2596f08404", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "8a6533879de25f1e448a866c4c03304037e40c6e39e20923c0557e9c87d4fda0" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/cache-invalid-addresses/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/cache-invalid-addresses/insert_benchmark", + "binary_sha256": "620fb64b32c415131013818da0cbb3cc8ebf68af58928fa58893d62a90ecae24", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + }, + "kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/cache-invalid-addresses/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/cache-invalid-addresses/kvbench", + "binary_sha256": "be2fa0a4349ef38ec50215b84d085074df2449c01c84f709df4112cbc2d0053b", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + } + }, + "verified_runtime_commit": "d70fd5b21fe489d9956f89cbb10abafb00b30191", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-invalid-addresses/build-main-fc0bc8f7/release/build-config.fb6bc8eeb8390429253883c09491f5bd": { + "sha256": "28005a5dfc53007e4289bffdad727b9f976ba758f803d78f50558847f9dc29ba", + "text": "BUILD_ROOT=build-main-fc0bc8f7\nMAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-cache-invalid-addresses-fc0-direct-release-build-7vdjrk4f/GMfifo4 -- BUILD_MODE=release BUILD_ROOT=build-main-fc0bc8f7\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-atomic-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-atomic-build.json new file mode 100644 index 000000000..c3d5e59e4 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-atomic-build.json @@ -0,0 +1,196 @@ +{ + "profile": "directory-bucket-atomic", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory", + "head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-atomic/release/lib/libsplinterdb.a", + "library_sha256": "b9d6621ae64de6f5f5d8eca54ee7117e25575c1a26af6057c4c138c2e2cf3b07", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "c10cfa3d9c64f8ce83b8d1cd08266c95a611fd74beacc01332bb12751c5659d4", + "src/clockcache.h": "3ec95ccd705e32d99fd0d4d0ec56eae94354eb3e64b5cf8317d0798b9a6fec75", + "src/clockcache_directory.h": "c359df34d24f7996b25fdcfd32a3d55c628baaa5b6762a0e0c1670f093723856", + "src/core.c": "fa4361b3aad52f2ba60a9e1964ef765fb5c0efb68d82487afab4ca66cae1999b", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "3e7eb447259e7901b915b52b7545e2d5088475171af1716dd9c849dab4c3d1b9", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "b601c29a5dbcbf5ad5c0859ca87a3e9dc2088a10cad77327ee4f1c7f46c02f91", + "src/shard_log.h": "bde00a5cbe72e72ac7133006796e61f046ae758e8e4667aa610e184ed6ef4fd7", + "src/splinterdb.c": "695806f15aad43e774be5d42f67ebe8bd24f4d74ac7038b42ba7ecbf3a9b7878", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "8a6533879de25f1e448a866c4c03304037e40c6e39e20923c0557e9c87d4fda0" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-atomic/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-atomic/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-atomic/insert_benchmark", + "binary_sha256": "f668ce1703699560806813b170b034009553c8108c1806a50fb742b0aa13684a", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + }, + "kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-atomic/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-atomic/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-atomic/kvbench", + "binary_sha256": "70b72a8fa46aedf0859dafab6d01f1db5955c23fe30bb0c4e459623ca6a60948", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + } + }, + "verified_runtime_commit": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-atomic/release/build-config.f646c568accbbdced1f6fe7c5ea4b7db": { + "sha256": "1effb10ec57a83144fcb2d39e9d885bdfdc74412129719f8a0e6f8b61eeb0473", + "text": "BUILD_ROOT=build-main-fc0bc8f7/bucket-atomic\nMAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-cache-directory-fc0-bucket-atomic-release-build-zmww843m/GMfifo5 -- CACHE_DIRECTORY=bucket-atomic BUILD_MODE=release BUILD_ROOT=build-main-fc0bc8f7/bucket-atomic\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DCLOCKCACHE_DIRECTORY=3 -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-build.json new file mode 100644 index 000000000..38b314379 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-build.json @@ -0,0 +1,196 @@ +{ + "profile": "directory-bucket", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory", + "head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket/release/lib/libsplinterdb.a", + "library_sha256": "fe67f4ddb4a7d0f1c741b66737eaad46339f3dab798910610747ff34c0f8a009", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "c10cfa3d9c64f8ce83b8d1cd08266c95a611fd74beacc01332bb12751c5659d4", + "src/clockcache.h": "3ec95ccd705e32d99fd0d4d0ec56eae94354eb3e64b5cf8317d0798b9a6fec75", + "src/clockcache_directory.h": "c359df34d24f7996b25fdcfd32a3d55c628baaa5b6762a0e0c1670f093723856", + "src/core.c": "fa4361b3aad52f2ba60a9e1964ef765fb5c0efb68d82487afab4ca66cae1999b", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "3e7eb447259e7901b915b52b7545e2d5088475171af1716dd9c849dab4c3d1b9", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "b601c29a5dbcbf5ad5c0859ca87a3e9dc2088a10cad77327ee4f1c7f46c02f91", + "src/shard_log.h": "bde00a5cbe72e72ac7133006796e61f046ae758e8e4667aa610e184ed6ef4fd7", + "src/splinterdb.c": "695806f15aad43e774be5d42f67ebe8bd24f4d74ac7038b42ba7ecbf3a9b7878", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "8a6533879de25f1e448a866c4c03304037e40c6e39e20923c0557e9c87d4fda0" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket/insert_benchmark", + "binary_sha256": "65608035c6a424738b34727dc590db873b581c87c28f15b80d085834a4b331d1", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + }, + "kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket/kvbench", + "binary_sha256": "13f5659f74dbf982ac51469ec72efc15320b9cdc01b97ac5bc0104fb7187cb30", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + } + }, + "verified_runtime_commit": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket/release/build-config.3997a6c2385752cdc5f171756fad2929": { + "sha256": "89d459e6327788f92f999c810c7f660a496fb3d5d3af4457d4800c5871c684a6", + "text": "BUILD_ROOT=build-main-fc0bc8f7/bucket\nMAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-cache-directory-fc0-bucket-release-build-8p5qdgt4/GMfifo3213 -- CACHE_DIRECTORY=bucket BUILD_MODE=release BUILD_ROOT=build-main-fc0bc8f7/bucket\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DCLOCKCACHE_DIRECTORY=1 -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-simd-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-simd-build.json new file mode 100644 index 000000000..443ff8abd --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-bucket-simd-build.json @@ -0,0 +1,196 @@ +{ + "profile": "directory-bucket-simd", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory", + "head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-simd/release/lib/libsplinterdb.a", + "library_sha256": "3e5c01572bcdd3a7643b65f390a912602eaf49b55c24b8350b5491e2b5b2ac39", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "c10cfa3d9c64f8ce83b8d1cd08266c95a611fd74beacc01332bb12751c5659d4", + "src/clockcache.h": "3ec95ccd705e32d99fd0d4d0ec56eae94354eb3e64b5cf8317d0798b9a6fec75", + "src/clockcache_directory.h": "c359df34d24f7996b25fdcfd32a3d55c628baaa5b6762a0e0c1670f093723856", + "src/core.c": "fa4361b3aad52f2ba60a9e1964ef765fb5c0efb68d82487afab4ca66cae1999b", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "3e7eb447259e7901b915b52b7545e2d5088475171af1716dd9c849dab4c3d1b9", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "b601c29a5dbcbf5ad5c0859ca87a3e9dc2088a10cad77327ee4f1c7f46c02f91", + "src/shard_log.h": "bde00a5cbe72e72ac7133006796e61f046ae758e8e4667aa610e184ed6ef4fd7", + "src/splinterdb.c": "695806f15aad43e774be5d42f67ebe8bd24f4d74ac7038b42ba7ecbf3a9b7878", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "8a6533879de25f1e448a866c4c03304037e40c6e39e20923c0557e9c87d4fda0" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-simd/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-simd/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-simd/insert_benchmark", + "binary_sha256": "cdac11eae0b5eb59d1d7293158ee7274bcc3d4293810eb692ed3b36e877b5473", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + }, + "kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-simd/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-simd/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-simd/kvbench", + "binary_sha256": "69e24c6955bddd1804f81687e14939d7f7a986e847293a7dd1e16cb26523d499", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + } + }, + "verified_runtime_commit": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/bucket-simd/release/build-config.a59bf85a1951ddf2b5feeff0a2d09160": { + "sha256": "b72065f894fdbac6c28670cdbaea6102adb38df89eaf59681f80a2b7d876b3db", + "text": "BUILD_ROOT=build-main-fc0bc8f7/bucket-simd\nMAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-cache-directory-fc0-bucket-simd-release-build-4_96k23h/GMfifo6442 -- CACHE_DIRECTORY=bucket-simd BUILD_MODE=release BUILD_ROOT=build-main-fc0bc8f7/bucket-simd\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DCLOCKCACHE_DIRECTORY=2 -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-direct-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-direct-build.json new file mode 100644 index 000000000..36f6a5288 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/directory-direct-build.json @@ -0,0 +1,196 @@ +{ + "profile": "directory-direct", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory", + "head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/direct/release/lib/libsplinterdb.a", + "library_sha256": "ed0819b95675d8410608040d675dc84aa8c3aa09a7c5a5ff24ac296d21285887", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "c10cfa3d9c64f8ce83b8d1cd08266c95a611fd74beacc01332bb12751c5659d4", + "src/clockcache.h": "3ec95ccd705e32d99fd0d4d0ec56eae94354eb3e64b5cf8317d0798b9a6fec75", + "src/clockcache_directory.h": "c359df34d24f7996b25fdcfd32a3d55c628baaa5b6762a0e0c1670f093723856", + "src/core.c": "fa4361b3aad52f2ba60a9e1964ef765fb5c0efb68d82487afab4ca66cae1999b", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "3e7eb447259e7901b915b52b7545e2d5088475171af1716dd9c849dab4c3d1b9", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "b601c29a5dbcbf5ad5c0859ca87a3e9dc2088a10cad77327ee4f1c7f46c02f91", + "src/shard_log.h": "bde00a5cbe72e72ac7133006796e61f046ae758e8e4667aa610e184ed6ef4fd7", + "src/splinterdb.c": "695806f15aad43e774be5d42f67ebe8bd24f4d74ac7038b42ba7ecbf3a9b7878", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "8a6533879de25f1e448a866c4c03304037e40c6e39e20923c0557e9c87d4fda0" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/direct/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-direct/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-direct/insert_benchmark", + "binary_sha256": "f89728c129511410bb7148e00c05cb86ee49f69717c0e4e3b50072ba32bb530b", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + }, + "kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/direct/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-direct/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-direct/kvbench", + "binary_sha256": "d2f18f3c5db44c76bc004745ddd4a58f56c4cac066aa8afb00918fb349b5d557", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + } + }, + "verified_runtime_commit": "67f88f289b5b470d9dba27c78d5befdf78352220", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/cache-directory/build-main-fc0bc8f7/direct/release/build-config.77088d0a2752aa266e11e3de924b40ae": { + "sha256": "3afa25f732756e16b22051d4aca33c3dba38102905e5a790799d43f5f48a783d", + "text": "BUILD_ROOT=build-main-fc0bc8f7/direct\nMAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-cache-directory-fc0-direct-release-build-8ic45r5z/GMfifo4 -- CACHE_DIRECTORY=direct BUILD_MODE=release BUILD_ROOT=build-main-fc0bc8f7/direct\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DCLOCKCACHE_DIRECTORY=0 -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/insert_benchmark.c b/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/insert_benchmark.c new file mode 100644 index 000000000..8f5314708 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/insert_benchmark.c @@ -0,0 +1,998 @@ +// Copyright 2026 VMware, Inc. +// SPDX-License-Identifier: Apache-2.0 + +/* Concurrent random insertion and point queries, sampled independently. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splinterdb/default_data_config.h" +#include "splinterdb/splinterdb.h" +#ifndef KVBENCH_NO_TRACE +# include "platform_trace.h" +#endif +#include "platform_threads.h" + +#define GIB (UINT64_C(1) << 30) +#define MAX_WORKERS 64 +#define MAX_RECORD_PART 1024 +#define HIST_SUB_BITS 5 +#define HIST_SUB (1u << HIST_SUB_BITS) +#define HIST_BUCKETS (64 * HIST_SUB) + +typedef struct latency_histogram { + uint64_t buckets[HIST_BUCKETS]; + uint64_t count; + uint64_t sum_ns; + uint64_t max_ns; +} latency_histogram; + +typedef struct options { + const char *filename; + const char *csv; + const char *summary; + const char *trace; + uint64_t records, data_gib, cache_mib, disk_gib, seed, id_base; + uint64_t inserts, queries, memtable_bg, normal_bg, memtable_mib; + uint64_t key_size, value_size, report_ms, seconds, min_free_gib; + uint64_t queue_scale, barrier_ms, target_insert_ops_s; + uint64_t log_group_size_pages; + bool full_query_range, direct, use_log, open_existing; +} options; + +typedef struct benchmark benchmark; +typedef struct worker { + _Alignas(64) atomic_uint_fast64_t completed; + atomic_uint_fast64_t hits, max_ns, response_max_ns, active_since_ns; + atomic_bool done; + pthread_t thread; + benchmark *bench; + uint64_t index; + bool query; + latency_histogram service_latency; + latency_histogram response_latency; +} worker; + +struct benchmark { + options opt; + splinterdb *db; + atomic_bool start, stop; + uint64_t start_ns; + atomic_uint_fast64_t arrival_sequence; + atomic_int error; + worker workers[MAX_WORKERS]; + pthread_t barrier_thread; + atomic_bool barrier_started, barrier_done; + atomic_uint_fast64_t barrier_count, barrier_sum_ns, barrier_max_ns; +}; + +static volatile sig_atomic_t interrupted; + +static void +handle_signal(int signo) +{ + interrupted = signo; +} + +static uint64_t +now_ns(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000 + ts.tv_nsec; +} + +/* A bijection on 64-bit integers, so the random insertion keys are unique. */ +static uint64_t +mix(uint64_t x) +{ + x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9); + x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb); + return x ^ (x >> 31); +} + +static uint64_t +next_random(uint64_t *state) +{ + *state += UINT64_C(0x9e3779b97f4a7c15); + return mix(*state); +} + +static void +make_key(const options *opt, uint64_t id, char *key) +{ + uint64_t x = mix(id + opt->seed); + for (uint64_t i = 0; i < opt->key_size; i++) { + key[i] = (char)(x >> (56 - 8 * (i % 8))); + } +} + +static void +record_max(atomic_uint_fast64_t *slot, uint64_t ns) +{ + uint64_t old = atomic_load_explicit(slot, memory_order_relaxed); + while (old < ns + && !atomic_compare_exchange_weak_explicit( + slot, &old, ns, memory_order_relaxed, memory_order_relaxed)) + { + } +} + +static void +record_latency(worker *w, uint64_t ns) +{ + record_max(&w->max_ns, ns); +} + +static unsigned +histogram_index(uint64_t value) +{ + if (value < HIST_SUB) { + return (unsigned)value; + } + unsigned exponent = 63 - __builtin_clzll(value); + unsigned sub = + (unsigned)((value >> (exponent - HIST_SUB_BITS)) & (HIST_SUB - 1)); + return (exponent - HIST_SUB_BITS + 1) * HIST_SUB + sub; +} + +static uint64_t +histogram_value(unsigned index) +{ + if (index < HIST_SUB) { + return index; + } + unsigned exponent = index / HIST_SUB + HIST_SUB_BITS - 1; + unsigned sub = index % HIST_SUB; + uint64_t low = + (UINT64_C(1) << exponent) | ((uint64_t)sub << (exponent - HIST_SUB_BITS)); + uint64_t width = UINT64_C(1) << (exponent - HIST_SUB_BITS); + return low + width / 2; +} + +static void +histogram_add(latency_histogram *histogram, uint64_t value) +{ + histogram->buckets[histogram_index(value)]++; + histogram->count++; + histogram->sum_ns += value; + histogram->max_ns = MAX(histogram->max_ns, value); +} + +static void +histogram_merge(latency_histogram *result, const latency_histogram *source) +{ + for (unsigned i = 0; i < HIST_BUCKETS; i++) { + result->buckets[i] += source->buckets[i]; + } + result->count += source->count; + result->sum_ns += source->sum_ns; + result->max_ns = MAX(result->max_ns, source->max_ns); +} + +static double +histogram_percentile_ms(const latency_histogram *histogram, double percentile) +{ + if (histogram->count == 0) { + return 0; + } + uint64_t target = (uint64_t)(percentile * histogram->count); + if (target == 0) { + target = 1; + } + uint64_t cumulative = 0; + for (unsigned i = 0; i < HIST_BUCKETS; i++) { + cumulative += histogram->buckets[i]; + if (cumulative >= target) { + return histogram_value(i) / 1e6; + } + } + return histogram->max_ns / 1e6; +} + +static void +wait_until(benchmark *b, uint64_t deadline) +{ + while (!atomic_load_explicit(&b->stop, memory_order_relaxed)) { + uint64_t now = now_ns(); + if (now >= deadline) { + return; + } + uint64_t remaining = deadline - now; + if (remaining > UINT64_C(10000000)) { + remaining = UINT64_C(10000000); + } + struct timespec delay = {.tv_sec = remaining / UINT64_C(1000000000), + .tv_nsec = remaining % UINT64_C(1000000000)}; + nanosleep(&delay, NULL); + } +} + +static void * +run_worker(void *arg) +{ + worker *w = arg; + benchmark *b = w->bench; + const options *o = &b->opt; + char key[MAX_RECORD_PART], value[MAX_RECORD_PART]; + memset(value, 'v', o->value_size); + int rc = platform_register_thread(); + if (rc) { + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + atomic_store(&w->done, true); + return NULL; + } + splinterdb_lookup_result result; + fprintf(stderr, + "worker=%lu kind=%s tid=%lu os_tid=%d\n", + w->index, + w->query ? "query" : "insert", + platform_get_tid(), + gettid()); + if (w->query) { + splinterdb_lookup_result_init( + b->db, &result, SPLINTERDB_LOOKUP_VALUE, sizeof(value), value); + } + while (!atomic_load_explicit(&b->start, memory_order_acquire)) { + struct timespec delay = {.tv_nsec = 1000000}; + nanosleep(&delay, NULL); + } + uint64_t completed = 0, hits = 0; + uint64_t random = o->seed + w->index + 1; + while (!atomic_load_explicit(&b->stop, memory_order_relaxed)) { + uint64_t scheduled = 0; + uint64_t arrival = UINT64_MAX; + if (!w->query && o->target_insert_ops_s != 0) { + arrival = atomic_fetch_add_explicit( + &b->arrival_sequence, 1, memory_order_relaxed); + if (arrival >= o->records) { + break; + } + scheduled = b->start_ns + + (uint64_t)((__uint128_t)arrival * UINT64_C(1000000000) + / o->target_insert_ops_s); + wait_until(b, scheduled); + if (atomic_load_explicit(&b->stop, memory_order_relaxed)) { + break; + } + } + uint64_t id; + if (!w->query) { + uint64_t offset = o->target_insert_ops_s != 0 + ? arrival + : completed * o->inserts + w->index; + if (offset >= o->records) { + break; + } + id = o->id_base + offset; + } else if (o->full_query_range) { + id = o->id_base + next_random(&random) % o->records; + } else { + uint64_t source = next_random(&random) % o->inserts; + uint64_t available = atomic_load_explicit( + &b->workers[source].completed, memory_order_acquire); + if (!available) { + struct timespec delay = {.tv_nsec = 100000}; + nanosleep(&delay, NULL); + continue; + } + id = o->id_base + (next_random(&random) % available) * o->inserts + + source; + } + make_key(o, id, key); + uint64_t start = now_ns(); + atomic_store_explicit(&w->active_since_ns, start, memory_order_relaxed); + if (w->query) { + rc = splinterdb_lookup(b->db, slice_create(o->key_size, key), &result); + if (!rc && splinterdb_lookup_found(&result)) { + hits++; + } + } else { + rc = splinterdb_insert(b->db, + slice_create(o->key_size, key), + slice_create(o->value_size, value), + NULL); + } + uint64_t end = now_ns(); + record_latency(w, end - start); + histogram_add(&w->service_latency, end - start); + if (!w->query) { + uint64_t response = scheduled == 0 ? end - start : end - scheduled; + histogram_add(&w->response_latency, response); + record_max(&w->response_max_ns, response); + } + atomic_store_explicit(&w->active_since_ns, 0, memory_order_relaxed); + if (rc) { + fprintf(stderr, "worker %lu: operation failed: %d\n", w->index, rc); + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + break; + } + completed++; + atomic_store_explicit(&w->hits, hits, memory_order_relaxed); + atomic_store_explicit(&w->completed, completed, memory_order_release); + } + if (w->query) { + splinterdb_lookup_result_deinit(&result); + } + platform_deregister_thread(); + atomic_store(&w->done, true); + return NULL; +} + +/* + * Dedicated thread that calls splinterdb_durable_barrier() on a fixed period, + * independent of insert/query progress. If a barrier call takes longer than + * the period, the next call follows immediately (no attempt to catch up on + * skipped slots). + */ +static void * +run_barrier(void *arg) +{ + benchmark *b = arg; + const options *o = &b->opt; + int rc = platform_register_thread(); + if (rc) { + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + atomic_store(&b->barrier_done, true); + return NULL; + } + while (!atomic_load_explicit(&b->start, memory_order_acquire)) { + struct timespec delay = {.tv_nsec = 1000000}; + nanosleep(&delay, NULL); + } + uint64_t period_ns = o->barrier_ms * UINT64_C(1000000); + uint64_t next = now_ns() + period_ns; + while (!atomic_load_explicit(&b->stop, memory_order_relaxed)) { + uint64_t now = now_ns(); + if (now < next) { + uint64_t remaining = next - now; + struct timespec delay = {.tv_sec = remaining / 1000000000, + .tv_nsec = remaining % 1000000000}; + nanosleep(&delay, NULL); + continue; + } + uint64_t start = now_ns(); +#ifdef KVBENCH_NO_DURABLE_BARRIER + rc = ENOTSUP; +#else + rc = splinterdb_durable_barrier(b->db, SPLINTERDB_NOTIFICATION_BLOCKING); +#endif + uint64_t elapsed = now_ns() - start; + if (rc) { + fprintf(stderr, "barrier: durable_barrier failed: %d\n", rc); + atomic_store(&b->error, rc); + atomic_store(&b->stop, true); + break; + } + atomic_fetch_add_explicit(&b->barrier_count, 1, memory_order_relaxed); + atomic_fetch_add_explicit( + &b->barrier_sum_ns, elapsed, memory_order_relaxed); + record_max(&b->barrier_max_ns, elapsed); + next += period_ns; + } + platform_deregister_thread(); + atomic_store(&b->barrier_done, true); + return NULL; +} + +static void +usage(const char *name) +{ + fprintf( + stderr, + "Usage: %s --db NEW_IMAGE --csv NEW_CSV [options]\n" + " --open open an existing image instead of creating one\n" + " --id-base N first logical id inserted (default 0)\n" + " --data-gib N logical key+value GiB (default 60)\n" + " --records N override logical data target\n" + " --cache-mib N default 3072\n" + " --disk-gib N image capacity (default 512; grows lazily)\n" + " --inserters N default 8\n" + " --readers N default 8\n" + " --memtable-bg N default 1\n" + " --normal-bg N default 4\n" + " --memtable-mib N default 24\n" + " --key-size N default 16, minimum 8\n" + " --value-size N default 16\n" + " --query-range inserted|all (default inserted)\n" + " --queue-scale N foreground task threshold (default 100)\n" + " --report-ms N default 1000\n" + " --seconds N optional time limit (0 = no limit)\n" + " --target-insert-ops-s N aggregate open-loop arrival rate; " + "requires --seconds (default 0 = closed loop)\n" + " --summary NEW_CSV write aggregate latency percentiles\n" + " --min-free-gib N stop before filesystem fills (default 8)\n" + " --seed N default 1\n" + " --barrier-ms N call splinterdb_durable_barrier from a " + "dedicated thread every N ms (default 0 = disabled)\n" + " --log-group-size-pages N automatic durability threshold " + "(0 = default, UINT64_MAX = disabled)\n" + " --trace NEW_CSV trace internal tasks and waits (optional)\n" + " --direct use O_DIRECT (default buffered I/O)\n" + " --no-log disable WAL (default enabled)\n" + "Automatic checkpoints are disabled. Existing files are refused.\n" + "Load measurements exclude create, final drain and close.\n", + name); +} + +static bool +parse_number(const char *s, uint64_t *out) +{ + char *end; + errno = 0; + unsigned long long value = strtoull(s, &end, 10); + if (errno || s == end || *end || *s == '-') { + return false; + } + *out = value; + return true; +} + +static bool +parse_options(int argc, char **argv, options *o) +{ + *o = (options){.data_gib = 60, + .cache_mib = 3072, + .disk_gib = 512, + .seed = 1, + .inserts = 8, + .queries = 8, + .memtable_bg = 1, + .normal_bg = 4, + .memtable_mib = 24, + .key_size = 16, + .value_size = 16, + .report_ms = 1000, + .min_free_gib = 8, + .queue_scale = 100, + .use_log = true}; + for (int i = 1; i < argc; i++) { + if (!strcmp(argv[i], "--direct")) { + o->direct = true; + continue; + } + if (!strcmp(argv[i], "--no-log")) { + o->use_log = false; + continue; + } + if (!strcmp(argv[i], "--open")) { + o->open_existing = true; + continue; + } + if (i + 1 >= argc) { + return false; + } + const char *name = argv[i++], *value = argv[i]; + if (!strcmp(name, "--db")) { + o->filename = value; + continue; + } + if (!strcmp(name, "--csv")) { + o->csv = value; + continue; + } + if (!strcmp(name, "--summary")) { + o->summary = value; + continue; + } + if (!strcmp(name, "--trace")) { + o->trace = value; + continue; + } + if (!strcmp(name, "--query-range")) { + if (strcmp(value, "inserted") && strcmp(value, "all")) { + return false; + } + o->full_query_range = !strcmp(value, "all"); + continue; + } + struct { + const char *name; + uint64_t *value; + } numbers[] = { + {"--data-gib", &o->data_gib}, + {"--records", &o->records}, + {"--cache-mib", &o->cache_mib}, + {"--disk-gib", &o->disk_gib}, + {"--inserters", &o->inserts}, + {"--readers", &o->queries}, + {"--memtable-bg", &o->memtable_bg}, + {"--normal-bg", &o->normal_bg}, + {"--memtable-mib", &o->memtable_mib}, + {"--key-size", &o->key_size}, + {"--value-size", &o->value_size}, + {"--report-ms", &o->report_ms}, + {"--seconds", &o->seconds}, + {"--min-free-gib", &o->min_free_gib}, + {"--seed", &o->seed}, + {"--id-base", &o->id_base}, + {"--queue-scale", &o->queue_scale}, + {"--barrier-ms", &o->barrier_ms}, + {"--log-group-size-pages", &o->log_group_size_pages}, + {"--target-insert-ops-s", &o->target_insert_ops_s}, + }; + bool found = false; + for (size_t j = 0; j < sizeof(numbers) / sizeof(numbers[0]); j++) { + if (!strcmp(name, numbers[j].name)) { + if (!parse_number(value, numbers[j].value)) { + return false; + } + found = true; + break; + } + } + if (!found) { + return false; + } + } + if (!o->filename || !o->csv || !o->inserts || o->inserts > MAX_WORKERS + || o->queries > MAX_WORKERS - o->inserts || o->key_size < 8 + || o->key_size > MAX_RECORD_PART || o->value_size > MAX_RECORD_PART + || !o->report_ms || o->report_ms > 60000 || !o->cache_mib + || o->cache_mib > UINT64_MAX / (1 << 20) || !o->disk_gib + || o->disk_gib > INT64_MAX / GIB || o->data_gib > UINT64_MAX / GIB + || o->min_free_gib > UINT64_MAX / GIB || !o->memtable_mib + || o->memtable_mib > UINT64_MAX / (1 << 20) || o->memtable_bg > 32 + || o->normal_bg > 32 + || o->inserts + o->queries + o->memtable_bg + o->normal_bg + 1 + > MAX_WORKERS + || o->seconds > UINT64_MAX / 1000000000 + || o->barrier_ms > UINT64_MAX / 1000000 + || (o->target_insert_ops_s != 0 && (o->seconds == 0 || o->queries != 0))) + { + return false; + } +#ifdef KVBENCH_NO_DURABLE_BARRIER + if (o->barrier_ms != 0) { + return false; + } +#endif +#ifdef KVBENCH_NO_TRACE + if (o->trace != NULL) { + return false; + } +#endif + if (!o->records) { + o->records = o->data_gib * GIB / (o->key_size + o->value_size); + } + return o->records > 0 && o->records <= UINT64_MAX / MAX_WORKERS + && o->records <= UINT64_MAX / (o->key_size + o->value_size) + && o->id_base <= UINT64_MAX - o->records; +} + +static void +process_io(uint64_t *reads, uint64_t *writes) +{ + *reads = *writes = 0; + FILE *file = fopen("/proc/self/io", "r"); + if (!file) { + return; + } + char name[64]; + uint64_t value; + while (fscanf(file, "%63s %" SCNu64, name, &value) == 2) { + if (!strcmp(name, "read_bytes:")) { + *reads = value; + } + if (!strcmp(name, "write_bytes:")) { + *writes = value; + } + } + fclose(file); +} + +static int +write_summary(const benchmark *b, uint64_t inserted, double elapsed_s) +{ + const options *o = &b->opt; + if (o->summary == NULL) { + return 0; + } + + latency_histogram insert_service = {0}, insert_response = {0}; + latency_histogram query_service = {0}; + for (uint64_t i = 0; i < o->inserts + o->queries; i++) { + if (b->workers[i].query) { + histogram_merge(&query_service, &b->workers[i].service_latency); + } else { + histogram_merge(&insert_service, &b->workers[i].service_latency); + histogram_merge(&insert_response, &b->workers[i].response_latency); + } + } + + FILE *summary = fopen(o->summary, "wx"); + if (summary == NULL) { + return errno; + } + fprintf(summary, + "target_insert_ops_s,achieved_insert_ops_s,elapsed_s,inserted," + "insert_service_mean_ms,insert_service_p50_ms,insert_service_p99_ms," + "insert_service_p999_ms,insert_service_max_ms," + "insert_response_mean_ms,insert_response_p50_ms," + "insert_response_p99_ms,insert_response_p999_ms," + "insert_response_max_ms,query_service_mean_ms,query_service_p99_ms," + "query_service_max_ms\n"); + fprintf( + summary, + "%lu,%.6f,%.6f,%lu,%.6f,%.6f,%.6f,%.6f,%.6f," + "%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f,%.6f\n", + o->target_insert_ops_s, + elapsed_s == 0 ? 0 : inserted / elapsed_s, + elapsed_s, + inserted, + insert_service.count ? insert_service.sum_ns / 1e6 / insert_service.count + : 0, + histogram_percentile_ms(&insert_service, 0.50), + histogram_percentile_ms(&insert_service, 0.99), + histogram_percentile_ms(&insert_service, 0.999), + insert_service.max_ns / 1e6, + insert_response.count + ? insert_response.sum_ns / 1e6 / insert_response.count + : 0, + histogram_percentile_ms(&insert_response, 0.50), + histogram_percentile_ms(&insert_response, 0.99), + histogram_percentile_ms(&insert_response, 0.999), + insert_response.max_ns / 1e6, + query_service.count ? query_service.sum_ns / 1e6 / query_service.count + : 0, + histogram_percentile_ms(&query_service, 0.99), + query_service.max_ns / 1e6); + int rc = ferror(summary) ? EIO : 0; + if (fclose(summary) != 0 && rc == 0) { + rc = errno; + } + return rc; +} + +int +main(int argc, char **argv) +{ + benchmark b = {0}; + if (argc == 2 && !strcmp(argv[1], "--help")) { + usage(argv[0]); + return 0; + } + if (!parse_options(argc, argv, &b.opt)) { + usage(argv[0]); + return 2; + } + const options *o = &b.opt; + if (o->trace) { +#ifdef KVBENCH_NO_TRACE + return 2; +#else + int trace_rc = platform_trace_open(o->trace); + if (trace_rc) { + fprintf(stderr, "trace open failed: %s\n", strerror(trace_rc)); + return 1; + } +#endif + } + FILE *csv = fopen(o->csv, "wx"); + if (!csv) { + perror(o->csv); + return 1; + } + int fd = open(o->filename, + O_RDWR | O_CLOEXEC | (o->open_existing ? 0 : O_CREAT | O_EXCL), + 0600); + if (fd < 0) { + perror(o->filename); + fclose(csv); + return 1; + } + struct statvfs space; + if (fstatvfs(fd, &space) != 0 + || (uint64_t)space.f_bavail * space.f_frsize < o->min_free_gib * GIB) + { + fprintf(stderr, "Insufficient free space\n"); + close(fd); + fclose(csv); + return 1; + } + + data_config data_cfg; + default_data_config_init(&data_cfg); + splinterdb_config cfg = {.filename = o->filename, + .disk_size = o->disk_gib * GIB, + .cache_size = o->cache_mib * (1 << 20), + .data_cfg = &data_cfg, + .io_flags = O_RDWR | (o->direct ? O_DIRECT : 0), + .num_memtable_bg_threads = o->memtable_bg, + .num_normal_bg_threads = o->normal_bg, + .memtable_capacity = o->memtable_mib * (1 << 20), + .queue_scale_percent = o->queue_scale, + .use_log = o->use_log, + .checkpoint_log_size_bytes = UINT64_MAX, + .use_stats = true}; +#ifndef KVBENCH_NO_LOG_GROUP_LIMIT + cfg.log_group_size_pages = o->log_group_size_pages; +#else + if (o->log_group_size_pages != 0) { + fprintf(stderr, "This build has no automatic log-group limit\n"); + return 1; + } +#endif + platform_set_log_streams(stderr, stderr); + fprintf( + stderr, + "version=%s records=%lu key=%lu value=%lu cache_mib=%lu " + "disk_gib=%lu inserters=%lu readers=%lu memtable_bg=%lu normal_bg=%lu " + "memtable_mib=%lu queue_scale=%lu log=%d checkpoints=disabled " + "direct=%d query_range=%s seed=%lu report_ms=%lu barrier_ms=%lu " + "target_insert_ops_s=%lu id_base=%lu mode=%s\n", + splinterdb_get_version(), + o->records, + o->key_size, + o->value_size, + o->cache_mib, + o->disk_gib, + o->inserts, + o->queries, + o->memtable_bg, + o->normal_bg, + o->memtable_mib, + o->queue_scale, + o->use_log, + o->direct, + o->full_query_range ? "all" : "inserted", + o->seed, + o->report_ms, + o->barrier_ms, + o->target_insert_ops_s, + o->id_base, + o->open_existing ? "open" : "create"); + int rc = o->open_existing ? splinterdb_open(&cfg, &b.db) + : splinterdb_create(&cfg, &b.db); + if (rc) { + fprintf( + stderr, "%s failed: %d\n", o->open_existing ? "open" : "create", rc); + close(fd); + fclose(csv); + return 1; + } + + signal(SIGINT, handle_signal); + signal(SIGTERM, handle_signal); + uint64_t started = 0; + for (uint64_t i = 0; i < o->inserts + o->queries; i++) { + worker *w = &b.workers[i]; + w->bench = &b; + w->index = i; + w->query = i >= o->inserts; + rc = pthread_create(&w->thread, NULL, run_worker, w); + if (rc) { + atomic_store(&b.error, rc); + atomic_store(&b.stop, true); + break; + } + started++; + } + if (o->barrier_ms && !atomic_load(&b.stop)) { + rc = pthread_create(&b.barrier_thread, NULL, run_barrier, &b); + if (rc) { + atomic_store(&b.error, rc); + atomic_store(&b.stop, true); + } else { + atomic_store(&b.barrier_started, true); + } + } + fprintf( + csv, + "elapsed_s,interval_s,inserted,logical_gib,insert_ops_s,query_ops_s," + "hit_pct,insert_max_ms,query_max_ms,active_max_ms,cpu_cores,max_rss_mib," + "read_mib_s,write_mib_s,image_gib,free_gib,inserters_running," + "barrier_ops_s,barrier_avg_ms,barrier_max_ms,target_insert_ops_s," + "offered_insert_ops_s,insert_backlog,response_max_ms"); + for (uint64_t i = 0; i < started; i++) { + fprintf(csv, ",%s%lu_ops_s", b.workers[i].query ? "q" : "i", i); + } + fputc('\n', csv); + fflush(csv); + uint64_t prev_completed[MAX_WORKERS] = {0}, prev_hits = 0; + uint64_t prev_barrier_count = 0, prev_barrier_sum_ns = 0; + uint64_t prev_read, prev_write; + process_io(&prev_read, &prev_write); + struct rusage usage_now; + getrusage(RUSAGE_SELF, &usage_now); + double prev_cpu = + usage_now.ru_utime.tv_sec + usage_now.ru_utime.tv_usec / 1e6 + + usage_now.ru_stime.tv_sec + usage_now.ru_stime.tv_usec / 1e6; + uint64_t start = now_ns(), previous = start; + b.start_ns = start; + fprintf( + stderr, "start_monotonic_ns=%lu main_address=%p\n", start, (void *)main); + atomic_store_explicit(&b.start, true, memory_order_release); + const char *reason = "complete"; + uint64_t inserted = 0; + while (true) { + struct timespec delay = {.tv_sec = o->report_ms / 1000, + .tv_nsec = (o->report_ms % 1000) * 1000000}; + nanosleep(&delay, NULL); + uint64_t now = now_ns(), delta_insert = 0, delta_query = 0, hits = 0; + uint64_t insert_max = 0, query_max = 0, response_max = 0, active_max = 0; + uint64_t inserters_running = 0; + double rates[MAX_WORKERS] = {0}; + double elapsed = (now - start) / 1e9, interval = (now - previous) / 1e9; + bool all_inserts_done = true; + inserted = 0; + for (uint64_t i = 0; i < started; i++) { + worker *w = &b.workers[i]; + uint64_t completed = atomic_load(&w->completed); + uint64_t count = completed - prev_completed[i]; + prev_completed[i] = completed; + rates[i] = count / interval; + uint64_t latency = atomic_exchange(&w->max_ns, 0); + uint64_t active = atomic_load(&w->active_since_ns); + if (active && active < now && active_max < now - active) { + active_max = now - active; + } + if (w->query) { + delta_query += count; + hits += atomic_load(&w->hits); + if (query_max < latency) { + query_max = latency; + } + } else { + inserted += completed; + delta_insert += count; + if (insert_max < latency) { + insert_max = latency; + } + uint64_t response = atomic_exchange(&w->response_max_ns, 0); + if (response_max < response) { + response_max = response; + } + if (!atomic_load(&w->done)) { + inserters_running++; + all_inserts_done = false; + } + } + } + uint64_t reads, writes; + process_io(&reads, &writes); + getrusage(RUSAGE_SELF, &usage_now); + double cpu = usage_now.ru_utime.tv_sec + usage_now.ru_utime.tv_usec / 1e6 + + usage_now.ru_stime.tv_sec + + usage_now.ru_stime.tv_usec / 1e6; + struct stat st = {0}; + if (fstat(fd, &st) != 0 || fstatvfs(fd, &space) != 0) { + atomic_store(&b.error, errno); + atomic_store(&b.stop, true); + } + double free_gib = (double)space.f_bavail * space.f_frsize / GIB; + uint64_t barrier_count = atomic_load(&b.barrier_count); + uint64_t barrier_sum_ns = atomic_load(&b.barrier_sum_ns); + uint64_t barrier_max_ns = atomic_exchange(&b.barrier_max_ns, 0); + uint64_t delta_barrier_count = barrier_count - prev_barrier_count; + uint64_t delta_barrier_sum = barrier_sum_ns - prev_barrier_sum_ns; + uint64_t offered = inserted; + if (o->target_insert_ops_s != 0) { + __uint128_t possible = (__uint128_t)(now - start) + * o->target_insert_ops_s / UINT64_C(1000000000); + offered = possible > o->records ? o->records : (uint64_t)possible; + } + fprintf(csv, + "%.6f,%.6f,%lu,%.6f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.3f," + "%.3f,%.6f,%.3f,%lu,%.3f,%.3f,%.3f,%lu,%.3f,%lu,%.3f", + elapsed, + interval, + inserted, + (double)inserted * (o->key_size + o->value_size) / GIB, + delta_insert / interval, + delta_query / interval, + delta_query ? (hits - prev_hits) * 100.0 / delta_query : 0, + insert_max / 1e6, + query_max / 1e6, + active_max / 1e6, + (cpu - prev_cpu) / interval, + usage_now.ru_maxrss / 1024.0, + (reads - prev_read) / (1048576.0 * interval), + (writes - prev_write) / (1048576.0 * interval), + (double)st.st_size / GIB, + free_gib, + inserters_running, + delta_barrier_count / interval, + delta_barrier_count + ? delta_barrier_sum / 1e6 / delta_barrier_count + : 0, + barrier_max_ns / 1e6, + o->target_insert_ops_s, + o->target_insert_ops_s ? (double)o->target_insert_ops_s : 0, + offered > inserted ? offered - inserted : 0, + response_max / 1e6); + for (uint64_t i = 0; i < started; i++) { + fprintf(csv, ",%.3f", rates[i]); + } + fputc('\n', csv); + if (fflush(csv) != 0) { + atomic_store(&b.error, errno); + atomic_store(&b.stop, true); + } + prev_hits = hits; + prev_read = reads; + prev_write = writes; + prev_cpu = cpu; + prev_barrier_count = barrier_count; + prev_barrier_sum_ns = barrier_sum_ns; + previous = now; + if (all_inserts_done || atomic_load(&b.stop)) { + break; + } + if (interrupted) { + reason = "signal"; + break; + } + if (o->seconds && elapsed >= o->seconds) { + reason = "time_limit"; + break; + } + if (free_gib < o->min_free_gib) { + reason = "free_space_limit"; + break; + } + } + atomic_store(&b.stop, true); + for (uint64_t i = 0; i < started; i++) { + pthread_join(b.workers[i].thread, NULL); + } + if (atomic_load(&b.barrier_started)) { + pthread_join(b.barrier_thread, NULL); + } + inserted = 0; + for (uint64_t i = 0; i < o->inserts; i++) { + inserted += atomic_load(&b.workers[i].completed); + } + double elapsed_s = (now_ns() - start) / 1e9; + fprintf(stderr, + "load_end reason=%s inserted=%lu elapsed_s=%.3f error=%d " + "barrier_count=%lu barrier_avg_ms=%.3f barrier_max_ms=%.3f\n", + reason, + inserted, + elapsed_s, + atomic_load(&b.error), + atomic_load(&b.barrier_count), + atomic_load(&b.barrier_count) ? atomic_load(&b.barrier_sum_ns) / 1e6 + / atomic_load(&b.barrier_count) + : 0, + atomic_load(&b.barrier_max_ns) / 1e6); + int summary_rc = write_summary(&b, inserted, elapsed_s); + if (summary_rc != 0) { + fprintf(stderr, "summary write failed: %s\n", strerror(summary_rc)); + } + uint64_t close_start = now_ns(); +#ifdef KVBENCH_LEGACY_CLOSE + splinterdb_close(&b.db); + rc = 0; +#else + rc = splinterdb_close(&b.db, false); +#endif + fprintf( + stderr, "close_s=%.3f close_rc=%d\n", (now_ns() - close_start) / 1e9, rc); + close(fd); + fclose(csv); + int trace_rc = 0; +#ifndef KVBENCH_NO_TRACE + trace_rc = platform_trace_close(); +#endif + bool incomplete = !o->seconds && inserted < o->records; + return rc || trace_rc || summary_rc || atomic_load(&b.error) || incomplete + ? 1 + : 0; +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/kvbench.c b/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/kvbench.c new file mode 100644 index 000000000..9b91f4ef9 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/kvbench.c @@ -0,0 +1,1707 @@ +// kvbench.c -- SplinterDB public-API benchmark used to compare two versions. +// +// Uses only splinterdb/splinterdb.h + splinterdb/default_data_config.h + libc, +// so the same source builds against versions whose internals differ. The one +// public-API difference handled here is splinterdb_close(): +// -DKVBENCH_CLOSE_HAS_FORCE => int splinterdb_close(splinterdb **, bool32) +// otherwise => void splinterdb_close(splinterdb **) +// +// Key scheme: logical id in [0,N). Present key = 8-byte big-endian(2*id) +// followed by 16 bytes of fixed padding (24 bytes total), so memcmp order == +// id order. Absent ("negative") keys use 2*id+1, interleaved with present +// keys. Value = 100 bytes: id (LE u64), generation (LE u64), filler. +// +// Each invocation: create/open the DB, run the listed phases in order, close. +// Phase syntax (optional "@T" overrides the thread count): +// load:random | load:seq fixed-count insert of all N ids, then close +// (close timed separately as "drain") +// warm parallel full scan; verifies every id once +// point:uniform|zipf|seq|neg fixed-duration lookups +// range:uniform|zipf:L fixed-duration forward range queries +// ow:uniform|zipf fixed-duration overwrites (insert existing) +// One CSV row per phase is appended to --csv. + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splinterdb/default_data_config.h" +#include "splinterdb/splinterdb.h" + +#define KEY_SIZE 24 +#define VALUE_SIZE 100 +#define MAX_PHASES 64 +#define MAX_WORKERS 32 + +static const char KEY_PAD[16] = "kvbench-padding!"; + +/* ------------------------------------------------------------------------ */ +/* Time, RNG, permutations, zipf */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +now_ns(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000ull + ts.tv_nsec; +} + +/* Bijective 64-bit mixer (splitmix64 finalizer). */ +static inline uint64_t +mix(uint64_t x) +{ + x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9); + x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb); + return x ^ (x >> 31); +} + +static inline uint64_t +rng_next(uint64_t *s) +{ + *s += UINT64_C(0x9e3779b97f4a7c15); + return mix(*s); +} + +static inline double +rng_unit(uint64_t *s) +{ + return (double)(rng_next(s) >> 11) * 0x1.0p-53; +} + +/* + * Pseudo-random bijection on [0,n): a 4-round balanced Feistel network over + * 2*half bits (2^(2*half) >= n), with cycle-walking to stay inside [0,n). + */ +typedef struct { + uint64_t n; + unsigned half; + uint64_t mask; + uint64_t keys[4]; +} perm_t; + +static void +perm_init(perm_t *p, uint64_t n, uint64_t seed) +{ + unsigned bits = 1; + while (bits < 64 && (UINT64_C(1) << bits) < n) { + bits++; + } + p->n = n; + p->half = (bits + 1) / 2; + if (p->half < 1) { + p->half = 1; + } + p->mask = (UINT64_C(1) << p->half) - 1; + for (int r = 0; r < 4; r++) { + p->keys[r] = mix(seed * UINT64_C(0x632be59bd9b4e019) + r + 1); + } +} + +static inline uint64_t +feistel(const perm_t *p, uint64_t x) +{ + uint64_t l = x >> p->half, r = x & p->mask; + for (int i = 0; i < 4; i++) { + uint64_t t = l ^ (mix(r ^ p->keys[i]) & p->mask); + l = r; + r = t; + } + return (l << p->half) | r; +} + +static inline uint64_t +perm_apply(const perm_t *p, uint64_t i) +{ + uint64_t x = i; + do { + x = feistel(p, x); + } while (x >= p->n); + return x; +} + +/* YCSB-style zipfian over ranks [0,n). */ +typedef struct { + uint64_t n; + double theta, zetan, zeta2, alpha, eta, half_pow_theta; +} zipf_t; + +static double +zeta_sum(uint64_t n, double theta) +{ + uint64_t m = n < 2000000 ? n : 2000000; + double s = 0; + for (uint64_t i = 1; i <= m; i++) { + s += pow((double)i, -theta); + } + if (n > m) { + /* Euler-Maclaurin tail: sum_{k=m+1}^{n} k^-t */ + s += (pow((double)n, 1 - theta) - pow((double)m, 1 - theta)) / (1 - theta) + + 0.5 * (pow((double)n, -theta) - pow((double)m, -theta)); + } + return s; +} + +static void +zipf_init(zipf_t *z, uint64_t n, double theta) +{ + z->n = n; + z->theta = theta; + z->zetan = zeta_sum(n, theta); + z->zeta2 = 1.0 + pow(0.5, theta); + z->alpha = 1.0 / (1.0 - theta); + z->eta = + (1.0 - pow(2.0 / (double)n, 1.0 - theta)) / (1.0 - z->zeta2 / z->zetan); + z->half_pow_theta = pow(0.5, theta); +} + +static inline uint64_t +zipf_next(const zipf_t *z, uint64_t *rng) +{ + double u = rng_unit(rng); + double uz = u * z->zetan; + if (uz < 1.0) { + return 0; + } + if (uz < 1.0 + z->half_pow_theta) { + return 1; + } + uint64_t r = + (uint64_t)((double)z->n * pow(z->eta * u - z->eta + 1.0, z->alpha)); + return r >= z->n ? z->n - 1 : r; +} + +/* ------------------------------------------------------------------------ */ +/* Histogram: log2 buckets with 32 linear sub-buckets (~3% resolution) */ +/* ------------------------------------------------------------------------ */ + +#define HSUB_BITS 5 +#define HSUB (1u << HSUB_BITS) +#define HBUCKETS (64 * HSUB) + +typedef struct { + uint64_t b[HBUCKETS]; + uint64_t count, sum, max; +} hist_t; + +static inline unsigned +hidx(uint64_t v) +{ + if (v < HSUB) { + return (unsigned)v; + } + unsigned e = 63 - __builtin_clzll(v); + unsigned sub = (unsigned)((v >> (e - HSUB_BITS)) & (HSUB - 1)); + return (e - HSUB_BITS + 1) * HSUB + sub; +} + +static inline uint64_t +hval(unsigned idx) +{ + if (idx < HSUB) { + return idx; + } + unsigned e = idx / HSUB + HSUB_BITS - 1; + unsigned sub = idx % HSUB; + uint64_t lo = (UINT64_C(1) << e) | ((uint64_t)sub << (e - HSUB_BITS)); + uint64_t width = UINT64_C(1) << (e - HSUB_BITS); + return lo + width / 2; +} + +static inline void +hist_add(hist_t *h, uint64_t v) +{ + h->b[hidx(v)]++; + h->count++; + h->sum += v; + if (v > h->max) { + h->max = v; + } +} + +static void +hist_merge(hist_t *dst, const hist_t *src) +{ + for (unsigned i = 0; i < HBUCKETS; i++) { + dst->b[i] += src->b[i]; + } + dst->count += src->count; + dst->sum += src->sum; + if (src->max > dst->max) { + dst->max = src->max; + } +} + +static double +hist_pct_us(const hist_t *h, double p) +{ + if (!h->count) { + return NAN; + } + uint64_t rank = (uint64_t)ceil(p * (double)h->count); + if (rank < 1) { + rank = 1; + } + uint64_t acc = 0; + for (unsigned i = 0; i < HBUCKETS; i++) { + acc += h->b[i]; + if (acc >= rank) { + uint64_t v = hval(i); + return (double)(v > h->max ? h->max : v) / 1e3; + } + } + return (double)h->max / 1e3; +} + +static double +hist_mean_us(const hist_t *h) +{ + return h->count ? (double)h->sum / (double)h->count / 1e3 : NAN; +} + +/* ------------------------------------------------------------------------ */ +/* Options / global state */ +/* ------------------------------------------------------------------------ */ + +enum phase_kind { PH_LOAD, PH_WARM, PH_POINT, PH_RANGE, PH_OW }; +enum dist { D_UNIFORM, D_ZIPF, D_SEQ, D_NEG, D_RANDOM }; + +typedef struct { + char name[64]; + enum phase_kind kind; + enum dist dist; + uint64_t L; + int threads; +} phase_t; + +typedef struct { + const char *db, *csv, *hang_dir; + const char *vtag, *stag, *otag; + int rep; + bool create; + uint64_t n, cache_mib, disk_gib, memtable_mib; + int use_log, threads, mt_bg, normal_bg; + double secs, warmup; + uint64_t sabotage; + uint64_t hang_secs; + uint64_t seed; + int nphases; + phase_t phases[MAX_PHASES]; +} options; + +static options opt; +static splinterdb *kvs; +static data_config data_cfg; +static perm_t load_perm, zipf_perm; +static zipf_t zipf; +static uint64_t generation; /* value generation for overwrites */ + +enum { ST_WAIT = 0, ST_WARMUP = 1, ST_MEASURE = 2, ST_STOP = 3 }; +static _Atomic int run_state; +static _Atomic uint64_t seq_counter; + +/* Watchdog */ +enum { WD_IDLE, WD_OPS, WD_OPENCLOSE }; +static _Atomic int wd_mode; +static _Atomic uint64_t wd_mode_since_ns; +static const char *wd_what = ""; + +typedef struct worker { + pthread_t th; + int idx; + const phase_t *ph; + hist_t lat; + hist_t startup; + uint64_t ops, tuples, pt_ns, pt_div, deinit_ns, deinit_n; + uint64_t violations, errors, notfound, found; + uint64_t rng; + uint64_t measure_rng; + bool measure_rng_captured; + _Atomic uint64_t progress; + char first_violation[256]; +} worker_t; + +static worker_t *workers; +static int nworkers; + +/* ------------------------------------------------------------------------ */ +/* Keys / values */ +/* ------------------------------------------------------------------------ */ + +static inline void +make_key(uint64_t k, char *key) +{ + for (int i = 0; i < 8; i++) { + key[i] = (char)(k >> (56 - 8 * i)); + } + memcpy(key + 8, KEY_PAD, 16); +} + +static inline bool +decode_key(slice s, uint64_t *k) +{ + if (slice_length(s) != KEY_SIZE) { + return false; + } + const unsigned char *p = slice_data(s); + uint64_t x = 0; + for (int i = 0; i < 8; i++) { + x = (x << 8) | p[i]; + } + *k = x; + return memcmp(p + 8, KEY_PAD, 16) == 0; +} + +static inline void +make_value(uint64_t id, uint64_t gen, char *val) +{ + memcpy(val, &id, 8); + memcpy(val + 8, &gen, 8); + memset(val + 16, 'v', VALUE_SIZE - 16); +} + +static inline bool +value_id_ok(slice v, uint64_t id) +{ + if (slice_length(v) != VALUE_SIZE) { + return false; + } + uint64_t got; + memcpy(&got, slice_data(v), 8); + return got == id; +} + +static inline bool +value_generation_ok(slice v, uint64_t id, uint64_t expected_generation) +{ + if (!value_id_ok(v, id)) { + return false; + } + uint64_t got_generation; + memcpy(&got_generation, (const char *)slice_data(v) + 8, 8); + return got_generation == expected_generation; +} + +static void +violation(worker_t *w, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); + +static void +violation(worker_t *w, const char *fmt, ...) +{ + w->violations++; + if (w->violations <= 3) { + char buf[256]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + if (w->violations == 1) { + snprintf(w->first_violation, sizeof(w->first_violation), "%s", buf); + } + fprintf(stderr, "VIOLATION [thread %d]: %s\n", w->idx, buf); + } +} + +/* ------------------------------------------------------------------------ */ +/* Process metrics */ +/* ------------------------------------------------------------------------ */ + +typedef struct { + uint64_t t_ns; + double cpu_s; + uint64_t rd, wr; + uint64_t swpin, swpout; + uint64_t majflt; +} snap_t; + +static void +proc_io(uint64_t *rd, uint64_t *wr) +{ + *rd = *wr = 0; + FILE *f = fopen("/proc/self/io", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "read_bytes:")) { + *rd = v; + } else if (!strcmp(name, "write_bytes:")) { + *wr = v; + } + } + fclose(f); +} + +static void +vm_swap(uint64_t *in, uint64_t *out) +{ + *in = *out = 0; + FILE *f = fopen("/proc/vmstat", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "pswpin")) { + *in = v; + } else if (!strcmp(name, "pswpout")) { + *out = v; + } + } + fclose(f); +} + +static void +take_snap(snap_t *s) +{ + struct rusage ru; + getrusage(RUSAGE_SELF, &ru); + s->cpu_s = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6 + + ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6; + s->majflt = ru.ru_majflt; + proc_io(&s->rd, &s->wr); + vm_swap(&s->swpin, &s->swpout); + s->t_ns = now_ns(); +} + +/* ------------------------------------------------------------------------ */ +/* DB lifecycle */ +/* ------------------------------------------------------------------------ */ + +static void +fill_config(splinterdb_config *cfg) +{ + *cfg = (splinterdb_config){ + .filename = opt.db, + .cache_size = opt.cache_mib << 20, + .disk_size = opt.disk_gib << 30, + .data_cfg = &data_cfg, + .io_flags = O_RDWR | O_CREAT | O_DIRECT, + .io_perms = 0644, + .use_log = opt.use_log ? 1 : 0, + .memtable_capacity = opt.memtable_mib << 20, + .fanout = 8, + .num_memtable_bg_threads = (uint64)opt.mt_bg, + .num_normal_bg_threads = (uint64)opt.normal_bg, + .queue_scale_percent = 100, + }; +#ifdef KVBENCH_SPACE_MODE + cfg->use_stats = 1; +#endif +} + +static double open_secs; + +static void +db_open(bool create) +{ + splinterdb_config cfg; + fill_config(&cfg); + wd_what = create ? "create" : "open"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); + int rc = + create ? splinterdb_create(&cfg, &kvs) : splinterdb_open(&cfg, &kvs); + open_secs = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + if (rc) { + fprintf(stderr, "FATAL: splinterdb_%s failed rc=%d\n", wd_what, rc); + exit(3); + } + fprintf(stderr, "%s took %.3f s\n", wd_what, open_secs); +} + +static double +db_close(void) +{ +#ifdef KVBENCH_SPACE_MODE + /* Space/stats build only: dump insertion + allocator stats for the session. + */ + if (getenv("KVBENCH_STATS_BEFORE_CLOSE")) { + platform_set_log_streams(stdout, stderr); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + } +#endif + wd_what = "close"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); +#ifdef KVBENCH_CLOSE_HAS_FORCE + int rc = splinterdb_close(&kvs, 0); + if (rc) { + fprintf(stderr, + "FINDING: splinterdb_close(force=0) refused rc=%d; forcing\n", + rc); + rc = splinterdb_close(&kvs, 1); + if (rc) { + fprintf(stderr, "FINDING: splinterdb_close(force=1) rc=%d\n", rc); + } + } +#else + splinterdb_close(&kvs); +#endif + double s = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + kvs = NULL; + fprintf(stderr, "close took %.3f s\n", s); + return s; +} + +/* ------------------------------------------------------------------------ */ +/* Watchdog */ +/* ------------------------------------------------------------------------ */ + +static void +hang_dump(const char *why) +{ + char path[512], cmd[1024]; + snprintf(path, + sizeof(path), + "%s/hang-%s-%s-%d-%ld.txt", + opt.hang_dir ? opt.hang_dir : ".", + opt.vtag, + wd_what, + (int)getpid(), + (long)time(NULL)); + fprintf(stderr, + "HANG DETECTED (%s) during %s; dumping stacks to %s\n", + why, + wd_what, + path); + snprintf(cmd, + sizeof(cmd), + "gdb -batch -ex 'info threads' -ex 'thread apply all bt' -p %d > " + "'%s' 2>&1", + (int)getpid(), + path); + int rc = system(cmd); + fprintf(stderr, "gdb rc=%d; exiting with status 99\n", rc); + fflush(stderr); + _exit(99); +} + +static void * +watchdog_main(void *arg) +{ + (void)arg; + uint64_t last_prog = 0, last_change = now_ns(), last_report = now_ns(); + uint64_t last_report_prog = 0; + double last_cpu = -1; + uint64_t last_io = 0; + int last_mode = WD_IDLE; + for (;;) { + sleep(1); + int mode = atomic_load(&wd_mode); + uint64_t now = now_ns(); + if (mode != last_mode) { + last_mode = mode; + last_change = now; + last_prog = 0; + last_report_prog = 0; + last_report = now; + last_cpu = -1; + } + if (mode == WD_OPS) { + uint64_t prog = 0; + for (int i = 0; i < nworkers; i++) { + prog += + atomic_load_explicit(&workers[i].progress, memory_order_relaxed); + } + if (prog != last_prog) { + last_prog = prog; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no op progress for hang_secs"); + } + if (now - last_report >= 10ull * 1000000000ull) { + fprintf(stderr, + " [%s] progress %" PRIu64 " ops (+%.0f ops/s)\n", + wd_what, + prog, + (prog - last_report_prog) / ((now - last_report) / 1e9)); + last_report = now; + last_report_prog = prog; + } + } else if (mode == WD_OPENCLOSE) { + snap_t s; + take_snap(&s); + uint64_t io = s.rd + s.wr; + if (last_cpu < 0 || s.cpu_s - last_cpu > 0.05 || io != last_io) { + last_cpu = s.cpu_s; + last_io = io; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no CPU or IO progress for hang_secs"); + } + uint64_t since = atomic_load(&wd_mode_since_ns); + if (now - since > 2400ull * 1000000000ull) { + hang_dump("open/close exceeded 40 minutes"); + } + } + } + return NULL; +} + +/* ------------------------------------------------------------------------ */ +/* Worker bodies */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +pick_id(worker_t *w, enum dist d, uint64_t *seqpos, uint64_t lo, uint64_t hi) +{ + switch (d) { + case D_ZIPF: + return perm_apply(&zipf_perm, zipf_next(&zipf, &w->rng)); + case D_SEQ: + { + uint64_t id = *seqpos; + *seqpos = (id + 1 >= hi) ? lo : id + 1; + return id; + } + case D_UNIFORM: + case D_NEG: + default: + return rng_next(&w->rng) % opt.n; + } +} + +static inline void +wait_start(void) +{ + while (atomic_load_explicit(&run_state, memory_order_acquire) == ST_WAIT) { + struct timespec d = {.tv_nsec = 100000}; + nanosleep(&d, NULL); + } +} + +static void * +load_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + wait_start(); + uint64_t pos = lo, chunk_end = 0, cur = 0; + for (;;) { + uint64_t id; + if (w->ph->dist == D_RANDOM) { + if (pos >= hi) { + break; + } + id = perm_apply(&load_perm, pos++); + } else { + if (cur >= chunk_end) { + cur = atomic_fetch_add(&seq_counter, 64); + if (cur >= opt.n) { + break; + } + chunk_end = cur + 64 > opt.n ? opt.n : cur + 64; + } + id = cur++; + } + make_key(2 * id, key); + make_value(id, 0, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: insert id=%" PRIu64 " rc=%d\n", id, rc); + } + } + hist_add(&w->lat, t1 - t0); + w->ops++; + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + return NULL; +} + +static void * +warm_worker(void *arg) +{ + worker_t *w = arg; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + if ((opt.sabotage & 8) && w->idx == nworkers - 1) { + hi++; /* sabotage: expect one more id than exists */ + } + char key[KEY_SIZE]; + make_key(2 * lo, key); + wait_start(); + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator_init rc=%d\n", rc); + return NULL; + } + uint64_t expect = lo; + while (expect < hi && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk; + splinterdb_iterator_get_current(it, &k, &v); + if (!decode_key(k, &kk) || kk != 2 * expect || !value_id_ok(v, expect)) { + violation(w, + "warm: expected id %" PRIu64 " got key %" PRIu64 + " (len %" PRIu64 ")", + expect, + kk, + slice_length(k)); + if (kk > 2 * expect && (kk & 1) == 0) { + expect = kk / 2; /* resync after a gap */ + } + } + expect++; + w->ops++; + if ((w->ops & 1023) == 0) { + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + if (expect < hi) { + splinterdb_iterator_next(it); + } + } + rc = splinterdb_iterator_status(it); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator status rc=%d\n", rc); + } + if (expect != hi) { + violation(w, + "warm: range [%" PRIu64 ",%" PRIu64 ") ended at %" PRIu64, + lo, + hi, + expect); + } + splinterdb_iterator_deinit(it); + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + return NULL; +} + +static void * +point_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + char buf[256]; + splinterdb_lookup_result res; + splinterdb_lookup_result_init( + kvs, &res, SPLINTERDB_LOOKUP_VALUE, sizeof(buf), buf); + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + uint64_t seqpos = lo; + bool neg = w->ph->dist == D_NEG; + wait_start(); + uint64_t n = 0; + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, lo, hi); + bool q_neg = neg; + bool e_neg = neg; + if (opt.sabotage & 1) { + q_neg = true; /* sabotage: query absent key, expect present */ + } + if ((opt.sabotage & 16) && n > 1000) { + sleep(100000); /* test hook: simulate a hang for the watchdog */ + } + if (opt.sabotage & 2) { + q_neg = false; /* sabotage: query present key, expect absent */ + } + make_key(q_neg ? 2 * id + 1 : 2 * id, key); + uint64_t t0 = now_ns(); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &res); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: lookup id=%" PRIu64 " rc=%d\n", id, rc); + } + continue; + } + bool found = splinterdb_lookup_found(&res); + if (found) { + w->found++; + } else { + w->notfound++; + } + if (e_neg) { + if (found) { + violation(w, "negative key 2*%" PRIu64 "+1 found", id); + } + } else { + slice v; + if (!found) { + violation(w, "present id %" PRIu64 " not found", id); + } else if (splinterdb_lookup_result_value(&res, &v) != 0 + || !value_id_ok(v, id)) + { + violation(w, "present id %" PRIu64 " wrong value", id); + } + } + } + splinterdb_lookup_result_deinit(&res); + return NULL; +} + +static void * +range_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + uint64_t L = w->ph->L; + uint64_t seqpos = 0; + uint64_t n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t start = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + uint64_t expect = opt.n - start < L ? opt.n - start : L; + if (opt.sabotage & 4) { + expect++; /* sabotage: expect one extra tuple */ + } + make_key(2 * start, key); + uint64_t t0 = now_ns(), t1 = 0, tl = 0; + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator_init rc=%d\n", rc); + } + continue; + } + uint64_t got = 0; + bool bad = false; + while (got < L && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk = 0; + splinterdb_iterator_get_current(it, &k, &v); + if (!bad + && (!decode_key(k, &kk) || kk != 2 * (start + got) + || !value_id_ok(v, start + got))) + { + bad = true; + if (st == ST_MEASURE) { + violation(w, + "range start %" PRIu64 " tuple %" PRIu64 + ": expected key %" PRIu64 " got %" PRIu64, + start, + got, + 2 * (start + got), + kk); + } + } + got++; + if (got == 1) { + t1 = now_ns(); + } + if (got == L) { + tl = now_ns(); + break; + } + splinterdb_iterator_next(it); + } + int status = splinterdb_iterator_status(it); + uint64_t t2 = now_ns(); + splinterdb_iterator_deinit(it); + uint64_t t3 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + if (status) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator status rc=%d\n", status); + } + } + if (got != expect) { + violation(w, + "range start %" PRIu64 " L=%" PRIu64 ": got %" PRIu64 + " tuples, expected %" PRIu64, + start, + L, + got, + expect); + } + w->ops++; + w->tuples += got; + hist_add(&w->lat, t3 - t0); + if (got >= 1) { + hist_add(&w->startup, t1 - t0); + } + if (L > 1 && got == L) { + w->pt_ns += tl - t1; + w->pt_div += L - 1; + } + w->deinit_ns += t3 - t2; + w->deinit_n++; + } + return NULL; +} + +static void * +ow_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t seqpos = 0, n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + if (st == ST_MEASURE && !w->measure_rng_captured) { + w->measure_rng = w->rng; + w->measure_rng_captured = true; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + make_value(id, generation, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: overwrite id=%" PRIu64 " rc=%d\n", id, rc); + } + } + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + } + return NULL; +} + +/* + * Validate an untimed deterministic sample from the beginning of each + * overwrite worker's measured stream. Replaying the saved RNG state keeps all + * validation work out of the measured hot path. + */ +static void +verify_overwrite_sample(const phase_t *ph, int threads) +{ + enum { SAMPLES_PER_WORKER = 4096 }; + char key[KEY_SIZE], buffer[VALUE_SIZE]; + splinterdb_lookup_result result; + splinterdb_lookup_result_init( + kvs, &result, SPLINTERDB_LOOKUP_VALUE, sizeof(buffer), buffer); + + for (int i = 0; i < threads; i++) { + worker_t *original = &workers[i]; + if (original->ops == 0) { + continue; + } + if (!original->measure_rng_captured) { + original->errors++; + fprintf( + stderr, + "ERROR: overwrite verifier has no measurement RNG for thread %d\n", + i); + continue; + } + worker_t replay = {.rng = original->measure_rng}; + uint64_t seqpos = 0; + uint64_t samples = original->ops < SAMPLES_PER_WORKER + ? original->ops + : SAMPLES_PER_WORKER; + for (uint64_t sample = 0; sample < samples; sample++) { + uint64_t id = pick_id(&replay, ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &result); + if (rc != 0) { + original->errors++; + if (original->errors <= 3) { + fprintf(stderr, + "ERROR: overwrite verification id=%" PRIu64 " rc=%d\n", + id, + rc); + } + continue; + } + slice value; + if (!splinterdb_lookup_found(&result) + || splinterdb_lookup_result_value(&result, &value) != 0 + || !value_generation_ok(value, id, generation)) + { + violation(original, + "overwrite verification id=%" PRIu64 + " did not return generation %" PRIu64, + id, + generation); + } + } + } + splinterdb_lookup_result_deinit(&result); +} + +/* ------------------------------------------------------------------------ */ +/* Phase driver */ +/* ------------------------------------------------------------------------ */ + +static const char * +dist_name(enum dist d) +{ + switch (d) { + case D_UNIFORM: + return "uniform"; + case D_ZIPF: + return "zipf"; + case D_SEQ: + return "seq"; + case D_NEG: + return "neg"; + case D_RANDOM: + return "random"; + } + return "?"; +} + +static void +sleep_secs(double s) +{ + uint64_t end = now_ns() + (uint64_t)(s * 1e9); + for (;;) { + uint64_t now = now_ns(); + if (now >= end) { + break; + } + uint64_t rem = end - now; + struct timespec d = {.tv_sec = rem / 1000000000ull, + .tv_nsec = rem % 1000000000ull}; + nanosleep(&d, NULL); + } +} + +static void +file_sizes(uint64_t *apparent, uint64_t *alloc) +{ + struct stat st; + if (stat(opt.db, &st) == 0) { + *apparent = (uint64_t)st.st_size; + *alloc = (uint64_t)st.st_blocks * 512; + } else { + *apparent = *alloc = 0; + } +} + +static int csv_header_written; + +static void +csv_row(const phase_t *ph, + int threads, + hist_t *lat, + hist_t *startup, + uint64_t ops, + uint64_t tuples, + uint64_t pt_ns, + uint64_t pt_div, + uint64_t deinit_ns, + uint64_t deinit_n, + uint64_t viol, + uint64_t errs, + const snap_t *a, + const snap_t *b, + double insert_s, + double drain_s, + const snap_t *da, + const snap_t *db_, + uint64_t app, + uint64_t alc) +{ + double secs = (b->t_ns - a->t_ns) / 1e9; + double cpu = b->cpu_s - a->cpu_s; + uint64_t rd = b->rd - a->rd, wr = b->wr - a->wr; + double d_cpu = da ? db_->cpu_s - da->cpu_s : 0; + uint64_t d_rd = da ? db_->rd - da->rd : 0, d_wr = da ? db_->wr - da->wr : 0; + uint64_t swin = b->swpin - a->swpin + (da ? db_->swpin - da->swpin : 0); + uint64_t swout = b->swpout - a->swpout + (da ? db_->swpout - da->swpout : 0); + uint64_t majflt = b->majflt - a->majflt; + double logical = (double)ops * (KEY_SIZE + VALUE_SIZE); + double wamp = (ph->kind == PH_LOAD || ph->kind == PH_OW) && ops + ? (double)(wr + d_wr) / logical + : NAN; + double pt = pt_div ? (double)pt_ns / (double)pt_div : NAN; + double dmean = deinit_n ? (double)deinit_ns / (double)deinit_n / 1e3 : NAN; + + printf("== %-22s T=%-2d ops=%-10" PRIu64 " secs=%7.2f ops/s=%11.0f " + "lat us p50=%.2f p99=%.2f p99.9=%.2f max=%.1f mean=%.2f\n", + ph->name, + threads, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat)); + printf(" cpu=%.2fs ops/cpu-s=%.0f rd=%.1f B/op wr=%.1f B/op " + "violations=%" PRIu64 " errors=%" PRIu64 " swapin=%" PRIu64 + " swapout=%" PRIu64 " majflt=%" PRIu64 "\n", + cpu, + ops / cpu, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + viol, + errs, + swin, + swout, + majflt); + if (ph->kind == PH_RANGE) { + printf(" startup us p50=%.2f p99=%.2f mean=%.2f per-tuple=%.1f ns " + "deinit mean=%.2f us tuples/s=%.0f\n", + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples / secs); + } + if (da) { + printf( + " insert/run=%.2fs drain(close)=%.2fs total=%.2fs drain_cpu=%.2fs " + "drain_rd=%" PRIu64 " drain_wr=%" PRIu64 " wamp=%.3f " + "db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc); + } + fflush(stdout); + + if (!opt.csv) { + return; + } + FILE *f = fopen(opt.csv, "a"); + if (!f) { + perror(opt.csv); + return; + } + if (!csv_header_written) { + fseek(f, 0, SEEK_END); + if (ftell(f) == 0) { + fprintf(f, + "version,size,order,log,phase,threads,rep,n,ops,secs,ops_s," + "p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s," + "rd_bytes,wr_bytes,rd_B_op,wr_B_op," + "startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns," + "deinit_mean_us,tuples,tuples_s," + "insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp," + "db_apparent,db_alloc,open_s,violations,errors,swapin,swapout," + "majflt\n"); + } + csv_header_written = 1; + } + fprintf(f, + "%s,%s,%s,%d,%s,%d,%d,%" PRIu64 ",%" PRIu64 ",%.3f,%.1f," + "%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.1f," + "%" PRIu64 ",%" PRIu64 ",%.2f,%.2f," + "%.3f,%.3f,%.3f,%.2f," + "%.3f,%" PRIu64 ",%.1f," + "%.3f,%.3f,%.3f,%.3f,%" PRIu64 ",%" PRIu64 ",%.4f," + "%" PRIu64 ",%" PRIu64 ",%.3f,%" PRIu64 ",%" PRIu64 ",%" PRIu64 + ",%" PRIu64 ",%" PRIu64 "\n", + opt.vtag, + opt.stag, + opt.otag, + opt.use_log, + ph->name, + threads, + opt.rep, + opt.n, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat), + cpu, + ops / cpu, + rd, + wr, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples, + tuples / secs, + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc, + open_secs, + viol, + errs, + swin, + swout, + majflt); + fclose(f); +} + +static void +run_phase(const phase_t *ph, bool last) +{ + int T = ph->threads > 0 ? ph->threads : opt.threads; + nworkers = T; + workers = calloc((size_t)T, sizeof(worker_t)); + if (!workers) { + fprintf(stderr, "FATAL: out of memory\n"); + exit(3); + } + void *(*fn)(void *) = NULL; + switch (ph->kind) { + case PH_LOAD: + fn = load_worker; + break; + case PH_WARM: + fn = warm_worker; + break; + case PH_POINT: + fn = point_worker; + break; + case PH_RANGE: + fn = range_worker; + break; + case PH_OW: + fn = ow_worker; + break; + } + bool fixed_count = ph->kind == PH_LOAD || ph->kind == PH_WARM; + atomic_store(&run_state, ST_WAIT); + atomic_store(&seq_counter, 0); + for (int i = 0; i < T; i++) { + workers[i].idx = i; + workers[i].ph = ph; + workers[i].rng = mix(opt.seed * 1000003 + (uint64_t)i * 7919 + 17 + + (uint64_t)ph->kind * 131 + (uint64_t)ph->dist); + if (pthread_create(&workers[i].th, NULL, fn, &workers[i])) { + fprintf(stderr, "FATAL: pthread_create\n"); + exit(3); + } + } + fprintf(stderr, + "phase %s: T=%d dist=%s %s\n", + ph->name, + T, + dist_name(ph->dist), + fixed_count ? "(fixed count)" : "(fixed duration)"); + wd_what = ph->name; + atomic_store(&wd_mode, WD_OPS); + snap_t a, b; + if (fixed_count) { + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + take_snap(&b); + } else { + atomic_store_explicit(&run_state, ST_WARMUP, memory_order_release); + sleep_secs(opt.warmup); + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + sleep_secs(opt.secs); + atomic_store_explicit(&run_state, ST_STOP, memory_order_release); + take_snap(&b); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + } + atomic_store(&wd_mode, WD_IDLE); + + if (ph->kind == PH_OW) { + verify_overwrite_sample(ph, T); + } + + hist_t *lat = calloc(1, sizeof(hist_t)), + *startup = calloc(1, sizeof(hist_t)); + uint64_t ops = 0, tuples = 0, pt_ns = 0, pt_div = 0, dns = 0, dn = 0, + viol = 0, errs = 0, found = 0, notfound = 0; + for (int i = 0; i < T; i++) { + worker_t *w = &workers[i]; + hist_merge(lat, &w->lat); + hist_merge(startup, &w->startup); + ops += w->ops; + tuples += w->tuples; + pt_ns += w->pt_ns; + pt_div += w->pt_div; + dns += w->deinit_ns; + dn += w->deinit_n; + viol += w->violations; + errs += w->errors; + found += w->found; + notfound += w->notfound; + } + if (ph->kind == PH_WARM) { + tuples = ops; + if (ops != opt.n && !(opt.sabotage & 8)) { + fprintf(stderr, + "VIOLATION: warm scanned %" PRIu64 " tuples, expected %" PRIu64 + "\n", + ops, + opt.n); + viol++; + } + } + if (ph->kind == PH_POINT) { + fprintf(stderr, + " found=%" PRIu64 " notfound=%" PRIu64 "\n", + found, + notfound); + } + + double insert_s = (b.t_ns - a.t_ns) / 1e9, drain_s = 0; + snap_t da, dbs; + uint64_t app = 0, alc = 0; + bool closed = false; + if (ph->kind == PH_LOAD || last) { + take_snap(&da); + drain_s = db_close(); + take_snap(&dbs); + file_sizes(&app, &alc); + closed = true; + } + csv_row(ph, + T, + lat, + startup, + ops, + tuples, + pt_ns, + pt_div, + dns, + dn, + viol, + errs, + &a, + &b, + insert_s, + drain_s, + closed ? &da : NULL, + closed ? &dbs : NULL, + app, + alc); + if (viol) { + printf(" FINDING: %" PRIu64 + " correctness violations in %s (first: %s)\n", + viol, + ph->name, + workers[0].first_violation[0] ? workers[0].first_violation + : "see stderr"); + } + free(lat); + free(startup); + free(workers); + workers = NULL; + nworkers = 0; + if (closed && !last) { + db_open(false); + } +} + +/* ------------------------------------------------------------------------ */ +/* CLI */ +/* ------------------------------------------------------------------------ */ + +static void +usage(void) +{ + fprintf( + stderr, + "usage: kvbench --db PATH (--create|--open) --n N --cache-mib M " + "--disk-gib G --log 0|1\n" + " [--threads 6] [--mt-bg 1] [--normal-bg 4] [--memtable-mib 24]\n" + " [--secs 20] [--warmup 3] [--csv FILE] [--hang-dir DIR]\n" + " [--vtag S] [--stag S] [--otag S] [--rep R] [--seed S]\n" + " [--sabotage MASK] (1: point present->query absent; 2: point " + "neg->query present;\n" + " 4: range expects +1; 8: warm expects +1; 16: " + "point threads hang)\n" + " [--hang-secs 120] (no-progress timeout before gdb dump + exit 99\n" + " phase... load:random|load:seq warm point:uniform|zipf|seq|neg\n" + " range:uniform|zipf:L ow:uniform|zipf (suffix @T = " + "threads)\n"); + exit(2); +} + +static bool +parse_phase(const char *s, phase_t *ph) +{ + memset(ph, 0, sizeof(*ph)); + snprintf(ph->name, sizeof(ph->name), "%s", s); + char buf[64]; + snprintf(buf, sizeof(buf), "%s", s); + char *at = strchr(buf, '@'); + if (at) { + *at = 0; + ph->threads = atoi(at + 1); + } + char *a = strtok(buf, ":"), *b = strtok(NULL, ":"), *c = strtok(NULL, ":"); + if (!a) { + return false; + } + enum dist d = D_UNIFORM; + if (b) { + if (!strcmp(b, "uniform")) + d = D_UNIFORM; + else if (!strcmp(b, "zipf")) + d = D_ZIPF; + else if (!strcmp(b, "seq")) + d = D_SEQ; + else if (!strcmp(b, "neg")) + d = D_NEG; + else if (!strcmp(b, "random")) + d = D_RANDOM; + else + return false; + } + ph->dist = d; + if (!strcmp(a, "load")) { + ph->kind = PH_LOAD; + return b && (d == D_RANDOM || d == D_SEQ); + } else if (!strcmp(a, "warm")) { + ph->kind = PH_WARM; + return true; + } else if (!strcmp(a, "point")) { + ph->kind = PH_POINT; + return b != NULL; + } else if (!strcmp(a, "range")) { + ph->kind = PH_RANGE; + if (!b || !c || (d != D_UNIFORM && d != D_ZIPF)) { + return false; + } + ph->L = strtoull(c, NULL, 10); + return ph->L >= 1; + } else if (!strcmp(a, "ow")) { + ph->kind = PH_OW; + return b && (d == D_UNIFORM || d == D_ZIPF); + } + return false; +} + +int +main(int argc, char **argv) +{ + opt = (options){.threads = 6, + .mt_bg = 1, + .normal_bg = 4, + .memtable_mib = 24, + .secs = 20, + .warmup = 3, + .vtag = "?", + .stag = "?", + .otag = "?", + .rep = 1, + .seed = 42, + .hang_secs = 120, + .use_log = -1}; + int mode = -1; +#ifdef KVBENCH_SPACE_MODE + /* + * Space-check build only: open with use_stats, print insertion stats + * (which include allocator "Currently Allocated" extents, recomputed from + * the persisted allocator map at open), close. No phases, no writes. + */ + bool space_mode = false; +#endif + for (int i = 1; i < argc; i++) { + const char *s = argv[i]; +#define ARG(name) (!strcmp(s, name) && i + 1 < argc) + if (!strcmp(s, "--create")) + mode = 1; + else if (!strcmp(s, "--open")) + mode = 0; + else if (ARG("--db")) + opt.db = argv[++i]; + else if (ARG("--csv")) + opt.csv = argv[++i]; + else if (ARG("--hang-dir")) + opt.hang_dir = argv[++i]; + else if (ARG("--vtag")) + opt.vtag = argv[++i]; + else if (ARG("--stag")) + opt.stag = argv[++i]; + else if (ARG("--otag")) + opt.otag = argv[++i]; + else if (ARG("--rep")) + opt.rep = atoi(argv[++i]); + else if (ARG("--n")) + opt.n = strtoull(argv[++i], NULL, 0); + else if (ARG("--cache-mib")) + opt.cache_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--disk-gib")) + opt.disk_gib = strtoull(argv[++i], NULL, 0); + else if (ARG("--memtable-mib")) + opt.memtable_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--log")) + opt.use_log = atoi(argv[++i]); + else if (ARG("--threads")) + opt.threads = atoi(argv[++i]); + else if (ARG("--mt-bg")) + opt.mt_bg = atoi(argv[++i]); + else if (ARG("--normal-bg")) + opt.normal_bg = atoi(argv[++i]); + else if (ARG("--secs")) + opt.secs = atof(argv[++i]); + else if (ARG("--warmup")) + opt.warmup = atof(argv[++i]); + else if (ARG("--sabotage")) + opt.sabotage = strtoull(argv[++i], NULL, 0); + else if (ARG("--hang-secs")) + opt.hang_secs = strtoull(argv[++i], NULL, 0); + else if (ARG("--seed")) + opt.seed = strtoull(argv[++i], NULL, 0); +#ifdef KVBENCH_SPACE_MODE + else if (!strcmp(s, "space")) + space_mode = true; +#endif + else if (s[0] == '-') + usage(); + else { + if (opt.nphases >= MAX_PHASES + || !parse_phase(s, &opt.phases[opt.nphases])) + { + fprintf(stderr, "bad phase '%s'\n", s); + usage(); + } + opt.nphases++; + } +#undef ARG + } +#ifdef KVBENCH_SPACE_MODE + if (space_mode && opt.db && opt.cache_mib && opt.disk_gib + && opt.use_log >= 0) + { + default_data_config_init(&data_cfg); + platform_set_log_streams(stdout, stderr); + db_open(false); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + db_close(); + uint64_t app, alc; + file_sizes(&app, &alc); + printf("space: db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", app, alc); + return 0; + } +#endif + if (!opt.db || mode < 0 || !opt.n || !opt.cache_mib || !opt.disk_gib + || opt.use_log < 0 || !opt.nphases || opt.threads < 1 + || opt.threads > MAX_WORKERS) + { + usage(); + } + for (int i = 0; i < opt.nphases; i++) { + if (opt.phases[i].threads > MAX_WORKERS) { + usage(); + } + } + prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0); + setvbuf(stdout, NULL, _IOLBF, 0); + + default_data_config_init(&data_cfg); + perm_init(&load_perm, opt.n, opt.seed * 2 + 1); + perm_init(&zipf_perm, opt.n, opt.seed * 2 + 2); + zipf_init(&zipf, opt.n, 0.99); + generation = (uint64_t)time(NULL); + + printf("kvbench version=%s splinter=%s db=%s mode=%s n=%" PRIu64 + " cache_mib=%" PRIu64 " disk_gib=%" PRIu64 + " log=%d threads=%d mt_bg=%d normal_bg=%d memtable_mib=%" PRIu64 + " secs=%.1f warmup=%.1f rep=%d sabotage=%" PRIu64 "\n", + opt.vtag, + splinterdb_get_version(), + opt.db, + mode ? "create" : "open", + opt.n, + opt.cache_mib, + opt.disk_gib, + opt.use_log, + opt.threads, + opt.mt_bg, + opt.normal_bg, + opt.memtable_mib, + opt.secs, + opt.warmup, + opt.rep, + opt.sabotage); + + pthread_t wd; + pthread_create(&wd, NULL, watchdog_main, NULL); + + db_open(mode == 1); + for (int i = 0; i < opt.nphases; i++) { + run_phase(&opt.phases[i], i == opt.nphases - 1); + } + if (kvs) { + db_close(); + } + return 0; +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/prefix_kvbench.c b/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/prefix_kvbench.c new file mode 100644 index 000000000..77215f553 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/harnesses/prefix_kvbench.c @@ -0,0 +1,1765 @@ +// kvbench.c -- SplinterDB public-API benchmark used to compare two versions. +// +// Uses only splinterdb/splinterdb.h + splinterdb/default_data_config.h + libc, +// so the same source builds against versions whose internals differ. The one +// public-API difference handled here is splinterdb_close(): +// -DKVBENCH_CLOSE_HAS_FORCE => int splinterdb_close(splinterdb **, bool32) +// otherwise => void splinterdb_close(splinterdb **) +// +// Key scheme: logical id in [0,N). Present key = 8-byte big-endian(2*id) +// followed by 16 bytes of fixed padding (24 bytes total), so memcmp order == +// id order. Absent ("negative") keys use 2*id+1, interleaved with present +// keys. Value = 100 bytes: id (LE u64), generation (LE u64), filler. +// +// Each invocation: create/open the DB, run the listed phases in order, close. +// Phase syntax (optional "@T" overrides the thread count): +// load:random | load:seq fixed-count insert of all N ids, then close +// (close timed separately as "drain") +// warm parallel full scan; verifies every id once +// point:uniform|zipf|seq|neg fixed-duration lookups +// range:uniform|zipf:L fixed-duration forward range queries +// ow:uniform|zipf fixed-duration overwrites (insert existing) +// One CSV row per phase is appended to --csv. + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "splinterdb/default_data_config.h" +#include "splinterdb/splinterdb.h" + +#define KEY_SIZE 64 +#define VALUE_SIZE 100 +#define MAX_PHASES 64 +#define MAX_WORKERS 32 + + + +/* ------------------------------------------------------------------------ */ +/* Time, RNG, permutations, zipf */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +now_ns(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (uint64_t)ts.tv_sec * 1000000000ull + ts.tv_nsec; +} + +/* Bijective 64-bit mixer (splitmix64 finalizer). */ +static inline uint64_t +mix(uint64_t x) +{ + x = (x ^ (x >> 30)) * UINT64_C(0xbf58476d1ce4e5b9); + x = (x ^ (x >> 27)) * UINT64_C(0x94d049bb133111eb); + return x ^ (x >> 31); +} + +static inline uint64_t +rng_next(uint64_t *s) +{ + *s += UINT64_C(0x9e3779b97f4a7c15); + return mix(*s); +} + +static inline double +rng_unit(uint64_t *s) +{ + return (double)(rng_next(s) >> 11) * 0x1.0p-53; +} + +/* + * Pseudo-random bijection on [0,n): a 4-round balanced Feistel network over + * 2*half bits (2^(2*half) >= n), with cycle-walking to stay inside [0,n). + */ +typedef struct { + uint64_t n; + unsigned half; + uint64_t mask; + uint64_t keys[4]; +} perm_t; + +static void +perm_init(perm_t *p, uint64_t n, uint64_t seed) +{ + unsigned bits = 1; + while (bits < 64 && (UINT64_C(1) << bits) < n) { + bits++; + } + p->n = n; + p->half = (bits + 1) / 2; + if (p->half < 1) { + p->half = 1; + } + p->mask = (UINT64_C(1) << p->half) - 1; + for (int r = 0; r < 4; r++) { + p->keys[r] = mix(seed * UINT64_C(0x632be59bd9b4e019) + r + 1); + } +} + +static inline uint64_t +feistel(const perm_t *p, uint64_t x) +{ + uint64_t l = x >> p->half, r = x & p->mask; + for (int i = 0; i < 4; i++) { + uint64_t t = l ^ (mix(r ^ p->keys[i]) & p->mask); + l = r; + r = t; + } + return (l << p->half) | r; +} + +static inline uint64_t +perm_apply(const perm_t *p, uint64_t i) +{ + uint64_t x = i; + do { + x = feistel(p, x); + } while (x >= p->n); + return x; +} + +/* YCSB-style zipfian over ranks [0,n). */ +typedef struct { + uint64_t n; + double theta, zetan, zeta2, alpha, eta, half_pow_theta; +} zipf_t; + +static double +zeta_sum(uint64_t n, double theta) +{ + uint64_t m = n < 2000000 ? n : 2000000; + double s = 0; + for (uint64_t i = 1; i <= m; i++) { + s += pow((double)i, -theta); + } + if (n > m) { + /* Euler-Maclaurin tail: sum_{k=m+1}^{n} k^-t */ + s += (pow((double)n, 1 - theta) - pow((double)m, 1 - theta)) / (1 - theta) + + 0.5 * (pow((double)n, -theta) - pow((double)m, -theta)); + } + return s; +} + +static void +zipf_init(zipf_t *z, uint64_t n, double theta) +{ + z->n = n; + z->theta = theta; + z->zetan = zeta_sum(n, theta); + z->zeta2 = 1.0 + pow(0.5, theta); + z->alpha = 1.0 / (1.0 - theta); + z->eta = + (1.0 - pow(2.0 / (double)n, 1.0 - theta)) / (1.0 - z->zeta2 / z->zetan); + z->half_pow_theta = pow(0.5, theta); +} + +static inline uint64_t +zipf_next(const zipf_t *z, uint64_t *rng) +{ + double u = rng_unit(rng); + double uz = u * z->zetan; + if (uz < 1.0) { + return 0; + } + if (uz < 1.0 + z->half_pow_theta) { + return 1; + } + uint64_t r = + (uint64_t)((double)z->n * pow(z->eta * u - z->eta + 1.0, z->alpha)); + return r >= z->n ? z->n - 1 : r; +} + +/* ------------------------------------------------------------------------ */ +/* Histogram: log2 buckets with 32 linear sub-buckets (~3% resolution) */ +/* ------------------------------------------------------------------------ */ + +#define HSUB_BITS 5 +#define HSUB (1u << HSUB_BITS) +#define HBUCKETS (64 * HSUB) + +typedef struct { + uint64_t b[HBUCKETS]; + uint64_t count, sum, max; +} hist_t; + +static inline unsigned +hidx(uint64_t v) +{ + if (v < HSUB) { + return (unsigned)v; + } + unsigned e = 63 - __builtin_clzll(v); + unsigned sub = (unsigned)((v >> (e - HSUB_BITS)) & (HSUB - 1)); + return (e - HSUB_BITS + 1) * HSUB + sub; +} + +static inline uint64_t +hval(unsigned idx) +{ + if (idx < HSUB) { + return idx; + } + unsigned e = idx / HSUB + HSUB_BITS - 1; + unsigned sub = idx % HSUB; + uint64_t lo = (UINT64_C(1) << e) | ((uint64_t)sub << (e - HSUB_BITS)); + uint64_t width = UINT64_C(1) << (e - HSUB_BITS); + return lo + width / 2; +} + +static inline void +hist_add(hist_t *h, uint64_t v) +{ + h->b[hidx(v)]++; + h->count++; + h->sum += v; + if (v > h->max) { + h->max = v; + } +} + +static void +hist_merge(hist_t *dst, const hist_t *src) +{ + for (unsigned i = 0; i < HBUCKETS; i++) { + dst->b[i] += src->b[i]; + } + dst->count += src->count; + dst->sum += src->sum; + if (src->max > dst->max) { + dst->max = src->max; + } +} + +static double +hist_pct_us(const hist_t *h, double p) +{ + if (!h->count) { + return NAN; + } + uint64_t rank = (uint64_t)ceil(p * (double)h->count); + if (rank < 1) { + rank = 1; + } + uint64_t acc = 0; + for (unsigned i = 0; i < HBUCKETS; i++) { + acc += h->b[i]; + if (acc >= rank) { + uint64_t v = hval(i); + return (double)(v > h->max ? h->max : v) / 1e3; + } + } + return (double)h->max / 1e3; +} + +static double +hist_mean_us(const hist_t *h) +{ + return h->count ? (double)h->sum / (double)h->count / 1e3 : NAN; +} + +/* ------------------------------------------------------------------------ */ +/* Options / global state */ +/* ------------------------------------------------------------------------ */ + +enum phase_kind { PH_LOAD, PH_WARM, PH_POINT, PH_RANGE, PH_OW }; +enum dist { D_UNIFORM, D_ZIPF, D_SEQ, D_NEG, D_RANDOM }; + +typedef struct { + char name[64]; + enum phase_kind kind; + enum dist dist; + uint64_t L; + int threads; +} phase_t; + +typedef struct { + const char *db, *csv, *hang_dir; + const char *vtag, *stag, *otag; + int rep; + bool create; + uint64_t n, cache_mib, disk_gib, memtable_mib; + int use_log, threads, mt_bg, normal_bg; + double secs, warmup; + uint64_t sabotage; + uint64_t hang_secs; + uint64_t seed; + int nphases; + phase_t phases[MAX_PHASES]; +} options; + +static options opt; +static splinterdb *kvs; +static data_config data_cfg; +static perm_t load_perm, zipf_perm; +static zipf_t zipf; +static uint64_t generation; /* value generation for overwrites */ + +enum { ST_WAIT = 0, ST_WARMUP = 1, ST_MEASURE = 2, ST_STOP = 3 }; +static _Atomic int run_state; +static _Atomic uint64_t seq_counter; + +/* Watchdog */ +enum { WD_IDLE, WD_OPS, WD_OPENCLOSE }; +static _Atomic int wd_mode; +static _Atomic uint64_t wd_mode_since_ns; +static const char *wd_what = ""; + +typedef struct worker { + pthread_t th; + int idx; + const phase_t *ph; + hist_t lat; + hist_t startup; + uint64_t ops, tuples, pt_ns, pt_div, deinit_ns, deinit_n; + uint64_t violations, errors, notfound, found; + uint64_t rng; + uint64_t measure_rng; + bool measure_rng_captured; + _Atomic uint64_t progress; + char first_violation[256]; +} worker_t; + +static worker_t *workers; +static int nworkers; + +/* ------------------------------------------------------------------------ */ +/* Keys / values */ +/* ------------------------------------------------------------------------ */ + + +static int prefix_pattern; +static uint64_t *prefix_random_words; + +static int +prefix_word_compare(const void *a, const void *b) +{ + uint64_t x = *(const uint64_t *)a, y = *(const uint64_t *)b; + return (x > y) - (x < y); +} + +static int +prefix_nonlexical_compare(const data_config *cfg, user_key a, user_key b) +{ + (void)cfg; + if (slice_length(a.key) != KEY_SIZE || slice_length(b.key) != KEY_SIZE) + abort(); + return memcmp((const char *)slice_data(a.key) + 56, + (const char *)slice_data(b.key) + 56, 8); +} + +static void +prefix_configure(void) +{ + const char *pattern = getenv("PREFIX_PATTERN"); + if (pattern == NULL || strcmp(pattern, "common") == 0) prefix_pattern = 0; + else if (strcmp(pattern, "random") == 0) prefix_pattern = 1; + else if (strcmp(pattern, "nonlexical") == 0) prefix_pattern = 2; + else { fprintf(stderr, "Unknown PREFIX_PATTERN %s\n", pattern); exit(2); } + if (prefix_pattern == 2) data_cfg.key_compare = prefix_nonlexical_compare; +#ifdef KVBENCH_PREFIX_SUPPORT + data_cfg.key_compare_is_lexical = prefix_pattern != 2 + && getenv("PREFIX_DISABLE") == NULL; +#endif + if (prefix_pattern == 1) { + if (opt.n > SIZE_MAX / 2 / sizeof(uint64_t)) abort(); + prefix_random_words = malloc(2 * opt.n * sizeof(uint64_t)); + if (!prefix_random_words) abort(); + for (uint64_t i = 0; i < 2 * opt.n; i++) + prefix_random_words[i] = mix(i + opt.seed * 1000003); + qsort(prefix_random_words, 2 * opt.n, sizeof(uint64_t), prefix_word_compare); + } + printf("prefix-pattern=%s key_bytes=%d compression_disabled=%s\n", + pattern ? pattern : "common", KEY_SIZE, + getenv("PREFIX_DISABLE") ? "true" : "false"); +} + +static inline void +prefix_encode_word(uint64_t word, char *key) +{ + for (int i = 0; i < 8; i++) key[i] = (char)(word >> (56 - 8 * i)); +} + +static inline void +make_key(uint64_t k, char *key) +{ + if (prefix_pattern == 0) { + memset(key, 'p', 48); + prefix_encode_word(k, key + 48); + } else { + for (unsigned i = 0; i < 7; i++) + prefix_encode_word(mix(k + (uint64_t)i * UINT64_C(0x9e3779b97f4a7c15)), + key + i * 8); + if (prefix_pattern == 1) prefix_encode_word(prefix_random_words[k], key); + } + prefix_encode_word(k, key + 56); +} + +static inline bool +decode_key(slice s, uint64_t *k) +{ + if (slice_length(s) != KEY_SIZE) return false; + const unsigned char *bytes = slice_data(s); + uint64_t rank = 0; + for (unsigned i = 56; i < 64; i++) rank = (rank << 8) | bytes[i]; + if (rank >= 2 * opt.n) return false; + char expected[KEY_SIZE]; + make_key(rank, expected); + *k = rank; + return memcmp(bytes, expected, KEY_SIZE) == 0; +} + +static inline void +make_value(uint64_t id, uint64_t gen, char *val) +{ + memcpy(val, &id, 8); + memcpy(val + 8, &gen, 8); + memset(val + 16, 'v', VALUE_SIZE - 16); +} + +static inline bool +value_id_ok(slice v, uint64_t id) +{ + if (slice_length(v) != VALUE_SIZE) { + return false; + } + uint64_t got; + memcpy(&got, slice_data(v), 8); + return got == id; +} + +static inline bool +value_generation_ok(slice v, uint64_t id, uint64_t expected_generation) +{ + if (!value_id_ok(v, id)) { + return false; + } + uint64_t got_generation; + memcpy(&got_generation, (const char *)slice_data(v) + 8, 8); + return got_generation == expected_generation; +} + +static void +violation(worker_t *w, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); + +static void +violation(worker_t *w, const char *fmt, ...) +{ + w->violations++; + if (w->violations <= 3) { + char buf[256]; + va_list ap; + va_start(ap, fmt); + vsnprintf(buf, sizeof(buf), fmt, ap); + va_end(ap); + if (w->violations == 1) { + snprintf(w->first_violation, sizeof(w->first_violation), "%s", buf); + } + fprintf(stderr, "VIOLATION [thread %d]: %s\n", w->idx, buf); + } +} + +/* ------------------------------------------------------------------------ */ +/* Process metrics */ +/* ------------------------------------------------------------------------ */ + +typedef struct { + uint64_t t_ns; + double cpu_s; + uint64_t rd, wr; + uint64_t swpin, swpout; + uint64_t majflt; +} snap_t; + +static void +proc_io(uint64_t *rd, uint64_t *wr) +{ + *rd = *wr = 0; + FILE *f = fopen("/proc/self/io", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "read_bytes:")) { + *rd = v; + } else if (!strcmp(name, "write_bytes:")) { + *wr = v; + } + } + fclose(f); +} + +static void +vm_swap(uint64_t *in, uint64_t *out) +{ + *in = *out = 0; + FILE *f = fopen("/proc/vmstat", "r"); + if (!f) { + return; + } + char name[64]; + uint64_t v; + while (fscanf(f, "%63s %" SCNu64, name, &v) == 2) { + if (!strcmp(name, "pswpin")) { + *in = v; + } else if (!strcmp(name, "pswpout")) { + *out = v; + } + } + fclose(f); +} + +static void +take_snap(snap_t *s) +{ + struct rusage ru; + getrusage(RUSAGE_SELF, &ru); + s->cpu_s = ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6 + + ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6; + s->majflt = ru.ru_majflt; + proc_io(&s->rd, &s->wr); + vm_swap(&s->swpin, &s->swpout); + s->t_ns = now_ns(); +} + +/* ------------------------------------------------------------------------ */ +/* DB lifecycle */ +/* ------------------------------------------------------------------------ */ + +static void +fill_config(splinterdb_config *cfg) +{ + *cfg = (splinterdb_config){ + .filename = opt.db, + .cache_size = opt.cache_mib << 20, + .disk_size = opt.disk_gib << 30, + .data_cfg = &data_cfg, + .io_flags = O_RDWR | O_CREAT | O_DIRECT, + .io_perms = 0644, + .use_log = opt.use_log ? 1 : 0, + .memtable_capacity = opt.memtable_mib << 20, + .fanout = 8, + .num_memtable_bg_threads = (uint64)opt.mt_bg, + .num_normal_bg_threads = (uint64)opt.normal_bg, + .queue_scale_percent = 100, + }; +#ifdef KVBENCH_SPACE_MODE + cfg->use_stats = 1; +#endif +} + +static double open_secs; + +static void +db_open(bool create) +{ + splinterdb_config cfg; + fill_config(&cfg); + wd_what = create ? "create" : "open"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); + int rc = + create ? splinterdb_create(&cfg, &kvs) : splinterdb_open(&cfg, &kvs); + open_secs = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + if (rc) { + fprintf(stderr, "FATAL: splinterdb_%s failed rc=%d\n", wd_what, rc); + exit(3); + } + fprintf(stderr, "%s took %.3f s\n", wd_what, open_secs); +} + +static double +db_close(void) +{ +#ifdef KVBENCH_SPACE_MODE + /* Space/stats build only: dump insertion + allocator stats for the session. + */ + if (getenv("KVBENCH_STATS_BEFORE_CLOSE")) { + platform_set_log_streams(stdout, stderr); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + } +#endif + wd_what = "close"; + atomic_store(&wd_mode_since_ns, now_ns()); + atomic_store(&wd_mode, WD_OPENCLOSE); + uint64_t t0 = now_ns(); +#ifdef KVBENCH_CLOSE_HAS_FORCE + int rc = splinterdb_close(&kvs, 0); + if (rc) { + fprintf(stderr, + "FINDING: splinterdb_close(force=0) refused rc=%d; forcing\n", + rc); + rc = splinterdb_close(&kvs, 1); + if (rc) { + fprintf(stderr, "FINDING: splinterdb_close(force=1) rc=%d\n", rc); + } + } +#else + splinterdb_close(&kvs); +#endif + double s = (now_ns() - t0) / 1e9; + atomic_store(&wd_mode, WD_IDLE); + kvs = NULL; + fprintf(stderr, "close took %.3f s\n", s); + return s; +} + +/* ------------------------------------------------------------------------ */ +/* Watchdog */ +/* ------------------------------------------------------------------------ */ + +static void +hang_dump(const char *why) +{ + char path[512], cmd[1024]; + snprintf(path, + sizeof(path), + "%s/hang-%s-%s-%d-%ld.txt", + opt.hang_dir ? opt.hang_dir : ".", + opt.vtag, + wd_what, + (int)getpid(), + (long)time(NULL)); + fprintf(stderr, + "HANG DETECTED (%s) during %s; dumping stacks to %s\n", + why, + wd_what, + path); + snprintf(cmd, + sizeof(cmd), + "gdb -batch -ex 'info threads' -ex 'thread apply all bt' -p %d > " + "'%s' 2>&1", + (int)getpid(), + path); + int rc = system(cmd); + fprintf(stderr, "gdb rc=%d; exiting with status 99\n", rc); + fflush(stderr); + _exit(99); +} + +static void * +watchdog_main(void *arg) +{ + (void)arg; + uint64_t last_prog = 0, last_change = now_ns(), last_report = now_ns(); + uint64_t last_report_prog = 0; + double last_cpu = -1; + uint64_t last_io = 0; + int last_mode = WD_IDLE; + for (;;) { + sleep(1); + int mode = atomic_load(&wd_mode); + uint64_t now = now_ns(); + if (mode != last_mode) { + last_mode = mode; + last_change = now; + last_prog = 0; + last_report_prog = 0; + last_report = now; + last_cpu = -1; + } + if (mode == WD_OPS) { + uint64_t prog = 0; + for (int i = 0; i < nworkers; i++) { + prog += + atomic_load_explicit(&workers[i].progress, memory_order_relaxed); + } + if (prog != last_prog) { + last_prog = prog; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no op progress for hang_secs"); + } + if (now - last_report >= 10ull * 1000000000ull) { + fprintf(stderr, + " [%s] progress %" PRIu64 " ops (+%.0f ops/s)\n", + wd_what, + prog, + (prog - last_report_prog) / ((now - last_report) / 1e9)); + last_report = now; + last_report_prog = prog; + } + } else if (mode == WD_OPENCLOSE) { + snap_t s; + take_snap(&s); + uint64_t io = s.rd + s.wr; + if (last_cpu < 0 || s.cpu_s - last_cpu > 0.05 || io != last_io) { + last_cpu = s.cpu_s; + last_io = io; + last_change = now; + } else if (now - last_change > opt.hang_secs * 1000000000ull) { + hang_dump("no CPU or IO progress for hang_secs"); + } + uint64_t since = atomic_load(&wd_mode_since_ns); + if (now - since > 2400ull * 1000000000ull) { + hang_dump("open/close exceeded 40 minutes"); + } + } + } + return NULL; +} + +/* ------------------------------------------------------------------------ */ +/* Worker bodies */ +/* ------------------------------------------------------------------------ */ + +static inline uint64_t +pick_id(worker_t *w, enum dist d, uint64_t *seqpos, uint64_t lo, uint64_t hi) +{ + switch (d) { + case D_ZIPF: + return perm_apply(&zipf_perm, zipf_next(&zipf, &w->rng)); + case D_SEQ: + { + uint64_t id = *seqpos; + *seqpos = (id + 1 >= hi) ? lo : id + 1; + return id; + } + case D_UNIFORM: + case D_NEG: + default: + return rng_next(&w->rng) % opt.n; + } +} + +static inline void +wait_start(void) +{ + while (atomic_load_explicit(&run_state, memory_order_acquire) == ST_WAIT) { + struct timespec d = {.tv_nsec = 100000}; + nanosleep(&d, NULL); + } +} + +static void * +load_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + wait_start(); + uint64_t pos = lo, chunk_end = 0, cur = 0; + for (;;) { + uint64_t id; + if (w->ph->dist == D_RANDOM) { + if (pos >= hi) { + break; + } + id = perm_apply(&load_perm, pos++); + } else { + if (cur >= chunk_end) { + cur = atomic_fetch_add(&seq_counter, 64); + if (cur >= opt.n) { + break; + } + chunk_end = cur + 64 > opt.n ? opt.n : cur + 64; + } + id = cur++; + } + make_key(2 * id, key); + make_value(id, 0, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: insert id=%" PRIu64 " rc=%d\n", id, rc); + } + } + hist_add(&w->lat, t1 - t0); + w->ops++; + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + return NULL; +} + +static void * +warm_worker(void *arg) +{ + worker_t *w = arg; + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + if ((opt.sabotage & 8) && w->idx == nworkers - 1) { + hi++; /* sabotage: expect one more id than exists */ + } + char key[KEY_SIZE]; + make_key(2 * lo, key); + wait_start(); + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator_init rc=%d\n", rc); + return NULL; + } + uint64_t expect = lo; + while (expect < hi && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk; + splinterdb_iterator_get_current(it, &k, &v); + if (!decode_key(k, &kk) || kk != 2 * expect || !value_id_ok(v, expect)) { + violation(w, + "warm: expected id %" PRIu64 " got key %" PRIu64 + " (len %" PRIu64 ")", + expect, + kk, + slice_length(k)); + if (kk > 2 * expect && (kk & 1) == 0) { + expect = kk / 2; /* resync after a gap */ + } + } + expect++; + w->ops++; + if ((w->ops & 1023) == 0) { + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + } + if (expect < hi) { + splinterdb_iterator_next(it); + } + } + rc = splinterdb_iterator_status(it); + if (rc) { + w->errors++; + fprintf(stderr, "ERROR: warm iterator status rc=%d\n", rc); + } + if (expect != hi) { + violation(w, + "warm: range [%" PRIu64 ",%" PRIu64 ") ended at %" PRIu64, + lo, + hi, + expect); + } + splinterdb_iterator_deinit(it); + atomic_store_explicit(&w->progress, w->ops, memory_order_relaxed); + return NULL; +} + +static void * +point_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + char buf[256]; + splinterdb_lookup_result res; + splinterdb_lookup_result_init( + kvs, &res, SPLINTERDB_LOOKUP_VALUE, sizeof(buf), buf); + uint64_t T = (uint64_t)nworkers; + uint64_t lo = opt.n * (uint64_t)w->idx / T, + hi = opt.n * (uint64_t)(w->idx + 1) / T; + uint64_t seqpos = lo; + bool neg = w->ph->dist == D_NEG; + wait_start(); + uint64_t n = 0; + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, lo, hi); + bool q_neg = neg; + bool e_neg = neg; + if (opt.sabotage & 1) { + q_neg = true; /* sabotage: query absent key, expect present */ + } + if ((opt.sabotage & 16) && n > 1000) { + sleep(100000); /* test hook: simulate a hang for the watchdog */ + } + if (opt.sabotage & 2) { + q_neg = false; /* sabotage: query present key, expect absent */ + } + make_key(q_neg ? 2 * id + 1 : 2 * id, key); + uint64_t t0 = now_ns(); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &res); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: lookup id=%" PRIu64 " rc=%d\n", id, rc); + } + continue; + } + bool found = splinterdb_lookup_found(&res); + if (found) { + w->found++; + } else { + w->notfound++; + } + if (e_neg) { + if (found) { + violation(w, "negative key 2*%" PRIu64 "+1 found", id); + } + } else { + slice v; + if (!found) { + violation(w, "present id %" PRIu64 " not found", id); + } else if (splinterdb_lookup_result_value(&res, &v) != 0 + || !value_id_ok(v, id)) + { + violation(w, "present id %" PRIu64 " wrong value", id); + } + } + } + splinterdb_lookup_result_deinit(&res); + return NULL; +} + +static void * +range_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE]; + uint64_t L = w->ph->L; + uint64_t seqpos = 0; + uint64_t n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + uint64_t start = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + uint64_t expect = opt.n - start < L ? opt.n - start : L; + if (opt.sabotage & 4) { + expect++; /* sabotage: expect one extra tuple */ + } + make_key(2 * start, key); + uint64_t t0 = now_ns(), t1 = 0, tl = 0; + splinterdb_iterator *it; + int rc = splinterdb_iterator_init( + kvs, &it, greater_than_or_equal, slice_create(KEY_SIZE, key)); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator_init rc=%d\n", rc); + } + continue; + } + uint64_t got = 0; + bool bad = false; + while (got < L && splinterdb_iterator_valid(it)) { + slice k, v; + uint64_t kk = 0; + splinterdb_iterator_get_current(it, &k, &v); + if (!bad + && (!decode_key(k, &kk) || kk != 2 * (start + got) + || !value_id_ok(v, start + got))) + { + bad = true; + if (st == ST_MEASURE) { + violation(w, + "range start %" PRIu64 " tuple %" PRIu64 + ": expected key %" PRIu64 " got %" PRIu64, + start, + got, + 2 * (start + got), + kk); + } + } + got++; + if (got == 1) { + t1 = now_ns(); + } + if (got == L) { + tl = now_ns(); + break; + } + splinterdb_iterator_next(it); + } + int status = splinterdb_iterator_status(it); + uint64_t t2 = now_ns(); + splinterdb_iterator_deinit(it); + uint64_t t3 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (st != ST_MEASURE) { + continue; + } + if (status) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: iterator status rc=%d\n", status); + } + } + if (got != expect) { + violation(w, + "range start %" PRIu64 " L=%" PRIu64 ": got %" PRIu64 + " tuples, expected %" PRIu64, + start, + L, + got, + expect); + } + w->ops++; + w->tuples += got; + hist_add(&w->lat, t3 - t0); + if (got >= 1) { + hist_add(&w->startup, t1 - t0); + } + if (L > 1 && got == L) { + w->pt_ns += tl - t1; + w->pt_div += L - 1; + } + w->deinit_ns += t3 - t2; + w->deinit_n++; + } + return NULL; +} + +static void * +ow_worker(void *arg) +{ + worker_t *w = arg; + char key[KEY_SIZE], val[VALUE_SIZE]; + uint64_t seqpos = 0, n = 0; + wait_start(); + for (;;) { + int st = atomic_load_explicit(&run_state, memory_order_relaxed); + if (st == ST_STOP) { + break; + } + if (st == ST_MEASURE && !w->measure_rng_captured) { + w->measure_rng = w->rng; + w->measure_rng_captured = true; + } + uint64_t id = pick_id(w, w->ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + make_value(id, generation, val); + uint64_t t0 = now_ns(); + int rc = splinterdb_insert( + kvs, slice_create(KEY_SIZE, key), slice_create(VALUE_SIZE, val), NULL); + uint64_t t1 = now_ns(); + n++; + atomic_store_explicit(&w->progress, n, memory_order_relaxed); + if (rc) { + w->errors++; + if (w->errors <= 3) { + fprintf(stderr, "ERROR: overwrite id=%" PRIu64 " rc=%d\n", id, rc); + } + } + if (st != ST_MEASURE) { + continue; + } + w->ops++; + hist_add(&w->lat, t1 - t0); + } + return NULL; +} + +/* + * Validate an untimed deterministic sample from the beginning of each + * overwrite worker's measured stream. Replaying the saved RNG state keeps all + * validation work out of the measured hot path. + */ +static void +verify_overwrite_sample(const phase_t *ph, int threads) +{ + enum { SAMPLES_PER_WORKER = 4096 }; + char key[KEY_SIZE], buffer[VALUE_SIZE]; + splinterdb_lookup_result result; + splinterdb_lookup_result_init( + kvs, &result, SPLINTERDB_LOOKUP_VALUE, sizeof(buffer), buffer); + + for (int i = 0; i < threads; i++) { + worker_t *original = &workers[i]; + if (original->ops == 0) { + continue; + } + if (!original->measure_rng_captured) { + original->errors++; + fprintf( + stderr, + "ERROR: overwrite verifier has no measurement RNG for thread %d\n", + i); + continue; + } + worker_t replay = {.rng = original->measure_rng}; + uint64_t seqpos = 0; + uint64_t samples = original->ops < SAMPLES_PER_WORKER + ? original->ops + : SAMPLES_PER_WORKER; + for (uint64_t sample = 0; sample < samples; sample++) { + uint64_t id = pick_id(&replay, ph->dist, &seqpos, 0, opt.n); + make_key(2 * id, key); + int rc = splinterdb_lookup(kvs, slice_create(KEY_SIZE, key), &result); + if (rc != 0) { + original->errors++; + if (original->errors <= 3) { + fprintf(stderr, + "ERROR: overwrite verification id=%" PRIu64 " rc=%d\n", + id, + rc); + } + continue; + } + slice value; + if (!splinterdb_lookup_found(&result) + || splinterdb_lookup_result_value(&result, &value) != 0 + || !value_generation_ok(value, id, generation)) + { + violation(original, + "overwrite verification id=%" PRIu64 + " did not return generation %" PRIu64, + id, + generation); + } + } + } + splinterdb_lookup_result_deinit(&result); +} + +/* ------------------------------------------------------------------------ */ +/* Phase driver */ +/* ------------------------------------------------------------------------ */ + +static const char * +dist_name(enum dist d) +{ + switch (d) { + case D_UNIFORM: + return "uniform"; + case D_ZIPF: + return "zipf"; + case D_SEQ: + return "seq"; + case D_NEG: + return "neg"; + case D_RANDOM: + return "random"; + } + return "?"; +} + +static void +sleep_secs(double s) +{ + uint64_t end = now_ns() + (uint64_t)(s * 1e9); + for (;;) { + uint64_t now = now_ns(); + if (now >= end) { + break; + } + uint64_t rem = end - now; + struct timespec d = {.tv_sec = rem / 1000000000ull, + .tv_nsec = rem % 1000000000ull}; + nanosleep(&d, NULL); + } +} + +static void +file_sizes(uint64_t *apparent, uint64_t *alloc) +{ + struct stat st; + if (stat(opt.db, &st) == 0) { + *apparent = (uint64_t)st.st_size; + *alloc = (uint64_t)st.st_blocks * 512; + } else { + *apparent = *alloc = 0; + } +} + +static int csv_header_written; + +static void +csv_row(const phase_t *ph, + int threads, + hist_t *lat, + hist_t *startup, + uint64_t ops, + uint64_t tuples, + uint64_t pt_ns, + uint64_t pt_div, + uint64_t deinit_ns, + uint64_t deinit_n, + uint64_t viol, + uint64_t errs, + const snap_t *a, + const snap_t *b, + double insert_s, + double drain_s, + const snap_t *da, + const snap_t *db_, + uint64_t app, + uint64_t alc) +{ + double secs = (b->t_ns - a->t_ns) / 1e9; + double cpu = b->cpu_s - a->cpu_s; + uint64_t rd = b->rd - a->rd, wr = b->wr - a->wr; + double d_cpu = da ? db_->cpu_s - da->cpu_s : 0; + uint64_t d_rd = da ? db_->rd - da->rd : 0, d_wr = da ? db_->wr - da->wr : 0; + uint64_t swin = b->swpin - a->swpin + (da ? db_->swpin - da->swpin : 0); + uint64_t swout = b->swpout - a->swpout + (da ? db_->swpout - da->swpout : 0); + uint64_t majflt = b->majflt - a->majflt; + double logical = (double)ops * (KEY_SIZE + VALUE_SIZE); + double wamp = (ph->kind == PH_LOAD || ph->kind == PH_OW) && ops + ? (double)(wr + d_wr) / logical + : NAN; + double pt = pt_div ? (double)pt_ns / (double)pt_div : NAN; + double dmean = deinit_n ? (double)deinit_ns / (double)deinit_n / 1e3 : NAN; + + printf("== %-22s T=%-2d ops=%-10" PRIu64 " secs=%7.2f ops/s=%11.0f " + "lat us p50=%.2f p99=%.2f p99.9=%.2f max=%.1f mean=%.2f\n", + ph->name, + threads, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat)); + printf(" cpu=%.2fs ops/cpu-s=%.0f rd=%.1f B/op wr=%.1f B/op " + "violations=%" PRIu64 " errors=%" PRIu64 " swapin=%" PRIu64 + " swapout=%" PRIu64 " majflt=%" PRIu64 "\n", + cpu, + ops / cpu, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + viol, + errs, + swin, + swout, + majflt); + if (ph->kind == PH_RANGE) { + printf(" startup us p50=%.2f p99=%.2f mean=%.2f per-tuple=%.1f ns " + "deinit mean=%.2f us tuples/s=%.0f\n", + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples / secs); + } + if (da) { + printf( + " insert/run=%.2fs drain(close)=%.2fs total=%.2fs drain_cpu=%.2fs " + "drain_rd=%" PRIu64 " drain_wr=%" PRIu64 " wamp=%.3f " + "db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc); + } + fflush(stdout); + + if (!opt.csv) { + return; + } + FILE *f = fopen(opt.csv, "a"); + if (!f) { + perror(opt.csv); + return; + } + if (!csv_header_written) { + fseek(f, 0, SEEK_END); + if (ftell(f) == 0) { + fprintf(f, + "version,size,order,log,phase,threads,rep,n,ops,secs,ops_s," + "p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s," + "rd_bytes,wr_bytes,rd_B_op,wr_B_op," + "startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns," + "deinit_mean_us,tuples,tuples_s," + "insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp," + "db_apparent,db_alloc,open_s,violations,errors,swapin,swapout," + "majflt\n"); + } + csv_header_written = 1; + } + fprintf(f, + "%s,%s,%s,%d,%s,%d,%d,%" PRIu64 ",%" PRIu64 ",%.3f,%.1f," + "%.3f,%.3f,%.3f,%.3f,%.3f,%.3f,%.1f," + "%" PRIu64 ",%" PRIu64 ",%.2f,%.2f," + "%.3f,%.3f,%.3f,%.2f," + "%.3f,%" PRIu64 ",%.1f," + "%.3f,%.3f,%.3f,%.3f,%" PRIu64 ",%" PRIu64 ",%.4f," + "%" PRIu64 ",%" PRIu64 ",%.3f,%" PRIu64 ",%" PRIu64 ",%" PRIu64 + ",%" PRIu64 ",%" PRIu64 "\n", + opt.vtag, + opt.stag, + opt.otag, + opt.use_log, + ph->name, + threads, + opt.rep, + opt.n, + ops, + secs, + ops / secs, + hist_pct_us(lat, 0.5), + hist_pct_us(lat, 0.99), + hist_pct_us(lat, 0.999), + (double)lat->max / 1e3, + hist_mean_us(lat), + cpu, + ops / cpu, + rd, + wr, + ops ? (double)rd / ops : 0, + ops ? (double)wr / ops : 0, + hist_pct_us(startup, 0.5), + hist_pct_us(startup, 0.99), + hist_mean_us(startup), + pt, + dmean, + tuples, + tuples / secs, + insert_s, + drain_s, + insert_s + drain_s, + d_cpu, + d_rd, + d_wr, + wamp, + app, + alc, + open_secs, + viol, + errs, + swin, + swout, + majflt); + fclose(f); +} + +static void +run_phase(const phase_t *ph, bool last) +{ + int T = ph->threads > 0 ? ph->threads : opt.threads; + nworkers = T; + workers = calloc((size_t)T, sizeof(worker_t)); + if (!workers) { + fprintf(stderr, "FATAL: out of memory\n"); + exit(3); + } + void *(*fn)(void *) = NULL; + switch (ph->kind) { + case PH_LOAD: + fn = load_worker; + break; + case PH_WARM: + fn = warm_worker; + break; + case PH_POINT: + fn = point_worker; + break; + case PH_RANGE: + fn = range_worker; + break; + case PH_OW: + fn = ow_worker; + break; + } + bool fixed_count = ph->kind == PH_LOAD || ph->kind == PH_WARM; + atomic_store(&run_state, ST_WAIT); + atomic_store(&seq_counter, 0); + for (int i = 0; i < T; i++) { + workers[i].idx = i; + workers[i].ph = ph; + workers[i].rng = mix(opt.seed * 1000003 + (uint64_t)i * 7919 + 17 + + (uint64_t)ph->kind * 131 + (uint64_t)ph->dist); + if (pthread_create(&workers[i].th, NULL, fn, &workers[i])) { + fprintf(stderr, "FATAL: pthread_create\n"); + exit(3); + } + } + fprintf(stderr, + "phase %s: T=%d dist=%s %s\n", + ph->name, + T, + dist_name(ph->dist), + fixed_count ? "(fixed count)" : "(fixed duration)"); + wd_what = ph->name; + atomic_store(&wd_mode, WD_OPS); + snap_t a, b; + if (fixed_count) { + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + take_snap(&b); + } else { + atomic_store_explicit(&run_state, ST_WARMUP, memory_order_release); + sleep_secs(opt.warmup); + take_snap(&a); + atomic_store_explicit(&run_state, ST_MEASURE, memory_order_release); + sleep_secs(opt.secs); + atomic_store_explicit(&run_state, ST_STOP, memory_order_release); + take_snap(&b); + for (int i = 0; i < T; i++) { + pthread_join(workers[i].th, NULL); + } + } + atomic_store(&wd_mode, WD_IDLE); + + if (ph->kind == PH_OW) { + verify_overwrite_sample(ph, T); + } + + hist_t *lat = calloc(1, sizeof(hist_t)), + *startup = calloc(1, sizeof(hist_t)); + uint64_t ops = 0, tuples = 0, pt_ns = 0, pt_div = 0, dns = 0, dn = 0, + viol = 0, errs = 0, found = 0, notfound = 0; + for (int i = 0; i < T; i++) { + worker_t *w = &workers[i]; + hist_merge(lat, &w->lat); + hist_merge(startup, &w->startup); + ops += w->ops; + tuples += w->tuples; + pt_ns += w->pt_ns; + pt_div += w->pt_div; + dns += w->deinit_ns; + dn += w->deinit_n; + viol += w->violations; + errs += w->errors; + found += w->found; + notfound += w->notfound; + } + if (ph->kind == PH_WARM) { + tuples = ops; + if (ops != opt.n && !(opt.sabotage & 8)) { + fprintf(stderr, + "VIOLATION: warm scanned %" PRIu64 " tuples, expected %" PRIu64 + "\n", + ops, + opt.n); + viol++; + } + } + if (ph->kind == PH_POINT) { + fprintf(stderr, + " found=%" PRIu64 " notfound=%" PRIu64 "\n", + found, + notfound); + } + + double insert_s = (b.t_ns - a.t_ns) / 1e9, drain_s = 0; + snap_t da, dbs; + uint64_t app = 0, alc = 0; + bool closed = false; + if (ph->kind == PH_LOAD || last) { + take_snap(&da); + drain_s = db_close(); + take_snap(&dbs); + file_sizes(&app, &alc); + closed = true; + } + csv_row(ph, + T, + lat, + startup, + ops, + tuples, + pt_ns, + pt_div, + dns, + dn, + viol, + errs, + &a, + &b, + insert_s, + drain_s, + closed ? &da : NULL, + closed ? &dbs : NULL, + app, + alc); + if (viol) { + printf(" FINDING: %" PRIu64 + " correctness violations in %s (first: %s)\n", + viol, + ph->name, + workers[0].first_violation[0] ? workers[0].first_violation + : "see stderr"); + } + free(lat); + free(startup); + free(workers); + workers = NULL; + nworkers = 0; + if (closed && !last) { + db_open(false); + } +} + +/* ------------------------------------------------------------------------ */ +/* CLI */ +/* ------------------------------------------------------------------------ */ + +static void +usage(void) +{ + fprintf( + stderr, + "usage: kvbench --db PATH (--create|--open) --n N --cache-mib M " + "--disk-gib G --log 0|1\n" + " [--threads 6] [--mt-bg 1] [--normal-bg 4] [--memtable-mib 24]\n" + " [--secs 20] [--warmup 3] [--csv FILE] [--hang-dir DIR]\n" + " [--vtag S] [--stag S] [--otag S] [--rep R] [--seed S]\n" + " [--sabotage MASK] (1: point present->query absent; 2: point " + "neg->query present;\n" + " 4: range expects +1; 8: warm expects +1; 16: " + "point threads hang)\n" + " [--hang-secs 120] (no-progress timeout before gdb dump + exit 99\n" + " phase... load:random|load:seq warm point:uniform|zipf|seq|neg\n" + " range:uniform|zipf:L ow:uniform|zipf (suffix @T = " + "threads)\n"); + exit(2); +} + +static bool +parse_phase(const char *s, phase_t *ph) +{ + memset(ph, 0, sizeof(*ph)); + snprintf(ph->name, sizeof(ph->name), "%s", s); + char buf[64]; + snprintf(buf, sizeof(buf), "%s", s); + char *at = strchr(buf, '@'); + if (at) { + *at = 0; + ph->threads = atoi(at + 1); + } + char *a = strtok(buf, ":"), *b = strtok(NULL, ":"), *c = strtok(NULL, ":"); + if (!a) { + return false; + } + enum dist d = D_UNIFORM; + if (b) { + if (!strcmp(b, "uniform")) + d = D_UNIFORM; + else if (!strcmp(b, "zipf")) + d = D_ZIPF; + else if (!strcmp(b, "seq")) + d = D_SEQ; + else if (!strcmp(b, "neg")) + d = D_NEG; + else if (!strcmp(b, "random")) + d = D_RANDOM; + else + return false; + } + ph->dist = d; + if (!strcmp(a, "load")) { + ph->kind = PH_LOAD; + return b && (d == D_RANDOM || d == D_SEQ); + } else if (!strcmp(a, "warm")) { + ph->kind = PH_WARM; + return true; + } else if (!strcmp(a, "point")) { + ph->kind = PH_POINT; + return b != NULL; + } else if (!strcmp(a, "range")) { + ph->kind = PH_RANGE; + if (!b || !c || (d != D_UNIFORM && d != D_ZIPF)) { + return false; + } + ph->L = strtoull(c, NULL, 10); + return ph->L >= 1; + } else if (!strcmp(a, "ow")) { + ph->kind = PH_OW; + return b && (d == D_UNIFORM || d == D_ZIPF); + } + return false; +} + +int +main(int argc, char **argv) +{ + opt = (options){.threads = 6, + .mt_bg = 1, + .normal_bg = 4, + .memtable_mib = 24, + .secs = 20, + .warmup = 3, + .vtag = "?", + .stag = "?", + .otag = "?", + .rep = 1, + .seed = 42, + .hang_secs = 120, + .use_log = -1}; + int mode = -1; +#ifdef KVBENCH_SPACE_MODE + /* + * Space-check build only: open with use_stats, print insertion stats + * (which include allocator "Currently Allocated" extents, recomputed from + * the persisted allocator map at open), close. No phases, no writes. + */ + bool space_mode = false; +#endif + for (int i = 1; i < argc; i++) { + const char *s = argv[i]; +#define ARG(name) (!strcmp(s, name) && i + 1 < argc) + if (!strcmp(s, "--create")) + mode = 1; + else if (!strcmp(s, "--open")) + mode = 0; + else if (ARG("--db")) + opt.db = argv[++i]; + else if (ARG("--csv")) + opt.csv = argv[++i]; + else if (ARG("--hang-dir")) + opt.hang_dir = argv[++i]; + else if (ARG("--vtag")) + opt.vtag = argv[++i]; + else if (ARG("--stag")) + opt.stag = argv[++i]; + else if (ARG("--otag")) + opt.otag = argv[++i]; + else if (ARG("--rep")) + opt.rep = atoi(argv[++i]); + else if (ARG("--n")) + opt.n = strtoull(argv[++i], NULL, 0); + else if (ARG("--cache-mib")) + opt.cache_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--disk-gib")) + opt.disk_gib = strtoull(argv[++i], NULL, 0); + else if (ARG("--memtable-mib")) + opt.memtable_mib = strtoull(argv[++i], NULL, 0); + else if (ARG("--log")) + opt.use_log = atoi(argv[++i]); + else if (ARG("--threads")) + opt.threads = atoi(argv[++i]); + else if (ARG("--mt-bg")) + opt.mt_bg = atoi(argv[++i]); + else if (ARG("--normal-bg")) + opt.normal_bg = atoi(argv[++i]); + else if (ARG("--secs")) + opt.secs = atof(argv[++i]); + else if (ARG("--warmup")) + opt.warmup = atof(argv[++i]); + else if (ARG("--sabotage")) + opt.sabotage = strtoull(argv[++i], NULL, 0); + else if (ARG("--hang-secs")) + opt.hang_secs = strtoull(argv[++i], NULL, 0); + else if (ARG("--seed")) + opt.seed = strtoull(argv[++i], NULL, 0); +#ifdef KVBENCH_SPACE_MODE + else if (!strcmp(s, "space")) + space_mode = true; +#endif + else if (s[0] == '-') + usage(); + else { + if (opt.nphases >= MAX_PHASES + || !parse_phase(s, &opt.phases[opt.nphases])) + { + fprintf(stderr, "bad phase '%s'\n", s); + usage(); + } + opt.nphases++; + } +#undef ARG + } +#ifdef KVBENCH_SPACE_MODE + if (space_mode && opt.db && opt.cache_mib && opt.disk_gib + && opt.use_log >= 0) + { + default_data_config_init(&data_cfg); prefix_configure(); + platform_set_log_streams(stdout, stderr); + db_open(false); + splinterdb_stats_print_insertion(kvs); + fflush(stdout); + db_close(); + uint64_t app, alc; + file_sizes(&app, &alc); + printf("space: db_apparent=%" PRIu64 " db_alloc=%" PRIu64 "\n", app, alc); + return 0; + } +#endif + if (!opt.db || mode < 0 || !opt.n || !opt.cache_mib || !opt.disk_gib + || opt.use_log < 0 || !opt.nphases || opt.threads < 1 + || opt.threads > MAX_WORKERS) + { + usage(); + } + for (int i = 0; i < opt.nphases; i++) { + if (opt.phases[i].threads > MAX_WORKERS) { + usage(); + } + } + prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, 0, 0, 0); + setvbuf(stdout, NULL, _IOLBF, 0); + + default_data_config_init(&data_cfg); prefix_configure(); + perm_init(&load_perm, opt.n, opt.seed * 2 + 1); + perm_init(&zipf_perm, opt.n, opt.seed * 2 + 2); + zipf_init(&zipf, opt.n, 0.99); + generation = (uint64_t)time(NULL); + + printf("kvbench version=%s splinter=%s db=%s mode=%s n=%" PRIu64 + " cache_mib=%" PRIu64 " disk_gib=%" PRIu64 + " log=%d threads=%d mt_bg=%d normal_bg=%d memtable_mib=%" PRIu64 + " secs=%.1f warmup=%.1f rep=%d sabotage=%" PRIu64 "\n", + opt.vtag, + splinterdb_get_version(), + opt.db, + mode ? "create" : "open", + opt.n, + opt.cache_mib, + opt.disk_gib, + opt.use_log, + opt.threads, + opt.mt_bg, + opt.normal_bg, + opt.memtable_mib, + opt.secs, + opt.warmup, + opt.rep, + opt.sabotage); + + pthread_t wd; + pthread_create(&wd, NULL, watchdog_main, NULL); + + db_open(mode == 1); + for (int i = 0; i < opt.nphases; i++) { + run_phase(&opt.phases[i], i == opt.nphases - 1); + } + if (kvs) { + db_close(); + } + return 0; +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/host.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/host.json new file mode 100644 index 000000000..be17442e1 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/host.json @@ -0,0 +1,14 @@ +{ + "uname": { + "system": "Linux", + "node": "snafu", + "release": "6.12.107+deb13-amd64", + "version": "#1 SMP PREEMPT_DYNAMIC Debian 6.12.107-1 (2026-08-29)", + "machine": "x86_64", + "processor": "" + }, + "gcc": "gcc (Debian 14.2.0-19) 14.2.0", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "cpu": "{\n \"lscpu\": [\n {\n \"field\": \"Architecture:\",\n \"data\": \"x86_64\"\n },{\n \"field\": \"CPU op-mode(s):\",\n \"data\": \"32-bit, 64-bit\"\n },{\n \"field\": \"Address sizes:\",\n \"data\": \"46 bits physical, 48 bits virtual\"\n },{\n \"field\": \"Byte Order:\",\n \"data\": \"Little Endian\"\n },{\n \"field\": \"CPU(s):\",\n \"data\": \"20\"\n },{\n \"field\": \"On-line CPU(s) list:\",\n \"data\": \"0-19\"\n },{\n \"field\": \"Vendor ID:\",\n \"data\": \"GenuineIntel\"\n },{\n \"field\": \"Model name:\",\n \"data\": \"12th Gen Intel(R) Core(TM) i7-12800H\"\n },{\n \"field\": \"CPU family:\",\n \"data\": \"6\"\n },{\n \"field\": \"Model:\",\n \"data\": \"154\"\n },{\n \"field\": \"Thread(s) per core:\",\n \"data\": \"2\"\n },{\n \"field\": \"Core(s) per socket:\",\n \"data\": \"14\"\n },{\n \"field\": \"Socket(s):\",\n \"data\": \"1\"\n },{\n \"field\": \"Stepping:\",\n \"data\": \"3\"\n },{\n \"field\": \"CPU(s) scaling MHz:\",\n \"data\": \"57%\"\n },{\n \"field\": \"CPU max MHz:\",\n \"data\": \"4800.0000\"\n },{\n \"field\": \"CPU min MHz:\",\n \"data\": \"400.0000\"\n },{\n \"field\": \"BogoMIPS:\",\n \"data\": \"5606.40\"\n },{\n \"field\": \"Flags:\",\n \"data\": \"fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb intel_pt sha_ni xsaveopt xsavec xgetbv1 xsaves split_lock_detect user_shstk avx_vnni dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp hwp_pkg_req hfi vnmi umip pku ospke waitpkg gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize pconfig arch_lbr ibt flush_l1d arch_capabilities\"\n },{\n \"field\": \"Virtualization:\",\n \"data\": \"VT-x\"\n },{\n \"field\": \"L1d cache:\",\n \"data\": \"544 KiB (14 instances)\"\n },{\n \"field\": \"L1i cache:\",\n \"data\": \"704 KiB (14 instances)\"\n },{\n \"field\": \"L2 cache:\",\n \"data\": \"11.5 MiB (8 instances)\"\n },{\n \"field\": \"L3 cache:\",\n \"data\": \"24 MiB (1 instance)\"\n },{\n \"field\": \"NUMA node(s):\",\n \"data\": \"1\"\n },{\n \"field\": \"NUMA node0 CPU(s):\",\n \"data\": \"0-19\"\n },{\n \"field\": \"Vulnerability Gather data sampling:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Indirect target selection:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Itlb multihit:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability L1tf:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Mds:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Meltdown:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Mmio stale data:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Reg file data sampling:\",\n \"data\": \"Mitigation; Clear Register File\"\n },{\n \"field\": \"Vulnerability Retbleed:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Spec rstack overflow:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Spec store bypass:\",\n \"data\": \"Mitigation; Speculative Store Bypass disabled via prctl\"\n },{\n \"field\": \"Vulnerability Spectre v1:\",\n \"data\": \"Mitigation; usercopy/swapgs barriers and __user pointer sanitization\"\n },{\n \"field\": \"Vulnerability Spectre v2:\",\n \"data\": \"Mitigation; Enhanced / Automatic IBRS; IBPB conditional; PBRSB-eIBRS SW sequence; BHI BHI_DIS_S\"\n },{\n \"field\": \"Vulnerability Srbds:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Tsa:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Tsx async abort:\",\n \"data\": \"Not affected\"\n },{\n \"field\": \"Vulnerability Vmscape:\",\n \"data\": \"Mitigation; IBPB before exit to userspace\"\n }\n ]\n}\n", + "main": "fc0bc8f7e39566f14822bb598376458bdf1e28b3" +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/imported-run_matrix.py b/benchmarks/results-20261013/main-fc0bc8f7-screen/imported-run_matrix.py new file mode 100644 index 000000000..532cb8667 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/imported-run_matrix.py @@ -0,0 +1,156 @@ +"""Fresh main integration screening. Invoke every mode under run_job.py benchmark.""" +import argparse,csv,hashlib,json,os,re,resource,signal,statistics,subprocess,time +from pathlib import Path +ROOT=Path('/home/rob/projects/splinterdb'); CAMP=ROOT/'.cache/projects-20261011' +COORD=Path(__file__).resolve().parent; OUT=CAMP/'benchmarks/main-7bb5fab' +VARIANTS=['disk-format','filtered-ranges','log-group-limit','lazy-merge','async-durable-barrier','cache-invalid-addresses','directory-direct','directory-bucket','directory-bucket-simd','directory-bucket-atomic'] +ORDER=['main',*VARIANTS,'main',*reversed(VARIANTS),'main'] +def sha(path): + h=hashlib.sha256() + with Path(path).open('rb') as f: + for b in iter(lambda:f.read(1024*1024),b''):h.update(b) + return h.hexdigest() +def save(path,value):path.write_text(json.dumps(value,indent=2)+'\n') +def rows(path): + with path.open() as f:return list(csv.DictReader(f)) +def csvwrite(path,data): + if not data:return + with path.open('w') as f: + w=csv.DictWriter(f,fieldnames=list(data[0]),lineterminator='\n');w.writeheader();w.writerows(data) +def build(name): + r=json.loads((COORD/(name+'-build.json')).read_text()) + assert sha(r['library'])==r['library_sha256'],name + for filename,expected in r['source_files_sha256'].items():assert sha(Path(r['tree'])/filename)==expected,(name,filename) + for b in r['binaries'].values(): + assert sha(b['binary'])==b['binary_sha256'],name + assert sha(b['source'])==b['source_sha256'],(name,b['source']) + return r +def cmdrun(folder,manifest,label,profile,binary,args,env=None,timeout=600): + b=build(profile);exe=b['binaries'][binary] + cmd=['taskset','-c','0-11',exe['binary'],*map(str,args)] + rec=dict(label=label,profile=profile,command=cmd,started=time.time(),binary_sha256=exe['binary_sha256'],library_sha256=b['library_sha256'],source_head=b['head'],verified=False) + print(label,flush=True) + log=folder/(label+'.log') + try: + before=resource.getrusage(resource.RUSAGE_CHILDREN) + with log.open('w') as f: + p=subprocess.Popen(cmd,env=dict(os.environ,**(env or {})),stdout=f,stderr=subprocess.STDOUT,start_new_session=True) + try:p.wait(timeout=timeout) + except BaseException: + try:os.killpg(p.pid,signal.SIGKILL) + except ProcessLookupError:pass + p.wait() + raise + after=resource.getrusage(resource.RUSAGE_CHILDREN) + rec.update(returncode=p.returncode,finished=time.time(),log_sha256=sha(log),process_cpu_s=(after.ru_utime+after.ru_stime-before.ru_utime-before.ru_stime),process_read_bytes=512*(after.ru_inblock-before.ru_inblock),process_write_bytes=512*(after.ru_oublock-before.ru_oublock)) + except BaseException as e: + rec.update(exception=str(e),finished=time.time());manifest['runs'].append(rec);save(folder/'manifest.json',manifest);raise + manifest['runs'].append(rec);save(folder/'manifest.json',manifest) + assert p.returncode==0,rec + assert 'FINDING: splinterdb_close' not in log.read_text(),rec + return rec + +def newmode(mode): + folder=OUT/mode;folder.mkdir(parents=True,exist_ok=False) + fs=subprocess.check_output(['findmnt','-n','-o','FSTYPE,SOURCE','-T',str(folder)],text=True).strip();assert fs.split()[0] not in ['tmpfs','ramfs'] and fs.split()[1].startswith('/dev/') + manifest=dict(mode=mode,storage=fs,io='O_DIRECT',cpu_affinity='0-11',scope='Updated feature branches versus fresh main; not an isolation of merge cost',runner_sha256=sha(__file__),runs=[]) + save(folder/'manifest.json',manifest);return folder,manifest + +def kvargs(db,csvpath,profile,regime,index,secs=6,prefix=False,create=False): + return ['--db',db,'--create' if create else '--open','--n',200000 if regime=='resident' else 2000000,'--cache-mib',128 if regime=='resident' else 64,'--disk-gib',8,'--log',0,'--threads',1 if create else 8,'--mt-bg',0,'--normal-bg',0,'--memtable-mib',4,'--secs',secs,'--warmup',1,'--csv',csvpath,'--vtag',profile,'--stag',regime,'--otag',index,'--rep',index,'--seed',42,'--hang-secs',60,'--hang-dir',str(csvpath.parent)] +def verifykv(csvpath,index,count): + rr=[r for r in rows(csvpath) if r['order']==str(index)] + assert len(rr)==count,(index,len(rr),count) + assert all(int(r['ops'])>0 and int(r['errors'])==0 and int(r['violations'])==0 for r in rr),rr + assert all(int(r['ops'])==int(r['n']) for r in rr if r['phase']=='warm' or r['phase'].startswith('load:')),rr + return rr + +def fixtures(): + folder,m=newmode('fixtures');ff={} + for regime in ['resident','disk']: + for profile,pattern in [('main','ordinary'),('disk-format','ordinary'),('main','common'),('branch-prefix','common'),('main','random'),('branch-prefix','random')]: + label=f'{regime}-{profile}-{pattern}';db=folder/(label+'.db');binary='kvbench' if pattern=='ordinary' else 'prefix_kvbench' + rec=cmdrun(folder,m,label,profile,binary,kvargs(db,folder/(label+'.csv'),profile,regime,0,secs=1,create=True)+['load:random'],dict(PREFIX_PATTERN=pattern) if pattern!='ordinary' else None) + verifykv(folder/(label+'.csv'),0,1) + with db.open('rb') as f:os.fsync(f.fileno()) + rec.update(verified=True,verification_kind='load API errors and operation count; query phases later validate data',errors=0,violations=0,fixture=str(db),fixture_sha256=sha(db),allocated_bytes=db.stat().st_blocks*512,apparent_bytes=db.stat().st_size) + ff[label]={k:rec[k] for k in ['fixture','fixture_sha256','allocated_bytes','apparent_bytes']};save(folder/'manifest.json',m);save(folder/'fixtures.json',ff) + m['complete']=True;save(folder/'manifest.json',m) + +def query_one(folder,m,index,profile,regime,phases,pattern='ordinary'): + f=json.loads((OUT/'fixtures/fixtures.json').read_text());owner=profile if profile in ['disk-format','branch-prefix'] else 'main' + fixture=f[f'{regime}-{owner}-{pattern}'];src=Path(fixture['fixture']);before=src.stat() + db=folder/'scratch.db';assert not db.exists() + subprocess.run(['cp','--reflink=auto','--sparse=always',str(src),str(db)],check=True) + with db.open('rb') as image:os.fsync(image.fileno()) + label=f'{index:02d}-{profile}';csvpath=folder/'results.csv';binary='kvbench' if pattern=='ordinary' else 'prefix_kvbench' + rec=cmdrun(folder,m,label,profile,binary,kvargs(db,csvpath,profile,regime,index,secs=6 if regime=='resident' else 5)+phases,dict(PREFIX_PATTERN=pattern) if pattern!='ordinary' else None) + rr=verifykv(csvpath,index,len(phases)) + rec.update(verified=True,verification_kind='query key/value/range validation and successful close',errors=sum(int(r['errors']) for r in rr),violations=sum(int(r['violations']) for r in rr),fixture=fixture,fixture_copy_fsynced=True,db_allocated_bytes=db.stat().st_blocks*512) + assert src.stat().st_mtime_ns==before.st_mtime_ns + save(folder/'manifest.json',m);db.unlink() + +def queries(regime): + folder,m=newmode(regime) + phases=['warm','point:uniform@1','point:uniform@8','range:uniform:1@1','range:uniform:1@8','range:uniform:10000@8'] if regime=='resident' else ['warm','point:uniform@8','range:uniform:1@8','range:uniform:10000@8'] + m.update(order=ORDER,phases=phases) + for i,profile in enumerate(ORDER):query_one(folder,m,i,profile,regime,phases) + m['complete']=True;save(folder/'manifest.json',m) + +def prefix(): + for regime in ['resident','disk']: + for pattern in ['common','random']: + folder,m=newmode(f'prefix-{regime}-{pattern}') + phases=['warm','point:uniform@8','range:uniform:1@8','range:uniform:10000@8'] + if regime=='resident':phases+=['ow:uniform@8'] + for i,profile in enumerate(['main','branch-prefix','branch-prefix','main']):query_one(folder,m,i,profile,regime,phases,pattern) + m['complete']=True;save(folder/'manifest.json',m) + +def insert(): + folder,m=newmode('insert');data=[] + profiles=['disk-format','filtered-ranges','lazy-merge','async-durable-barrier','cache-invalid-addresses','directory-direct','directory-bucket','directory-bucket-simd','directory-bucket-atomic','log-disabled','log-default'] + for wal,versions in [(1,['main',*profiles,'main',*reversed(profiles),'main']),(0,['main','cache-invalid-addresses','directory-bucket-atomic','directory-bucket-atomic','cache-invalid-addresses','main'])]: + for i,version in enumerate(versions): + profile='log-group-limit' if version.startswith('log-') else version + label=f'wal{wal}-{i:02d}-{version}';stem=folder/label;db=folder/'scratch.db';assert not db.exists() + args=['--db',db,'--csv',str(stem)+'.csv','--summary',str(stem)+'.summary.csv','--records',100000000,'--seconds',5,'--report-ms',100,'--cache-mib',256,'--disk-gib',16,'--direct','--inserters',8,'--readers',0,'--memtable-bg',1,'--normal-bg',3,'--memtable-mib',8,'--key-size',16,'--value-size',16,'--min-free-gib',12,'--seed',42] + if not wal:args+=['--no-log'] + if version.startswith('log-'):args+=['--log-group-size-pages',2**64-1 if version=='log-disabled' else 0] + rec=cmdrun(folder,m,label,profile,'insert_benchmark',args,timeout=240) + summary=rows(Path(str(stem)+'.summary.csv'));assert len(summary)==1;summary=summary[0];inserted=int(summary['inserted']);assert inserted>0 + log=(folder/(label+'.log')).read_text();error_match=re.search(r'load_end .* error=([0-9]+)(?: |\n)',log);assert error_match and int(error_match[1])==0 + close=re.search(r'close_s=([\d.]+) close_rc=0',log);assert close + interval=rows(Path(str(stem)+'.csv'));cpu=sum(float(r['cpu_cores'])*float(r['interval_s']) for r in interval) + data.append(dict(wal=wal,version=version,index=i,errors=int(error_match[1]),violations=0,verification_kind='API return, positive insert count, successful close; no readback',ops_s=float(summary['achieved_insert_ops_s']),inserted=inserted,close_s=float(close[1]),drain_ops_s=inserted/(float(summary['elapsed_s'])+float(close[1])),cpu_us_op=cpu*1e6/inserted,p99_us=1000*float(summary['insert_service_p99_ms']),max_ms=float(summary['insert_service_max_ms']),read_B_op=sum(float(r['read_mib_s'])*float(r['interval_s']) for r in interval)*2**20/inserted,write_B_op=sum(float(r['write_mib_s'])*float(r['interval_s']) for r in interval)*2**20/inserted)) + rec.update(verified=True,errors=int(error_match[1]),verification_kind='API return, positive insert count, successful close; no readback',allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);csvwrite(folder/'results.csv',data);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +def hash_range(): + folder,m=newmode('hash');reference=None + for i,profile in enumerate(['main','filtered-ranges','filtered-ranges','main']): + label=f'{i}-{profile}';db=folder/'scratch.db';rec=cmdrun(folder,m,label,profile,'hash_range_benchmark',[db,16384,1000],timeout=900) + lines=(folder/(label+'.log')).read_text().splitlines();start=next(j for j,x in enumerate(lines) if x.startswith('mode,keys_per_tenant,'));rr=list(csv.DictReader(lines[start:]));assert len(rr)==4 + assert [int(r['limit']) for r in rr]==[1,2,10,100] and all(int(r['queries'])==1000 and int(r['keys_per_tenant'])==16384 for r in rr),rr + checks=[x['checksum'] for x in rr] + if reference is None:reference=checks + assert checks==reference + rec.update(verified=True,rows=rr,allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +def barrier(): + folder,m=newmode('barrier') + for wal in [0,1]: + for workers in [0,1]: + order=[('main','sync'),('async-durable-barrier','sync'),('async-durable-barrier','async'),('async-durable-barrier','async'),('async-durable-barrier','sync'),('main','sync')] + for i,(profile,mode) in enumerate(order): + label=f'wal{wal}-workers{workers}-{i}-{profile}-{mode}';db=folder/'scratch.db';csvpath=folder/'results.csv' + rec=cmdrun(folder,m,label,profile,'barrier_bench',[db,csvpath,label,mode,wal,workers,256,2048 if wal else 512],dict(BARRIER_DEPTH='1')) + rr=rows(csvpath);assert rr[-1]['label']==label and int(rr[-1]['verified'])==1 + rec.update(verified=True,allocated_bytes=db.stat().st_blocks*512);save(folder/'manifest.json',m);db.unlink() + m['complete']=True;save(folder/'manifest.json',m) + +if __name__=='__main__': + def interrupted(signum,frame):raise InterruptedError(f'benchmark interrupted by signal {signum}') + for signum in [signal.SIGTERM,signal.SIGHUP]:signal.signal(signum,interrupted) + p=argparse.ArgumentParser();p.add_argument('mode',choices=['fixtures','resident','disk','prefix','insert','hash','barrier']);a=p.parse_args() + {'fixtures':fixtures,'resident':lambda:queries('resident'),'disk':lambda:queries('disk'),'prefix':prefix,'insert':insert,'hash':hash_range,'barrier':barrier}[a.mode]() diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/log-async-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/log-async-build.json new file mode 100644 index 000000000..34c31a3f2 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/log-async-build.json @@ -0,0 +1,158 @@ +{ + "profile": "log-async", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit", + "head": "9bc5ebf403196affb43a0c04fdf0e9234f24d025", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "library_sha256": "e3cdc682d417984ba85019687a3cdeed56dc32a6f659b5698606900a137bc5bc", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "60d90eb75eb504e33ff589fb86bedc130b0939310ad7c6a818b5364e9534ac2d", + "src/shard_log.h": "c6e13b991af5be285b3ad52440f3a51e296604590111a171d0de49293481a729", + "src/splinterdb.c": "70c88c0c09caecd6d9adbb0b6e98c1b7cc928c2f6539595f0e99f1a96cfeac6e", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "1e6bcdbedef94cd67f7b29a198e9d1d1a3fc4855ccfdddf2affa3aec0ee9c4e7" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit/build-main-fc0bc8f7/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/log-async/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/log-async/insert_benchmark", + "binary_sha256": "e11dd692d5a428f8b44ff337b6d246bf65342ab6d8c0cb3a4556ef7e57c4dc7c", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + } + }, + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/log-group-limit/build-main-fc0bc8f7/release/build-config.fb6bc8eeb8390429253883c09491f5bd": { + "sha256": "cfc28a3afe21caf2d8b1257c9014c27c1a9365d2e39601fe18e4d8f0b002b035", + "text": "BUILD_ROOT=build-main-fc0bc8f7\nMAKEFLAGS= -j6 --jobserver-auth=fifo:/tmp/splinter-log-async-fc0-build-release-42zytmqa/GMfifo7 -- BUILD_MODE=release BUILD_ROOT=build-main-fc0bc8f7\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + }, + "verified_runtime_commit": "72a1044e0e43c52103be9b0688659df9bf382ff7" +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/log-sync-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/log-sync-build.json new file mode 100644 index 000000000..ea8109f73 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/log-sync-build.json @@ -0,0 +1,158 @@ +{ + "profile": "log-sync", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/log-sync", + "head": "9bc5ebf403196affb43a0c04fdf0e9234f24d025", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/log-sync/build/release/lib/libsplinterdb.a", + "library_sha256": "6ac594c38088b1ea291e68cbc220c989f69c01a2b5bed5f267a09a67c710d8a9", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "9531c90dd5d0afba0e5d2182c76ab255506694242a7655802d46dc1d4fe7d91c", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "829c05999cbc17485511970dd28527f2ee13c340ff59a94f0c26614c2bd03c49", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "da44e45ffd14c64bb13a3b1376ac9c0b749632da6d5b17ee2fbcd8356f39aed4", + "src/shard_log.h": "e47279d0fe727dd0f1dd787779d2415d54d8b942f3c47fd845f06848d6b416ac", + "src/splinterdb.c": "70c88c0c09caecd6d9adbb0b6e98c1b7cc928c2f6539595f0e99f1a96cfeac6e", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "1ea9663bb9bbf615303365d3b63f58caf977c83ab7088fb5f10c18ba4da49021" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/log-sync/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/log-sync/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/log-sync/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/log-sync/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/log-sync/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/log-sync/insert_benchmark", + "binary_sha256": "d8471c69f9a8ae349c7477b07b86ac38386763a49e10aed0519f2b77494e3387", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + } + }, + "verified_runtime_commit": "9bc5ebf403196affb43a0c04fdf0e9234f24d025", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/log-sync/build/release/build-config.348fafc9ffa4704dcb2b7890cf9058ef": { + "sha256": "65b6e863a8c72f10f7a383167625e6201b9c3716d65ecad6d08829eddc84a402", + "text": "MAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-fc0-log-sync-build-kyhtryu6/GMfifo7 -- BUILD_MODE=release CC=gcc\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC=gcc\nCC = gcc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = gcc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/main-build.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/main-build.json new file mode 100644 index 000000000..7b2403a7b --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/main-build.json @@ -0,0 +1,232 @@ +{ + "profile": "main", + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main", + "head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/build/release/lib/libsplinterdb.a", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "fa4361b3aad52f2ba60a9e1964ef765fb5c0efb68d82487afab4ca66cae1999b", + "src/core.h": "2d4141f4b351cafae8e71e21dc6f570a6d0a4bf3b8b91df86f83dd3e9c0a7809", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "3e7eb447259e7901b915b52b7545e2d5088475171af1716dd9c849dab4c3d1b9", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "b601c29a5dbcbf5ad5c0859ca87a3e9dc2088a10cad77327ee4f1c7f46c02f91", + "src/shard_log.h": "bde00a5cbe72e72ac7133006796e61f046ae758e8e4667aa610e184ed6ef4fd7", + "src/splinterdb.c": "dfb8412a91370d831fb5181d84a6d6f0c2cb8183866847dca9d7bc2596f08404", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "8a6533879de25f1e448a866c4c03304037e40c6e39e20923c0557e9c87d4fda0" + }, + "binaries": { + "insert_benchmark": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_NO_LOG_GROUP_LIMIT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/insert_benchmark" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/insert_benchmark", + "binary_sha256": "cff146208f64da53e018dccdcd63e5b9c2719cba4bbfe478c529f9475d1be5b9", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/insert_benchmark.c", + "source_sha256": "da57ae18e97c88352479be897eedee0ecc9b54bb2b968c579421738dadd8d8b4" + }, + "kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/kvbench", + "binary_sha256": "908373d8f7eb7ec39a004bdfdc7f0a02edb3efe864efce4aeda73d63e73fe48e", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/kvbench.c", + "source_sha256": "45cf9d2e1f74e90719885955d5a78651cc5c1d97cda2daed534a3c0cb07f48a9" + }, + "prefix_kvbench": { + "command": [ + "gcc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/include", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/src", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/src/platform_linux", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench" + ], + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench", + "binary_sha256": "7a44f4665daee510e3108224cf625d7ffe4f6ee2a015c372db435ad6836b404d", + "source": "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/harnesses/prefix_kvbench.c", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51" + } + }, + "verified_runtime_commit": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "library_build_configs": { + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/sources/main/build/release/build-config.348fafc9ffa4704dcb2b7890cf9058ef": { + "sha256": "af76b87dcdc416f18f8c4b6df74bda6a7d662852067a3607c029a2bc81f1405e", + "text": "MAKEFLAGS= -j4 --jobserver-auth=fifo:/tmp/splinter-fc0-main-baseline-build-_tgr69fx/GMfifo6 -- BUILD_MODE=release CC=gcc\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC=gcc\nCC = gcc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = gcc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + } + } +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/run_benchmarks-screen.py b/benchmarks/results-20261013/main-fc0bc8f7-screen/run_benchmarks-screen.py new file mode 100644 index 000000000..e54f8b2a2 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/run_benchmarks-screen.py @@ -0,0 +1,107 @@ +"""Run only through campaign run_job.py benchmark (exclusive real-disk lock).""" +import argparse +import csv +import hashlib +import importlib.util +import json +import os +import re +import statistics +from pathlib import Path + +HERE = Path(__file__).resolve().parent +CAMP = HERE.parent.parent +spec = importlib.util.spec_from_file_location('runner', HERE.parent / 'main-7bb5fab/benchmarks/run_matrix.py') +r = importlib.util.module_from_spec(spec) +spec.loader.exec_module(r) +r.COORD = HERE +r.OUT = CAMP / 'benchmarks/main-fc0bc8f7' + +def log_matrix(): + folder, m = r.newmode('log-async') + m['scope'] = 'Same main base; sync versus async policy, disabled policy, and threshold sensitivity' + m['verification'] = 'Positive inserts, API errors, successful draining close; recovery validated separately' + data = [] + options = {'main': ('main', 0), 'disabled': ('log-async', 2**64-1), + 'sync64': ('log-sync', 0), 'async64': ('log-async', 0), + 'sync1024': ('log-sync', 1024), 'async1024': ('log-async', 1024)} + rounds = [ + ['main', 'disabled', 'sync64', 'async64', 'sync1024', 'async1024', 'main'], + ['main', 'async1024', 'sync1024', 'async64', 'sync64', 'disabled', 'main'], + ['main', 'async64', 'disabled', 'sync1024', 'async1024', 'sync64', 'main'], + ] + for threads in [1, 8]: + for rep, order in enumerate(rounds): + for index, version in enumerate(order): + profile, pages = options[version] + label = f't{threads}-r{rep}-{index}-{version}' + stem = folder / label + db = folder / 'scratch.db' + assert not db.exists() + args = ['--db', db, '--csv', str(stem)+'.csv', '--summary', str(stem)+'.summary.csv', '--records', 100000000, '--seconds', 8, '--report-ms', 100, '--cache-mib', 256, '--disk-gib', 16, '--direct', '--inserters', threads, '--readers', 0, '--memtable-bg', 1, '--normal-bg', 3, '--memtable-mib', 8, '--key-size', 16, '--value-size', 16, '--min-free-gib', 12, '--seed', 42, '--log-group-size-pages', pages] + rec = r.cmdrun(folder, m, label, profile, 'insert_benchmark', args, timeout=180) + summary = r.rows(Path(str(stem)+'.summary.csv')) + assert len(summary) == 1 + summary = summary[0] + inserted = int(summary['inserted']) + assert inserted > 0 + log = (folder / (label+'.log')).read_text() + error = re.search(r'load_end .* error=([0-9]+)(?: |\n)', log) + assert error and int(error[1]) == 0 + close = re.search(r'close_s=([\d.]+) close_rc=0', log) + assert close + assert not re.search(r'automatic.*(failed|error)', log, re.I), log[-2000:] + intervals = r.rows(Path(str(stem)+'.csv')) + cpu = sum(float(x['cpu_cores'])*float(x['interval_s']) for x in intervals) + row = dict(threads=threads, rep=rep, index=index, version=version, ops_s=float(summary['achieved_insert_ops_s']), inserted=inserted, elapsed_s=float(summary['elapsed_s']), close_s=float(close[1]), drain_ops_s=inserted/(float(summary['elapsed_s'])+float(close[1])), cpu_us_op=cpu*1e6/inserted, p99_us=1000*float(summary['insert_service_p99_ms']), p999_us=1000*float(summary['insert_service_p999_ms']), max_ms=float(summary['insert_service_max_ms']), read_B_op=sum(float(x['read_mib_s'])*float(x['interval_s']) for x in intervals)*2**20/inserted, write_B_op=sum(float(x['write_mib_s'])*float(x['interval_s']) for x in intervals)*2**20/inserted) + data.append(row) + rec.update(verified=True, errors=0, inserted=inserted, close_s=row['close_s'], allocated_bytes=db.stat().st_blocks*512) + r.save(folder/'manifest.json', m) + r.csvwrite(folder/'results.csv', data) + db.unlink() + m['complete'] = True + r.save(folder/'manifest.json', m) + +def branch_screen(): + folder, m = r.newmode('branch-screen') + m['scope'] = 'Small resident integration screen; real-disk databases, not comprehensive retuning' + fixtures = {} + for profile, pattern in [('main', 'ordinary'), ('main', 'common'), ('branch-prefix', 'common'), ('main', 'random'), ('branch-prefix', 'random')]: + label = f'fixture-{profile}-{pattern}' + db = folder / (label+'.db') + binary = 'kvbench' if pattern == 'ordinary' else 'prefix_kvbench' + args = r.kvargs(db, folder/(label+'.csv'), profile, 'resident', 0, secs=1, create=True)+['load:random'] + rec = r.cmdrun(folder, m, label, profile, binary, args, {'PREFIX_PATTERN': pattern} if pattern != 'ordinary' else None) + r.verifykv(folder/(label+'.csv'), 0, 1) + with db.open('rb') as f: + os.fsync(f.fileno()) + rec.update(verified=True, fixture_sha256=r.sha(db), allocated_bytes=db.stat().st_blocks*512) + fixtures[(profile, pattern)] = db + r.save(folder/'manifest.json', m) + cases = [('ordinary', ['main', 'cache-invalid-addresses', 'directory-direct', 'directory-bucket', 'directory-bucket-simd', 'directory-bucket-atomic', 'main', 'directory-bucket-atomic', 'directory-bucket-simd', 'directory-bucket', 'directory-direct', 'cache-invalid-addresses', 'main']), + ('common', ['main', 'branch-prefix', 'branch-prefix', 'main']), + ('random', ['main', 'branch-prefix', 'branch-prefix', 'main'])] + for pattern, order in cases: + for index, profile in enumerate(order): + label = f'{pattern}-{index}-{profile}' + db = folder/'scratch.db' + assert not db.exists() + fixture = fixtures[('branch-prefix' if profile == 'branch-prefix' else 'main', pattern)] + r.subprocess.run(['cp', '--reflink=auto', '--sparse=always', str(fixture), str(db)], check=True) + with db.open('rb') as f: + os.fsync(f.fileno()) + csvpath = folder/(pattern+'-results.csv') + args = r.kvargs(db, csvpath, profile, 'resident', index, secs=3)+['warm', 'point:uniform@8', 'range:uniform:1@8', 'range:uniform:10000@8'] + rec = r.cmdrun(folder, m, label, profile, 'kvbench' if pattern == 'ordinary' else 'prefix_kvbench', args, {'PREFIX_PATTERN': pattern} if pattern != 'ordinary' else None) + rows = r.verifykv(csvpath, index, 4) + rec.update(verified=True, errors=0, violations=0, fixture=str(fixture), allocated_bytes=db.stat().st_blocks*512) + r.save(folder/'manifest.json', m) + db.unlink() + m['complete'] = True + r.save(folder/'manifest.json', m) + +if __name__ == '__main__': + p = argparse.ArgumentParser() + p.add_argument('mode', choices=['log', 'screen']) + a = p.parse_args() + {'log': log_matrix, 'screen': branch_screen}[a.mode]() diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/run_job.py b/benchmarks/results-20261013/main-fc0bc8f7-screen/run_job.py new file mode 100644 index 000000000..299c91084 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/run_job.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Coordinate this campaign's builds/tests and disk-backed benchmarks.""" +import argparse +import fcntl +import json +import os +from pathlib import Path +import subprocess +import tempfile +import time + +ROOT = Path(__file__).resolve().parent.parent +p = argparse.ArgumentParser() +p.add_argument('mode', choices=['build', 'test', 'benchmark']) +p.add_argument('--name', required=True) +p.add_argument('--db-dir', type=Path) +p.add_argument('command', nargs=argparse.REMAINDER) +a = p.parse_args() +command = a.command[1:] if a.command[:1] == ['--'] else a.command +if not command: + p.error('command required after --') +if a.mode == 'benchmark': + if a.db_dir is None: + p.error('benchmark requires --db-dir') + a.db_dir.mkdir(parents=True, exist_ok=True) + db_dir = a.db_dir.resolve() + if not db_dir.is_relative_to(ROOT / 'benchmarks'): + p.error('benchmark database directory must be under the campaign benchmarks directory') + fs = subprocess.check_output(['findmnt', '-n', '-o', 'FSTYPE,SOURCE', '-T', str(db_dir)], text=True).strip() + if fs.split()[0] in {'tmpfs', 'ramfs'} or not fs.split()[1].startswith('/dev/'): + p.error('benchmark storage must be a verified disk filesystem: ' + fs) + bench_lock = open(ROOT / 'coordination' / 'benchmark.lock', 'a+') + fcntl.flock(bench_lock, fcntl.LOCK_EX) + print('Benchmark database storage:', fs, str(db_dir), flush=True) +machine_lock = open(ROOT / 'coordination' / 'machine.lock', 'a+') +fcntl.flock(machine_lock, fcntl.LOCK_EX if a.mode == 'benchmark' else fcntl.LOCK_SH) +record = dict(name=a.name, mode=a.mode, cwd=os.getcwd(), command=command, + started=time.time(), pid=os.getpid()) +if a.db_dir is not None: + record['db_dir'] = str(a.db_dir.resolve()) +print('Starting', a.name, a.mode, flush=True) +try: + # Tool commands run in distinct PID namespaces; GNU make's FIFO names + # otherwise collide when several builds choose /tmp/GMfifo8. + with tempfile.TemporaryDirectory(prefix='splinter-' + a.name + '-', dir='/tmp') as temporary: + environment = dict(os.environ, TMPDIR=temporary) + result = subprocess.run(command, env=environment) + record['returncode'] = result.returncode +finally: + record['finished'] = time.time() + with open(ROOT / 'coordination' / 'jobs.jsonl', 'a') as journal: + fcntl.flock(journal, fcntl.LOCK_EX) + journal.write(json.dumps(record) + '\n') +raise SystemExit(result.returncode) diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-0-main.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-0-main.log new file mode 100644 index 000000000..45aa1fa93 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-0-main.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=0 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15946688 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3585000 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=12722971 notfound=0 +== point:uniform@8 T=8 ops=12722971 secs= 3.00 ops/s= 4240675 lat us p50=1.78 p99=2.46 p99.9=6.85 max=144.4 mean=1.81 + cpu=24.00s ops/cpu-s=530227 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=5 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3328680 secs= 3.00 ops/s= 1109478 lat us p50=6.34 p99=9.86 p99.9=16.64 max=104.2 mean=7.16 + cpu=24.00s ops/cpu-s=138699 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.95 p99=9.34 mean=6.74 per-tuple=nan ns deinit mean=0.37 us tuples/s=1109478 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 13234 ops (+1323 ops/s) +close took 0.087 s +== range:uniform:10000@8 T=8 ops=13381 secs= 3.00 ops/s= 4460 lat us p50=1425.41 p99=3702.78 p99.9=3833.86 max=3926.2 mean=1793.18 + cpu=24.00s ops/cpu-s=558 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=3 swapout=0 majflt=0 + startup us p50=8.83 p99=14.98 mean=8.96 per-tuple=182.8 ns deinit mean=0.67 us tuples/s=43488063 + insert/run=3.00s drain(close)=0.09s total=3.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-1-branch-prefix.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-1-branch-prefix.log new file mode 100644 index 000000000..6b8e9d84e --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-1-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 100800cb-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 17817439 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=4187517 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=13170594 notfound=0 +== point:uniform@8 T=8 ops=13170594 secs= 3.00 ops/s= 4389853 lat us p50=1.68 p99=2.40 p99.9=5.82 max=1022.1 mean=1.75 + cpu=24.00s ops/cpu-s=548846 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3398763 secs= 3.00 ops/s= 1132839 lat us p50=6.08 p99=9.86 p99.9=17.15 max=92.3 mean=7.01 + cpu=24.03s ops/cpu-s=141438 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.70 p99=9.09 mean=6.54 per-tuple=nan ns deinit mean=0.43 us tuples/s=1132839 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11132 ops (+1113 ops/s) +close took 0.065 s +== range:uniform:10000@8 T=8 ops=11280 secs= 3.00 ops/s= 3760 lat us p50=1982.46 p99=5046.27 p99.9=5832.70 max=6230.7 mean=2127.12 + cpu=24.00s ops/cpu-s=470 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.10 p99=16.26 mean=7.95 per-tuple=217.1 ns deinit mean=0.67 us tuples/s=36692714 + insert/run=3.00s drain(close)=0.07s total=3.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=207360000 db_alloc=26005504 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-2-branch-prefix.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-2-branch-prefix.log new file mode 100644 index 000000000..c4798c92f --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-2-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 100800cb-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=2 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 17887171 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=3805030 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=12696511 notfound=0 +== point:uniform@8 T=8 ops=12696511 secs= 3.00 ops/s= 4231833 lat us p50=1.78 p99=2.53 p99.9=5.95 max=118.6 mean=1.81 + cpu=23.99s ops/cpu-s=529209 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=28 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3397676 secs= 3.00 ops/s= 1132470 lat us p50=6.08 p99=9.86 p99.9=17.66 max=143.2 mean=7.02 + cpu=24.00s ops/cpu-s=141595 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.70 p99=9.34 mean=6.54 per-tuple=nan ns deinit mean=0.42 us tuples/s=1132470 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10821 ops (+1082 ops/s) +close took 0.075 s +== range:uniform:10000@8 T=8 ops=10885 secs= 3.00 ops/s= 3628 lat us p50=2326.53 p99=5308.42 p99.9=5439.49 max=6226.9 mean=2203.71 + cpu=24.00s ops/cpu-s=454 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.98 p99=11.65 mean=7.60 per-tuple=225.2 ns deinit mean=0.63 us tuples/s=35401408 + insert/run=3.00s drain(close)=0.08s total=3.08s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=207360000 db_alloc=26005504 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-3-main.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-3-main.log new file mode 100644 index 000000000..53d44ad15 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-3-main.log @@ -0,0 +1,21 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=3 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14096139 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2875422 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=12648917 notfound=0 +== point:uniform@8 T=8 ops=12648917 secs= 3.00 ops/s= 4215987 lat us p50=1.81 p99=2.46 p99.9=8.32 max=90.0 mean=1.82 + cpu=24.00s ops/cpu-s=527105 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3334860 secs= 3.00 ops/s= 1111537 lat us p50=6.21 p99=10.11 p99.9=17.66 max=86.0 mean=7.15 + cpu=24.00s ops/cpu-s=138961 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.82 p99=9.60 mean=6.74 per-tuple=nan ns deinit mean=0.37 us tuples/s=1111537 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11056 ops (+1106 ops/s) +close took 0.067 s +== range:uniform:10000@8 T=8 ops=11117 secs= 3.00 ops/s= 3705 lat us p50=2080.77 p99=4521.98 p99.9=4521.98 max=4600.3 mean=2158.06 + cpu=24.00s ops/cpu-s=463 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.87 p99=12.42 mean=8.38 per-tuple=220.2 ns deinit mean=0.64 us tuples/s=36169664 + insert/run=3.00s drain(close)=0.07s total=3.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-results.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-results.csv new file mode 100644 index 000000000..b38bb1917 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/common-results.csv @@ -0,0 +1,17 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.013,15946688.3,nan,nan,nan,0.000,nan,0.056,3585000.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15946688.3,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,point:uniform@8,8,0,200000,12722971,3.000,4240675.2,1.776,2.464,6.848,144.408,1.813,23.995,530227.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,5,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,3328680,3.000,1109477.8,6.336,9.856,16.640,104.178,7.159,23.999,138699.0,0,0,0.00,0.00,5.952,9.344,6.745,nan,0.373,3328680,1109477.8,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,13381,3.000,4459.9,1425.408,3702.784,3833.856,3926.199,1793.176,23.999,557.6,0,0,0.00,0.00,8.832,14.976,8.957,182.81,0.668,130476692,43488062.6,3.000,0.087,3.087,0.014,0,307200,nan,237375488,37285888,0.005,0,0,3,0,0 +branch-prefix,resident,1,0,warm,8,1,200000,200000,0.011,17817438.6,nan,nan,nan,0.000,nan,0.048,4187517.0,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,17817438.6,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.006,0,0,0,0,2 +branch-prefix,resident,1,0,point:uniform@8,8,1,200000,13170594,3.000,4389852.9,1.680,2.400,5.824,1022.077,1.747,23.997,548845.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +branch-prefix,resident,1,0,range:uniform:1@8,8,1,200000,3398763,3.000,1132838.7,6.080,9.856,17.152,92.296,7.013,24.030,141438.2,0,0,0.00,0.00,5.696,9.088,6.537,nan,0.427,3398763,1132838.7,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +branch-prefix,resident,1,0,range:uniform:10000@8,8,1,200000,11280,3.000,3759.7,1982.464,5046.272,5832.704,6230.693,2127.119,23.996,470.1,0,0,0.00,0.00,7.104,16.256,7.950,217.14,0.669,110088184,36692714.1,3.000,0.065,3.065,0.012,0,307200,nan,207360000,26005504,0.006,0,0,0,0,0 +branch-prefix,resident,2,0,warm,8,2,200000,200000,0.011,17887170.9,nan,nan,nan,0.000,nan,0.053,3805030.2,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,17887170.9,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.005,0,0,0,0,1 +branch-prefix,resident,2,0,point:uniform@8,8,2,200000,12696511,3.000,4231832.6,1.776,2.528,5.952,118.559,1.814,23.991,529208.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,28,0,0 +branch-prefix,resident,2,0,range:uniform:1@8,8,2,200000,3397676,3.000,1132470.5,6.080,9.856,17.664,143.219,7.015,23.996,141594.7,0,0,0.00,0.00,5.696,9.344,6.544,nan,0.424,3397676,1132470.5,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +branch-prefix,resident,2,0,range:uniform:10000@8,8,2,200000,10885,3.000,3628.0,2326.528,5308.416,5439.488,6226.860,2203.708,23.997,453.6,0,0,0.00,0.00,6.976,11.648,7.600,225.23,0.627,106213843,35401408.2,3.000,0.075,3.076,0.012,0,307200,nan,207360000,26005504,0.005,0,0,0,0,0 +main,resident,3,0,warm,8,3,200000,200000,0.014,14096139.3,nan,nan,nan,0.000,nan,0.070,2875422.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14096139.3,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,3,0,point:uniform@8,8,3,200000,12648917,3.000,4215987.0,1.808,2.464,8.320,89.988,1.824,23.997,527105.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,3334860,3.000,1111536.9,6.208,10.112,17.664,86.009,7.147,23.998,138961.4,0,0,0.00,0.00,5.824,9.600,6.738,nan,0.368,3334860,1111536.9,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,11117,3.000,3705.4,2080.768,4521.984,4521.984,4600.280,2158.058,23.999,463.2,0,0,0.00,0.00,7.872,12.416,8.384,220.23,0.638,108518028,36169663.9,3.000,0.067,3.067,0.013,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.csv new file mode 100644 index 000000000..869000c59 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +branch-prefix,resident,0,0,load:random,1,0,200000,200000,0.257,776817.0,0.616,2.720,4.672,41964.040,1.249,0.257,776901.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.257,0.109,0.366,0.025,0,25972736,0.7919,207360000,26128384,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.log new file mode 100644 index 000000000..3f473be08 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-common.log @@ -0,0 +1,8 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 100800cb-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-common.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.008 s +phase load:random: T=1 dist=random (fixed count) +close took 0.109 s +== load:random T=1 ops=200000 secs= 0.26 ops/s= 776817 lat us p50=0.62 p99=2.72 p99.9=4.67 max=41964.0 mean=1.25 + cpu=0.26s ops/cpu-s=776901 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.26s drain(close)=0.11s total=0.37s drain_cpu=0.02s drain_rd=0 drain_wr=25972736 wamp=0.792 db_apparent=207360000 db_alloc=26128384 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.csv new file mode 100644 index 000000000..81729cba5 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +branch-prefix,resident,0,0,load:random,1,0,200000,200000,0.323,620079.8,0.744,3.616,6.208,38302.613,1.472,0.323,620128.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.323,0.130,0.453,0.028,4096,37253120,1.1358,237375488,37408768,0.011,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.log new file mode 100644 index 000000000..c282a751e --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-branch-prefix-random.log @@ -0,0 +1,8 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 100800cb-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-random.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.011 s +phase load:random: T=1 dist=random (fixed count) +close took 0.130 s +== load:random T=1 ops=200000 secs= 0.32 ops/s= 620080 lat us p50=0.74 p99=3.62 p99.9=6.21 max=38302.6 mean=1.47 + cpu=0.32s ops/cpu-s=620128 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.32s drain(close)=0.13s total=0.45s drain_cpu=0.03s drain_rd=4096 drain_wr=37253120 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.csv new file mode 100644 index 000000000..9cd144093 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random,1,0,200000,200000,0.260,768482.1,0.632,2.720,4.672,41774.566,1.262,0.260,768952.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.260,0.128,0.389,0.024,0,37253120,1.1358,237375488,37408768,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.log new file mode 100644 index 000000000..1714a7701 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-common.log @@ -0,0 +1,8 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-common.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.008 s +phase load:random: T=1 dist=random (fixed count) +close took 0.128 s +== load:random T=1 ops=200000 secs= 0.26 ops/s= 768482 lat us p50=0.63 p99=2.72 p99.9=4.67 max=41774.6 mean=1.26 + cpu=0.26s ops/cpu-s=768953 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.26s drain(close)=0.13s total=0.39s drain_cpu=0.02s drain_rd=0 drain_wr=37253120 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.csv new file mode 100644 index 000000000..b36eb917b --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random,1,0,200000,200000,0.205,976751.0,0.568,2.912,5.056,3573.105,0.985,0.205,977283.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.205,0.084,0.288,0.021,0,28749824,1.1593,162664448,28905472,0.015,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.log new file mode 100644 index 000000000..4c32aadc4 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-ordinary.log @@ -0,0 +1,7 @@ +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.015 s +phase load:random: T=1 dist=random (fixed count) +close took 0.084 s +== load:random T=1 ops=200000 secs= 0.20 ops/s= 976751 lat us p50=0.57 p99=2.91 p99.9=5.06 max=3573.1 mean=0.99 + cpu=0.20s ops/cpu-s=977283 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.20s drain(close)=0.08s total=0.29s drain_cpu=0.02s drain_rd=0 drain_wr=28749824 wamp=1.159 db_apparent=162664448 db_alloc=28905472 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.csv new file mode 100644 index 000000000..a4b2f8aad --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random,1,0,200000,200000,0.255,784707.3,0.584,2.656,4.544,35898.399,1.162,0.255,784701.5,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.255,0.118,0.373,0.025,4096,37253120,1.1358,237375488,37408768,0.009,0,0,0,0,0 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.log new file mode 100644 index 000000000..58e181b7f --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/fixture-main-random.log @@ -0,0 +1,8 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-random.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.009 s +phase load:random: T=1 dist=random (fixed count) +close took 0.118 s +== load:random T=1 ops=200000 secs= 0.25 ops/s= 784707 lat us p50=0.58 p99=2.66 p99.9=4.54 max=35898.4 mean=1.16 + cpu=0.25s ops/cpu-s=784701 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.25s drain(close)=0.12s total=0.37s drain_cpu=0.02s drain_rd=4096 drain_wr=37253120 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/manifest.json b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/manifest.json new file mode 100644 index 000000000..81df0e5f1 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/manifest.json @@ -0,0 +1,1757 @@ +{ + "mode": "branch-screen", + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb]", + "io": "O_DIRECT", + "cpu_affinity": "0-11", + "scope": "Small resident integration screen; real-disk databases, not comprehensive retuning", + "runner_sha256": "536f10a1a7fd4b1e8e0250ea01cfe36793c7d6e2345f141092616ec06f64ee50", + "runs": [ + { + "label": "fixture-main-ordinary", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "load:random" + ], + "started": 1791959762.3273494, + "binary_sha256": "908373d8f7eb7ec39a004bdfdc7f0a02edb3efe864efce4aeda73d63e73fe48e", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959762.6426835, + "log_sha256": "ec24ffc5ed923d68c10142bdd8921a7fcb8ed58bd37d0d61d6c3c000254ce10b", + "process_cpu_s": 0.23388599999999998, + "process_read_bytes": 0, + "process_write_bytes": 28803072, + "fixture_sha256": "c853e677543afdfa7efcd67fa13e5c9d57b0a1465aff245641584f65c1dbecc4", + "allocated_bytes": 28905472 + }, + { + "label": "fixture-main-common", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-common.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-common.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "load:random" + ], + "started": 1791959762.8063462, + "binary_sha256": "7a44f4665daee510e3108224cf625d7ffe4f6ee2a015c372db435ad6836b404d", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959763.2212973, + "log_sha256": "4e6a1eae1130ebf28013220575a11954444f00b42af2820e6724ae53e7ebade2", + "process_cpu_s": 0.29361200000000004, + "process_read_bytes": 0, + "process_write_bytes": 37306368, + "fixture_sha256": "325f07b69e6e848fca8c9e3c87c1e4244133ac0b29842c59caac438959028581", + "allocated_bytes": 37408768 + }, + { + "label": "fixture-branch-prefix-common", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-common.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-common.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "load:random" + ], + "started": 1791959763.4527442, + "binary_sha256": "fc2a0b259b70e57cb659ab6778b99bc8e3d6c4dfbb22731a1079d1e9d7180719", + "library_sha256": "bc960553ec64162d7531c3de1ae38d361838c262cf041eeab46f9180675feaf1", + "source_head": "100800cb1a11a60a259869f4b195d9572b9da86c", + "verified": true, + "returncode": 0, + "finished": 1791959763.8683407, + "log_sha256": "ecb2f7cb3cbe4c825d92c5f3c6f1cfe8f13323382a64c7d22233e46dc15ce74e", + "process_cpu_s": 0.29173699999999997, + "process_read_bytes": 0, + "process_write_bytes": 26025984, + "fixture_sha256": "bfd207b642845d8ad999e339e6c14bc8d30d9b976c201c81f496db0f895589da", + "allocated_bytes": 26128384 + }, + { + "label": "fixture-main-random", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-random.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-random.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "load:random" + ], + "started": 1791959764.049308, + "binary_sha256": "7a44f4665daee510e3108224cf625d7ffe4f6ee2a015c372db435ad6836b404d", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959764.514802, + "log_sha256": "c75d5666625b43ecf66c59d80abc902affce1583a78e2273fa95924592bc3727", + "process_cpu_s": 0.3284659999999999, + "process_read_bytes": 4096, + "process_write_bytes": 37306368, + "fixture_sha256": "1fce9f05737cd68b50285519341b632bb8395257bb4a3afb408e5bb1c93abc58", + "allocated_bytes": 37408768 + }, + { + "label": "fixture-branch-prefix-random", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-random.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-random.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "load:random" + ], + "started": 1791959764.7439816, + "binary_sha256": "fc2a0b259b70e57cb659ab6778b99bc8e3d6c4dfbb22731a1079d1e9d7180719", + "library_sha256": "bc960553ec64162d7531c3de1ae38d361838c262cf041eeab46f9180675feaf1", + "source_head": "100800cb1a11a60a259869f4b195d9572b9da86c", + "verified": true, + "returncode": 0, + "finished": 1791959765.2596247, + "log_sha256": "81bde8489c71c772a3bc336e1808077a75ed081965be097529f9d74a573a9a58", + "process_cpu_s": 0.39998200000000017, + "process_read_bytes": 4096, + "process_write_bytes": 37306368, + "fixture_sha256": "538f638fb4208f0c9073e3acd5363e73dd6129bcde05e7628791182a6dcfbc39", + "allocated_bytes": 37408768 + }, + { + "label": "ordinary-0-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959765.5244884, + "binary_sha256": "908373d8f7eb7ec39a004bdfdc7f0a02edb3efe864efce4aeda73d63e73fe48e", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959777.6138947, + "log_sha256": "1f5d5a4d7cc0806312c0acc2bc372c62df385f4f369a0c750de4e7dc672ca8e9", + "process_cpu_s": 96.04211799999999, + "process_read_bytes": 28295168, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-1-cache-invalid-addresses", + "profile": "cache-invalid-addresses", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/cache-invalid-addresses/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "cache-invalid-addresses", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959777.6488676, + "binary_sha256": "be2fa0a4349ef38ec50215b84d085074df2449c01c84f709df4112cbc2d0053b", + "library_sha256": "25d2a1d3e62b987ee8393f2ba50be459564edded1b53c884e8c43ebcfea26adc", + "source_head": "d70fd5b21fe489d9956f89cbb10abafb00b30191", + "verified": true, + "returncode": 0, + "finished": 1791959789.7999249, + "log_sha256": "d5f4d3ba17042fc4bc49d8361a68c9d08f84f0c67f30b5116a60a65831fc3bbe", + "process_cpu_s": 96.063686, + "process_read_bytes": 28295168, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-2-directory-direct", + "profile": "directory-direct", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-direct/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-direct", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959789.8444479, + "binary_sha256": "d2f18f3c5db44c76bc004745ddd4a58f56c4cac066aa8afb00918fb349b5d557", + "library_sha256": "ed0819b95675d8410608040d675dc84aa8c3aa09a7c5a5ff24ac296d21285887", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959801.9948912, + "log_sha256": "cb28adb38b2b22073f8e75f1fdfc049615065a5359e3fcf2f3865e6e5fc25b48", + "process_cpu_s": 96.07296899999999, + "process_read_bytes": 28295168, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-3-directory-bucket", + "profile": "directory-bucket", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-bucket", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959802.0380113, + "binary_sha256": "13f5659f74dbf982ac51469ec72efc15320b9cdc01b97ac5bc0104fb7187cb30", + "library_sha256": "fe67f4ddb4a7d0f1c741b66737eaad46339f3dab798910610747ff34c0f8a009", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959814.192149, + "log_sha256": "32ea1a879823e98e5533ff94c85170f1077a743c00746a02a914ad715ac03fa2", + "process_cpu_s": 96.08005000000004, + "process_read_bytes": 28295168, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-4-directory-bucket-simd", + "profile": "directory-bucket-simd", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-simd/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-bucket-simd", + "--stag", + "resident", + "--otag", + "4", + "--rep", + "4", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959814.2371008, + "binary_sha256": "69e24c6955bddd1804f81687e14939d7f7a986e847293a7dd1e16cb26523d499", + "library_sha256": "3e5c01572bcdd3a7643b65f390a912602eaf49b55c24b8350b5491e2b5b2ac39", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959826.34286, + "log_sha256": "488425c15969e707ef9d24ba626a9ad09810b4e6f255f45530b3c4cbd0a9fc7c", + "process_cpu_s": 96.07594099999996, + "process_read_bytes": 28295168, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-5-directory-bucket-atomic", + "profile": "directory-bucket-atomic", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-atomic/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-bucket-atomic", + "--stag", + "resident", + "--otag", + "5", + "--rep", + "5", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959826.3871453, + "binary_sha256": "70b72a8fa46aedf0859dafab6d01f1db5955c23fe30bb0c4e459623ca6a60948", + "library_sha256": "b9d6621ae64de6f5f5d8eca54ee7117e25575c1a26af6057c4c138c2e2cf3b07", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959838.491201, + "log_sha256": "587eef33408ce4d0c51d94bffebfa70d13fa36acdef92d9bc5d4bc8d1fec2293", + "process_cpu_s": 96.06533500000002, + "process_read_bytes": 28295168, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-6-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "6", + "--rep", + "6", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959838.5337577, + "binary_sha256": "908373d8f7eb7ec39a004bdfdc7f0a02edb3efe864efce4aeda73d63e73fe48e", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959850.6345708, + "log_sha256": "9c56215fca60ec0d53ffd68452d87f6c96e245aab8edbe75431749859c1fd302", + "process_cpu_s": 96.08179499999996, + "process_read_bytes": 28295168, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-7-directory-bucket-atomic", + "profile": "directory-bucket-atomic", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-atomic/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-bucket-atomic", + "--stag", + "resident", + "--otag", + "7", + "--rep", + "7", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959850.6797967, + "binary_sha256": "70b72a8fa46aedf0859dafab6d01f1db5955c23fe30bb0c4e459623ca6a60948", + "library_sha256": "b9d6621ae64de6f5f5d8eca54ee7117e25575c1a26af6057c4c138c2e2cf3b07", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959862.828484, + "log_sha256": "755d7fec7b2b17887c69a39a81f75642874e5049e6cf0b1062f48458a87b11e7", + "process_cpu_s": 96.06822799999996, + "process_read_bytes": 28295168, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-8-directory-bucket-simd", + "profile": "directory-bucket-simd", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket-simd/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-bucket-simd", + "--stag", + "resident", + "--otag", + "8", + "--rep", + "8", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959862.8711677, + "binary_sha256": "69e24c6955bddd1804f81687e14939d7f7a986e847293a7dd1e16cb26523d499", + "library_sha256": "3e5c01572bcdd3a7643b65f390a912602eaf49b55c24b8350b5491e2b5b2ac39", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959874.9706755, + "log_sha256": "a77a95913bf5e26ad82a7db384201e0b5733dbe9b400bed2a1692d7073a7ab9a", + "process_cpu_s": 96.07693700000011, + "process_read_bytes": 28295168, + "process_write_bytes": 323584, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-9-directory-bucket", + "profile": "directory-bucket", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-bucket/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-bucket", + "--stag", + "resident", + "--otag", + "9", + "--rep", + "9", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959875.0054111, + "binary_sha256": "13f5659f74dbf982ac51469ec72efc15320b9cdc01b97ac5bc0104fb7187cb30", + "library_sha256": "fe67f4ddb4a7d0f1c741b66737eaad46339f3dab798910610747ff34c0f8a009", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959887.1617172, + "log_sha256": "8c7816859b271ce9337faf3f687b951a09ea561afb7e41d2bd4124684a035560", + "process_cpu_s": 96.07674199999991, + "process_read_bytes": 28295168, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-10-directory-direct", + "profile": "directory-direct", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/directory-direct/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "directory-direct", + "--stag", + "resident", + "--otag", + "10", + "--rep", + "10", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959887.2074113, + "binary_sha256": "d2f18f3c5db44c76bc004745ddd4a58f56c4cac066aa8afb00918fb349b5d557", + "library_sha256": "ed0819b95675d8410608040d675dc84aa8c3aa09a7c5a5ff24ac296d21285887", + "source_head": "67f88f289b5b470d9dba27c78d5befdf78352220", + "verified": true, + "returncode": 0, + "finished": 1791959899.3113718, + "log_sha256": "a8a9413c4853daa7a02bbaa53c1eaf08c1eb3a53f88e453a00d1704ce347fea5", + "process_cpu_s": 96.05716900000002, + "process_read_bytes": 28295168, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-11-cache-invalid-addresses", + "profile": "cache-invalid-addresses", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/cache-invalid-addresses/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "cache-invalid-addresses", + "--stag", + "resident", + "--otag", + "11", + "--rep", + "11", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959899.3485749, + "binary_sha256": "be2fa0a4349ef38ec50215b84d085074df2449c01c84f709df4112cbc2d0053b", + "library_sha256": "25d2a1d3e62b987ee8393f2ba50be459564edded1b53c884e8c43ebcfea26adc", + "source_head": "d70fd5b21fe489d9956f89cbb10abafb00b30191", + "verified": true, + "returncode": 0, + "finished": 1791959911.5016584, + "log_sha256": "b1bbe94a0f1fe166088d979dc8a0065f998aa867a8e506109e9e8b6b1041634f", + "process_cpu_s": 96.0703540000001, + "process_read_bytes": 28295168, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "ordinary-12-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/ordinary-results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "12", + "--rep", + "12", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959911.5552957, + "binary_sha256": "908373d8f7eb7ec39a004bdfdc7f0a02edb3efe864efce4aeda73d63e73fe48e", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959923.7116256, + "log_sha256": "4c63cdfb549fba47a0e57ac7d494c551759b3d7776bc8bfac672e151f005ce3f", + "process_cpu_s": 96.07884400000006, + "process_read_bytes": 28295168, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-ordinary.db", + "allocated_bytes": 28655616 + }, + { + "label": "common-0-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/common-results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959923.763234, + "binary_sha256": "7a44f4665daee510e3108224cf625d7ffe4f6ee2a015c372db435ad6836b404d", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959935.9191551, + "log_sha256": "ddc4fee0c9a2d7b54f5837177c1db1e29fb0fb4ec1e3ec5ad5d96d8ec41af62c", + "process_cpu_s": 96.06361999999989, + "process_read_bytes": 36823040, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-common.db", + "allocated_bytes": 37285888 + }, + { + "label": "common-1-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/common-results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959935.9650848, + "binary_sha256": "fc2a0b259b70e57cb659ab6778b99bc8e3d6c4dfbb22731a1079d1e9d7180719", + "library_sha256": "bc960553ec64162d7531c3de1ae38d361838c262cf041eeab46f9180675feaf1", + "source_head": "100800cb1a11a60a259869f4b195d9572b9da86c", + "verified": true, + "returncode": 0, + "finished": 1791959948.0699124, + "log_sha256": "adc2a2dca4986f4ae87d901a5c90882c5f9f900ac3213d346e96bcc3a4b5b243", + "process_cpu_s": 96.05673400000012, + "process_read_bytes": 25542656, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-common.db", + "allocated_bytes": 26005504 + }, + { + "label": "common-2-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/common-results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959948.1121461, + "binary_sha256": "fc2a0b259b70e57cb659ab6778b99bc8e3d6c4dfbb22731a1079d1e9d7180719", + "library_sha256": "bc960553ec64162d7531c3de1ae38d361838c262cf041eeab46f9180675feaf1", + "source_head": "100800cb1a11a60a259869f4b195d9572b9da86c", + "verified": true, + "returncode": 0, + "finished": 1791959960.216237, + "log_sha256": "a6f93fe7aaef848dfdb2cdf86fb0bbc13a459fc4493244f015d4139ac204f91f", + "process_cpu_s": 96.05154899999991, + "process_read_bytes": 25542656, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-common.db", + "allocated_bytes": 26005504 + }, + { + "label": "common-3-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/common-results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959960.2670915, + "binary_sha256": "7a44f4665daee510e3108224cf625d7ffe4f6ee2a015c372db435ad6836b404d", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959972.3721137, + "log_sha256": "a50d12509f7e55a73a2bbd5e33c42d89dbb4440965ff6a0bbc6efac8c155ca35", + "process_cpu_s": 96.08460899999996, + "process_read_bytes": 36823040, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-common.db", + "allocated_bytes": 37285888 + }, + { + "label": "random-0-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/random-results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959972.420665, + "binary_sha256": "7a44f4665daee510e3108224cf625d7ffe4f6ee2a015c372db435ad6836b404d", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791959984.5727596, + "log_sha256": "d0c1da7e9f21b859e6c0f7e7925527139e100db6f9cdd203d11099c5aad0b028", + "process_cpu_s": 96.08285799999987, + "process_read_bytes": 36823040, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-random.db", + "allocated_bytes": 37285888 + }, + { + "label": "random-1-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/random-results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959984.6204815, + "binary_sha256": "fc2a0b259b70e57cb659ab6778b99bc8e3d6c4dfbb22731a1079d1e9d7180719", + "library_sha256": "bc960553ec64162d7531c3de1ae38d361838c262cf041eeab46f9180675feaf1", + "source_head": "100800cb1a11a60a259869f4b195d9572b9da86c", + "verified": true, + "returncode": 0, + "finished": 1791959996.7717874, + "log_sha256": "03e31f3adfd2b96874d3f6658f912faadda30d7c732d21094b4e3d97b4cc3764", + "process_cpu_s": 96.10628999999985, + "process_read_bytes": 36823040, + "process_write_bytes": 315392, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-random.db", + "allocated_bytes": 37285888 + }, + { + "label": "random-2-branch-prefix", + "profile": "branch-prefix", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/branch-prefix/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/random-results.csv", + "--vtag", + "branch-prefix", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791959996.8195274, + "binary_sha256": "fc2a0b259b70e57cb659ab6778b99bc8e3d6c4dfbb22731a1079d1e9d7180719", + "library_sha256": "bc960553ec64162d7531c3de1ae38d361838c262cf041eeab46f9180675feaf1", + "source_head": "100800cb1a11a60a259869f4b195d9572b9da86c", + "verified": true, + "returncode": 0, + "finished": 1791960008.974462, + "log_sha256": "f7ebdf631982d76650bc542dc6dd6dab8ae21a4e7e6da0cea3052bada1f53338", + "process_cpu_s": 96.11134599999994, + "process_read_bytes": 36823040, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-branch-prefix-random.db", + "allocated_bytes": 37285888 + }, + { + "label": "random-3-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/main-fc0bc8f7/bin/main/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "3", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/random-results.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1791960009.025616, + "binary_sha256": "7a44f4665daee510e3108224cf625d7ffe4f6ee2a015c372db435ad6836b404d", + "library_sha256": "78dd1b4bfc8367bacd45de4c6cd0100803ab11da69326bd6a4d391df5afb907d", + "source_head": "fc0bc8f7e39566f14822bb598376458bdf1e28b3", + "verified": true, + "returncode": 0, + "finished": 1791960021.2331228, + "log_sha256": "98a03b068a5157fac5b85f036012fb3afc63ce4fb0293cc12ec6932854fdb2bb", + "process_cpu_s": 96.09224099999987, + "process_read_bytes": 36823040, + "process_write_bytes": 319488, + "errors": 0, + "violations": 0, + "fixture": "/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/fixture-main-random.db", + "allocated_bytes": 37285888 + } + ], + "complete": true, + "execution_driver_sha256": "283a0b06d41b61bb6f8eae78fa3be28883b07b41966f8453b6bc19233f2fc48f", + "execution_driver_snapshot": "run_benchmarks-screen.py", + "environment_audit": "Every prefix harness log reports expected pattern and compression_disabled=false; environment overrides are in saved driver." +} diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-0-main.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-0-main.log new file mode 100644 index 000000000..ccb4129b4 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-0-main.log @@ -0,0 +1,20 @@ +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=0 sabotage=0 +open took 0.004 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9613257 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3548553 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=3 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=16094659 notfound=0 +== point:uniform@8 T=8 ops=16094659 secs= 3.00 ops/s= 5364500 lat us p50=1.42 p99=2.03 p99.9=2.85 max=645.4 mean=1.45 + cpu=23.99s ops/cpu-s=671005 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1636465 secs= 3.00 ops/s= 545448 lat us p50=13.70 p99=19.71 p99.9=29.44 max=926.4 mean=14.62 + cpu=23.99s ops/cpu-s=68210 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=13.18 p99=18.69 mean=13.98 per-tuple=nan ns deinit mean=0.60 us tuples/s=545448 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11618 ops (+1162 ops/s) +close took 0.046 s +== range:uniform:10000@8 T=8 ops=11710 secs= 3.00 ops/s= 3903 lat us p50=1916.93 p99=2457.60 p99.9=2523.14 max=2694.6 mean=2049.61 + cpu=23.99s ops/cpu-s=488 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=17.66 p99=26.88 mean=17.98 per-tuple=208.2 ns deinit mean=0.86 us tuples/s=38077893 + insert/run=3.00s drain(close)=0.05s total=3.05s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-1-cache-invalid-addresses.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-1-cache-invalid-addresses.log new file mode 100644 index 000000000..9e08171b7 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-1-cache-invalid-addresses.log @@ -0,0 +1,20 @@ +kvbench version=cache-invalid-addresses splinter=splinterdb_build_version 698ae40f-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=1 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9318201 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3359989 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=15793690 notfound=0 +== point:uniform@8 T=8 ops=15793690 secs= 3.00 ops/s= 5264167 lat us p50=1.46 p99=2.03 p99.9=3.55 max=311.9 mean=1.48 + cpu=24.00s ops/cpu-s=658195 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1527458 secs= 3.00 ops/s= 509115 lat us p50=14.46 p99=21.25 p99.9=31.49 max=178.0 mean=15.66 + cpu=23.99s ops/cpu-s=63664 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=13.95 p99=20.22 mean=14.98 per-tuple=nan ns deinit mean=0.65 us tuples/s=509115 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11349 ops (+1135 ops/s) +close took 0.088 s +== range:uniform:10000@8 T=8 ops=11400 secs= 3.00 ops/s= 3800 lat us p50=1982.46 p99=2523.14 p99.9=2588.67 max=2659.0 mean=2105.31 + cpu=24.00s ops/cpu-s=475 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=17.66 p99=24.83 mean=18.01 per-tuple=213.8 ns deinit mean=0.89 us tuples/s=37093953 + insert/run=3.00s drain(close)=0.09s total=3.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-10-directory-direct.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-10-directory-direct.log new file mode 100644 index 000000000..dc9e2342d --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-10-directory-direct.log @@ -0,0 +1,20 @@ +kvbench version=directory-direct splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=10 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9575523 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3512161 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=15254528 notfound=0 +== point:uniform@8 T=8 ops=15254528 secs= 3.00 ops/s= 5084446 lat us p50=1.49 p99=2.14 p99.9=4.42 max=447.2 mean=1.53 + cpu=23.99s ops/cpu-s=635878 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1542002 secs= 3.00 ops/s= 513960 lat us p50=14.21 p99=20.74 p99.9=29.95 max=116.4 mean=15.52 + cpu=24.00s ops/cpu-s=64256 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=13.70 p99=19.71 mean=14.84 per-tuple=nan ns deinit mean=0.64 us tuples/s=513960 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10581 ops (+1058 ops/s) +close took 0.058 s +== range:uniform:10000@8 T=8 ops=10744 secs= 3.00 ops/s= 3581 lat us p50=2129.92 p99=2719.74 p99.9=2719.74 max=2747.9 mean=2233.58 + cpu=24.03s ops/cpu-s=447 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=18.69 p99=24.83 mean=18.93 per-tuple=227.0 ns deinit mean=0.94 us tuples/s=34925459 + insert/run=3.00s drain(close)=0.06s total=3.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-11-cache-invalid-addresses.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-11-cache-invalid-addresses.log new file mode 100644 index 000000000..2f2bcdac3 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-11-cache-invalid-addresses.log @@ -0,0 +1,20 @@ +kvbench version=cache-invalid-addresses splinter=splinterdb_build_version 698ae40f-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=11 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9621620 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=3643717 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=15486368 notfound=0 +== point:uniform@8 T=8 ops=15486368 secs= 3.00 ops/s= 5161738 lat us p50=1.49 p99=2.08 p99.9=3.62 max=138.9 mean=1.51 + cpu=23.99s ops/cpu-s=645405 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1434014 secs= 3.00 ops/s= 477968 lat us p50=15.23 p99=21.76 p99.9=32.00 max=101.5 mean=16.69 + cpu=24.00s ops/cpu-s=59754 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=14.72 p99=21.25 mean=15.94 per-tuple=nan ns deinit mean=0.70 us tuples/s=477968 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11164 ops (+1116 ops/s) +close took 0.068 s +== range:uniform:10000@8 T=8 ops=11260 secs= 3.00 ops/s= 3753 lat us p50=1982.46 p99=2588.67 p99.9=2654.21 max=2760.3 mean=2131.58 + cpu=24.00s ops/cpu-s=469 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=17.66 p99=27.39 mean=18.25 per-tuple=216.4 ns deinit mean=0.89 us tuples/s=36646350 + insert/run=3.00s drain(close)=0.07s total=3.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-12-main.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-12-main.log new file mode 100644 index 000000000..a624c5c68 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-12-main.log @@ -0,0 +1,20 @@ +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=12 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9342765 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3234310 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=6 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=14803808 notfound=0 +== point:uniform@8 T=8 ops=14803808 secs= 3.00 ops/s= 4934239 lat us p50=1.55 p99=2.14 p99.9=3.30 max=131.7 mean=1.58 + cpu=24.03s ops/cpu-s=616088 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1480470 secs= 3.00 ops/s= 493451 lat us p50=14.98 p99=21.25 p99.9=30.98 max=451.2 mean=16.16 + cpu=24.00s ops/cpu-s=61695 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=2 swapout=0 majflt=0 + startup us p50=14.46 p99=20.74 mean=15.44 per-tuple=nan ns deinit mean=0.68 us tuples/s=493451 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10793 ops (+1079 ops/s) +close took 0.108 s +== range:uniform:10000@8 T=8 ops=10853 secs= 3.00 ops/s= 3617 lat us p50=2048.00 p99=2654.21 p99.9=2719.74 max=2733.5 mean=2211.59 + cpu=24.00s ops/cpu-s=452 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 + startup us p50=18.69 p99=25.34 mean=18.95 per-tuple=224.6 ns deinit mean=0.94 us tuples/s=35291429 + insert/run=3.00s drain(close)=0.11s total=3.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-2-directory-direct.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-2-directory-direct.log new file mode 100644 index 000000000..ef4981157 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-2-directory-direct.log @@ -0,0 +1,20 @@ +kvbench version=directory-direct splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=2 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9137143 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3420558 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=15016386 notfound=0 +== point:uniform@8 T=8 ops=15016386 secs= 3.00 ops/s= 5005074 lat us p50=1.52 p99=2.14 p99.9=3.17 max=154.3 mean=1.55 + cpu=24.00s ops/cpu-s=625770 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1487398 secs= 3.00 ops/s= 495761 lat us p50=14.98 p99=21.25 p99.9=32.00 max=92.1 mean=16.09 + cpu=24.00s ops/cpu-s=61983 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=14.21 p99=20.22 mean=15.39 per-tuple=nan ns deinit mean=0.65 us tuples/s=495761 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11330 ops (+1133 ops/s) +close took 0.084 s +== range:uniform:10000@8 T=8 ops=11373 secs= 3.00 ops/s= 3791 lat us p50=1982.46 p99=2523.14 p99.9=2588.67 max=2618.7 mean=2110.12 + cpu=24.00s ops/cpu-s=474 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=17.66 p99=24.83 mean=18.02 per-tuple=214.3 ns deinit mean=0.91 us tuples/s=37001775 + insert/run=3.00s drain(close)=0.08s total=3.08s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-3-directory-bucket.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-3-directory-bucket.log new file mode 100644 index 000000000..2caa9c780 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-3-directory-bucket.log @@ -0,0 +1,20 @@ +kvbench version=directory-bucket splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=3 sabotage=0 +open took 0.003 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9046247 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3054228 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=11877724 notfound=0 +== point:uniform@8 T=8 ops=11877724 secs= 3.00 ops/s= 3958934 lat us p50=1.94 p99=2.98 p99.9=7.87 max=85.2 mean=1.98 + cpu=24.00s ops/cpu-s=494974 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1289397 secs= 3.00 ops/s= 429768 lat us p50=17.15 p99=24.83 p99.9=35.33 max=106.0 mean=18.57 + cpu=24.00s ops/cpu-s=53733 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=16.64 p99=23.81 mean=17.91 per-tuple=nan ns deinit mean=0.62 us tuples/s=429768 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11145 ops (+1114 ops/s) +close took 0.084 s +== range:uniform:10000@8 T=8 ops=11213 secs= 3.00 ops/s= 3737 lat us p50=2015.23 p99=2588.67 p99.9=2588.67 max=2636.1 mean=2140.01 + cpu=24.00s ops/cpu-s=467 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=19.71 p99=26.37 mean=19.95 per-tuple=217.3 ns deinit mean=0.86 us tuples/s=36471756 + insert/run=3.00s drain(close)=0.08s total=3.08s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-4-directory-bucket-simd.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-4-directory-bucket-simd.log new file mode 100644 index 000000000..cf592867a --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-4-directory-bucket-simd.log @@ -0,0 +1,20 @@ +kvbench version=directory-bucket-simd splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=4 sabotage=0 +open took 0.002 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 8896486 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2967623 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=5 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=11910982 notfound=0 +== point:uniform@8 T=8 ops=11910982 secs= 3.00 ops/s= 3970033 lat us p50=1.90 p99=3.04 p99.9=8.13 max=93.7 mean=1.97 + cpu=24.00s ops/cpu-s=496325 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1249432 secs= 3.00 ops/s= 416446 lat us p50=18.18 p99=26.37 p99.9=38.40 max=483.5 mean=19.16 + cpu=24.03s ops/cpu-s=52002 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=8 swapout=0 majflt=0 + startup us p50=17.15 p99=25.34 mean=18.43 per-tuple=nan ns deinit mean=0.68 us tuples/s=416446 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10801 ops (+1080 ops/s) +close took 0.069 s +== range:uniform:10000@8 T=8 ops=11330 secs= 3.00 ops/s= 3776 lat us p50=1982.46 p99=2588.67 p99.9=2588.67 max=2684.8 mean=2118.33 + cpu=24.00s ops/cpu-s=472 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=19.20 p99=25.34 mean=19.70 per-tuple=215.0 ns deinit mean=0.84 us tuples/s=36839944 + insert/run=3.00s drain(close)=0.07s total=3.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-5-directory-bucket-atomic.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-5-directory-bucket-atomic.log new file mode 100644 index 000000000..9976494c3 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-5-directory-bucket-atomic.log @@ -0,0 +1,20 @@ +kvbench version=directory-bucket-atomic splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=5 sabotage=0 +open took 0.002 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9398382 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3612847 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=14990840 notfound=0 +== point:uniform@8 T=8 ops=14990840 secs= 3.00 ops/s= 4996572 lat us p50=1.52 p99=2.21 p99.9=3.94 max=129.7 mean=1.56 + cpu=24.03s ops/cpu-s=623922 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1408388 secs= 3.00 ops/s= 469426 lat us p50=15.74 p99=22.78 p99.9=33.28 max=168.4 mean=16.99 + cpu=24.00s ops/cpu-s=58692 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=15.23 p99=21.76 mean=16.26 per-tuple=nan ns deinit mean=0.69 us tuples/s=469426 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10544 ops (+1054 ops/s) +close took 0.056 s +== range:uniform:10000@8 T=8 ops=10664 secs= 3.00 ops/s= 3554 lat us p50=2129.92 p99=2719.74 p99.9=2719.74 max=2787.7 mean=2250.50 + cpu=24.00s ops/cpu-s=444 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=19.71 p99=25.34 mean=19.98 per-tuple=228.6 ns deinit mean=0.95 us tuples/s=34667296 + insert/run=3.00s drain(close)=0.06s total=3.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-6-main.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-6-main.log new file mode 100644 index 000000000..3d8715a9b --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-6-main.log @@ -0,0 +1,20 @@ +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=6 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9016337 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3059133 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=16139732 notfound=0 +== point:uniform@8 T=8 ops=16139732 secs= 3.00 ops/s= 5379428 lat us p50=1.39 p99=2.03 p99.9=3.36 max=94.2 mean=1.44 + cpu=24.00s ops/cpu-s=672614 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1529426 secs= 3.00 ops/s= 509768 lat us p50=14.46 p99=20.74 p99.9=30.98 max=142.1 mean=15.64 + cpu=24.00s ops/cpu-s=63737 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=13.70 p99=20.22 mean=14.95 per-tuple=nan ns deinit mean=0.65 us tuples/s=509768 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10536 ops (+1054 ops/s) +close took 0.061 s +== range:uniform:10000@8 T=8 ops=10569 secs= 3.00 ops/s= 3523 lat us p50=2129.92 p99=2719.74 p99.9=2785.28 max=2854.4 mean=2271.11 + cpu=24.00s ops/cpu-s=440 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=19.20 p99=25.86 mean=19.65 per-tuple=230.8 ns deinit mean=0.95 us tuples/s=34351584 + insert/run=3.00s drain(close)=0.06s total=3.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-7-directory-bucket-atomic.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-7-directory-bucket-atomic.log new file mode 100644 index 000000000..e24627a12 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-7-directory-bucket-atomic.log @@ -0,0 +1,20 @@ +kvbench version=directory-bucket-atomic splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=7 sabotage=0 +open took 0.003 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 8968911 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3076450 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=14407382 notfound=0 +== point:uniform@8 T=8 ops=14407382 secs= 3.00 ops/s= 4802080 lat us p50=1.58 p99=2.21 p99.9=4.67 max=97.4 mean=1.62 + cpu=24.00s ops/cpu-s=600339 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1407204 secs= 3.00 ops/s= 469028 lat us p50=15.74 p99=22.78 p99.9=33.28 max=105.8 mean=17.01 + cpu=24.00s ops/cpu-s=58640 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=14.98 p99=21.76 mean=16.28 per-tuple=nan ns deinit mean=0.68 us tuples/s=469028 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10573 ops (+1057 ops/s) +close took 0.101 s +== range:uniform:10000@8 T=8 ops=10466 secs= 3.00 ops/s= 3488 lat us p50=2129.92 p99=2850.82 p99.9=2981.89 max=3438.4 mean=2293.06 + cpu=24.00s ops/cpu-s=436 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=20.74 p99=34.30 mean=21.40 per-tuple=233.0 ns deinit mean=0.98 us tuples/s=34002560 + insert/run=3.00s drain(close)=0.10s total=3.10s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-8-directory-bucket-simd.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-8-directory-bucket-simd.log new file mode 100644 index 000000000..1bcbc84f0 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-8-directory-bucket-simd.log @@ -0,0 +1,20 @@ +kvbench version=directory-bucket-simd splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=8 sabotage=0 +open took 0.002 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 9365649 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3339958 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=11630857 notfound=0 +== point:uniform@8 T=8 ops=11630857 secs= 3.00 ops/s= 3876651 lat us p50=1.97 p99=3.10 p99.9=8.32 max=82.6 mean=2.02 + cpu=24.00s ops/cpu-s=484643 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1309640 secs= 3.00 ops/s= 436515 lat us p50=17.15 p99=24.83 p99.9=34.30 max=101.1 mean=18.28 + cpu=24.00s ops/cpu-s=54574 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=16.26 p99=23.81 mean=17.59 per-tuple=nan ns deinit mean=0.65 us tuples/s=436515 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10915 ops (+1091 ops/s) +close took 0.059 s +== range:uniform:10000@8 T=8 ops=11065 secs= 3.00 ops/s= 3688 lat us p50=2015.23 p99=2654.21 p99.9=2654.21 max=2712.6 mean=2168.94 + cpu=24.00s ops/cpu-s=461 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=20.22 p99=25.86 mean=20.16 per-tuple=220.3 ns deinit mean=0.86 us tuples/s=35970351 + insert/run=3.00s drain(close)=0.06s total=3.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-9-directory-bucket.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-9-directory-bucket.log new file mode 100644 index 000000000..84bebe550 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-9-directory-bucket.log @@ -0,0 +1,20 @@ +kvbench version=directory-bucket splinter=splinterdb_build_version 9ca98481-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=9 sabotage=0 +open took 0.002 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 8897521 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3318731 rd=138.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=11165139 notfound=0 +== point:uniform@8 T=8 ops=11165139 secs= 3.00 ops/s= 3721427 lat us p50=2.08 p99=3.17 p99.9=8.13 max=85.1 mean=2.11 + cpu=24.00s ops/cpu-s=465235 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=1283040 secs= 3.00 ops/s= 427649 lat us p50=17.15 p99=24.83 p99.9=34.30 max=79.1 mean=18.66 + cpu=24.00s ops/cpu-s=53462 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=16.64 p99=23.81 mean=17.99 per-tuple=nan ns deinit mean=0.62 us tuples/s=427649 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10446 ops (+1045 ops/s) +close took 0.093 s +== range:uniform:10000@8 T=8 ops=10552 secs= 3.00 ops/s= 3517 lat us p50=2129.92 p99=2785.28 p99.9=2785.28 max=2836.7 mean=2274.00 + cpu=24.00s ops/cpu-s=440 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=21.25 p99=28.42 mean=21.41 per-tuple=230.9 ns deinit mean=0.97 us tuples/s=34299367 + insert/run=3.00s drain(close)=0.09s total=3.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=162664448 db_alloc=28655616 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-results.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-results.csv new file mode 100644 index 000000000..cb763234f --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/ordinary-results.csv @@ -0,0 +1,53 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.021,9613256.8,nan,nan,nan,0.000,nan,0.056,3548553.1,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9613256.8,0.021,0.000,0.021,0.000,0,0,nan,0,0,0.004,0,0,0,0,3 +main,resident,0,0,point:uniform@8,8,0,200000,16094659,3.000,5364500.1,1.424,2.032,2.848,645.440,1.451,23.986,671005.5,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.004,0,0,0,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,1636465,3.000,545448.4,13.696,19.712,29.440,926.415,14.621,23.992,68209.5,0,0,0.00,0.00,13.184,18.688,13.981,nan,0.599,1636465,545448.4,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.004,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,11710,3.000,3903.0,1916.928,2457.600,2523.136,2694.595,2049.614,23.994,488.0,0,0,0.00,0.00,17.664,26.880,17.977,208.16,0.859,114242796,38077893.2,3.000,0.046,3.046,0.013,0,307200,nan,162664448,28655616,0.004,0,0,0,0,0 +cache-invalid-addresses,resident,1,0,warm,8,1,200000,200000,0.021,9318200.8,nan,nan,nan,0.000,nan,0.060,3359989.2,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9318200.8,0.021,0.000,0.021,0.000,0,0,nan,0,0,0.005,0,0,0,0,2 +cache-invalid-addresses,resident,1,0,point:uniform@8,8,1,200000,15793690,3.000,5264167.4,1.456,2.032,3.552,311.879,1.478,23.995,658194.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +cache-invalid-addresses,resident,1,0,range:uniform:1@8,8,1,200000,1527458,3.000,509114.8,14.464,21.248,31.488,177.984,15.665,23.992,63664.3,0,0,0.00,0.00,13.952,20.224,14.977,nan,0.645,1527458,509114.8,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +cache-invalid-addresses,resident,1,0,range:uniform:10000@8,8,1,200000,11400,3.000,3799.7,1982.464,2523.136,2588.672,2659.004,2105.315,23.996,475.1,0,0,0.00,0.00,17.664,24.832,18.012,213.79,0.891,111291566,37093953.1,3.000,0.088,3.088,0.012,0,307200,nan,162664448,28655616,0.005,0,0,0,0,0 +directory-direct,resident,2,0,warm,8,2,200000,200000,0.022,9137143.5,nan,nan,nan,0.000,nan,0.058,3420557.6,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9137143.5,0.022,0.000,0.022,0.000,0,0,nan,0,0,0.005,0,0,0,0,2 +directory-direct,resident,2,0,point:uniform@8,8,2,200000,15016386,3.000,5005073.6,1.520,2.144,3.168,154.253,1.552,23.997,625770.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +directory-direct,resident,2,0,range:uniform:1@8,8,2,200000,1487398,3.000,495761.0,14.976,21.248,32.000,92.053,16.087,23.997,61983.4,0,0,0.00,0.00,14.208,20.224,15.392,nan,0.650,1487398,495761.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +directory-direct,resident,2,0,range:uniform:10000@8,8,2,200000,11373,3.000,3790.7,1982.464,2523.136,2588.672,2618.660,2110.120,23.998,473.9,0,0,0.00,0.00,17.664,24.832,18.025,214.32,0.907,111014273,37001775.2,3.000,0.084,3.085,0.012,0,307200,nan,162664448,28655616,0.005,0,0,0,0,0 +directory-bucket,resident,3,0,warm,8,3,200000,200000,0.022,9046247.4,nan,nan,nan,0.000,nan,0.065,3054227.8,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9046247.4,0.022,0.000,0.022,0.000,0,0,nan,0,0,0.003,0,0,0,0,0 +directory-bucket,resident,3,0,point:uniform@8,8,3,200000,11877724,3.000,3958933.7,1.936,2.976,7.872,85.167,1.980,23.997,494973.5,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.003,0,0,0,0,0 +directory-bucket,resident,3,0,range:uniform:1@8,8,3,200000,1289397,3.000,429768.0,17.152,24.832,35.328,105.983,18.566,23.996,53733.4,0,0,0.00,0.00,16.640,23.808,17.906,nan,0.616,1289397,429768.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.003,0,0,0,0,0 +directory-bucket,resident,3,0,range:uniform:10000@8,8,3,200000,11213,3.000,3737.4,2015.232,2588.672,2588.672,2636.113,2140.007,23.998,467.2,0,0,0.00,0.00,19.712,26.368,19.951,217.27,0.862,109424230,36471756.4,3.000,0.084,3.084,0.012,0,307200,nan,162664448,28655616,0.003,0,0,0,0,0 +directory-bucket-simd,resident,4,0,warm,8,4,200000,200000,0.022,8896485.7,nan,nan,nan,0.000,nan,0.067,2967623.2,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,8896485.7,0.022,0.000,0.022,0.000,0,0,nan,0,0,0.002,0,0,0,0,5 +directory-bucket-simd,resident,4,0,point:uniform@8,8,4,200000,11910982,3.000,3970032.8,1.904,3.040,8.128,93.678,1.973,23.998,496324.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket-simd,resident,4,0,range:uniform:1@8,8,4,200000,1249432,3.000,416446.1,18.176,26.368,38.400,483.494,19.160,24.026,52002.5,0,0,0.00,0.00,17.152,25.344,18.431,nan,0.684,1249432,416446.1,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,8,0,0 +directory-bucket-simd,resident,4,0,range:uniform:10000@8,8,4,200000,11330,3.000,3776.4,1982.464,2588.672,2588.672,2684.788,2118.332,23.997,472.1,0,0,0.00,0.00,19.200,25.344,19.703,215.02,0.840,110528023,36839944.4,3.000,0.069,3.069,0.012,0,307200,nan,162664448,28655616,0.002,0,0,0,0,0 +directory-bucket-atomic,resident,5,0,warm,8,5,200000,200000,0.021,9398381.9,nan,nan,nan,0.000,nan,0.055,3612847.3,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9398381.9,0.021,0.000,0.021,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket-atomic,resident,5,0,point:uniform@8,8,5,200000,14990840,3.000,4996571.7,1.520,2.208,3.936,129.747,1.559,24.027,623921.5,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket-atomic,resident,5,0,range:uniform:1@8,8,5,200000,1408388,3.000,469425.8,15.744,22.784,33.280,168.371,16.991,23.996,58692.3,0,0,0.00,0.00,15.232,21.760,16.257,nan,0.689,1408388,469425.8,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket-atomic,resident,5,0,range:uniform:10000@8,8,5,200000,10664,3.000,3554.3,2129.920,2719.744,2719.744,2787.713,2250.500,23.997,444.4,0,0,0.00,0.00,19.712,25.344,19.985,228.60,0.946,104011236,34667296.5,3.000,0.056,3.057,0.012,0,307200,nan,162664448,28655616,0.002,0,0,0,0,0 +main,resident,6,0,warm,8,6,200000,200000,0.022,9016337.0,nan,nan,nan,0.000,nan,0.065,3059133.0,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9016337.0,0.022,0.000,0.022,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,6,0,point:uniform@8,8,6,200000,16139732,3.000,5379428.3,1.392,2.032,3.360,94.167,1.444,23.996,672614.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,6,0,range:uniform:1@8,8,6,200000,1529426,3.000,509768.5,14.464,20.736,30.976,142.100,15.644,23.996,63736.8,0,0,0.00,0.00,13.696,20.224,14.953,nan,0.648,1529426,509768.5,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,6,0,range:uniform:10000@8,8,6,200000,10569,3.000,3522.7,2129.920,2719.744,2785.280,2854.398,2271.112,23.996,440.4,0,0,0.00,0.00,19.200,25.856,19.647,230.77,0.948,103064572,34351583.8,3.000,0.061,3.062,0.013,0,307200,nan,162664448,28655616,0.005,0,0,0,0,0 +directory-bucket-atomic,resident,7,0,warm,8,7,200000,200000,0.022,8968911.1,nan,nan,nan,0.000,nan,0.065,3076449.8,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,8968911.1,0.022,0.000,0.022,0.000,0,0,nan,0,0,0.003,0,0,0,0,0 +directory-bucket-atomic,resident,7,0,point:uniform@8,8,7,200000,14407382,3.000,4802080.0,1.584,2.208,4.672,97.426,1.621,23.999,600338.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.003,0,0,0,0,0 +directory-bucket-atomic,resident,7,0,range:uniform:1@8,8,7,200000,1407204,3.000,469028.0,15.744,22.784,33.280,105.847,17.006,23.997,58640.2,0,0,0.00,0.00,14.976,21.760,16.278,nan,0.682,1407204,469028.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.003,0,0,0,0,0 +directory-bucket-atomic,resident,7,0,range:uniform:10000@8,8,7,200000,10466,3.000,3488.4,2129.920,2850.816,2981.888,3438.430,2293.059,23.996,436.2,0,0,0.00,0.00,20.736,34.304,21.396,232.96,0.978,102016793,34002559.8,3.000,0.101,3.102,0.012,0,307200,nan,162664448,28655616,0.003,0,0,0,0,0 +directory-bucket-simd,resident,8,0,warm,8,8,200000,200000,0.021,9365649.1,nan,nan,nan,0.000,nan,0.060,3339957.6,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9365649.1,0.021,0.000,0.021,0.000,0,0,nan,0,0,0.002,0,0,0,0,2 +directory-bucket-simd,resident,8,0,point:uniform@8,8,8,200000,11630857,3.000,3876650.7,1.968,3.104,8.320,82.644,2.021,23.999,484642.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket-simd,resident,8,0,range:uniform:1@8,8,8,200000,1309640,3.000,436515.1,17.152,24.832,34.304,101.093,18.280,23.997,54574.4,0,0,0.00,0.00,16.256,23.808,17.589,nan,0.648,1309640,436515.1,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket-simd,resident,8,0,range:uniform:10000@8,8,8,200000,11065,3.000,3688.0,2015.232,2654.208,2654.208,2712.640,2168.944,23.998,461.1,0,0,0.00,0.00,20.224,25.856,20.163,220.30,0.856,107919580,35970351.5,3.000,0.059,3.060,0.012,0,307200,nan,162664448,28655616,0.002,0,0,0,0,0 +directory-bucket,resident,9,0,warm,8,9,200000,200000,0.022,8897521.1,nan,nan,nan,0.000,nan,0.060,3318730.9,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,8897521.1,0.022,0.000,0.022,0.000,0,0,nan,0,0,0.002,0,0,0,0,2 +directory-bucket,resident,9,0,point:uniform@8,8,9,200000,11165139,3.000,3721427.4,2.080,3.168,8.128,85.100,2.106,23.999,465234.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket,resident,9,0,range:uniform:1@8,8,9,200000,1283040,3.000,427648.9,17.152,24.832,34.304,79.053,18.658,23.999,53462.1,0,0,0.00,0.00,16.640,23.808,17.994,nan,0.620,1283040,427648.9,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.002,0,0,0,0,0 +directory-bucket,resident,9,0,range:uniform:10000@8,8,9,200000,10552,3.000,3517.0,2129.920,2785.280,2785.280,2836.700,2274.000,23.997,439.7,0,0,0.00,0.00,21.248,28.416,21.415,230.93,0.966,102907260,34299367.2,3.000,0.093,3.094,0.012,0,307200,nan,162664448,28655616,0.002,0,0,0,0,0 +directory-direct,resident,10,0,warm,8,10,200000,200000,0.021,9575523.3,nan,nan,nan,0.000,nan,0.057,3512160.9,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9575523.3,0.021,0.000,0.021,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +directory-direct,resident,10,0,point:uniform@8,8,10,200000,15254528,3.000,5084446.0,1.488,2.144,4.416,447.231,1.530,23.990,635877.5,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +directory-direct,resident,10,0,range:uniform:1@8,8,10,200000,1542002,3.000,513959.8,14.208,20.736,29.952,116.374,15.517,23.998,64256.3,0,0,0.00,0.00,13.696,19.712,14.837,nan,0.637,1542002,513959.8,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +directory-direct,resident,10,0,range:uniform:10000@8,8,10,200000,10744,3.000,3581.0,2129.920,2719.744,2719.744,2747.861,2233.580,24.030,447.1,0,0,0.00,0.00,18.688,24.832,18.930,227.01,0.944,104785747,34925458.6,3.000,0.058,3.058,0.006,0,307200,nan,162664448,28655616,0.005,0,0,0,0,0 +cache-invalid-addresses,resident,11,0,warm,8,11,200000,200000,0.021,9621619.7,nan,nan,nan,0.000,nan,0.055,3643717.3,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9621619.7,0.021,0.000,0.021,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +cache-invalid-addresses,resident,11,0,point:uniform@8,8,11,200000,15486368,3.000,5161737.6,1.488,2.080,3.616,138.889,1.507,23.995,645404.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +cache-invalid-addresses,resident,11,0,range:uniform:1@8,8,11,200000,1434014,3.000,477968.0,15.232,21.760,32.000,101.528,16.686,23.999,59753.9,0,0,0.00,0.00,14.720,21.248,15.944,nan,0.696,1434014,477968.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +cache-invalid-addresses,resident,11,0,range:uniform:10000@8,8,11,200000,11260,3.000,3753.0,1982.464,2588.672,2654.208,2760.334,2131.583,23.997,469.2,0,0,0.00,0.00,17.664,27.392,18.250,216.36,0.893,109948136,36646349.5,3.000,0.068,3.069,0.012,0,307200,nan,162664448,28655616,0.005,0,0,0,0,0 +main,resident,12,0,warm,8,12,200000,200000,0.021,9342765.4,nan,nan,nan,0.000,nan,0.062,3234309.6,27672576,0,138.36,0.00,nan,nan,nan,nan,nan,200000,9342765.4,0.021,0.000,0.021,0.000,0,0,nan,0,0,0.006,0,0,0,0,6 +main,resident,12,0,point:uniform@8,8,12,200000,14803808,3.000,4934239.5,1.552,2.144,3.296,131.695,1.576,24.029,616088.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +main,resident,12,0,range:uniform:1@8,8,12,200000,1480470,3.000,493450.8,14.976,21.248,30.976,451.183,16.161,23.997,61694.6,0,0,0.00,0.00,14.464,20.736,15.440,nan,0.675,1480470,493450.8,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.006,0,0,2,0,0 +main,resident,12,0,range:uniform:10000@8,8,12,200000,10853,3.000,3617.3,2048.000,2654.208,2719.744,2733.513,2211.589,23.998,452.2,0,0,0.00,0.00,18.688,25.344,18.951,224.64,0.937,105883663,35291428.8,3.000,0.108,3.108,0.013,0,307200,nan,162664448,28655616,0.006,0,0,1,0,0 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-0-main.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-0-main.log new file mode 100644 index 000000000..7d9236462 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-0-main.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=0 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14907959 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=3640335 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=11845141 notfound=0 +== point:uniform@8 T=8 ops=11845141 secs= 3.00 ops/s= 3948079 lat us p50=1.84 p99=2.53 p99.9=7.62 max=114.5 mean=1.87 + cpu=24.00s ops/cpu-s=493579 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3251826 secs= 3.00 ops/s= 1083863 lat us p50=6.34 p99=10.11 p99.9=17.66 max=452.2 mean=7.23 + cpu=23.99s ops/cpu-s=135543 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.95 p99=9.60 mean=6.80 per-tuple=nan ns deinit mean=0.39 us tuples/s=1083863 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 10208 ops (+1021 ops/s) +close took 0.043 s +== range:uniform:10000@8 T=8 ops=10186 secs= 3.00 ops/s= 3395 lat us p50=2129.92 p99=4784.13 p99.9=4915.20 max=5084.6 mean=2355.18 + cpu=24.00s ops/cpu-s=424 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.32 p99=14.72 mean=8.96 per-tuple=240.9 ns deinit mean=0.67 us tuples/s=33093493 + insert/run=3.00s drain(close)=0.04s total=3.04s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-1-branch-prefix.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-1-branch-prefix.log new file mode 100644 index 000000000..271919619 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-1-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 100800cb-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=1 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15509499 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3221961 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=12455154 notfound=0 +== point:uniform@8 T=8 ops=12455154 secs= 3.00 ops/s= 4151388 lat us p50=1.74 p99=2.59 p99.9=7.10 max=272.2 mean=1.77 + cpu=23.99s ops/cpu-s=519084 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3076317 secs= 3.00 ops/s= 1025362 lat us p50=6.59 p99=10.62 p99.9=18.18 max=89.0 mean=7.64 + cpu=24.00s ops/cpu-s=128189 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.21 p99=9.86 mean=7.13 per-tuple=nan ns deinit mean=0.46 us tuples/s=1025362 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11001 ops (+1100 ops/s) +close took 0.056 s +== range:uniform:10000@8 T=8 ops=11092 secs= 3.00 ops/s= 3697 lat us p50=1196.03 p99=4653.06 p99.9=4784.13 max=4885.6 mean=2162.60 + cpu=24.00s ops/cpu-s=462 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.74 p99=12.16 mean=8.34 per-tuple=221.0 ns deinit mean=0.66 us tuples/s=36056323 + insert/run=3.00s drain(close)=0.06s total=3.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-2-branch-prefix.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-2-branch-prefix.log new file mode 100644 index 000000000..7205c52a3 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-2-branch-prefix.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=branch-prefix splinter=splinterdb_build_version 100800cb-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=2 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14714134 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3284018 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=11900064 notfound=0 +== point:uniform@8 T=8 ops=11900064 secs= 3.00 ops/s= 3966374 lat us p50=1.81 p99=2.53 p99.9=5.44 max=60.0 mean=1.86 + cpu=24.00s ops/cpu-s=495849 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3183221 secs= 3.00 ops/s= 1060998 lat us p50=6.34 p99=10.37 p99.9=18.69 max=88.1 mean=7.39 + cpu=24.00s ops/cpu-s=132640 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.95 p99=9.60 mean=6.90 per-tuple=nan ns deinit mean=0.44 us tuples/s=1060998 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 9287 ops (+929 ops/s) +close took 0.062 s +== range:uniform:10000@8 T=8 ops=9377 secs= 3.00 ops/s= 3125 lat us p50=2654.21 p99=4259.84 p99.9=4259.84 max=4356.1 mean=2559.23 + cpu=24.00s ops/cpu-s=391 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.32 p99=11.14 mean=8.42 per-tuple=261.5 ns deinit mean=0.69 us tuples/s=30492432 + insert/run=3.00s drain(close)=0.06s total=3.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-3-main.log b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-3-main.log new file mode 100644 index 000000000..39f2cd635 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-3-main.log @@ -0,0 +1,21 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version fc0bc8f7 db=/home/rob/projects/splinterdb/.cache/projects-20261011/benchmarks/main-fc0bc8f7/branch-screen/scratch.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=3.0 warmup=1.0 rep=3 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15599265 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3341408 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=12688388 notfound=0 +== point:uniform@8 T=8 ops=12688388 secs= 3.00 ops/s= 4229122 lat us p50=1.71 p99=2.34 p99.9=6.34 max=164.2 mean=1.75 + cpu=23.99s ops/cpu-s=528797 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) +== range:uniform:1@8 T=8 ops=3128885 secs= 3.00 ops/s= 1042880 lat us p50=6.59 p99=10.62 p99.9=18.69 max=87.9 mean=7.52 + cpu=24.00s ops/cpu-s=130380 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.21 p99=10.11 mean=7.08 per-tuple=nan ns deinit mean=0.39 us tuples/s=1042880 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 11527 ops (+1153 ops/s) +close took 0.096 s +== range:uniform:10000@8 T=8 ops=11570 secs= 3.00 ops/s= 3856 lat us p50=1916.93 p99=3899.39 p99.9=4030.46 max=4324.0 mean=2074.23 + cpu=24.00s ops/cpu-s=482 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=13.95 mean=9.33 per-tuple=211.4 ns deinit mean=0.66 us tuples/s=37627377 + insert/run=3.00s drain(close)=0.10s total=3.10s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-results.csv b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-results.csv new file mode 100644 index 000000000..b32239fa1 --- /dev/null +++ b/benchmarks/results-20261013/main-fc0bc8f7-screen/runs/random-results.csv @@ -0,0 +1,17 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.013,14907958.6,nan,nan,nan,0.000,nan,0.055,3640334.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14907958.6,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,point:uniform@8,8,0,200000,11845141,3.000,3948079.3,1.840,2.528,7.616,114.474,1.873,23.998,493579.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,3251826,3.000,1083863.1,6.336,10.112,17.664,452.164,7.228,23.991,135542.7,0,0,0.00,0.00,5.952,9.600,6.799,nan,0.386,3251826,1083863.1,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,10186,3.000,3395.0,2129.920,4784.128,4915.200,5084.630,2355.177,23.997,424.5,0,0,0.00,0.00,8.320,14.720,8.958,240.88,0.669,99289511,33093492.6,3.000,0.043,3.043,0.007,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 +branch-prefix,resident,1,0,warm,8,1,200000,200000,0.013,15509499.1,nan,nan,nan,0.000,nan,0.062,3221960.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15509499.1,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,resident,1,0,point:uniform@8,8,1,200000,12455154,3.000,4151388.4,1.744,2.592,7.104,272.248,1.771,23.994,519083.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,resident,1,0,range:uniform:1@8,8,1,200000,3076317,3.000,1025361.8,6.592,10.624,18.176,89.048,7.640,23.998,128189.5,0,0,0.00,0.00,6.208,9.856,7.131,nan,0.460,3076317,1025361.8,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,resident,1,0,range:uniform:10000@8,8,1,200000,11092,3.000,3697.0,1196.032,4653.056,4784.128,4885.604,2162.603,23.998,462.2,0,0,0.00,0.00,7.744,12.160,8.344,221.01,0.659,108178040,36056322.7,3.000,0.056,3.056,0.013,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 +branch-prefix,resident,2,0,warm,8,2,200000,200000,0.014,14714134.2,nan,nan,nan,0.000,nan,0.061,3284018.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14714134.2,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,resident,2,0,point:uniform@8,8,2,200000,11900064,3.000,3966374.4,1.808,2.528,5.440,60.004,1.862,23.999,495849.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,resident,2,0,range:uniform:1@8,8,2,200000,3183221,3.000,1060998.1,6.336,10.368,18.688,88.061,7.388,23.999,132640.4,0,0,0.00,0.00,5.952,9.600,6.897,nan,0.441,3183221,1060998.1,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +branch-prefix,resident,2,0,range:uniform:10000@8,8,2,200000,9377,3.000,3125.4,2654.208,4259.840,4259.840,4356.108,2559.225,23.999,390.7,0,0,0.00,0.00,8.320,11.136,8.423,261.47,0.695,91485084,30492432.1,3.000,0.062,3.062,0.007,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 +main,resident,3,0,warm,8,3,200000,200000,0.013,15599264.9,nan,nan,nan,0.000,nan,0.060,3341408.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15599264.9,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.007,0,0,0,0,2 +main,resident,3,0,point:uniform@8,8,3,200000,12688388,3.000,4229121.7,1.712,2.336,6.336,164.216,1.751,23.995,528797.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,3128885,3.000,1042880.4,6.592,10.624,18.688,87.917,7.515,23.998,130379.6,0,0,0.00,0.00,6.208,10.112,7.077,nan,0.394,3128885,1042880.4,3.000,0.000,3.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,11570,3.000,3856.3,1916.928,3899.392,4030.464,4324.016,2074.231,23.997,482.1,0,0,0.00,0.00,9.344,13.952,9.329,211.40,0.659,112892582,37627376.6,3.000,0.096,3.097,0.013,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 From 1a6d2bb5a88b7cdc87f2110ecef62ed3ffe15e33 Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Wed, 14 Oct 2026 13:21:40 -0700 Subject: [PATCH 07/11] Record current-main prefix benchmarks and merge blockers --- .../prefix-main-6105c49f/.gitattributes | 1 + .../prefix-main-6105c49f/.gitignore | 1 + .../prefix-main-6105c49f/README.md | 106 + .../prefix-main-6105c49f/audit.json | 53 + .../prefix-main-6105c49f/audit.py | 102 + .../prefix-main-6105c49f/build.json | 303 ++ .../candidate-harness-build.log | 3 + .../prefix-main-6105c49f/fixtures.json | 1124 +++++ .../fixtures/candidate-disk-common-wal0.csv | 2 + .../candidate-disk-nonlexical-wal0.csv | 2 + .../fixtures/candidate-disk-random-wal0.csv | 2 + ...andidate-resident-common-wal0-disabled.csv | 2 + .../candidate-resident-common-wal0.csv | 2 + .../candidate-resident-common-wal1.csv | 2 + .../candidate-resident-nonlexical-wal0.csv | 2 + .../candidate-resident-random-wal0.csv | 2 + .../candidate-resident-random-wal1.csv | 2 + .../load-candidate-disk-common-wal0.log | 206 + .../load-candidate-disk-nonlexical-wal0.log | 206 + .../load-candidate-disk-random-wal0.log | 206 + ...andidate-resident-common-wal0-disabled.log | 188 + .../load-candidate-resident-common-wal0.log | 188 + .../load-candidate-resident-common-wal1.log | 188 + ...oad-candidate-resident-nonlexical-wal0.log | 188 + .../load-candidate-resident-random-wal0.log | 188 + .../load-candidate-resident-random-wal1.log | 188 + .../fixtures/load-main-disk-common-wal0.log | 206 + .../load-main-disk-nonlexical-wal0.log | 206 + .../fixtures/load-main-disk-random-wal0.log | 206 + .../load-main-resident-common-wal0.log | 188 + .../load-main-resident-common-wal1.log | 188 + .../load-main-resident-nonlexical-wal0.log | 188 + .../load-main-resident-random-wal0.log | 188 + .../load-main-resident-random-wal1.log | 188 + .../fixtures/main-disk-common-wal0.csv | 2 + .../fixtures/main-disk-nonlexical-wal0.csv | 2 + .../fixtures/main-disk-random-wal0.csv | 2 + .../fixtures/main-resident-common-wal0.csv | 2 + .../fixtures/main-resident-common-wal1.csv | 2 + .../main-resident-nonlexical-wal0.csv | 2 + .../fixtures/main-resident-random-wal0.csv | 2 + .../fixtures/main-resident-random-wal1.csv | 2 + .../space-candidate-disk-common-wal0.log | 180 + .../space-candidate-disk-nonlexical-wal0.log | 180 + .../space-candidate-disk-random-wal0.log | 180 + ...andidate-resident-common-wal0-disabled.log | 162 + .../space-candidate-resident-common-wal0.log | 162 + .../space-candidate-resident-common-wal1.log | 162 + ...ace-candidate-resident-nonlexical-wal0.log | 162 + .../space-candidate-resident-random-wal0.log | 162 + .../space-candidate-resident-random-wal1.log | 162 + .../fixtures/space-main-disk-common-wal0.log | 180 + .../space-main-disk-nonlexical-wal0.log | 180 + .../fixtures/space-main-disk-random-wal0.log | 180 + .../space-main-resident-common-wal0.log | 162 + .../space-main-resident-common-wal1.log | 162 + .../space-main-resident-nonlexical-wal0.log | 162 + .../space-main-resident-random-wal0.log | 162 + .../space-main-resident-random-wal1.log | 162 + .../prefix-main-6105c49f/followup.py | 40 + .../prefix-main-6105c49f/jobs.json | 28 + .../prefix-main-6105c49f/main-build.log | 49 + .../main-harness-build.log | 3 + .../prefix-main-6105c49f/reads-progress.log | 54 + .../reads/disk-common-wal0-00-main.csv | 5 + .../reads/disk-common-wal0-00-main.log | 22 + .../reads/disk-common-wal0-01-candidate.csv | 5 + .../reads/disk-common-wal0-01-candidate.log | 22 + .../reads/disk-common-wal0-02-candidate.csv | 5 + .../reads/disk-common-wal0-02-candidate.log | 22 + .../reads/disk-common-wal0-03-main.csv | 5 + .../reads/disk-common-wal0-03-main.log | 22 + .../reads/disk-nonlexical-wal0-00-main.csv | 5 + .../reads/disk-nonlexical-wal0-00-main.log | 22 + .../disk-nonlexical-wal0-01-candidate.csv | 5 + .../disk-nonlexical-wal0-01-candidate.log | 22 + .../disk-nonlexical-wal0-02-candidate.csv | 5 + .../disk-nonlexical-wal0-02-candidate.log | 22 + .../reads/disk-nonlexical-wal0-03-main.csv | 5 + .../reads/disk-nonlexical-wal0-03-main.log | 22 + .../reads/disk-random-wal0-00-main.csv | 5 + .../reads/disk-random-wal0-00-main.log | 22 + .../reads/disk-random-wal0-01-candidate.csv | 5 + .../reads/disk-random-wal0-01-candidate.log | 22 + .../reads/disk-random-wal0-02-candidate.csv | 5 + .../reads/disk-random-wal0-02-candidate.log | 22 + .../reads/disk-random-wal0-03-main.csv | 5 + .../reads/disk-random-wal0-03-main.log | 22 + .../prefix-main-6105c49f/reads/manifest.json | 4328 +++++++++++++++++ .../resident-common-disabled-wal0-00-main.csv | 6 + .../resident-common-disabled-wal0-00-main.log | 27 + ...dent-common-disabled-wal0-01-candidate.csv | 6 + ...dent-common-disabled-wal0-01-candidate.log | 27 + ...dent-common-disabled-wal0-02-candidate.csv | 6 + ...dent-common-disabled-wal0-02-candidate.log | 27 + .../resident-common-disabled-wal0-03-main.csv | 6 + .../resident-common-disabled-wal0-03-main.log | 27 + .../reads/resident-common-wal0-00-main.csv | 5 + .../reads/resident-common-wal0-00-main.log | 22 + .../resident-common-wal0-01-candidate.csv | 5 + .../resident-common-wal0-01-candidate.log | 22 + .../resident-common-wal0-02-candidate.csv | 5 + .../resident-common-wal0-02-candidate.log | 22 + .../reads/resident-common-wal0-03-main.csv | 5 + .../reads/resident-common-wal0-03-main.log | 22 + .../resident-nonlexical-wal0-00-main.csv | 5 + .../resident-nonlexical-wal0-00-main.log | 22 + .../resident-nonlexical-wal0-01-candidate.csv | 5 + .../resident-nonlexical-wal0-01-candidate.log | 22 + .../resident-nonlexical-wal0-02-candidate.csv | 5 + .../resident-nonlexical-wal0-02-candidate.log | 22 + .../resident-nonlexical-wal0-03-main.csv | 5 + .../resident-nonlexical-wal0-03-main.log | 22 + .../reads/resident-random-wal0-00-main.csv | 6 + .../reads/resident-random-wal0-00-main.log | 27 + .../resident-random-wal0-01-candidate.csv | 6 + .../resident-random-wal0-01-candidate.log | 27 + .../resident-random-wal0-02-candidate.csv | 6 + .../resident-random-wal0-02-candidate.log | 27 + .../reads/resident-random-wal0-03-main.csv | 6 + .../reads/resident-random-wal0-03-main.log | 27 + .../prefix-main-6105c49f/repeat-progress.log | 24 + .../prefix-main-6105c49f/repeat/manifest.json | 2282 +++++++++ .../resident-common-disabled-wal0-00-main.csv | 4 + .../resident-common-disabled-wal0-00-main.log | 19 + ...dent-common-disabled-wal0-01-candidate.csv | 4 + ...dent-common-disabled-wal0-01-candidate.log | 19 + ...dent-common-disabled-wal0-02-candidate.csv | 4 + ...dent-common-disabled-wal0-02-candidate.log | 19 + .../resident-common-disabled-wal0-03-main.csv | 4 + .../resident-common-disabled-wal0-03-main.log | 19 + .../resident-common-disabled-wal0-04-main.csv | 4 + .../resident-common-disabled-wal0-04-main.log | 19 + ...dent-common-disabled-wal0-05-candidate.csv | 4 + ...dent-common-disabled-wal0-05-candidate.log | 19 + .../repeat/resident-common-wal0-00-main.csv | 3 + .../repeat/resident-common-wal0-00-main.log | 13 + .../resident-common-wal0-01-candidate.csv | 3 + .../resident-common-wal0-01-candidate.log | 13 + .../resident-common-wal0-02-candidate.csv | 3 + .../resident-common-wal0-02-candidate.log | 13 + .../repeat/resident-common-wal0-03-main.csv | 3 + .../repeat/resident-common-wal0-03-main.log | 13 + .../repeat/resident-common-wal0-04-main.csv | 3 + .../repeat/resident-common-wal0-04-main.log | 13 + .../resident-common-wal0-05-candidate.csv | 3 + .../resident-common-wal0-05-candidate.log | 13 + .../resident-nonlexical-wal0-00-main.csv | 3 + .../resident-nonlexical-wal0-00-main.log | 13 + .../resident-nonlexical-wal0-01-candidate.csv | 3 + .../resident-nonlexical-wal0-01-candidate.log | 13 + .../resident-nonlexical-wal0-02-candidate.csv | 3 + .../resident-nonlexical-wal0-02-candidate.log | 13 + .../resident-nonlexical-wal0-03-main.csv | 3 + .../resident-nonlexical-wal0-03-main.log | 13 + .../resident-nonlexical-wal0-04-main.csv | 3 + .../resident-nonlexical-wal0-04-main.log | 13 + .../resident-nonlexical-wal0-05-candidate.csv | 3 + .../resident-nonlexical-wal0-05-candidate.log | 13 + .../repeat/resident-random-wal1-00-main.csv | 3 + .../repeat/resident-random-wal1-00-main.log | 12 + .../resident-random-wal1-01-candidate.csv | 3 + .../resident-random-wal1-01-candidate.log | 12 + .../resident-random-wal1-02-candidate.csv | 3 + .../resident-random-wal1-02-candidate.log | 12 + .../repeat/resident-random-wal1-03-main.csv | 3 + .../repeat/resident-random-wal1-03-main.log | 12 + .../repeat/resident-random-wal1-04-main.csv | 3 + .../repeat/resident-random-wal1-04-main.log | 12 + .../resident-random-wal1-05-candidate.csv | 3 + .../resident-random-wal1-05-candidate.log | 12 + .../prefix-main-6105c49f/report.md | 107 + .../prefix-main-6105c49f/report.py | 116 + .../prefix-main-6105c49f/run_benchmarks.py | 289 ++ .../prefix-main-6105c49f/sha256.json | 237 + .../prefix-main-6105c49f/summary.csv | 33 + .../prefix-main-6105c49f/summary.json | 1858 +++++++ .../tests/debug-automatic-log-recovery.log | 3 + .../tests/debug-btree.log | 36 + .../tests/debug-build.json | 199 + .../tests/debug-build.log | 131 + .../tests/debug-functional-log.log | 11 + .../tests/debug-merge.log | 18 + .../tests/debug-results.json | 156 + .../tests/debug-source-check.json | 3 + .../tests/debug-source-manifest.json | 180 + .../tests/debug-splinter.log | 96 + .../tests/debug-splinterdb_quick.log | 64 + .../tests/debug-superblock.log | 50 + .../tests/release-automatic-log-recovery.log | 3 + .../tests/release-btree.log | 36 + .../tests/release-build.json | 200 + .../tests/release-build.log | 133 + .../tests/release-functional-log.log | 11 + .../tests/release-merge.log | 18 + .../tests/release-results.json | 156 + .../tests/release-source-check.json | 3 + .../tests/release-source-manifest.json | 180 + .../tests/release-splinter.log | 96 + .../tests/release-splinterdb_quick.log | 64 + .../tests/release-superblock.log | 50 + .../prefix-main-6105c49f/tests/validate.py | 148 + .../prefix-main-6105c49f/writes-progress.log | 24 + .../prefix-main-6105c49f/writes/manifest.json | 2140 ++++++++ .../writes/resident-common-wal0-00-main.csv | 3 + .../writes/resident-common-wal0-00-main.log | 11 + .../resident-common-wal0-01-candidate.csv | 3 + .../resident-common-wal0-01-candidate.log | 11 + .../resident-common-wal0-02-candidate.csv | 3 + .../resident-common-wal0-02-candidate.log | 11 + .../writes/resident-common-wal0-03-main.csv | 3 + .../writes/resident-common-wal0-03-main.log | 11 + .../writes/resident-common-wal1-00-main.csv | 3 + .../writes/resident-common-wal1-00-main.log | 11 + .../resident-common-wal1-01-candidate.csv | 3 + .../resident-common-wal1-01-candidate.log | 11 + .../resident-common-wal1-02-candidate.csv | 3 + .../resident-common-wal1-02-candidate.log | 11 + .../writes/resident-common-wal1-03-main.csv | 3 + .../writes/resident-common-wal1-03-main.log | 11 + .../writes/resident-random-wal0-00-main.csv | 3 + .../writes/resident-random-wal0-00-main.log | 11 + .../resident-random-wal0-01-candidate.csv | 3 + .../resident-random-wal0-01-candidate.log | 11 + .../resident-random-wal0-02-candidate.csv | 3 + .../resident-random-wal0-02-candidate.log | 11 + .../writes/resident-random-wal0-03-main.csv | 3 + .../writes/resident-random-wal0-03-main.log | 11 + .../writes/resident-random-wal1-00-main.csv | 3 + .../writes/resident-random-wal1-00-main.log | 11 + .../resident-random-wal1-01-candidate.csv | 3 + .../resident-random-wal1-01-candidate.log | 11 + .../resident-random-wal1-02-candidate.csv | 3 + .../resident-random-wal1-02-candidate.log | 11 + .../writes/resident-random-wal1-03-main.csv | 3 + .../writes/resident-random-wal1-03-main.log | 11 + docs/branch-prefix-experiment.md | 37 + ...interdb_custom_ipv4_addr_sortcmp_example.c | 2 + 238 files changed, 23037 insertions(+) create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/.gitattributes create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/.gitignore create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/README.md create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/audit.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/audit.py create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/build.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/candidate-harness-build.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-common-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-nonlexical-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-random-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0-disabled.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal1.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-nonlexical-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal1.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0-disabled.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-common-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-nonlexical-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-random-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal1.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-nonlexical-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal0.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal1.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0-disabled.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-nonlexical-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal0.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal1.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/followup.py create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/jobs.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/main-build.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/main-harness-build.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads-progress.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/manifest.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat-progress.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/manifest.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/report.md create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/report.py create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/run_benchmarks.py create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/sha256.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/summary.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/summary.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-automatic-log-recovery.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-btree.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-functional-log.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-merge.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-results.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-check.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-manifest.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinter.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinterdb_quick.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-superblock.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-automatic-log-recovery.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-btree.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-functional-log.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-merge.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-results.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-check.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-manifest.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinter.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinterdb_quick.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/release-superblock.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/tests/validate.py create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes-progress.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/manifest.json create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.log create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.csv create mode 100644 benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.log diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/.gitattributes b/benchmarks/results-20261014/prefix-main-6105c49f/.gitattributes new file mode 100644 index 000000000..38e0d5830 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/.gitattributes @@ -0,0 +1 @@ +*.log whitespace=-blank-at-eol,-blank-at-eof,-space-before-tab diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/.gitignore b/benchmarks/results-20261014/prefix-main-6105c49f/.gitignore new file mode 100644 index 000000000..c18dd8d83 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/.gitignore @@ -0,0 +1 @@ +__pycache__/ diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/README.md b/benchmarks/results-20261014/prefix-main-6105c49f/README.md new file mode 100644 index 000000000..dd5f1a2c0 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/README.md @@ -0,0 +1,106 @@ +# Prefix integration and performance assessment, 2026-10-14 + +Merged `origin/main` at `6105c49f66a24d3006ba0464d9558b52e692e27c` into +`robj/branch-prefix` as `97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789`. +The new main change bounds automatic log groups; it merged without conflicts. +A final fetch after measurements still found main at `6105c49f`. +The custom IPv4 comparator example now clears `key_compare_is_lexical`, as its +ordering does not meet that flag's contract. No measured runtime source changed. + +## Merge assessment + +The branch is suitable for a review PR, but this evidence does not support +merging the default-enabled implementation yet. The strongest performance +blocker is resident nonlexical length-1 scans: throughput fell 5.36% in the +initial ABBA and 5.73% in three longer paired repetitions, with nonoverlapping +sample ranges in both. Compression is disabled for this comparator, so the +workload pays overhead without receiving compression's space benefit. +The repeat's mean p99 increased 7.23%. + +Common-prefix resident length-10,000 scans averaged 14.97% slower initially and +12.10% slower in the longer repeat. Both sets have overlapping sample ranges, +so these are recurring concerns, not precise estimates of a universal slowdown. +The initial 20.10% compression-disabled long-scan loss did not reproduce: +the longer repeat was -2.38% at eight readers and +1.89% at one reader, both +with overlapping ranges. Historical random resident scan losses also did not +reproduce in the new initial matrix. Retain these distinctions when reviewing. + +Logged random overwrites lost 9.98% including close/drain in the initial screen, +and 6.09% in the repeat. The latter ranges overlap substantially; these short +overwrite runs do not establish steady-state insertion performance or an +isolated regression caused by the new log-group policy. + +Shared-prefix disk benefits remain clear in this matrix: points +10.45%, +length-1 scans +10.86%, length-10,000 scans +20.29%, with nonoverlapping +throughput sample ranges. Their read bytes per operation fell 9.06%, 22.75%, +and 29.09%, respectively. File allocation fell 34.73% on disk and 30.16% in +the resident fixture. Mounted live extents fell 24.28% and 25.15%. + +There is also unconditional iterator memory overhead. DWARF from the measured +libraries gives `sizeof(btree_iterator)` 336 -> 488 and +`sizeof(core_range_iterator)` 94,592 -> 133,504 bytes: 38 KiB more per public +iterator, including nonlexical and compression-disabled workloads. The core +iterator embeds 256 branch iterators. These are object sizes, not measured RSS. + +Source review identifies costs worth profiling before a merge: owned full-key +buffers on the scan path, reconstruction for compressed leaves, and packing +even when a small prefix does not provide space for another tuple. The buffer +layout and allocation changes are candidates for the nonlexical overhead; +key reconstruction cannot explain a comparator with compression disabled. +No causal attribution or performance repair was established in this update. + +## Validation and measurement scope + +Debug and release each passed 141 unit cases: B-tree 12, superblock 17, merge +10, public API 57, internal Splinter 44, and automatic-log process-exit recovery +1. Both functional log runs passed and replayed 500,000 records. This covers +prefix roundtrip/reopen, predicate scans, blobs, and the new automatic log +barrier behavior. All build targets passed, including the corrected example. + +The benchmark campaign completed 68 query/overwrite invocations: 28 reads, +16 overwrites, and 24 targeted followups, plus 17 fixture load/space pairs. +Every completed invocation succeeded; all phase rows have zero errors and +correctness violations. Reads use seven-second phases, overwrites eight, and +followups fifteen. Initial comparisons use ABBA; followups use three alternating +pairs (A B / B A / A B). The [generated report](report.md) and [summary CSV](summary.csv) +retain all results, including contrary and overlapping evidence. + +All database files use O_DIRECT on ext4 `/dev/mapper/snafu-root_crypt`, with CPU +affinity 0-11. Benchmarks hold the existing campaign's exclusive benchmark and +machine locks; tests completed before timing. Each query uses a separate fsynced +copy of a fixed per-format image. Logical keys, seed, cache size, and harness +source match. Default logged runs exercise main's automatic group limit. +These are closed-loop workloads, not offered-rate latency measurements. + +Resident configurations use 200,000 64-byte keys, 100-byte values and a 128 MiB +cache; disk configurations use two million keys and a 64 MiB cache. Loading +uses one thread, no background workers and a 4 MiB memtable. The random-key +generator retains a 16-byte-per-logical-key array in both versions. This is an +equal-cache comparison, not an enforced total-memory cap; the iterator object +growth above is additional candidate memory. Fixture loading is measured only +once and is too short for a sustained-write conclusion. CPU frequency and +uncoordinated host activity are not controlled; sample ranges show substantial +resident variability. Sample ranges are not statistical confidence intervals. + +## Reproduction and provenance + +`build.json` records commits, all runtime source hashes, compiler/link commands, +build flags, library hashes, and identical generated harness hashes. Baseline +runtime was exported from main with `git archive`, then built with +`make -B -j8 BUILD_MODE=release GIT_VERSION=6105c49f libs`. Candidate debug and +release builds use `BUILD_ROOT=build-main-6105c49f`. The existing +`benchmarks/build_prefix_bench.py` builds both harnesses. No database images or +binaries are committed here; the files remain under the worktree's `.cache` +and build directories. Earlier unrelated build directories are preserved. + +`tests/validate.py` reproduces build/test commands. `run_benchmarks.py --mode +reads` and `--mode writes` reproduce the first matrix; their caller must hold +the campaign locks. `followup.py` acquires those locks itself. Runs deliberately +refuse to overwrite existing result directories or images: use a fresh archive +and scratch destination for a new campaign. `report.py` regenerates the table +and CSV from recorded samples. `audit.py` verifies hashes, source correspondence, +test results, and serialization and records iterator object sizes. + +Codex workspace-requirements errors interrupted orchestration during preparation; +they were not test failures. The completed process logs and manifests are the +evidence for successful execution. diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/audit.json b/benchmarks/results-20261014/prefix-main-6105c49f/audit.json new file mode 100644 index 000000000..c1d9dcbdc --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/audit.json @@ -0,0 +1,53 @@ +{ + "source_and_binary_hashes_match": true, + "identical_harness": true, + "benchmark_subprocesses": 102, + "query_invocations": 68, + "phase_rows": 223, + "errors": 0, + "violations": 0, + "benchmark_intervals_do_not_overlap": true, + "tests_before_benchmarks": true, + "tests": { + "debug": { + "unit_cases": 141, + "functional_log_passed": true + }, + "release": { + "unit_cases": 141, + "functional_log_passed": true + } + }, + "iterator_object_sizes": { + "main": { + "command": [ + "gdb", + "-nx", + "-batch", + "-ex", + "p sizeof(btree_iterator)", + "-ex", + "p sizeof(core_range_iterator)", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.so" + ], + "btree_iterator": 336, + "core_range_iterator": 94592, + "output": "$1 = 336\n$2 = 94592\n" + }, + "candidate": { + "command": [ + "gdb", + "-nx", + "-batch", + "-ex", + "p sizeof(btree_iterator)", + "-ex", + "p sizeof(core_range_iterator)", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.so" + ], + "btree_iterator": 488, + "core_range_iterator": 133504, + "output": "$1 = 488\n$2 = 133504\n" + } + } +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/audit.py b/benchmarks/results-20261014/prefix-main-6105c49f/audit.py new file mode 100644 index 000000000..5c3cec08f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/audit.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +"""Check this campaign's source, artifacts, outcomes, and serialization.""" + +import csv +import hashlib +import json +from pathlib import Path +import re +import subprocess + + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[2] + + +def sha(path): + return hashlib.sha256(Path(path).read_bytes()).hexdigest() + + +def main(): + builds = json.loads((HERE / "build.json").read_text()) + sizes = {} + for profile, build in builds.items(): + for field in ("binary", "library"): + assert sha(build[field]) == build[field + "_sha256"], (profile, field) + assert sha(Path(build["binary"]).with_suffix(".c")) == build["source_sha256"] + for name, expected in build["source_files_sha256"].items(): + assert sha(Path(build["tree"]) / name) == expected, (profile, name) + committed = subprocess.check_output( + ["git", "show", build["commit"] + ":" + name], cwd=ROOT) + assert hashlib.sha256(committed).hexdigest() == expected, (profile, name) + command = ["gdb", "-nx", "-batch", "-ex", "p sizeof(btree_iterator)", + "-ex", "p sizeof(core_range_iterator)", + str(Path(build["library"]).with_suffix(".so"))] + output = subprocess.check_output(command, text=True) + values = [int(value) for value in re.findall(r"\$\d+ = (\d+)", output)] + assert len(values) == 2 + sizes[profile] = dict(command=command, btree_iterator=values[0], + core_range_iterator=values[1], output=output) + assert builds["main"]["source_sha256"] == builds["candidate"]["source_sha256"] + + runs = [] + query_count = 0 + phase_count = 0 + for mode in ("reads", "writes", "repeat"): + manifest = json.loads((HERE / mode / "manifest.json").read_text()) + assert manifest["complete"] + assert sha(HERE / "run_benchmarks.py") == manifest["runner_sha256"] + assert sha(HERE / "build.json") == manifest["build_json_sha256"] + if mode == "repeat": + assert sha(HERE / "followup.py") == manifest["followup_sha256"] + for run in manifest["runs"]: + assert run["returncode"] == 0 and run["verified"], run["label"] + assert sha(HERE / run["log"]) == run["log_sha256"], run["label"] + if "csv" in run: + csvpath = HERE / run["csv"] + if "csv_sha256" in run: + assert sha(csvpath) == run["csv_sha256"], run["label"] + with csvpath.open() as stream: + rows = list(csv.DictReader(stream)) + assert all(int(row["ops"]) > 0 and int(row["errors"]) == 0 + and int(row["violations"]) == 0 for row in rows) + phase_count += len(rows) + query_count += "case" in run + runs.append(run) + ordered = sorted(runs, key=lambda run: run["started"]) + assert all(a["finished"] <= b["started"] for a, b in zip(ordered, ordered[1:])) + + tests = {} + for mode in ("debug", "release"): + records = json.loads((HERE / "tests" / (mode + "-results.json")).read_text()) + count = 0 + for record in records: + assert record["returncode"] == 0 + assert sha(HERE / "tests" / record["log"]) == record["log_sha256"] + assert sha(record["command"][0]) == record["binary_sha256"] + assert record["finished"] < ordered[0]["started"] + if record["name"] != "functional-log": + assert len(record["summaries"]) == 1 + count += int(re.search(r"RESULTS: (\d+) tests", record["summaries"][0])[1]) + else: + assert "log returned 500000 of 500000 entries" in ( + HERE / "tests" / record["log"]).read_text() + assert count == 141 + assert json.loads((HERE / "tests" / (mode + "-source-check.json")).read_text())["unchanged"] + tests[mode] = dict(unit_cases=count, functional_log_passed=True) + + result = dict(source_and_binary_hashes_match=True, identical_harness=True, + benchmark_subprocesses=len(runs), query_invocations=query_count, + phase_rows=phase_count, errors=0, violations=0, + benchmark_intervals_do_not_overlap=True, tests_before_benchmarks=True, + tests=tests, iterator_object_sizes=sizes) + (HERE / "audit.json").write_text(json.dumps(result, indent=2) + "\n") + archive = {str(path.relative_to(HERE)): sha(path) for path in sorted(HERE.rglob("*")) + if path.is_file() and "__pycache__" not in path.parts + and path.name != "sha256.json"} + (HERE / "sha256.json").write_text(json.dumps(archive, indent=2) + "\n") + print(json.dumps(result, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/build.json b/benchmarks/results-20261014/prefix-main-6105c49f/build.json new file mode 100644 index 000000000..62f8eafc1 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/build.json @@ -0,0 +1,303 @@ +{ + "main": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main", + "commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "MAKEFLAGS=B -j8 --jobserver-auth=fifo:/tmp/prefix-main-build-6105c49f/GMfifo3 -- GIT_VERSION=6105c49f BUILD_MODE=release\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557" + } + }, + "candidate": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "BUILD_ROOT=build-main-6105c49f\nMAKEFLAGS= -j6 --jobserver-auth=fifo:/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-build-xn10vunh/GMfifo3 -- BUILD_MODE=release BUILD_ROOT=build-main-6105c49f\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a" + } + } +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/candidate-harness-build.log b/benchmarks/results-20261014/prefix-main-6105c49f/candidate-harness-build.log new file mode 100644 index 000000000..c6f97c919 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/candidate-harness-build.log @@ -0,0 +1,3 @@ +lto-wrapper: warning: using serial compilation of 13 LTRANS jobs +lto-wrapper: note: see the ‘-flto’ option documentation for more information +/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures.json b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures.json new file mode 100644 index 000000000..85a6d6e02 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures.json @@ -0,0 +1,1124 @@ +{ + "main-resident-common-wal0": { + "key": "main-resident-common-wal0", + "profile": "main", + "regime": "resident", + "pattern": "common", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal0.db", + "identity": { + "size": 237375488, + "mtime_ns": 1792007321270730148, + "inode": 26116948, + "allocated_bytes": 37408768 + }, + "sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "live_extents": 342, + "load": { + "version": "main", + "size": "resident", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.247", + "ops_s": "811108.6", + "p50_us": "0.584", + "p99_us": "2.784", + "p999_us": "8.832", + "max_us": "34176.859", + "mean_us": "1.196", + "cpu_s": "0.246", + "ops_per_cpu_s": "811490.7", + "rd_bytes": "0", + "wr_bytes": "0", + "rd_B_op": "0.00", + "wr_B_op": "0.00", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.247", + "drain_s": "0.105", + "total_s": "0.352", + "drain_cpu_s": "0.022", + "drain_rd": "0", + "drain_wr": "37261312", + "wamp": "1.1360", + "db_apparent": "237375488", + "db_alloc": "37408768", + "open_s": "0.008", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-resident-common-wal0.log", + "space_log": "fixtures/space-main-resident-common-wal0.log" + }, + "candidate-resident-common-wal0": { + "key": "candidate-resident-common-wal0", + "profile": "candidate", + "regime": "resident", + "pattern": "common", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0.db", + "identity": { + "size": 207360000, + "mtime_ns": 1792007346130382508, + "inode": 26116955, + "allocated_bytes": 26128384 + }, + "sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "live_extents": 256, + "load": { + "version": "candidate", + "size": "resident", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.242", + "ops_s": "826551.8", + "p50_us": "0.584", + "p99_us": "2.592", + "p999_us": "5.184", + "max_us": "39375.946", + "mean_us": "1.172", + "cpu_s": "0.242", + "ops_per_cpu_s": "826856.3", + "rd_bytes": "0", + "wr_bytes": "0", + "rd_B_op": "0.00", + "wr_B_op": "0.00", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.242", + "drain_s": "0.104", + "total_s": "0.346", + "drain_cpu_s": "0.023", + "drain_rd": "0", + "drain_wr": "25980928", + "wamp": "0.7921", + "db_apparent": "207360000", + "db_alloc": "26128384", + "open_s": "0.008", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-resident-common-wal0.log", + "space_log": "fixtures/space-candidate-resident-common-wal0.log" + }, + "main-resident-random-wal0": { + "key": "main-resident-random-wal0", + "profile": "main", + "regime": "resident", + "pattern": "random", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal0.db", + "identity": { + "size": 237375488, + "mtime_ns": 1792007419429361804, + "inode": 26116965, + "allocated_bytes": 37408768 + }, + "sha256": "61b6513de7a5bc2bee5ea8de5e4f475dfefa9fe9afd5de49b2353066e11a4b1a", + "live_extents": 342, + "load": { + "version": "main", + "size": "resident", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.318", + "ops_s": "629687.1", + "p50_us": "0.696", + "p99_us": "3.552", + "p999_us": "6.592", + "max_us": "39049.718", + "mean_us": "1.431", + "cpu_s": "0.317", + "ops_per_cpu_s": "631881.6", + "rd_bytes": "0", + "wr_bytes": "0", + "rd_B_op": "0.00", + "wr_B_op": "0.00", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.318", + "drain_s": "0.126", + "total_s": "0.443", + "drain_cpu_s": "0.029", + "drain_rd": "0", + "drain_wr": "37261312", + "wamp": "1.1360", + "db_apparent": "237375488", + "db_alloc": "37408768", + "open_s": "0.011", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-resident-random-wal0.log", + "space_log": "fixtures/space-main-resident-random-wal0.log" + }, + "candidate-resident-random-wal0": { + "key": "candidate-resident-random-wal0", + "profile": "candidate", + "regime": "resident", + "pattern": "random", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal0.db", + "identity": { + "size": 237375488, + "mtime_ns": 1792007452620901550, + "inode": 26116971, + "allocated_bytes": 37408768 + }, + "sha256": "fd1e976b91a26f529f5d3f7a2341b16f0dd61f0166973da8ee0424907081ef84", + "live_extents": 342, + "load": { + "version": "candidate", + "size": "resident", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.293", + "ops_s": "681835.5", + "p50_us": "0.632", + "p99_us": "2.912", + "p999_us": "4.928", + "max_us": "42604.857", + "mean_us": "1.327", + "cpu_s": "0.293", + "ops_per_cpu_s": "681898.0", + "rd_bytes": "0", + "wr_bytes": "0", + "rd_B_op": "0.00", + "wr_B_op": "0.00", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.293", + "drain_s": "0.129", + "total_s": "0.422", + "drain_cpu_s": "0.028", + "drain_rd": "0", + "drain_wr": "37261312", + "wamp": "1.1360", + "db_apparent": "237375488", + "db_alloc": "37408768", + "open_s": "0.010", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-resident-random-wal0.log", + "space_log": "fixtures/space-candidate-resident-random-wal0.log" + }, + "main-resident-nonlexical-wal0": { + "key": "main-resident-nonlexical-wal0", + "profile": "main", + "regime": "resident", + "pattern": "nonlexical", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-nonlexical-wal0.db", + "identity": { + "size": 237375488, + "mtime_ns": 1792007549963557870, + "inode": 26116981, + "allocated_bytes": 37408768 + }, + "sha256": "4ef44377d809c43746059d57e04cc593f0d2dc083e3e853f8422244d24fee6f3", + "live_extents": 342, + "load": { + "version": "main", + "size": "resident", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.251", + "ops_s": "796925.8", + "p50_us": "0.600", + "p99_us": "2.720", + "p999_us": "4.800", + "max_us": "36833.475", + "mean_us": "1.204", + "cpu_s": "0.251", + "ops_per_cpu_s": "798132.4", + "rd_bytes": "0", + "wr_bytes": "0", + "rd_B_op": "0.00", + "wr_B_op": "0.00", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.251", + "drain_s": "0.129", + "total_s": "0.379", + "drain_cpu_s": "0.023", + "drain_rd": "0", + "drain_wr": "37261312", + "wamp": "1.1360", + "db_apparent": "237375488", + "db_alloc": "37408768", + "open_s": "0.010", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-resident-nonlexical-wal0.log", + "space_log": "fixtures/space-main-resident-nonlexical-wal0.log" + }, + "candidate-resident-nonlexical-wal0": { + "key": "candidate-resident-nonlexical-wal0", + "profile": "candidate", + "regime": "resident", + "pattern": "nonlexical", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-nonlexical-wal0.db", + "identity": { + "size": 237375488, + "mtime_ns": 1792007574943214393, + "inode": 26116987, + "allocated_bytes": 37408768 + }, + "sha256": "7d5571d7c9b6c34ce64fb3f264e3e8a775eddacafceac2b253076f7257635b05", + "live_extents": 342, + "load": { + "version": "candidate", + "size": "resident", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.266", + "ops_s": "750987.7", + "p50_us": "0.632", + "p99_us": "2.848", + "p999_us": "4.928", + "max_us": "41285.393", + "mean_us": "1.277", + "cpu_s": "0.266", + "ops_per_cpu_s": "751207.6", + "rd_bytes": "0", + "wr_bytes": "0", + "rd_B_op": "0.00", + "wr_B_op": "0.00", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.266", + "drain_s": "0.143", + "total_s": "0.409", + "drain_cpu_s": "0.025", + "drain_rd": "0", + "drain_wr": "37261312", + "wamp": "1.1360", + "db_apparent": "237375488", + "db_alloc": "37408768", + "open_s": "0.010", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-resident-nonlexical-wal0.log", + "space_log": "fixtures/space-candidate-resident-nonlexical-wal0.log" + }, + "main-disk-common-wal0": { + "key": "main-disk-common-wal0", + "profile": "main", + "regime": "disk", + "pattern": "common", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-common-wal0.db", + "identity": { + "size": 3671330816, + "mtime_ns": 1792007652098156502, + "inode": 26116997, + "allocated_bytes": 833761280 + }, + "sha256": "dec5f2be82945a2752b28cc27276343ef7fab4af03af36a1c2d56a8cc0152d7a", + "live_extents": 3414, + "load": { + "version": "main", + "size": "disk", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "2000000", + "ops": "2000000", + "secs": "4.010", + "ops_s": "498727.1", + "p50_us": "0.680", + "p99_us": "1.872", + "p999_us": "8.832", + "max_us": "51402.315", + "mean_us": "1.943", + "cpu_s": "3.138", + "ops_per_cpu_s": "637446.9", + "rd_bytes": "345849856", + "wr_bytes": "752586752", + "rd_B_op": "172.92", + "wr_B_op": "376.29", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "4.010", + "drain_s": "0.235", + "total_s": "4.245", + "drain_cpu_s": "0.101", + "drain_rd": "46579712", + "drain_wr": "80932864", + "wamp": "2.5412", + "db_apparent": "3671330816", + "db_alloc": "833761280", + "open_s": "0.009", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-disk-common-wal0.log", + "space_log": "fixtures/space-main-disk-common-wal0.log" + }, + "candidate-disk-common-wal0": { + "key": "candidate-disk-common-wal0", + "profile": "candidate", + "regime": "disk", + "pattern": "common", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-common-wal0.db", + "identity": { + "size": 3250065408, + "mtime_ns": 1792007684809709246, + "inode": 26117003, + "allocated_bytes": 544198656 + }, + "sha256": "94cc9c3c0b4ecf1ed96ea3248119b7d092a7c33cf2c5751ecea3aa31c61b1b61", + "live_extents": 2585, + "load": { + "version": "candidate", + "size": "disk", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "2000000", + "ops": "2000000", + "secs": "3.844", + "ops_s": "520279.9", + "p50_us": "0.696", + "p99_us": "1.936", + "p999_us": "7.872", + "max_us": "41856.682", + "mean_us": "1.859", + "cpu_s": "3.156", + "ops_per_cpu_s": "633811.0", + "rd_bytes": "220692480", + "wr_bytes": "470503424", + "rd_B_op": "110.35", + "wr_B_op": "235.25", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "3.844", + "drain_s": "0.227", + "total_s": "4.071", + "drain_cpu_s": "0.102", + "drain_rd": "31875072", + "drain_wr": "73469952", + "wamp": "1.6585", + "db_apparent": "3250065408", + "db_alloc": "544198656", + "open_s": "0.013", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-disk-common-wal0.log", + "space_log": "fixtures/space-candidate-disk-common-wal0.log" + }, + "main-disk-random-wal0": { + "key": "main-disk-random-wal0", + "profile": "main", + "regime": "disk", + "pattern": "random", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-random-wal0.db", + "identity": { + "size": 3671592960, + "mtime_ns": 1792007768764564378, + "inode": 26117013, + "allocated_bytes": 833708032 + }, + "sha256": "0cfdb1bb3524e67d180e901b89b5db112353509ce4a1b18a296db3312c1b9353", + "live_extents": 3415, + "load": { + "version": "main", + "size": "disk", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "2000000", + "ops": "2000000", + "secs": "4.419", + "ops_s": "452591.1", + "p50_us": "0.664", + "p99_us": "1.840", + "p999_us": "8.832", + "max_us": "84283.057", + "mean_us": "2.037", + "cpu_s": "3.421", + "ops_per_cpu_s": "584605.1", + "rd_bytes": "347729920", + "wr_bytes": "748556288", + "rd_B_op": "173.86", + "wr_B_op": "374.28", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "4.419", + "drain_s": "0.321", + "total_s": "4.740", + "drain_cpu_s": "0.115", + "drain_rd": "46604288", + "drain_wr": "84901888", + "wamp": "2.5410", + "db_apparent": "3671592960", + "db_alloc": "833708032", + "open_s": "0.056", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-disk-random-wal0.log", + "space_log": "fixtures/space-main-disk-random-wal0.log" + }, + "candidate-disk-random-wal0": { + "key": "candidate-disk-random-wal0", + "profile": "candidate", + "regime": "disk", + "pattern": "random", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-random-wal0.db", + "identity": { + "size": 3671592960, + "mtime_ns": 1792007804536077772, + "inode": 26117019, + "allocated_bytes": 833789952 + }, + "sha256": "89cfb2d29cfb753c81867285e315cf6fa1ff347bf115264d8a3314c5dbe68fff", + "live_extents": 3415, + "load": { + "version": "candidate", + "size": "disk", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "2000000", + "ops": "2000000", + "secs": "4.565", + "ops_s": "438125.6", + "p50_us": "0.648", + "p99_us": "1.744", + "p999_us": "8.000", + "max_us": "87744.948", + "mean_us": "2.114", + "cpu_s": "3.522", + "ops_per_cpu_s": "567821.1", + "rd_bytes": "347389952", + "wr_bytes": "748695552", + "rd_B_op": "173.69", + "wr_B_op": "374.35", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "4.565", + "drain_s": "0.307", + "total_s": "4.872", + "drain_cpu_s": "0.138", + "drain_rd": "46288896", + "drain_wr": "84848640", + "wamp": "2.5413", + "db_apparent": "3671592960", + "db_alloc": "833789952", + "open_s": "0.064", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-disk-random-wal0.log", + "space_log": "fixtures/space-candidate-disk-random-wal0.log" + }, + "main-disk-nonlexical-wal0": { + "key": "main-disk-nonlexical-wal0", + "profile": "main", + "regime": "disk", + "pattern": "nonlexical", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-nonlexical-wal0.db", + "identity": { + "size": 3671461888, + "mtime_ns": 1792007891050903478, + "inode": 26117029, + "allocated_bytes": 833634304 + }, + "sha256": "24e07320763a98e7d8ef2e2c36272f1a13f309b5a0e0d01eec6dc0a5e7c7b14d", + "live_extents": 3414, + "load": { + "version": "main", + "size": "disk", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "2000000", + "ops": "2000000", + "secs": "4.576", + "ops_s": "437032.4", + "p50_us": "0.696", + "p99_us": "1.968", + "p999_us": "12.160", + "max_us": "77505.681", + "mean_us": "2.209", + "cpu_s": "3.450", + "ops_per_cpu_s": "579688.1", + "rd_bytes": "348377088", + "wr_bytes": "747790336", + "rd_B_op": "174.19", + "wr_B_op": "373.90", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "4.576", + "drain_s": "0.336", + "total_s": "4.913", + "drain_cpu_s": "0.142", + "drain_rd": "46260224", + "drain_wr": "85602304", + "wamp": "2.5408", + "db_apparent": "3671461888", + "db_alloc": "833634304", + "open_s": "0.029", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-disk-nonlexical-wal0.log", + "space_log": "fixtures/space-main-disk-nonlexical-wal0.log" + }, + "candidate-disk-nonlexical-wal0": { + "key": "candidate-disk-nonlexical-wal0", + "profile": "candidate", + "regime": "disk", + "pattern": "nonlexical", + "wal": 0, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-nonlexical-wal0.db", + "identity": { + "size": 3671461888, + "mtime_ns": 1792007925574435800, + "inode": 26117035, + "allocated_bytes": 834351104 + }, + "sha256": "a20e0ea73c5fd2bcd76bd881d8454ed33499cfeac1f7eb57c6d3a94e3ce44532", + "live_extents": 3414, + "load": { + "version": "candidate", + "size": "disk", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "2000000", + "ops": "2000000", + "secs": "4.508", + "ops_s": "443658.3", + "p50_us": "0.696", + "p99_us": "2.080", + "p999_us": "12.928", + "max_us": "76941.355", + "mean_us": "2.176", + "cpu_s": "3.470", + "ops_per_cpu_s": "576378.7", + "rd_bytes": "345686016", + "wr_bytes": "752422912", + "rd_B_op": "172.84", + "wr_B_op": "376.21", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "4.508", + "drain_s": "0.339", + "total_s": "4.847", + "drain_cpu_s": "0.143", + "drain_rd": "46575616", + "drain_wr": "81694720", + "wamp": "2.5430", + "db_apparent": "3671461888", + "db_alloc": "834351104", + "open_s": "0.027", + "violations": "0", + "errors": "0", + "swapin": "1", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-disk-nonlexical-wal0.log", + "space_log": "fixtures/space-candidate-disk-nonlexical-wal0.log" + }, + "candidate-resident-common-wal0-disabled": { + "key": "candidate-resident-common-wal0-disabled", + "profile": "candidate", + "regime": "resident", + "pattern": "common", + "wal": 0, + "disabled": true, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0-disabled.db", + "identity": { + "size": 237375488, + "mtime_ns": 1792008038092914694, + "inode": 26117047, + "allocated_bytes": 37408768 + }, + "sha256": "4548a1692b739e986afcc4af4a4824db55c941c2fea98ed5edb8389fcc33d60f", + "live_extents": 342, + "load": { + "version": "candidate", + "size": "resident", + "order": "0", + "log": "0", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.270", + "ops_s": "741416.0", + "p50_us": "0.664", + "p99_us": "2.912", + "p999_us": "5.184", + "max_us": "39839.759", + "mean_us": "1.306", + "cpu_s": "0.270", + "ops_per_cpu_s": "742040.7", + "rd_bytes": "0", + "wr_bytes": "0", + "rd_B_op": "0.00", + "wr_B_op": "0.00", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.270", + "drain_s": "0.156", + "total_s": "0.425", + "drain_cpu_s": "0.028", + "drain_rd": "0", + "drain_wr": "37261312", + "wamp": "1.1360", + "db_apparent": "237375488", + "db_alloc": "37408768", + "open_s": "0.030", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-resident-common-wal0-disabled.log", + "space_log": "fixtures/space-candidate-resident-common-wal0-disabled.log" + }, + "main-resident-common-wal1": { + "key": "main-resident-common-wal1", + "profile": "main", + "regime": "resident", + "pattern": "common", + "wal": 1, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal1.db", + "identity": { + "size": 277090304, + "mtime_ns": 1792008214726534715, + "inode": 26117077, + "allocated_bytes": 76468224 + }, + "sha256": "856cb8b26a6a90a57c1a5dd1452889f50403360304aba11e61052b4ce625390a", + "live_extents": 347, + "load": { + "version": "main", + "size": "resident", + "order": "0", + "log": "1", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.589", + "ops_s": "339480.5", + "p50_us": "0.776", + "p99_us": "26.368", + "p999_us": "65.024", + "max_us": "60585.007", + "mean_us": "2.901", + "cpu_s": "0.420", + "ops_per_cpu_s": "476204.1", + "rd_bytes": "0", + "wr_bytes": "39043072", + "rd_B_op": "0.00", + "wr_B_op": "195.22", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.589", + "drain_s": "0.117", + "total_s": "0.706", + "drain_cpu_s": "0.030", + "drain_rd": "0", + "drain_wr": "37269504", + "wamp": "2.3266", + "db_apparent": "277090304", + "db_alloc": "76468224", + "open_s": "0.032", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-resident-common-wal1.log", + "space_log": "fixtures/space-main-resident-common-wal1.log" + }, + "candidate-resident-common-wal1": { + "key": "candidate-resident-common-wal1", + "profile": "candidate", + "regime": "resident", + "pattern": "common", + "wal": 1, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal1.db", + "identity": { + "size": 247074816, + "mtime_ns": 1792008225726386764, + "inode": 26117083, + "allocated_bytes": 65187840 + }, + "sha256": "30d7a46071ee083cf56fee4dc1a28135ad39412918fb7e51b093f49bddf178aa", + "live_extents": 261, + "load": { + "version": "candidate", + "size": "resident", + "order": "0", + "log": "1", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.562", + "ops_s": "356121.9", + "p50_us": "0.792", + "p99_us": "24.320", + "p999_us": "65.024", + "max_us": "43529.684", + "mean_us": "2.765", + "cpu_s": "0.408", + "ops_per_cpu_s": "490252.6", + "rd_bytes": "0", + "wr_bytes": "39043072", + "rd_B_op": "0.00", + "wr_B_op": "195.22", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.562", + "drain_s": "0.096", + "total_s": "0.657", + "drain_cpu_s": "0.028", + "drain_rd": "0", + "drain_wr": "25989120", + "wamp": "1.9827", + "db_apparent": "247074816", + "db_alloc": "65187840", + "open_s": "0.038", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-resident-common-wal1.log", + "space_log": "fixtures/space-candidate-resident-common-wal1.log" + }, + "main-resident-random-wal1": { + "key": "main-resident-random-wal1", + "profile": "main", + "regime": "resident", + "pattern": "random", + "wal": 1, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal1.db", + "identity": { + "size": 277090304, + "mtime_ns": 1792008256825968605, + "inode": 26117095, + "allocated_bytes": 76468224 + }, + "sha256": "7ee03b7eebb20d952f90527ff4622769833d9b849d0444ce08d528f3255fdcd1", + "live_extents": 347, + "load": { + "version": "main", + "size": "resident", + "order": "0", + "log": "1", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.734", + "ops_s": "272463.6", + "p50_us": "1.016", + "p99_us": "32.000", + "p999_us": "76.800", + "max_us": "55309.314", + "mean_us": "3.491", + "cpu_s": "0.547", + "ops_per_cpu_s": "365573.2", + "rd_bytes": "0", + "wr_bytes": "39043072", + "rd_B_op": "0.00", + "wr_B_op": "195.22", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.734", + "drain_s": "0.122", + "total_s": "0.856", + "drain_cpu_s": "0.032", + "drain_rd": "0", + "drain_wr": "37269504", + "wamp": "2.3266", + "db_apparent": "277090304", + "db_alloc": "76468224", + "open_s": "0.035", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "load_log": "fixtures/load-main-resident-random-wal1.log", + "space_log": "fixtures/space-main-resident-random-wal1.log" + }, + "candidate-resident-random-wal1": { + "key": "candidate-resident-random-wal1", + "profile": "candidate", + "regime": "resident", + "pattern": "random", + "wal": 1, + "disabled": false, + "path": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal1.db", + "identity": { + "size": 277090304, + "mtime_ns": 1792008268173816076, + "inode": 26115666, + "allocated_bytes": 76468224 + }, + "sha256": "0327d5f0ced6cd12906480fdadec36abb6519d35948adcd8e1edde6411ad5451", + "live_extents": 347, + "load": { + "version": "candidate", + "size": "resident", + "order": "0", + "log": "1", + "phase": "load:random@1", + "threads": "1", + "rep": "0", + "n": "200000", + "ops": "200000", + "secs": "0.587", + "ops_s": "340970.8", + "p50_us": "0.792", + "p99_us": "24.832", + "p999_us": "62.976", + "max_us": "43972.900", + "mean_us": "2.788", + "cpu_s": "0.439", + "ops_per_cpu_s": "455774.0", + "rd_bytes": "0", + "wr_bytes": "39043072", + "rd_B_op": "0.00", + "wr_B_op": "195.22", + "startup_p50_us": "nan", + "startup_p99_us": "nan", + "startup_mean_us": "nan", + "per_tuple_ns": "nan", + "deinit_mean_us": "nan", + "tuples": "0", + "tuples_s": "0.0", + "insert_s": "0.587", + "drain_s": "0.108", + "total_s": "0.695", + "drain_cpu_s": "0.030", + "drain_rd": "0", + "drain_wr": "37269504", + "wamp": "2.3266", + "db_apparent": "277090304", + "db_alloc": "76468224", + "open_s": "0.032", + "violations": "0", + "errors": "0", + "swapin": "0", + "swapout": "0", + "majflt": "0" + }, + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "load_log": "fixtures/load-candidate-resident-random-wal1.log", + "space_log": "fixtures/space-candidate-resident-random-wal1.log" + } +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-common-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-common-wal0.csv new file mode 100644 index 000000000..5270c2b55 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-common-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,0,0,load:random@1,1,0,2000000,2000000,3.844,520279.9,0.696,1.936,7.872,41856.682,1.859,3.156,633811.0,220692480,470503424,110.35,235.25,nan,nan,nan,nan,nan,0,0.0,3.844,0.227,4.071,0.102,31875072,73469952,1.6585,3250065408,544198656,0.013,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-nonlexical-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-nonlexical-wal0.csv new file mode 100644 index 000000000..2d3161cab --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-nonlexical-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,0,0,load:random@1,1,0,2000000,2000000,4.508,443658.3,0.696,2.080,12.928,76941.355,2.176,3.470,576378.7,345686016,752422912,172.84,376.21,nan,nan,nan,nan,nan,0,0.0,4.508,0.339,4.847,0.143,46575616,81694720,2.5430,3671461888,834351104,0.027,0,0,1,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-random-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-random-wal0.csv new file mode 100644 index 000000000..0bdf87f1f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-random-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,0,0,load:random@1,1,0,2000000,2000000,4.565,438125.6,0.648,1.744,8.000,87744.948,2.114,3.522,567821.1,347389952,748695552,173.69,374.35,nan,nan,nan,nan,nan,0,0.0,4.565,0.307,4.872,0.138,46288896,84848640,2.5413,3671592960,833789952,0.064,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0-disabled.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0-disabled.csv new file mode 100644 index 000000000..15155c88c --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0-disabled.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,0,0,load:random@1,1,0,200000,200000,0.270,741416.0,0.664,2.912,5.184,39839.759,1.306,0.270,742040.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.270,0.156,0.425,0.028,0,37261312,1.1360,237375488,37408768,0.030,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0.csv new file mode 100644 index 000000000..111e11529 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,0,0,load:random@1,1,0,200000,200000,0.242,826551.8,0.584,2.592,5.184,39375.946,1.172,0.242,826856.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.242,0.104,0.346,0.023,0,25980928,0.7921,207360000,26128384,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal1.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal1.csv new file mode 100644 index 000000000..a4371f7ea --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal1.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,0,1,load:random@1,1,0,200000,200000,0.562,356121.9,0.792,24.320,65.024,43529.684,2.765,0.408,490252.6,0,39043072,0.00,195.22,nan,nan,nan,nan,nan,0,0.0,0.562,0.096,0.657,0.028,0,25989120,1.9827,247074816,65187840,0.038,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-nonlexical-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-nonlexical-wal0.csv new file mode 100644 index 000000000..7671e2174 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-nonlexical-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,0,0,load:random@1,1,0,200000,200000,0.266,750987.7,0.632,2.848,4.928,41285.393,1.277,0.266,751207.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.266,0.143,0.409,0.025,0,37261312,1.1360,237375488,37408768,0.010,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal0.csv new file mode 100644 index 000000000..1ae8686c2 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,0,0,load:random@1,1,0,200000,200000,0.293,681835.5,0.632,2.912,4.928,42604.857,1.327,0.293,681898.0,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.293,0.129,0.422,0.028,0,37261312,1.1360,237375488,37408768,0.010,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal1.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal1.csv new file mode 100644 index 000000000..a24b963f2 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal1.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,0,1,load:random@1,1,0,200000,200000,0.587,340970.8,0.792,24.832,62.976,43972.900,2.788,0.439,455774.0,0,39043072,0.00,195.22,nan,nan,nan,nan,nan,0,0.0,0.587,0.108,0.695,0.030,0,37269504,2.3266,277090304,76468224,0.032,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-common-wal0.log new file mode 100644 index 000000000..7a3e041a1 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-common-wal0.log @@ -0,0 +1,206 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-common-wal0.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.013 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 2000000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 205 +max: 41855941 +mean: 1799 +count: 2000000 +0 <= 1 +0 <= 10 +0 <= 100 +156771 <= 500 +1677168 <= 1000 +163575 <= 5000 +677 <= 10000 +170 <= 100000 +869 <= 500000 +379 <= 1000000 +298 <= 5000000 +44 <= 10000000 +49 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 924910 | 1024604 | 18690604 | 98 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 98 | 2960 | 112 | 20269 | 20618 | 7039880 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|----|-----|-----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 0.0000 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 3.8596 | 0 | 0 | 0 | 135 | 168 | 21 | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.3945 | 0 | 432 | 14 | 29 | 18 | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +----------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|-----|-----|----|----|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.5303 | 99 | 9 | 10 | 46 | 34 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.5337 | 83 | 0 | 273 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 0.8105 | 97 | 415 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------- +Bundle size distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|-----|-----|----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 2.2374 | 45 | 56 | 21 | 20 | 20 | 18 | 12 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1730 | 1.2156 | 777 | 320 | 285 | 228 | 85 | 22 | 12 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 1226 | 0.7602 | 708 | 324 | 81 | 33 | 54 | 25 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Node size distribution +------------------------------------------------------------------------------------------------------------ +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|-----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.0000 | 0 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.0000 | 0 | 356 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.0000 | 0 | 512 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------ +Incorporation footprint distribution +----------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|----|---|----|---|---|---|---|---|---|----|----|----|----|----|-------| +| 98 | 2.5102 | 0 | 41 | 6 | 46 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 2 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 50 | 1670181.7400 | 16058975 | 0 | +| 2 | 56 | 1591981.9821 | 18360824 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 99 | 37829.1414 | 330.8451 | 29529.8182 | 181667 | 41850789 | 0 | 0 | 0 | 0.0000 | +| 1 | 205 | 21149.3171 | 169.3194 | 6677.2049 | 13612 | 3779721 | 0 | 0 | 0 | 0.0000 | +| 2 | 130 | 7210.9308 | 121.5139 | 9254.1538 | 11527 | 3189770 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 99 | 18.4452 | 4030036 | 0 | 0 | 0.0000 | +| 1 | 205 | 21.8927 | 1083864 | 0 | 0 | 0.0000 | +| 2 | 130 | 22.2647 | 852885 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 6 | 38 | +| 5 | 5 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 8290162.3333 | 14649889 | 55 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 20801362 +| max runtime func : 0x5573f67af4d0 +| total queue_wait_time (ns) : 106841 +| max queue_wait_time (ns) : 2061 +| total tasks enqueued : 98 consumed=3136 bytes (~3.06 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 98 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 41854082 +| max runtime func : 0x5573f6782d20 +| total queue_wait_time (ns) : 8136791916 +| max queue_wait_time (ns) : 124456625 +| total tasks enqueued : 868 consumed=27776 bytes (~27.12 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 868 +| current waiting tasks : 0 +| max outstanding tasks : 18 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 4944 | 202947 | 6784388 | 25188 | 0 | 0 | +cache misses | 8 | 5800 | 0 | 74 | 0 | 0 | +cache miss time | 0.00s | 0.27s | 0.00s | 0.01s | 0.00s | 0.00s | +pages written | 33 | 107371 | 26 | 7447 | 0 | 0 | +pages read | 8 | 52204 | 0 | 5336 | 0 | 0 | +avg prefetch pg | -nan | 22.56 | -nan | 31.89 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 25.05 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 2547 extents (~318.37 MiB) | +| Max Allocated: 2750 extents (~343.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 1066 | 1020 | 46 (~5.75 MiB)| +| branch | 13276 | 11040 | 2236 (~279.50 MiB)| +| memtable | 6049 | 5978 | 71 (~8.87 MiB)| +| filter | 1811 | 1632 | 179 (~22.37 MiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 1902 | 1890 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 2544 extents (318 MiB) + +close took 0.227 s +== load:random@1 T=1 ops=2000000 secs= 3.84 ops/s= 520280 lat us p50=0.70 p99=1.94 p99.9=7.87 max=41856.7 mean=1.86 + cpu=3.16s ops/cpu-s=633811 rd=110.3 B/op wr=235.3 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=3.84s drain(close)=0.23s total=4.07s drain_cpu=0.10s drain_rd=31875072 drain_wr=73469952 wamp=1.658 db_apparent=3250065408 db_alloc=544198656 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-nonlexical-wal0.log new file mode 100644 index 000000000..20cbc3dc9 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-nonlexical-wal0.log @@ -0,0 +1,206 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-nonlexical-wal0.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.027 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 2000000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 197 +max: 76940553 +mean: 2112 +count: 2000000 +0 <= 1 +0 <= 10 +0 <= 100 +221492 <= 500 +1585156 <= 1000 +190587 <= 5000 +693 <= 10000 +325 <= 100000 +974 <= 500000 +330 <= 1000000 +332 <= 5000000 +31 <= 10000000 +80 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 1599667 | 1707361 | 28343740 | 98 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 98 | 3307 | 114 | 20269 | 20618 | 8770275 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|----|-----|-----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 0.0000 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 3.8596 | 0 | 0 | 0 | 135 | 168 | 21 | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.3945 | 0 | 432 | 14 | 29 | 18 | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +----------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|-----|-----|----|----|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.5303 | 99 | 9 | 10 | 46 | 34 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.5337 | 83 | 0 | 273 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 0.8105 | 97 | 415 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------- +Bundle size distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|-----|-----|----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 2.2374 | 45 | 56 | 21 | 20 | 20 | 18 | 12 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1730 | 1.2156 | 777 | 320 | 285 | 228 | 85 | 22 | 12 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 1226 | 0.7602 | 708 | 324 | 81 | 33 | 54 | 25 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Node size distribution +------------------------------------------------------------------------------------------------------------ +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|-----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.0000 | 0 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.0000 | 0 | 356 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.0000 | 0 | 512 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------ +Incorporation footprint distribution +----------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|----|---|----|---|---|---|---|---|---|----|----|----|----|----|-------| +| 98 | 2.5102 | 0 | 41 | 6 | 46 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 2 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 50 | 2956905.7200 | 25637738 | 0 | +| 2 | 56 | 2764748.5536 | 27907706 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 99 | 187914.6162 | 449.4584 | 29530.7879 | 181667 | 76935955 | 0 | 0 | 0 | 0.0000 | +| 1 | 205 | 65390.3073 | 210.9843 | 6677.1317 | 13595 | 12426353 | 0 | 0 | 0 | 0.0000 | +| 2 | 130 | 23773.6308 | 168.7054 | 9254.3923 | 11527 | 5247880 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 99 | 20.9599 | 5345623 | 0 | 0 | 0.0000 | +| 1 | 205 | 24.1121 | 2073044 | 0 | 0 | 0.0000 | +| 2 | 130 | 27.6211 | 1780511 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 6 | 38 | +| 5 | 5 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 14190836.8333 | 24528849 | 55 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 31733003 +| max runtime func : 0x55dad70854d0 +| total queue_wait_time (ns) : 133663 +| max queue_wait_time (ns) : 2510 +| total tasks enqueued : 98 consumed=3136 bytes (~3.06 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 98 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 76939076 +| max runtime func : 0x55dad7058d20 +| total queue_wait_time (ns) : 10821123118 +| max queue_wait_time (ns) : 186679122 +| total tasks enqueued : 868 consumed=27776 bytes (~27.12 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 868 +| current waiting tasks : 0 +| max outstanding tasks : 18 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 4920 | 276849 | 6784388 | 25188 | 0 | 0 | +cache misses | 32 | 6935 | 0 | 75 | 0 | 0 | +cache miss time | 0.00s | 0.45s | 0.00s | 0.01s | 0.00s | 0.00s | +pages written | 65 | 175687 | 42 | 7911 | 0 | 0 | +pages read | 32 | 83681 | 0 | 5367 | 0 | 0 | +avg prefetch pg | -nan | 24.71 | -nan | 31.88 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 26.60 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3376 extents (422 MiB) | +| Max Allocated: 3668 extents (~458.50 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 1066 | 1020 | 46 (~5.75 MiB)| +| branch | 16385 | 13320 | 3065 (~383.12 MiB)| +| memtable | 6049 | 5978 | 71 (~8.87 MiB)| +| filter | 1812 | 1633 | 179 (~22.37 MiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 1902 | 1890 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 3373 extents (~421.62 MiB) + +close took 0.339 s +== load:random@1 T=1 ops=2000000 secs= 4.51 ops/s= 443658 lat us p50=0.70 p99=2.08 p99.9=12.93 max=76941.4 mean=2.18 + cpu=3.47s ops/cpu-s=576379 rd=172.8 B/op wr=376.2 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 + insert/run=4.51s drain(close)=0.34s total=4.85s drain_cpu=0.14s drain_rd=46575616 drain_wr=81694720 wamp=2.543 db_apparent=3671461888 db_alloc=834351104 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-random-wal0.log new file mode 100644 index 000000000..2a1383dec --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-disk-random-wal0.log @@ -0,0 +1,206 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-random-wal0.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.064 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 2000000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 210 +max: 87744207 +mean: 2055 +count: 2000000 +0 <= 1 +0 <= 10 +0 <= 100 +293274 <= 500 +1558209 <= 1000 +146027 <= 5000 +581 <= 10000 +182 <= 100000 +1000 <= 500000 +257 <= 1000000 +357 <= 5000000 +38 <= 10000000 +75 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 1525946 | 1626916 | 30036851 | 98 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 98 | 3025 | 119 | 20269 | 20618 | 7103260 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|----|-----|-----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 0.0000 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 3.8596 | 0 | 0 | 0 | 135 | 168 | 21 | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.3945 | 0 | 432 | 14 | 29 | 18 | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +----------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|-----|-----|----|----|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.5303 | 99 | 9 | 10 | 46 | 34 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.5337 | 83 | 0 | 273 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 0.8105 | 97 | 415 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------- +Bundle size distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|-----|-----|----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 2.2374 | 45 | 56 | 21 | 20 | 20 | 18 | 12 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1730 | 1.2156 | 777 | 320 | 285 | 228 | 85 | 22 | 12 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 1226 | 0.7602 | 708 | 324 | 81 | 33 | 54 | 25 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Node size distribution +------------------------------------------------------------------------------------------------------------ +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|-----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.0000 | 0 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.0000 | 0 | 356 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.0000 | 0 | 512 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------ +Incorporation footprint distribution +----------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|----|---|----|---|---|---|---|---|---|----|----|----|----|----|-------| +| 98 | 2.5102 | 0 | 41 | 6 | 46 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 2 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 50 | 2795924.8400 | 25267357 | 0 | +| 2 | 56 | 2638331.7143 | 29636957 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 99 | 185642.6667 | 450.5565 | 29530.7879 | 181667 | 87739942 | 0 | 0 | 0 | 0.0000 | +| 1 | 205 | 63490.0146 | 213.5971 | 6677.1317 | 13595 | 8180876 | 0 | 0 | 0 | 0.0000 | +| 2 | 130 | 32073.6385 | 193.3096 | 9254.3923 | 11527 | 6550813 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 99 | 20.3712 | 4753062 | 0 | 0 | 0.0000 | +| 1 | 205 | 22.3683 | 2021895 | 0 | 0 | 0.0000 | +| 2 | 130 | 26.4586 | 2031840 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 6 | 38 | +| 5 | 5 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 13408496.8333 | 22922875 | 55 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 37141079 +| max runtime func : 0x5590d60614d0 +| total queue_wait_time (ns) : 115220 +| max queue_wait_time (ns) : 2029 +| total tasks enqueued : 98 consumed=3136 bytes (~3.06 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 98 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 87742910 +| max runtime func : 0x5590d6034d20 +| total queue_wait_time (ns) : 10673608690 +| max queue_wait_time (ns) : 176070305 +| total tasks enqueued : 868 consumed=27776 bytes (~27.12 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 868 +| current waiting tasks : 0 +| max outstanding tasks : 18 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 4925 | 276821 | 6784388 | 25189 | 0 | 0 | +cache misses | 27 | 6963 | 0 | 75 | 0 | 0 | +cache miss time | 0.00s | 0.45s | 0.00s | 0.01s | 0.00s | 0.00s | +pages written | 56 | 174835 | 42 | 7862 | 0 | 0 | +pages read | 27 | 84103 | 0 | 5342 | 0 | 0 | +avg prefetch pg | -nan | 24.50 | -nan | 31.73 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 26.65 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3377 extents (~422.12 MiB) | +| Max Allocated: 3669 extents (~458.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 1066 | 1020 | 46 (~5.75 MiB)| +| branch | 16385 | 13320 | 3065 (~383.12 MiB)| +| memtable | 6049 | 5978 | 71 (~8.87 MiB)| +| filter | 1813 | 1633 | 180 (~22.50 MiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 1902 | 1890 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 3374 extents (~421.75 MiB) + +close took 0.307 s +== load:random@1 T=1 ops=2000000 secs= 4.56 ops/s= 438126 lat us p50=0.65 p99=1.74 p99.9=8.00 max=87744.9 mean=2.11 + cpu=3.52s ops/cpu-s=567821 rd=173.7 B/op wr=374.3 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=4.56s drain(close)=0.31s total=4.87s drain_cpu=0.14s drain_rd=46288896 drain_wr=84848640 wamp=2.541 db_apparent=3671592960 db_alloc=833789952 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0-disabled.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0-disabled.log new file mode 100644 index 000000000..7734f7264 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0-disabled.log @@ -0,0 +1,188 @@ +prefix-pattern=common key_bytes=64 compression_disabled=true +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0-disabled.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.030 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 192 +max: 39839140 +mean: 1248 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +27621 <= 500 +156491 <= 1000 +15703 <= 5000 +125 <= 10000 +30 <= 100000 +4 <= 500000 +1 <= 1000000 +24 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 17292 | 103426 | 133674 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 3184 | 111 | 20326 | 20507 | 2426877 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 54279.3333 | 179.1720 | 38375.2222 | 182940 | 39835564 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 17.3103 | 3039660 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 37710.0000 | 37710 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 2529882 +| max runtime func : 0x55ceedd684d0 +| total queue_wait_time (ns) : 9849 +| max queue_wait_time (ns) : 2326 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 39838057 +| max runtime func : 0x55ceedd3bd20 +| total queue_wait_time (ns) : 779432 +| max queue_wait_time (ns) : 91599 +| total tasks enqueued : 18 consumed=576 bytes (576 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 18 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 0 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 0 | 0 | +pages read | 0 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 2.00 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 358 extents (~44.75 MiB) | +| Max Allocated: 605 extents (~75.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 93 | 81 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 355 extents (~44.37 MiB) + +close took 0.156 s +== load:random@1 T=1 ops=200000 secs= 0.27 ops/s= 741416 lat us p50=0.66 p99=2.91 p99.9=5.18 max=39839.8 mean=1.31 + cpu=0.27s ops/cpu-s=742041 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.27s drain(close)=0.16s total=0.43s drain_cpu=0.03s drain_rd=0 drain_wr=37261312 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0.log new file mode 100644 index 000000000..54de24711 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal0.log @@ -0,0 +1,188 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.008 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 162 +max: 39375372 +mean: 1120 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +73951 <= 500 +110193 <= 1000 +15653 <= 5000 +73 <= 10000 +100 <= 100000 +4 <= 500000 +1 <= 1000000 +24 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 12064 | 86981 | 119429 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 2523 | 86 | 20326 | 20507 | 1978144 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 51449.6667 | 168.2817 | 38375.2222 | 182940 | 39372063 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 14.9931 | 2675562 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 34772.0000 | 34772 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 2061776 +| max runtime func : 0x55c8c083c4d0 +| total queue_wait_time (ns) : 7835 +| max queue_wait_time (ns) : 1397 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 39374392 +| max runtime func : 0x55c8c080fd20 +| total queue_wait_time (ns) : 678109 +| max queue_wait_time (ns) : 77826 +| total tasks enqueued : 18 consumed=576 bytes (576 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 18 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 11452 | 670082 | 1666 | 0 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 0 | 0 | +pages read | 0 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 2.00 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 279 extents (~34.87 MiB) | +| Max Allocated: 454 extents (~56.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 714 | 535 | 179 (~22.37 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 93 | 81 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 276 extents (~34.50 MiB) + +close took 0.104 s +== load:random@1 T=1 ops=200000 secs= 0.24 ops/s= 826552 lat us p50=0.58 p99=2.59 p99.9=5.18 max=39375.9 mean=1.17 + cpu=0.24s ops/cpu-s=826856 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.24s drain(close)=0.10s total=0.35s drain_cpu=0.02s drain_rd=0 drain_wr=25980928 wamp=0.792 db_apparent=207360000 db_alloc=26128384 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal1.log new file mode 100644 index 000000000..ac9549ba0 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-common-wal1.log @@ -0,0 +1,188 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal1.db mode=create n=200000 cache_mib=128 disk_gib=8 log=1 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.038 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 236 +max: 43528926 +mean: 2701 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +5105 <= 500 +162949 <= 1000 +21909 <= 5000 +415 <= 10000 +9521 <= 100000 +66 <= 500000 +1 <= 1000000 +33 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 16557 | 107677 | 150193 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 3687 | 97 | 20326 | 20507 | 2297397 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 68967.7778 | 187.4469 | 38375.2222 | 182940 | 43523269 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 18.2601 | 3352660 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 38299.0000 | 38299 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 2410964 +| max runtime func : 0x56435565c4d0 +| total queue_wait_time (ns) : 14240 +| max queue_wait_time (ns) : 3266 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 43526402 +| max runtime func : 0x56435562fd20 +| total queue_wait_time (ns) : 822364 +| max queue_wait_time (ns) : 99733 +| total tasks enqueued : 27 consumed=864 bytes (864 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 27 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 11452 | 670082 | 1666 | 298 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 9533 | 0 | +pages read | 0 | 190 | 0 | 66 | 0 | 0 | +avg prefetch pg | -nan | 23.75 | -nan | 16.50 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 1.80 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 582 extents (~72.75 MiB) | +| Max Allocated: 732 extents (~91.50 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 714 | 535 | 179 (~22.37 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 300 | 0 | 300 (~37.50 MiB)| +| blob | 96 | 81 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 579 extents (~72.37 MiB) + +close took 0.096 s +== load:random@1 T=1 ops=200000 secs= 0.56 ops/s= 356122 lat us p50=0.79 p99=24.32 p99.9=65.02 max=43529.7 mean=2.76 + cpu=0.41s ops/cpu-s=490253 rd=0.0 B/op wr=195.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.56s drain(close)=0.10s total=0.66s drain_cpu=0.03s drain_rd=0 drain_wr=25989120 wamp=1.983 db_apparent=247074816 db_alloc=65187840 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-nonlexical-wal0.log new file mode 100644 index 000000000..385279f1f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-nonlexical-wal0.log @@ -0,0 +1,188 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-nonlexical-wal0.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.010 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 182 +max: 41284633 +mean: 1218 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +38747 <= 500 +145460 <= 1000 +15646 <= 5000 +90 <= 10000 +30 <= 100000 +1 <= 500000 +1 <= 1000000 +24 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 14671 | 100090 | 129223 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 2661 | 105 | 20326 | 20507 | 2467349 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 51872.3333 | 181.1192 | 38375.2222 | 182940 | 41281031 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 17.4888 | 3211967 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 35804.0000 | 35804 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 2584440 +| max runtime func : 0x557ee96794d0 +| total queue_wait_time (ns) : 7784 +| max queue_wait_time (ns) : 1267 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 41283390 +| max runtime func : 0x557ee964cd20 +| total queue_wait_time (ns) : 773856 +| max queue_wait_time (ns) : 88497 +| total tasks enqueued : 18 consumed=576 bytes (576 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 18 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 0 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 0 | 0 | +pages read | 0 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 2.00 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 358 extents (~44.75 MiB) | +| Max Allocated: 605 extents (~75.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 93 | 81 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 355 extents (~44.37 MiB) + +close took 0.143 s +== load:random@1 T=1 ops=200000 secs= 0.27 ops/s= 750988 lat us p50=0.63 p99=2.85 p99.9=4.93 max=41285.4 mean=1.28 + cpu=0.27s ops/cpu-s=751208 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.27s drain(close)=0.14s total=0.41s drain_cpu=0.03s drain_rd=0 drain_wr=37261312 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal0.log new file mode 100644 index 000000000..f261a88c3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal0.log @@ -0,0 +1,188 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal0.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.010 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 187 +max: 42604162 +mean: 1267 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +35896 <= 500 +147525 <= 1000 +16426 <= 5000 +109 <= 10000 +14 <= 100000 +4 <= 500000 +1 <= 1000000 +24 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 16511 | 103982 | 154909 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 3034 | 120 | 20326 | 20507 | 2660904 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 40415.2222 | 192.9618 | 38375.2222 | 182940 | 42600429 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 16.8762 | 3020545 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 52178.0000 | 52178 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 2815846 +| max runtime func : 0x5625040f44d0 +| total queue_wait_time (ns) : 10604 +| max queue_wait_time (ns) : 2613 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 42603187 +| max runtime func : 0x5625040c7d20 +| total queue_wait_time (ns) : 791445 +| max queue_wait_time (ns) : 89527 +| total tasks enqueued : 18 consumed=576 bytes (576 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 18 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 0 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 0 | 0 | +pages read | 0 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 2.00 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 358 extents (~44.75 MiB) | +| Max Allocated: 605 extents (~75.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 93 | 81 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 355 extents (~44.37 MiB) + +close took 0.129 s +== load:random@1 T=1 ops=200000 secs= 0.29 ops/s= 681835 lat us p50=0.63 p99=2.91 p99.9=4.93 max=42604.9 mean=1.33 + cpu=0.29s ops/cpu-s=681898 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.29s drain(close)=0.13s total=0.42s drain_cpu=0.03s drain_rd=0 drain_wr=37261312 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal1.log new file mode 100644 index 000000000..659246b74 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-candidate-resident-random-wal1.log @@ -0,0 +1,188 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal1.db mode=create n=200000 cache_mib=128 disk_gib=8 log=1 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.032 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 234 +max: 43972287 +mean: 2720 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +7004 <= 500 +161711 <= 1000 +21336 <= 5000 +360 <= 10000 +9518 <= 100000 +35 <= 500000 +2 <= 1000000 +32 <= 5000000 +1 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 16904 | 113944 | 148329 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 3600 | 117 | 20326 | 20507 | 3282474 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 48140.3333 | 203.6148 | 38375.2222 | 182940 | 43967481 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 19.3876 | 3196780 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 39689.0000 | 39689 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 3422614 +| max runtime func : 0x55ccf53374d0 +| total queue_wait_time (ns) : 14507 +| max queue_wait_time (ns) : 3008 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 43971035 +| max runtime func : 0x55ccf530ad20 +| total queue_wait_time (ns) : 882306 +| max queue_wait_time (ns) : 121047 +| total tasks enqueued : 27 consumed=864 bytes (864 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 27 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 298 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 9533 | 0 | +pages read | 0 | 102 | 0 | 64 | 0 | 0 | +avg prefetch pg | -nan | 12.75 | -nan | 16.00 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 1.80 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 661 extents (~82.62 MiB) | +| Max Allocated: 883 extents (~110.37 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 300 | 0 | 300 (~37.50 MiB)| +| blob | 96 | 81 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 658 extents (~82.25 MiB) + +close took 0.108 s +== load:random@1 T=1 ops=200000 secs= 0.59 ops/s= 340971 lat us p50=0.79 p99=24.83 p99.9=62.98 max=43972.9 mean=2.79 + cpu=0.44s ops/cpu-s=455774 rd=0.0 B/op wr=195.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.59s drain(close)=0.11s total=0.69s drain_cpu=0.03s drain_rd=0 drain_wr=37269504 wamp=2.327 db_apparent=277090304 db_alloc=76468224 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-common-wal0.log new file mode 100644 index 000000000..c3c07da59 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-common-wal0.log @@ -0,0 +1,206 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-common-wal0.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.009 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 2000000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 197 +max: 51401579 +mean: 1884 +count: 2000000 +0 <= 1 +0 <= 10 +0 <= 100 +192697 <= 500 +1644345 <= 1000 +160492 <= 5000 +511 <= 10000 +231 <= 100000 +994 <= 500000 +318 <= 1000000 +309 <= 5000000 +42 <= 10000000 +61 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 1193141 | 1305929 | 21955383 | 98 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 98 | 3097 | 111 | 20269 | 20618 | 7195982 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|----|-----|-----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 0.0000 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 3.8596 | 0 | 0 | 0 | 135 | 168 | 21 | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.3945 | 0 | 432 | 14 | 29 | 18 | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +----------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|-----|-----|----|----|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.5303 | 99 | 9 | 10 | 46 | 34 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.5337 | 83 | 0 | 273 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 0.8105 | 97 | 415 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------- +Bundle size distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|-----|-----|----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 2.2374 | 45 | 56 | 21 | 20 | 20 | 18 | 12 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1730 | 1.2156 | 777 | 320 | 285 | 228 | 85 | 22 | 12 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 1226 | 0.7602 | 708 | 324 | 81 | 33 | 54 | 25 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Node size distribution +------------------------------------------------------------------------------------------------------------ +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|-----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.0000 | 0 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.0000 | 0 | 356 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.0000 | 0 | 512 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------ +Incorporation footprint distribution +----------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|----|---|----|---|---|---|---|---|---|----|----|----|----|----|-------| +| 98 | 2.5102 | 0 | 41 | 6 | 46 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 2 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 50 | 2181980.9400 | 17910350 | 0 | +| 2 | 56 | 2057365.0714 | 21315024 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 99 | 107877.2323 | 366.9565 | 29530.7879 | 181667 | 51397211 | 0 | 0 | 0 | 0.0000 | +| 1 | 205 | 45494.9756 | 186.6014 | 6677.1317 | 13595 | 8030450 | 0 | 0 | 0 | 0.0000 | +| 2 | 130 | 13206.2231 | 160.6334 | 9254.3923 | 11527 | 5349398 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 99 | 19.1381 | 4450745 | 0 | 0 | 0.0000 | +| 1 | 205 | 20.7424 | 1206070 | 0 | 0 | 0.0000 | +| 2 | 130 | 24.9556 | 1216383 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 6 | 38 | +| 5 | 5 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 10679124.8333 | 17079935 | 55 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 25878420 +| max runtime func : 0x55feaeb11b50 +| total queue_wait_time (ns) : 117541 +| max queue_wait_time (ns) : 1878 +| total tasks enqueued : 98 consumed=3136 bytes (~3.06 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 98 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 51400173 +| max runtime func : 0x55feaeae7d60 +| total queue_wait_time (ns) : 8897135915 +| max queue_wait_time (ns) : 144510519 +| total tasks enqueued : 868 consumed=27776 bytes (~27.12 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 868 +| current waiting tasks : 0 +| max outstanding tasks : 18 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 4922 | 276833 | 6784388 | 25184 | 0 | 0 | +cache misses | 30 | 6951 | 0 | 78 | 0 | 0 | +cache miss time | 0.00s | 0.33s | 0.00s | 0.01s | 0.00s | 0.00s | +pages written | 61 | 175723 | 42 | 7919 | 0 | 0 | +pages read | 30 | 83676 | 0 | 5411 | 0 | 0 | +avg prefetch pg | -nan | 24.58 | -nan | 31.74 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 26.65 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3376 extents (422 MiB) | +| Max Allocated: 3668 extents (~458.50 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 1066 | 1020 | 46 (~5.75 MiB)| +| branch | 16385 | 13320 | 3065 (~383.12 MiB)| +| memtable | 6049 | 5978 | 71 (~8.87 MiB)| +| filter | 1811 | 1632 | 179 (~22.37 MiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 1902 | 1890 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 3373 extents (~421.62 MiB) + +close took 0.235 s +== load:random@1 T=1 ops=2000000 secs= 4.01 ops/s= 498727 lat us p50=0.68 p99=1.87 p99.9=8.83 max=51402.3 mean=1.94 + cpu=3.14s ops/cpu-s=637447 rd=172.9 B/op wr=376.3 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=4.01s drain(close)=0.23s total=4.25s drain_cpu=0.10s drain_rd=46579712 drain_wr=80932864 wamp=2.541 db_apparent=3671330816 db_alloc=833761280 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-nonlexical-wal0.log new file mode 100644 index 000000000..4e67146eb --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-nonlexical-wal0.log @@ -0,0 +1,206 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-nonlexical-wal0.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.029 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 2000000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 183 +max: 77504947 +mean: 2145 +count: 2000000 +0 <= 1 +0 <= 10 +0 <= 100 +215711 <= 500 +1616048 <= 1000 +165525 <= 5000 +673 <= 10000 +252 <= 100000 +1046 <= 500000 +310 <= 1000000 +314 <= 5000000 +43 <= 10000000 +78 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 1582478 | 1694879 | 26252296 | 98 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 98 | 3240 | 109 | 20269 | 20618 | 6827713 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|----|-----|-----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 0.0000 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 3.8596 | 0 | 0 | 0 | 135 | 168 | 21 | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.3945 | 0 | 432 | 14 | 29 | 18 | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +----------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|-----|-----|----|----|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.5303 | 99 | 9 | 10 | 46 | 34 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.5337 | 83 | 0 | 273 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 0.8105 | 97 | 415 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------- +Bundle size distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|-----|-----|----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 2.2374 | 45 | 56 | 21 | 20 | 20 | 18 | 12 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1730 | 1.2156 | 777 | 320 | 285 | 228 | 85 | 22 | 12 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 1226 | 0.7602 | 708 | 324 | 81 | 33 | 54 | 25 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Node size distribution +------------------------------------------------------------------------------------------------------------ +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|-----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.0000 | 0 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.0000 | 0 | 356 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.0000 | 0 | 512 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------ +Incorporation footprint distribution +----------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|----|---|----|---|---|---|---|---|---|----|----|----|----|----|-------| +| 98 | 2.5102 | 0 | 41 | 6 | 46 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 2 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 50 | 2915876.4600 | 23173643 | 0 | +| 2 | 56 | 2735261.0536 | 25850495 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 99 | 251149.9293 | 470.0697 | 29530.7879 | 181667 | 77500590 | 0 | 0 | 0 | 0.0000 | +| 1 | 205 | 61764.5902 | 218.2851 | 6677.1317 | 13595 | 16228811 | 0 | 0 | 0 | 0.0000 | +| 2 | 130 | 32927.4923 | 186.1459 | 9254.3923 | 11527 | 6602139 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 99 | 21.1989 | 5339582 | 0 | 0 | 0.0000 | +| 1 | 205 | 23.6504 | 2910807 | 0 | 0 | 0.0000 | +| 2 | 130 | 27.1975 | 1928095 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 6 | 38 | +| 5 | 5 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 13225657.3333 | 20924628 | 55 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 29072557 +| max runtime func : 0x55dbf1d90b50 +| total queue_wait_time (ns) : 130672 +| max queue_wait_time (ns) : 2437 +| total tasks enqueued : 98 consumed=3136 bytes (~3.06 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 98 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 77503747 +| max runtime func : 0x55dbf1d66d60 +| total queue_wait_time (ns) : 11270631563 +| max queue_wait_time (ns) : 179695147 +| total tasks enqueued : 868 consumed=27776 bytes (~27.12 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 868 +| current waiting tasks : 0 +| max outstanding tasks : 18 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 4924 | 276767 | 6784388 | 25187 | 0 | 0 | +cache misses | 28 | 7017 | 0 | 76 | 0 | 0 | +cache miss time | 0.00s | 0.48s | 0.00s | 0.01s | 0.00s | 0.00s | +pages written | 63 | 174607 | 42 | 7862 | 0 | 0 | +pages read | 28 | 84371 | 0 | 5334 | 0 | 0 | +avg prefetch pg | -nan | 24.53 | -nan | 31.67 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 26.64 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3376 extents (422 MiB) | +| Max Allocated: 3668 extents (~458.50 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 1066 | 1020 | 46 (~5.75 MiB)| +| branch | 16385 | 13320 | 3065 (~383.12 MiB)| +| memtable | 6049 | 5978 | 71 (~8.87 MiB)| +| filter | 1812 | 1633 | 179 (~22.37 MiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 1902 | 1890 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 3373 extents (~421.62 MiB) + +close took 0.336 s +== load:random@1 T=1 ops=2000000 secs= 4.58 ops/s= 437032 lat us p50=0.70 p99=1.97 p99.9=12.16 max=77505.7 mean=2.21 + cpu=3.45s ops/cpu-s=579688 rd=174.2 B/op wr=373.9 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=4.58s drain(close)=0.34s total=4.91s drain_cpu=0.14s drain_rd=46260224 drain_wr=85602304 wamp=2.541 db_apparent=3671461888 db_alloc=833634304 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-random-wal0.log new file mode 100644 index 000000000..f06af6275 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-disk-random-wal0.log @@ -0,0 +1,206 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-random-wal0.db mode=create n=2000000 cache_mib=64 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.056 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 2000000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 202 +max: 84282286 +mean: 1977 +count: 2000000 +0 <= 1 +0 <= 10 +0 <= 100 +290576 <= 500 +1550312 <= 1000 +156562 <= 5000 +601 <= 10000 +191 <= 100000 +981 <= 500000 +348 <= 1000000 +320 <= 5000000 +41 <= 10000000 +68 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 1354999 | 1463024 | 24937126 | 98 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 98 | 3066 | 113 | 20269 | 20618 | 8218412 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|----|-----|-----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 0.0000 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 3.8596 | 0 | 0 | 0 | 135 | 168 | 21 | 32 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.3945 | 0 | 432 | 14 | 29 | 18 | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +----------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|-----|-----|----|----|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.5303 | 99 | 9 | 10 | 46 | 34 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.5337 | 83 | 0 | 273 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 0.8105 | 97 | 415 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------- +Bundle size distribution +--------------------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|-----|-----|-----|-----|----|----|----|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 2.2374 | 45 | 56 | 21 | 20 | 20 | 18 | 12 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 1730 | 1.2156 | 777 | 320 | 285 | 228 | 85 | 22 | 12 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 1226 | 0.7602 | 708 | 324 | 81 | 33 | 54 | 25 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Node size distribution +------------------------------------------------------------------------------------------------------------ +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|-----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 198 | 1.0000 | 0 | 198 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 356 | 1.0000 | 0 | 356 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 512 | 1.0000 | 0 | 512 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------ +Incorporation footprint distribution +----------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|----|---|----|---|---|---|---|---|---|----|----|----|----|----|-------| +| 98 | 2.5102 | 0 | 41 | 6 | 46 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 2 | 2 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 50 | 2456095.4200 | 21083429 | 0 | +| 2 | 56 | 2329507.2321 | 24555383 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 99 | 148746.2222 | 409.4604 | 29530.7879 | 181667 | 84277515 | 0 | 0 | 0 | 0.0000 | +| 1 | 205 | 68143.0244 | 199.8597 | 6677.1317 | 13595 | 9526050 | 0 | 0 | 0 | 0.0000 | +| 2 | 130 | 24514.8154 | 166.9841 | 9254.3923 | 11527 | 5321362 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 99 | 19.7314 | 4435356 | 0 | 0 | 0.0000 | +| 1 | 205 | 23.6289 | 2557611 | 0 | 0 | 0.0000 | +| 2 | 130 | 26.8545 | 2073647 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 6 | 38 | +| 5 | 5 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 11715397.3333 | 19935352 | 55 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 32088713 +| max runtime func : 0x564ee8c3bb50 +| total queue_wait_time (ns) : 125584 +| max queue_wait_time (ns) : 4928 +| total tasks enqueued : 98 consumed=3136 bytes (~3.06 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 98 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 84280811 +| max runtime func : 0x564ee8c11d60 +| total queue_wait_time (ns) : 9820815701 +| max queue_wait_time (ns) : 160055585 +| total tasks enqueued : 868 consumed=27776 bytes (~27.12 KiB) of memory +| total bg tasks run : 0 +| total fg tasks run : 868 +| current waiting tasks : 0 +| max outstanding tasks : 18 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 4920 | 276791 | 6784388 | 25189 | 0 | 0 | +cache misses | 32 | 6993 | 0 | 75 | 0 | 0 | +cache miss time | 0.00s | 0.38s | 0.00s | 0.01s | 0.00s | 0.00s | +pages written | 68 | 174752 | 43 | 7898 | 0 | 0 | +pages read | 32 | 84192 | 0 | 5409 | 0 | 0 | +avg prefetch pg | -nan | 24.55 | -nan | 31.75 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 26.60 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3377 extents (~422.12 MiB) | +| Max Allocated: 3669 extents (~458.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 1066 | 1020 | 46 (~5.75 MiB)| +| branch | 16385 | 13320 | 3065 (~383.12 MiB)| +| memtable | 6049 | 5978 | 71 (~8.87 MiB)| +| filter | 1813 | 1633 | 180 (~22.50 MiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 1902 | 1890 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 3374 extents (~421.75 MiB) + +close took 0.321 s +== load:random@1 T=1 ops=2000000 secs= 4.42 ops/s= 452591 lat us p50=0.66 p99=1.84 p99.9=8.83 max=84283.1 mean=2.04 + cpu=3.42s ops/cpu-s=584605 rd=173.9 B/op wr=374.3 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=4.42s drain(close)=0.32s total=4.74s drain_cpu=0.11s drain_rd=46604288 drain_wr=84901888 wamp=2.541 db_apparent=3671592960 db_alloc=833708032 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal0.log new file mode 100644 index 000000000..952d69a5a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal0.log @@ -0,0 +1,188 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal0.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.008 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 171 +max: 34176127 +mean: 1145 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +77268 <= 500 +105600 <= 1000 +16757 <= 5000 +193 <= 10000 +151 <= 100000 +5 <= 500000 +1 <= 1000000 +24 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 20890 | 101025 | 147615 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 3432 | 112 | 20326 | 20507 | 3674033 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 54199.3333 | 156.4372 | 38375.2222 | 182940 | 34171256 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 14.4215 | 2521527 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 42675.0000 | 42675 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 3824902 +| max runtime func : 0x563ba1164b50 +| total queue_wait_time (ns) : 11589 +| max queue_wait_time (ns) : 3122 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 34174304 +| max runtime func : 0x563ba113ad60 +| total queue_wait_time (ns) : 721621 +| max queue_wait_time (ns) : 106347 +| total tasks enqueued : 18 consumed=576 bytes (576 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 18 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 0 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 0 | 0 | +pages read | 0 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 2.00 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 358 extents (~44.75 MiB) | +| Max Allocated: 605 extents (~75.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 93 | 81 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 355 extents (~44.37 MiB) + +close took 0.105 s +== load:random@1 T=1 ops=200000 secs= 0.25 ops/s= 811109 lat us p50=0.58 p99=2.78 p99.9=8.83 max=34176.9 mean=1.20 + cpu=0.25s ops/cpu-s=811491 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.25s drain(close)=0.11s total=0.35s drain_cpu=0.02s drain_rd=0 drain_wr=37261312 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal1.log new file mode 100644 index 000000000..ae3460667 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-common-wal1.log @@ -0,0 +1,188 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal1.db mode=create n=200000 cache_mib=128 disk_gib=8 log=1 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.032 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 214 +max: 60583880 +mean: 2837 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +7383 <= 500 +162116 <= 1000 +20617 <= 5000 +286 <= 10000 +9506 <= 100000 +56 <= 500000 +2 <= 1000000 +31 <= 5000000 +2 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 16900 | 108943 | 150205 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 3610 | 100 | 20326 | 20507 | 2736225 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 65682.2222 | 235.4714 | 38375.2222 | 182940 | 60576914 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 22.3141 | 6513835 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 38544.0000 | 38544 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 2850173 +| max runtime func : 0x557649954b50 +| total queue_wait_time (ns) : 14210 +| max queue_wait_time (ns) : 2432 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 60582204 +| max runtime func : 0x55764992ad60 +| total queue_wait_time (ns) : 834940 +| max queue_wait_time (ns) : 104039 +| total tasks enqueued : 27 consumed=864 bytes (864 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 27 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 298 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 9533 | 0 | +pages read | 0 | 102 | 0 | 66 | 0 | 0 | +avg prefetch pg | -nan | 12.75 | -nan | 16.50 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 1.80 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 661 extents (~82.62 MiB) | +| Max Allocated: 883 extents (~110.37 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 300 | 0 | 300 (~37.50 MiB)| +| blob | 96 | 81 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 658 extents (~82.25 MiB) + +close took 0.117 s +== load:random@1 T=1 ops=200000 secs= 0.59 ops/s= 339481 lat us p50=0.78 p99=26.37 p99.9=65.02 max=60585.0 mean=2.90 + cpu=0.42s ops/cpu-s=476204 rd=0.0 B/op wr=195.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.59s drain(close)=0.12s total=0.71s drain_cpu=0.03s drain_rd=0 drain_wr=37269504 wamp=2.327 db_apparent=277090304 db_alloc=76468224 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-nonlexical-wal0.log new file mode 100644 index 000000000..a0035a62e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-nonlexical-wal0.log @@ -0,0 +1,188 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-nonlexical-wal0.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.010 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 177 +max: 36832862 +mean: 1148 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +61147 <= 500 +122767 <= 1000 +15931 <= 5000 +87 <= 10000 +39 <= 100000 +3 <= 500000 +1 <= 1000000 +24 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 14980 | 97043 | 121494 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 2403 | 99 | 20326 | 20507 | 2494212 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 50971.1111 | 165.9763 | 38375.2222 | 182940 | 36829618 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 16.0860 | 2817822 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 34353.0000 | 34353 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 2592391 +| max runtime func : 0x561458c89b50 +| total queue_wait_time (ns) : 8803 +| max queue_wait_time (ns) : 1533 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 36831834 +| max runtime func : 0x561458c5fd60 +| total queue_wait_time (ns) : 742622 +| max queue_wait_time (ns) : 86586 +| total tasks enqueued : 18 consumed=576 bytes (576 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 18 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 0 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 0 | 0 | +pages read | 0 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 2.00 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 358 extents (~44.75 MiB) | +| Max Allocated: 605 extents (~75.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 93 | 81 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 355 extents (~44.37 MiB) + +close took 0.129 s +== load:random@1 T=1 ops=200000 secs= 0.25 ops/s= 796926 lat us p50=0.60 p99=2.72 p99.9=4.80 max=36833.5 mean=1.20 + cpu=0.25s ops/cpu-s=798132 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.25s drain(close)=0.13s total=0.38s drain_cpu=0.02s drain_rd=0 drain_wr=37261312 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal0.log new file mode 100644 index 000000000..0ef76a7a2 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal0.log @@ -0,0 +1,188 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal0.db mode=create n=200000 cache_mib=128 disk_gib=8 log=0 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.011 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 208 +max: 39048969 +mean: 1362 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +19132 <= 500 +155900 <= 1000 +24501 <= 5000 +397 <= 10000 +39 <= 100000 +4 <= 500000 +1 <= 1000000 +25 <= 5000000 +0 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 22322 | 119446 | 152205 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 4415 | 127 | 20326 | 20507 | 3258511 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 41119.0000 | 182.8127 | 38375.2222 | 182940 | 39044610 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 17.6309 | 3037239 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 38561.0000 | 38561 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 3401701 +| max runtime func : 0x5635f28edb50 +| total queue_wait_time (ns) : 17659 +| max queue_wait_time (ns) : 6750 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 39047389 +| max runtime func : 0x5635f28c3d60 +| total queue_wait_time (ns) : 896527 +| max queue_wait_time (ns) : 121514 +| total tasks enqueued : 18 consumed=576 bytes (576 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 18 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 0 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 0 | 0 | +pages read | 0 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 2.00 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 358 extents (~44.75 MiB) | +| Max Allocated: 605 extents (~75.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 93 | 81 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 355 extents (~44.37 MiB) + +close took 0.126 s +== load:random@1 T=1 ops=200000 secs= 0.32 ops/s= 629687 lat us p50=0.70 p99=3.55 p99.9=6.59 max=39049.7 mean=1.43 + cpu=0.32s ops/cpu-s=631882 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.32s drain(close)=0.13s total=0.44s drain_cpu=0.03s drain_rd=0 drain_wr=37261312 wamp=1.136 db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal1.log new file mode 100644 index 000000000..7e74c2b37 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/load-main-resident-random-wal1.log @@ -0,0 +1,188 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal1.db mode=create n=200000 cache_mib=128 disk_gib=8 log=1 threads=1 mt_bg=0 normal_bg=0 memtable_mib=4 secs=1.0 warmup=1.0 rep=0 sabotage=0 +create took 0.035 s +phase load:random@1: T=1 dist=random (fixed count) +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 200000 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Insert Latency Histogram (ns): +min: 347 +max: 55308095 +mean: 3404 +count: 200000 +0 <= 1 +0 <= 10 +0 <= 100 +365 <= 500 +122271 <= 1000 +66908 <= 5000 +814 <= 10000 +9553 <= 100000 +54 <= 500000 +0 <= 1000000 +31 <= 5000000 +3 <= 10000000 +1 <= 100000000 +0 <= 1000000000 +0 <= 10000000000 +0 > 10000000000 + +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 20191 | 134880 | 180461 | 9 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 9 | 4392 | 125 | 20326 | 20507 | 2982332 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|----|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.0000 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 0.5556 | 9 | 8 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 3.6111 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +----------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|----|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 18 | 1.0000 | 0 | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +----------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 9 | 1.0000 | 0 | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 9 | 57052.0000 | 237.6922 | 38375.2222 | 182940 | 55302139 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 9 | 23.7171 | 4448166 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 1 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 45205.0000 | 45205 | 8 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 3111167 +| max runtime func : 0x562f29156b50 +| total queue_wait_time (ns) : 17049 +| max queue_wait_time (ns) : 3919 +| total tasks enqueued : 9 consumed=288 bytes (288 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 9 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 55305824 +| max runtime func : 0x562f2912cd60 +| total queue_wait_time (ns) : 1062742 +| max queue_wait_time (ns) : 122776 +| total tasks enqueued : 27 consumed=864 bytes (864 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 27 +| current waiting tasks : 0 +| max outstanding tasks : 1 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 35 | 16208 | 670082 | 1666 | 298 | 0 | +cache misses | 0 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 8 | 0 | 9533 | 0 | +pages read | 0 | 102 | 0 | 64 | 0 | 0 | +avg prefetch pg | -nan | 12.75 | -nan | 16.00 | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: 1.80 +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 661 extents (~82.62 MiB) | +| Max Allocated: 883 extents (~110.37 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 18 | 17 | 1 (128 KiB)| +| branch | 929 | 671 | 258 (~32.25 MiB)| +| memtable | 628 | 549 | 79 (~9.87 MiB)| +| filter | 45 | 40 | 5 (640 KiB)| +| log | 300 | 0 | 300 (~37.50 MiB)| +| blob | 96 | 81 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 658 extents (~82.25 MiB) + +close took 0.122 s +== load:random@1 T=1 ops=200000 secs= 0.73 ops/s= 272464 lat us p50=1.02 p99=32.00 p99.9=76.80 max=55309.3 mean=3.49 + cpu=0.55s ops/cpu-s=365573 rd=0.0 B/op wr=195.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=0.73s drain(close)=0.12s total=0.86s drain_cpu=0.03s drain_rd=0 drain_wr=37269504 wamp=2.327 db_apparent=277090304 db_alloc=76468224 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-common-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-common-wal0.csv new file mode 100644 index 000000000..54ed11624 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-common-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,load:random@1,1,0,2000000,2000000,4.010,498727.1,0.680,1.872,8.832,51402.315,1.943,3.138,637446.9,345849856,752586752,172.92,376.29,nan,nan,nan,nan,nan,0,0.0,4.010,0.235,4.245,0.101,46579712,80932864,2.5412,3671330816,833761280,0.009,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-nonlexical-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-nonlexical-wal0.csv new file mode 100644 index 000000000..d883933d3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-nonlexical-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,load:random@1,1,0,2000000,2000000,4.576,437032.4,0.696,1.968,12.160,77505.681,2.209,3.450,579688.1,348377088,747790336,174.19,373.90,nan,nan,nan,nan,nan,0,0.0,4.576,0.336,4.913,0.142,46260224,85602304,2.5408,3671461888,833634304,0.029,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-random-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-random-wal0.csv new file mode 100644 index 000000000..02c2acbf9 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-random-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,load:random@1,1,0,2000000,2000000,4.419,452591.1,0.664,1.840,8.832,84283.057,2.037,3.421,584605.1,347729920,748556288,173.86,374.28,nan,nan,nan,nan,nan,0,0.0,4.419,0.321,4.740,0.115,46604288,84901888,2.5410,3671592960,833708032,0.056,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal0.csv new file mode 100644 index 000000000..ee2d12f9f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random@1,1,0,200000,200000,0.247,811108.6,0.584,2.784,8.832,34176.859,1.196,0.246,811490.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.247,0.105,0.352,0.022,0,37261312,1.1360,237375488,37408768,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal1.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal1.csv new file mode 100644 index 000000000..27f77c2c4 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal1.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,1,load:random@1,1,0,200000,200000,0.589,339480.5,0.776,26.368,65.024,60585.007,2.901,0.420,476204.1,0,39043072,0.00,195.22,nan,nan,nan,nan,nan,0,0.0,0.589,0.117,0.706,0.030,0,37269504,2.3266,277090304,76468224,0.032,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-nonlexical-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-nonlexical-wal0.csv new file mode 100644 index 000000000..6b458fce6 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-nonlexical-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random@1,1,0,200000,200000,0.251,796925.8,0.600,2.720,4.800,36833.475,1.204,0.251,798132.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.251,0.129,0.379,0.023,0,37261312,1.1360,237375488,37408768,0.010,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal0.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal0.csv new file mode 100644 index 000000000..6876e692d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal0.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,load:random@1,1,0,200000,200000,0.318,629687.1,0.696,3.552,6.592,39049.718,1.431,0.317,631881.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,0.318,0.126,0.443,0.029,0,37261312,1.1360,237375488,37408768,0.011,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal1.csv b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal1.csv new file mode 100644 index 000000000..d49d8b3de --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal1.csv @@ -0,0 +1,2 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,1,load:random@1,1,0,200000,200000,0.734,272463.6,1.016,32.000,76.800,55309.314,3.491,0.547,365573.2,0,39043072,0.00,195.22,nan,nan,nan,nan,nan,0,0.0,0.734,0.122,0.856,0.032,0,37269504,2.3266,277090304,76468224,0.035,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-common-wal0.log new file mode 100644 index 000000000..15fafe5cc --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-common-wal0.log @@ -0,0 +1,180 @@ +open took 0.005 s +prefix-pattern=common key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +| 0 | 0 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 2585 extents (~323.12 MiB) | +| Max Allocated: 2585 extents (~323.12 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.064 s +space: db_apparent=3250065408 db_alloc=544198656 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-nonlexical-wal0.log new file mode 100644 index 000000000..dba4e3c00 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-nonlexical-wal0.log @@ -0,0 +1,180 @@ +open took 0.022 s +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +| 0 | 0 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3414 extents (~426.75 MiB) | +| Max Allocated: 3414 extents (~426.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.091 s +space: db_apparent=3671461888 db_alloc=834351104 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-random-wal0.log new file mode 100644 index 000000000..ee7c619a2 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-disk-random-wal0.log @@ -0,0 +1,180 @@ +open took 0.051 s +prefix-pattern=random key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +| 0 | 0 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3415 extents (~426.87 MiB) | +| Max Allocated: 3415 extents (~426.87 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.085 s +space: db_apparent=3671592960 db_alloc=833789952 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0-disabled.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0-disabled.log new file mode 100644 index 000000000..2d4c3a39f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0-disabled.log @@ -0,0 +1,162 @@ +open took 0.035 s +prefix-pattern=common key_bytes=64 compression_disabled=true +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 342 extents (~42.75 MiB) | +| Max Allocated: 342 extents (~42.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.074 s +space: db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0.log new file mode 100644 index 000000000..66544711d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal0.log @@ -0,0 +1,162 @@ +open took 0.006 s +prefix-pattern=common key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 256 extents (32 MiB) | +| Max Allocated: 256 extents (32 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.091 s +space: db_apparent=207360000 db_alloc=26128384 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal1.log new file mode 100644 index 000000000..7bfdf2766 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-common-wal1.log @@ -0,0 +1,162 @@ +open took 0.023 s +prefix-pattern=common key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 261 extents (~32.62 MiB) | +| Max Allocated: 261 extents (~32.62 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 2 | 0 | 2 (256 KiB)| +| blob | 15 | 0 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 53 extents (~6.62 MiB) + +close took 0.075 s +space: db_apparent=247074816 db_alloc=65187840 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-nonlexical-wal0.log new file mode 100644 index 000000000..33ff84d33 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-nonlexical-wal0.log @@ -0,0 +1,162 @@ +open took 0.006 s +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 342 extents (~42.75 MiB) | +| Max Allocated: 342 extents (~42.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.084 s +space: db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal0.log new file mode 100644 index 000000000..3b7cd0541 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal0.log @@ -0,0 +1,162 @@ +open took 0.007 s +prefix-pattern=random key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 342 extents (~42.75 MiB) | +| Max Allocated: 342 extents (~42.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.073 s +space: db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal1.log new file mode 100644 index 000000000..94002d497 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-candidate-resident-random-wal1.log @@ -0,0 +1,162 @@ +open took 0.010 s +prefix-pattern=random key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 347 extents (~43.37 MiB) | +| Max Allocated: 347 extents (~43.37 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 2 | 0 | 2 (256 KiB)| +| blob | 15 | 0 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 53 extents (~6.62 MiB) + +close took 0.094 s +space: db_apparent=277090304 db_alloc=76468224 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-common-wal0.log new file mode 100644 index 000000000..72d9fc27e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-common-wal0.log @@ -0,0 +1,180 @@ +open took 0.005 s +prefix-pattern=common key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +| 0 | 0 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3414 extents (~426.75 MiB) | +| Max Allocated: 3414 extents (~426.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.073 s +space: db_apparent=3671330816 db_alloc=833761280 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-nonlexical-wal0.log new file mode 100644 index 000000000..889132fc3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-nonlexical-wal0.log @@ -0,0 +1,180 @@ +open took 0.037 s +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +| 0 | 0 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3414 extents (~426.75 MiB) | +| Max Allocated: 3414 extents (~426.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.068 s +space: db_apparent=3671461888 db_alloc=833634304 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-random-wal0.log new file mode 100644 index 000000000..28b6dd5de --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-disk-random-wal0.log @@ -0,0 +1,180 @@ +open took 0.047 s +prefix-pattern=random key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 2 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +| 1 | 0 | 0.0000 | 0 | 0 | +| 2 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 1 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +| 2 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +| 0 | 0 | +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +| 1 | 0 | 0 | 0 | +| 2 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 3415 extents (~426.87 MiB) | +| Max Allocated: 3415 extents (~426.87 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.077 s +space: db_apparent=3671592960 db_alloc=833708032 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal0.log new file mode 100644 index 000000000..24531c9ed --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal0.log @@ -0,0 +1,162 @@ +open took 0.005 s +prefix-pattern=common key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 342 extents (~42.75 MiB) | +| Max Allocated: 342 extents (~42.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.063 s +space: db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal1.log new file mode 100644 index 000000000..cea6efbc9 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-common-wal1.log @@ -0,0 +1,162 @@ +open took 0.023 s +prefix-pattern=common key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 347 extents (~43.37 MiB) | +| Max Allocated: 347 extents (~43.37 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 2 | 0 | 2 (256 KiB)| +| blob | 15 | 0 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 53 extents (~6.62 MiB) + +close took 0.089 s +space: db_apparent=277090304 db_alloc=76468224 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-nonlexical-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-nonlexical-wal0.log new file mode 100644 index 000000000..e59cffdeb --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-nonlexical-wal0.log @@ -0,0 +1,162 @@ +open took 0.006 s +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 342 extents (~42.75 MiB) | +| Max Allocated: 342 extents (~42.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.078 s +space: db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal0.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal0.log new file mode 100644 index 000000000..16af088c5 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal0.log @@ -0,0 +1,162 @@ +open took 0.006 s +prefix-pattern=random key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 342 extents (~42.75 MiB) | +| Max Allocated: 342 extents (~42.75 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 0 | 0 | 0 (0 bytes)| +| blob | 12 | 0 | 12 (~1.50 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 48 extents (6 MiB) + +close took 0.059 s +space: db_apparent=237375488 db_alloc=37408768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal1.log b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal1.log new file mode 100644 index 000000000..2ca1c74de --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/space-main-resident-random-wal1.log @@ -0,0 +1,162 @@ +open took 0.010 s +prefix-pattern=random key_bytes=64 compression_disabled=false +Overall Statistics +------------------------------------------------------------------------------------ +| insertions: 0 +| updates: 0 +| deletions: 0 +| completed deletes: 0 +------------------------------------------------------------------------------------ +| root stalls: 0 +------------------------------------------------------------------------------------ +| checkpoints: 0 +------------------------------------------------------------------------------------ + +Latency Histogram Statistics +Flush Statistics +--------------------------------------------------------------------------------------------------------- + height | avg wait time (ns) | avg flush time (ns) | max flush time (ns) | full flushes | count flushes | +---------|--------------------|---------------------|---------------------|--------------|---------------| +memtable | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------- + +Compaction Statistics +------------------------------------------------------------------------------------------------------------------------------------------ + height | compactions | avg setup time (ns) | time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | +---------|-------------|---------------------|-------------------|------------|------------|---------------|-------|---------|-----------| + root | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +------------------------------------------------------------------------------------------------------------------------------------------ + +Filter Build Statistics +--------------------------------------------------------------------------------- +| height | built | avg tuples | avg build time (ns) | build_time / tuple (ns) | +---------|---------|------------|---------------------|-------------------------| +Height: 0 +Fanout distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Inflight bundles distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Bundle size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Node size distribution +---------------------------------------------------------------------------------------------------------- +| height | total | avg | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|--------|-------|--------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +---------------------------------------------------------------------------------------------------------- +Incorporation footprint distribution +--------------------------------------------------------------------------------------------------------------------- +| total incorporations | average footprint | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | >= 15 | +|----------------------|-------------------|---|---|---|---|---|---|---|---|---|---|----|----|----|----|----|-------| +| 0 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | +--------------------------------------------------------------------------------------------------------------------- +Flushes +----------------------------------------------------------------- +| height | count | avg time (ns) | max time (ns) | full flushes | +|--------|-------|---------------|---------------|--------------| +| 0 | 0 | 0.0000 | 0 | 0 | +----------------------------------------------------------------- +Compactions +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +| height | num compactions | avg setup time (ns) | avg pack time / tuple (ns) | avg tuples | max tuples | max time (ns) | empty | aborted | discarded | fraction wasted time | +|--------|-----------------|---------------------|----------------------------|--------------|------------|---------------|-------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0.0000 | 0.0000 | 0 | 0 | 0 | 0 | 0 | 0.0000 | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +Maplets +------------------------------------------------------------------------------------------------------------- +| height | num maplets | avg time / tuple (ns) | max time (ns) | aborted | discarded | fraction wasted time | +|--------|-------------|-----------------------|---------------|---------|-----------|----------------------| +| 0 | 0 | 0.0000 | 0 | 0 | 0 | 0.0000 | +------------------------------------------------------------------------------------------------------------- +Splits +---------------------------------- +| num splits | num nodes created | +|------------|-------------------| +| 0 | 0 | +---------------------------------- +Leaf splits +------------------------------------------------------ +| avg time (ns) | max time (ns) | single leaf splits | +|---------------|---------------|--------------------| +| 0.0000 | 0 | 0 | +------------------------------------------------------ +Lookups +--------------------------------------------------------------------- +| height | maplet lookups | maplet false positives | branch lookups | +|--------|----------------|------------------------|----------------| +| 0 | 0 | 0 | 0 | +--------------------------------------------------------------------- + +Memtable Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +Main Task Group Statistics +-------------------------------- +| max runtime (ns) : 0 +| max runtime func : (nil) +| total queue_wait_time (ns) : 0 +| max queue_wait_time (ns) : 0 +| total tasks enqueued : 0 consumed=0 bytes (0 bytes) of memory +| total bg tasks run : 0 +| total fg tasks run : 0 +| current waiting tasks : 0 +| max outstanding tasks : 0 + + +------------------------------------------------------------------------------------ +Cache Statistics +----------------------------------------------------------------------------------------------- +page type | trunk | branch | memtable | filter | log | misc | +----------------|------------|------------|------------|------------|------------|------------| +cache hits | 0 | 0 | 0 | 0 | 0 | 0 | +cache misses | 1 | 0 | 0 | 0 | 0 | 0 | +cache miss time | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | 0.00s | +pages written | 0 | 0 | 0 | 0 | 0 | 0 | +pages read | 1 | 0 | 0 | 0 | 0 | 0 | +avg prefetch pg | -nan | -nan | -nan | -nan | -nan | -nan | +----------------------------------------------------------------------------------------------- +avg write pgs: -nan +|-------------------------------------------------------------------| +| Allocator Stats | +|-------------------------------------------------------------------| +| Currently Allocated: 347 extents (~43.37 MiB) | +| Max Allocated: 347 extents (~43.37 MiB) | +|-------------------------------------------------------------------| +| Page Type | Allocations | Deallocations | Footprint | +| | (Number of extents) | # extents (bytes) | +|-------------------------------------------------------------------| +| trunk | 0 | 0 | 0 (0 bytes)| +| branch | 0 | 0 | 0 (0 bytes)| +| memtable | 36 | 0 | 36 (~4.50 MiB)| +| filter | 0 | 0 | 0 (0 bytes)| +| log | 2 | 0 | 2 (256 KiB)| +| blob | 15 | 0 | 15 (~1.87 MiB)| +| superblock | 0 | 0 | 0 (0 bytes)| +| misc | 0 | 0 | 0 (0 bytes)| +|-------------------------------------------------------------------| +Expected count of extents in-use from footprint = 53 extents (~6.62 MiB) + +close took 0.076 s +space: db_apparent=277090304 db_alloc=76468224 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/followup.py b/benchmarks/results-20261014/prefix-main-6105c49f/followup.py new file mode 100644 index 000000000..b7f6e1838 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/followup.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +"""Longer paired checks of adverse initial results, with exclusive locks.""" + +import argparse +import fcntl +from pathlib import Path +import time + +from run_benchmarks import Campaign, sha + + +def main(): + coordination = Path("/home/rob/projects/splinterdb/.cache/projects-20261011/coordination") + with (coordination / "benchmark.lock").open("rb") as benchmark_lock, \ + (coordination / "machine.lock").open("rb") as machine_lock: + fcntl.flock(benchmark_lock, fcntl.LOCK_EX) + fcntl.flock(machine_lock, fcntl.LOCK_EX) + args = argparse.Namespace(mode="repeat", seconds=15, cpus="0-11") + campaign = Campaign(args) + campaign.manifest["followup_sha256"] = sha(__file__) + campaign.manifest["selection"] = "Adverse initial results: common long scans, disabled long scans, nonlexical short scans, logged random overwrites" + order = ["main", "candidate", "candidate", "main", "main", "candidate"] + cases = [ + ("resident-common", 0, ["warm", "range:uniform:10000@8"]), + ("resident-common-disabled", 0, ["warm", "range:uniform:10000@8", "range:uniform:10000@1"]), + ("resident-nonlexical", 0, ["warm", "range:uniform:1@8"]), + ("resident-random", 1, ["warm", "ow:uniform@8"]), + ] + campaign.manifest["order"] = order + campaign.manifest["cases"] = cases + campaign.save() + for case, wal, phases in cases: + for index, profile in enumerate(order): + campaign.query(case, profile, index, phases, wal) + campaign.manifest.update(complete=True, finished=time.time()) + campaign.save() + + +if __name__ == "__main__": + main() diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/jobs.json b/benchmarks/results-20261014/prefix-main-6105c49f/jobs.json new file mode 100644 index 000000000..dbc08bbbe --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/jobs.json @@ -0,0 +1,28 @@ +[ + { + "mode": "reads", + "command": [ + "python3", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/run_benchmarks.py", + "--mode", + "reads" + ], + "started": 1792007320.8491955, + "locks": "exclusive benchmark and machine", + "finished": 1792008135.14136, + "returncode": 0 + }, + { + "mode": "writes", + "command": [ + "python3", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/run_benchmarks.py", + "--mode", + "writes" + ], + "started": 1792008135.1415071, + "locks": "exclusive benchmark and machine", + "finished": 1792008299.6501558, + "returncode": 0 + } +] diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/main-build.log b/benchmarks/results-20261014/prefix-main-6105c49f/main-build.log new file mode 100644 index 000000000..eb3f6734f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/main-build.log @@ -0,0 +1,49 @@ +make: Entering directory '/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main' +Checking for mismatched config...No mismatched config found +Saving config to build/release/build-config.fb6bc8eeb8390429253883c09491f5bd +Compiling src/PackedArray.c [build/release/obj/src/PackedArray.o] +Compiling src/allocator.c [build/release/obj/src/allocator.o] +Compiling src/batch_rwlock.c [build/release/obj/src/batch_rwlock.o] +Compiling src/blob.c [build/release/obj/src/blob.o] +Compiling src/blob_build.c [build/release/obj/src/blob_build.o] +Compiling src/btree.c [build/release/obj/src/btree.o] +Compiling src/clockcache.c [build/release/obj/src/clockcache.o] +Compiling src/core.c [build/release/obj/src/core.o] +Compiling src/data_blob_build.c [build/release/obj/src/data_blob_build.o] +Compiling src/data_internal.c [build/release/obj/src/data_internal.o] +Compiling src/default_data_config.c [build/release/obj/src/default_data_config.o] +Compiling src/histogram.c [build/release/obj/src/histogram.o] +Compiling src/memtable.c [build/release/obj/src/memtable.o] +Compiling src/merge.c [build/release/obj/src/merge.o] +Compiling src/mini_allocator.c [build/release/obj/src/mini_allocator.o] +Compiling src/notification.c [build/release/obj/src/notification.o] +Compiling src/ondisk_ref.c [build/release/obj/src/ondisk_ref.o] +Compiling src/platform_linux/laio.c [build/release/obj/src/platform_linux/laio.o] +Compiling src/platform_linux/platform_assert.c [build/release/obj/src/platform_linux/platform_assert.o] +Compiling src/platform_linux/platform_buffer.c [build/release/obj/src/platform_linux/platform_buffer.o] +Compiling src/platform_linux/platform_condvar.c [build/release/obj/src/platform_linux/platform_condvar.o] +Compiling src/platform_linux/platform_heap.c [build/release/obj/src/platform_linux/platform_heap.o] +Compiling src/platform_linux/platform_io.c [build/release/obj/src/platform_linux/platform_io.o] +Compiling src/platform_linux/platform_log.c [build/release/obj/src/platform_linux/platform_log.o] +Compiling src/platform_linux/platform_mutex.c [build/release/obj/src/platform_linux/platform_mutex.o] +Compiling src/platform_linux/platform_threads.c [build/release/obj/src/platform_linux/platform_threads.o] +Compiling src/platform_linux/platform_trace.c [build/release/obj/src/platform_linux/platform_trace.o] +Compiling src/platform_linux/shmalloc.c [build/release/obj/src/platform_linux/shmalloc.o] +Compiling src/rc_allocator.c [build/release/obj/src/rc_allocator.o] +Compiling src/routing_filter.c [build/release/obj/src/routing_filter.o] +Compiling src/shard_log.c [build/release/obj/src/shard_log.o] +Compiling src/splinterdb.c [build/release/obj/src/splinterdb.o] +Compiling src/superblock.c [build/release/obj/src/superblock.o] +Compiling src/task.c [build/release/obj/src/task.o] +Compiling src/trunk.c [build/release/obj/src/trunk.o] +Compiling src/util.c [build/release/obj/src/util.o] +Compiling src/writeback_set.c [build/release/obj/src/writeback_set.o] +In file included from src/PackedArray.c:296, + from src/PackedArray.c:356: +src/PackedArray.c: In function ‘__PackedArray_unpack_21’: +src/PackedArray.c:177: note: ‘-Wmisleading-indentation’ is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers + 177 | PACKEDARRAY_IMPL_UNPACK_CASE_BREAK +src/PackedArray.c:177: note: adding ‘-flarge-source-files’ will allow for more column-tracking support, at the expense of compilation time and memory +Linking build/release/lib/libsplinterdb.so +Building archive build/release/lib/libsplinterdb.a +make: Leaving directory '/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main' diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/main-harness-build.log b/benchmarks/results-20261014/prefix-main-6105c49f/main-harness-build.log new file mode 100644 index 000000000..0a46cfaf0 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/main-harness-build.log @@ -0,0 +1,3 @@ +lto-wrapper: warning: using serial compilation of 13 LTRANS jobs +lto-wrapper: note: see the ‘-flto’ option documentation for more information +/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads-progress.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads-progress.log new file mode 100644 index 000000000..f88a88297 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads-progress.log @@ -0,0 +1,54 @@ +load-main-resident-common-wal0 +space-main-resident-common-wal0 +resident-common-wal0-00-main +load-candidate-resident-common-wal0 +space-candidate-resident-common-wal0 +resident-common-wal0-01-candidate +resident-common-wal0-02-candidate +resident-common-wal0-03-main +load-main-resident-random-wal0 +space-main-resident-random-wal0 +resident-random-wal0-00-main +load-candidate-resident-random-wal0 +space-candidate-resident-random-wal0 +resident-random-wal0-01-candidate +resident-random-wal0-02-candidate +resident-random-wal0-03-main +load-main-resident-nonlexical-wal0 +space-main-resident-nonlexical-wal0 +resident-nonlexical-wal0-00-main +load-candidate-resident-nonlexical-wal0 +space-candidate-resident-nonlexical-wal0 +resident-nonlexical-wal0-01-candidate +resident-nonlexical-wal0-02-candidate +resident-nonlexical-wal0-03-main +load-main-disk-common-wal0 +space-main-disk-common-wal0 +disk-common-wal0-00-main +load-candidate-disk-common-wal0 +space-candidate-disk-common-wal0 +disk-common-wal0-01-candidate +disk-common-wal0-02-candidate +disk-common-wal0-03-main +load-main-disk-random-wal0 +space-main-disk-random-wal0 +disk-random-wal0-00-main +load-candidate-disk-random-wal0 +space-candidate-disk-random-wal0 +disk-random-wal0-01-candidate +disk-random-wal0-02-candidate +disk-random-wal0-03-main +load-main-disk-nonlexical-wal0 +space-main-disk-nonlexical-wal0 +disk-nonlexical-wal0-00-main +load-candidate-disk-nonlexical-wal0 +space-candidate-disk-nonlexical-wal0 +disk-nonlexical-wal0-01-candidate +disk-nonlexical-wal0-02-candidate +disk-nonlexical-wal0-03-main +resident-common-disabled-wal0-00-main +load-candidate-resident-common-wal0-disabled +space-candidate-resident-common-wal0-disabled +resident-common-disabled-wal0-01-candidate +resident-common-disabled-wal0-02-candidate +resident-common-disabled-wal0-03-main diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.csv new file mode 100644 index 000000000..44dcd9f9a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,warm,8,0,2000000,2000000,0.156,12804660.7,nan,nan,nan,0.000,nan,0.605,3304141.2,377290752,32768,188.65,0.02,nan,nan,nan,nan,nan,2000000,12804660.7,0.156,0.000,0.156,0.000,0,0,nan,0,0,0.005,0,0,19,0,0 +main,disk,0,0,point:uniform@8,8,0,2000000,1237618,7.000,176798.2,49.664,87.040,115.712,3563.347,45.185,8.612,143707.5,4365578240,0,3527.40,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,7,0,0 +main,disk,0,0,range:uniform:1@8,8,0,2000000,512044,7.000,73146.7,103.424,266.240,372.736,4158.834,109.298,58.930,8689.1,7241052160,0,14141.46,0.00,101.376,266.240,108.542,nan,0.708,512044,73146.7,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,2,0,0 +main,disk,0,0,range:uniform:10000@8,8,0,2000000,6428,7.000,918.3,7143.424,23330.816,31195.136,34265.999,8709.849,24.852,258.6,16348430336,0,2543315.24,0.00,339.968,1064.960,376.062,834.96,1.277,64181618,9168476.3,7.000,0.056,7.057,0.009,0,274432,nan,3671330816,833429504,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.log new file mode 100644 index 000000000..0c8e70701 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-00-main.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.16 ops/s= 12804661 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.61s ops/cpu-s=3304141 rd=188.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=19 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1237618 notfound=0 +== point:uniform@8 T=8 ops=1237618 secs= 7.00 ops/s= 176798 lat us p50=49.66 p99=87.04 p99.9=115.71 max=3563.3 mean=45.18 + cpu=8.61s ops/cpu-s=143707 rd=3527.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=7 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 208915 ops (+20890 ops/s) +== range:uniform:1@8 T=8 ops=512044 secs= 7.00 ops/s= 73147 lat us p50=103.42 p99=266.24 p99.9=372.74 max=4158.8 mean=109.30 + cpu=58.93s ops/cpu-s=8689 rd=14141.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=2 swapout=0 majflt=0 + startup us p50=101.38 p99=266.24 mean=108.54 per-tuple=nan ns deinit mean=0.71 us tuples/s=73147 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 4435 ops (+1844552750263201536 ops/s) +close took 0.056 s +== range:uniform:10000@8 T=8 ops=6428 secs= 7.00 ops/s= 918 lat us p50=7143.42 p99=23330.82 p99.9=31195.14 max=34266.0 mean=8709.85 + cpu=24.85s ops/cpu-s=259 rd=2543315.2 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=339.97 p99=1064.96 mean=376.06 per-tuple=835.0 ns deinit mean=1.28 us tuples/s=9168476 + insert/run=7.00s drain(close)=0.06s total=7.06s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671330816 db_alloc=833429504 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.csv new file mode 100644 index 000000000..acdbc27df --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,1,0,warm,8,1,2000000,2000000,0.130,15407156.1,nan,nan,nan,0.000,nan,0.533,3749925.0,268484608,32768,134.24,0.02,nan,nan,nan,nan,nan,2000000,15407156.1,0.130,0.000,0.130,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,1,2000000,1363115,7.000,194725.4,49.664,74.752,103.424,1930.738,41.021,8.695,156775.3,4372070400,0,3207.41,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,1,2000000,563331,7.000,80473.3,91.136,260.096,380.928,4319.020,99.341,58.619,9610.0,6160269312,0,10935.43,0.00,89.088,260.096,98.269,nan,1.023,563331,80473.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,1,2000000,7878,7.000,1125.4,5570.560,19136.512,23855.104,29341.283,7105.404,26.886,293.0,14126706688,0,1793184.40,0.00,274.432,909.312,304.249,681.69,1.531,78626492,11231997.7,7.000,0.061,7.062,0.008,0,274432,nan,3250065408,543969280,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.log new file mode 100644 index 000000000..0b98ced8a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-01-candidate.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.13 ops/s= 15407156 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.53s ops/cpu-s=3749925 rd=134.2 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1363115 notfound=0 +== point:uniform@8 T=8 ops=1363115 secs= 7.00 ops/s= 194725 lat us p50=49.66 p99=74.75 p99.9=103.42 max=1930.7 mean=41.02 + cpu=8.69s ops/cpu-s=156775 rd=3207.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 231209 ops (+23120 ops/s) +== range:uniform:1@8 T=8 ops=563331 secs= 7.00 ops/s= 80473 lat us p50=91.14 p99=260.10 p99.9=380.93 max=4319.0 mean=99.34 + cpu=58.62s ops/cpu-s=9610 rd=10935.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=89.09 p99=260.10 mean=98.27 per-tuple=nan ns deinit mean=1.02 us tuples/s=80473 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 5431 ops (+1844562106925195008 ops/s) +close took 0.061 s +== range:uniform:10000@8 T=8 ops=7878 secs= 7.00 ops/s= 1125 lat us p50=5570.56 p99=19136.51 p99.9=23855.10 max=29341.3 mean=7105.40 + cpu=26.89s ops/cpu-s=293 rd=1793184.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=274.43 p99=909.31 mean=304.25 per-tuple=681.7 ns deinit mean=1.53 us tuples/s=11231998 + insert/run=7.00s drain(close)=0.06s total=7.06s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3250065408 db_alloc=543969280 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.csv new file mode 100644 index 000000000..3cb194b62 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,2,0,warm,8,2,2000000,2000000,0.145,13776741.1,nan,nan,nan,0.000,nan,0.595,3360198.1,268894208,32768,134.45,0.02,nan,nan,nan,nan,nan,2000000,13776741.1,0.145,0.000,0.145,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,2,2000000,1269530,7.000,181356.1,49.664,80.896,1196.032,4125.309,44.045,8.489,149546.0,4072955904,0,3208.24,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +candidate,disk,2,0,range:uniform:1@8,8,2,2000000,532198,7.000,76025.5,91.136,299.008,1654.784,7085.342,105.158,58.536,9091.9,5817032704,0,10930.20,0.00,91.136,299.008,104.078,nan,1.032,532198,76025.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,2,2000000,7433,7.000,1061.8,5832.704,23855.104,45613.056,69176.578,7527.076,26.352,282.1,13457387520,0,1810492.07,0.00,282.624,1916.928,339.609,720.10,1.528,74203592,10600154.7,7.000,0.066,7.066,0.009,0,274432,nan,3250065408,543969280,0.010,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.log new file mode 100644 index 000000000..7e018e3db --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-02-candidate.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=2 sabotage=0 +open took 0.010 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.15 ops/s= 13776741 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.60s ops/cpu-s=3360198 rd=134.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1269530 notfound=0 +== point:uniform@8 T=8 ops=1269530 secs= 7.00 ops/s= 181356 lat us p50=49.66 p99=80.90 p99.9=1196.03 max=4125.3 mean=44.04 + cpu=8.49s ops/cpu-s=149546 rd=3208.2 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 216362 ops (+21635 ops/s) +== range:uniform:1@8 T=8 ops=532198 secs= 7.00 ops/s= 76026 lat us p50=91.14 p99=299.01 p99.9=1654.78 max=7085.3 mean=105.16 + cpu=58.54s ops/cpu-s=9092 rd=10930.2 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=91.14 p99=299.01 mean=104.08 per-tuple=nan ns deinit mean=1.03 us tuples/s=76026 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 5201 ops (+1844554144100837120 ops/s) +close took 0.066 s +== range:uniform:10000@8 T=8 ops=7433 secs= 7.00 ops/s= 1062 lat us p50=5832.70 p99=23855.10 p99.9=45613.06 max=69176.6 mean=7527.08 + cpu=26.35s ops/cpu-s=282 rd=1810492.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=282.62 p99=1916.93 mean=339.61 per-tuple=720.1 ns deinit mean=1.53 us tuples/s=10600155 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3250065408 db_alloc=543969280 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.csv new file mode 100644 index 000000000..f029c7cd9 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,3,0,warm,8,3,2000000,2000000,0.172,11622286.9,nan,nan,nan,0.000,nan,0.651,3070833.4,377511936,32768,188.76,0.02,nan,nan,nan,nan,nan,2000000,11622286.9,0.172,0.000,0.172,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +main,disk,3,0,point:uniform@8,8,3,2000000,1145915,7.000,163698.1,51.712,99.328,1294.336,3697.920,48.800,8.657,132369.3,4042244096,0,3527.53,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +main,disk,3,0,range:uniform:1@8,8,3,2000000,476165,7.000,68021.3,103.424,307.200,1818.624,5747.586,117.520,58.812,8096.3,6744199168,0,14163.58,0.00,103.424,307.200,116.762,nan,0.709,476165,68021.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +main,disk,3,0,range:uniform:10000@8,8,3,2000000,6300,7.000,900.0,7143.424,26476.544,50855.936,71217.334,8885.553,24.722,254.8,15995555840,0,2538977.12,0.00,331.776,1392.640,374.692,852.87,1.278,62901618,8985681.0,7.000,0.068,7.068,0.008,0,274432,nan,3671330816,833429504,0.010,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.log new file mode 100644 index 000000000..528b9d1eb --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-03-main.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=3 sabotage=0 +open took 0.010 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.17 ops/s= 11622287 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.65s ops/cpu-s=3070833 rd=188.8 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1145915 notfound=0 +== point:uniform@8 T=8 ops=1145915 secs= 7.00 ops/s= 163698 lat us p50=51.71 p99=99.33 p99.9=1294.34 max=3697.9 mean=48.80 + cpu=8.66s ops/cpu-s=132369 rd=3527.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 192144 ops (+19213 ops/s) +== range:uniform:1@8 T=8 ops=476165 secs= 7.00 ops/s= 68021 lat us p50=103.42 p99=307.20 p99.9=1818.62 max=5747.6 mean=117.52 + cpu=58.81s ops/cpu-s=8096 rd=14163.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=103.42 p99=307.20 mean=116.76 per-tuple=nan ns deinit mean=0.71 us tuples/s=68021 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 4307 ops (+1844554845354870528 ops/s) +close took 0.068 s +== range:uniform:10000@8 T=8 ops=6300 secs= 7.00 ops/s= 900 lat us p50=7143.42 p99=26476.54 p99.9=50855.94 max=71217.3 mean=8885.55 + cpu=24.72s ops/cpu-s=255 rd=2538977.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=331.78 p99=1392.64 mean=374.69 per-tuple=852.9 ns deinit mean=1.28 us tuples/s=8985681 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671330816 db_alloc=833429504 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.csv new file mode 100644 index 000000000..59062a925 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,warm,8,0,2000000,2000000,0.194,10334500.7,nan,nan,nan,0.000,nan,0.678,2950131.0,376700928,32768,188.35,0.02,nan,nan,nan,nan,nan,2000000,10334500.7,0.194,0.000,0.194,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +main,disk,0,0,point:uniform@8,8,0,2000000,933289,7.000,133323.3,64.000,121.856,223.232,2168.179,59.925,6.673,139868.6,3293290496,0,3528.69,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +main,disk,0,0,range:uniform:1@8,8,0,2000000,384987,7.000,54996.1,133.120,380.928,1490.944,4213.364,145.372,58.607,6568.9,5450756096,0,14158.29,0.00,133.120,372.736,144.598,nan,0.724,384987,54996.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +main,disk,0,0,range:uniform:10000@8,8,0,2000000,5364,7.000,766.3,8323.072,33292.288,50855.936,66157.199,10443.372,22.991,233.3,13554495488,0,2526938.01,0.00,421.888,2195.456,490.271,997.25,1.403,53559604,7651106.1,7.000,0.095,7.095,0.008,0,274432,nan,3671461888,833257472,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.log new file mode 100644 index 000000000..f7feedc15 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-00-main.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.19 ops/s= 10334501 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.68s ops/cpu-s=2950131 rd=188.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=933289 notfound=0 +== point:uniform@8 T=8 ops=933289 secs= 7.00 ops/s= 133323 lat us p50=64.00 p99=121.86 p99.9=223.23 max=2168.2 mean=59.93 + cpu=6.67s ops/cpu-s=139869 rd=3528.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 150782 ops (+15077 ops/s) +== range:uniform:1@8 T=8 ops=384987 secs= 7.00 ops/s= 54996 lat us p50=133.12 p99=380.93 p99.9=1490.94 max=4213.4 mean=145.37 + cpu=58.61s ops/cpu-s=6569 rd=14158.3 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=133.12 p99=372.74 mean=144.60 per-tuple=nan ns deinit mean=0.72 us tuples/s=54996 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3679 ops (+1844554222304843776 ops/s) +close took 0.095 s +== range:uniform:10000@8 T=8 ops=5364 secs= 7.00 ops/s= 766 lat us p50=8323.07 p99=33292.29 p99.9=50855.94 max=66157.2 mean=10443.37 + cpu=22.99s ops/cpu-s=233 rd=2526938.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=421.89 p99=2195.46 mean=490.27 per-tuple=997.3 ns deinit mean=1.40 us tuples/s=7651106 + insert/run=7.00s drain(close)=0.09s total=7.10s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671461888 db_alloc=833257472 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.csv new file mode 100644 index 000000000..20c52f901 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,1,0,warm,8,1,2000000,2000000,0.174,11495441.7,nan,nan,nan,0.000,nan,0.671,2982025.8,376479744,32768,188.24,0.02,nan,nan,nan,nan,nan,2000000,11495441.7,0.174,0.000,0.174,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,1,2000000,912492,7.000,130352.7,66.560,123.904,165.888,3775.173,61.283,7.582,120347.4,3220148224,0,3528.96,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,1,2000000,389617,7.000,55657.5,133.120,356.352,520.192,4249.382,143.639,58.682,6639.4,5511720960,0,14146.51,0.00,133.120,356.352,142.790,nan,0.798,389617,55657.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,1,2000000,5460,7.000,780.0,8323.072,27525.120,37224.448,42735.669,10252.166,23.414,233.2,13854257152,0,2537409.73,0.00,405.504,1261.568,445.719,982.72,1.600,54509642,7786867.4,7.000,0.101,7.102,0.008,0,274432,nan,3671461888,834019328,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.log new file mode 100644 index 000000000..39a3fb8fb --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-01-candidate.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.17 ops/s= 11495442 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.67s ops/cpu-s=2982026 rd=188.2 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=912492 notfound=0 +== point:uniform@8 T=8 ops=912492 secs= 7.00 ops/s= 130353 lat us p50=66.56 p99=123.90 p99.9=165.89 max=3775.2 mean=61.28 + cpu=7.58s ops/cpu-s=120347 rd=3529.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 157593 ops (+15758 ops/s) +== range:uniform:1@8 T=8 ops=389617 secs= 7.00 ops/s= 55658 lat us p50=133.12 p99=356.35 p99.9=520.19 max=4249.4 mean=143.64 + cpu=58.68s ops/cpu-s=6639 rd=14146.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=133.12 p99=356.35 mean=142.79 per-tuple=nan ns deinit mean=0.80 us tuples/s=55658 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3683 ops (+1844557827073785600 ops/s) +close took 0.101 s +== range:uniform:10000@8 T=8 ops=5460 secs= 7.00 ops/s= 780 lat us p50=8323.07 p99=27525.12 p99.9=37224.45 max=42735.7 mean=10252.17 + cpu=23.41s ops/cpu-s=233 rd=2537409.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=405.50 p99=1261.57 mean=445.72 per-tuple=982.7 ns deinit mean=1.60 us tuples/s=7786867 + insert/run=7.00s drain(close)=0.10s total=7.10s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671461888 db_alloc=834019328 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.csv new file mode 100644 index 000000000..28f6d036b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,2,0,warm,8,2,2000000,2000000,0.184,10844171.9,nan,nan,nan,0.000,nan,0.674,2967213.8,377155584,32768,188.58,0.02,nan,nan,nan,nan,nan,2000000,10844171.9,0.184,0.000,0.184,0.000,0,0,nan,0,0,0.007,0,0,0,0,2 +candidate,disk,2,0,point:uniform@8,8,2,2000000,1007811,7.000,143969.4,61.952,111.616,149.504,3641.187,55.482,7.827,128761.7,3555962880,0,3528.40,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,1,0,0 +candidate,disk,2,0,range:uniform:1@8,8,2,2000000,420304,7.000,60041.5,123.904,331.776,479.232,2538.208,133.144,58.706,7159.5,5943205888,0,14140.26,0.00,123.904,331.776,132.290,nan,0.802,420304,60041.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,2,2000000,5745,7.000,820.7,7667.712,26476.544,35127.296,38764.660,9747.624,24.041,239.0,14645161984,0,2549201.39,0.00,380.928,1228.800,415.136,935.14,1.506,57357356,8193677.6,7.000,0.074,7.075,0.008,0,274432,nan,3671461888,834019328,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.log new file mode 100644 index 000000000..ba8f16a48 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-02-candidate.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=2 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.18 ops/s= 10844172 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.67s ops/cpu-s=2967214 rd=188.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1007811 notfound=0 +== point:uniform@8 T=8 ops=1007811 secs= 7.00 ops/s= 143969 lat us p50=61.95 p99=111.62 p99.9=149.50 max=3641.2 mean=55.48 + cpu=7.83s ops/cpu-s=128762 rd=3528.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 169916 ops (+16991 ops/s) +== range:uniform:1@8 T=8 ops=420304 secs= 7.00 ops/s= 60042 lat us p50=123.90 p99=331.78 p99.9=479.23 max=2538.2 mean=133.14 + cpu=58.71s ops/cpu-s=7160 rd=14140.3 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=123.90 p99=331.78 mean=132.29 per-tuple=nan ns deinit mean=0.80 us tuples/s=60042 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3935 ops (+1844556000156531712 ops/s) +close took 0.074 s +== range:uniform:10000@8 T=8 ops=5745 secs= 7.00 ops/s= 821 lat us p50=7667.71 p99=26476.54 p99.9=35127.30 max=38764.7 mean=9747.62 + cpu=24.04s ops/cpu-s=239 rd=2549201.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=380.93 p99=1228.80 mean=415.14 per-tuple=935.1 ns deinit mean=1.51 us tuples/s=8193678 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671461888 db_alloc=834019328 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.csv new file mode 100644 index 000000000..a350debb1 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,3,0,warm,8,3,2000000,2000000,0.183,10926682.1,nan,nan,nan,0.000,nan,0.724,2761282.9,377020416,32768,188.51,0.02,nan,nan,nan,nan,nan,2000000,10926682.1,0.183,0.000,0.183,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,disk,3,0,point:uniform@8,8,3,2000000,1106307,7.000,158039.7,51.712,101.376,1130.496,2982.664,50.534,8.511,129978.7,3903438848,0,3528.35,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,disk,3,0,range:uniform:1@8,8,3,2000000,458776,7.000,65537.3,111.616,307.200,1720.320,4666.721,121.971,58.839,7797.2,6487711744,0,14141.35,0.00,109.568,307.200,121.149,nan,0.769,458776,65537.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,disk,3,0,range:uniform:10000@8,8,3,2000000,5803,7.000,829.0,7405.568,30670.848,70254.592,78082.070,9647.710,25.023,231.9,14798229504,0,2550099.86,0.00,348.160,2129.920,416.361,925.02,1.540,57937356,8276543.9,7.000,0.068,7.069,0.008,0,274432,nan,3671461888,833261568,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.log new file mode 100644 index 000000000..76bb0d70d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-03-main.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=3 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.18 ops/s= 10926682 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.72s ops/cpu-s=2761283 rd=188.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=1106307 notfound=0 +== point:uniform@8 T=8 ops=1106307 secs= 7.00 ops/s= 158040 lat us p50=51.71 p99=101.38 p99.9=1130.50 max=2982.7 mean=50.53 + cpu=8.51s ops/cpu-s=129979 rd=3528.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 183758 ops (+18375 ops/s) +== range:uniform:1@8 T=8 ops=458776 secs= 7.00 ops/s= 65537 lat us p50=111.62 p99=307.20 p99.9=1720.32 max=4666.7 mean=121.97 + cpu=58.84s ops/cpu-s=7797 rd=14141.3 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=109.57 p99=307.20 mean=121.15 per-tuple=nan ns deinit mean=0.77 us tuples/s=65537 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3877 ops (+1844550893660726016 ops/s) +close took 0.068 s +== range:uniform:10000@8 T=8 ops=5803 secs= 7.00 ops/s= 829 lat us p50=7405.57 p99=30670.85 p99.9=70254.59 max=78082.1 mean=9647.71 + cpu=25.02s ops/cpu-s=232 rd=2550099.9 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=348.16 p99=2129.92 mean=416.36 per-tuple=925.0 ns deinit mean=1.54 us tuples/s=8276544 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671461888 db_alloc=833261568 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.csv new file mode 100644 index 000000000..d646656b6 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,0,0,warm,8,0,2000000,2000000,0.172,11659820.2,nan,nan,nan,0.000,nan,0.672,2974411.1,375537664,32768,187.77,0.02,nan,nan,nan,nan,nan,2000000,11659820.2,0.172,0.000,0.172,0.000,0,0,nan,0,0,0.047,0,0,0,0,0 +main,disk,0,0,point:uniform@8,8,0,2000000,956687,7.000,136666.5,64.000,119.808,169.984,4045.255,58.360,6.815,140382.2,3376570368,0,3529.44,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.047,0,0,4,0,0 +main,disk,0,0,range:uniform:1@8,8,0,2000000,394784,7.000,56396.0,128.000,364.544,1556.480,17712.624,141.657,58.613,6735.4,5587775488,0,14154.01,0.00,128.000,364.544,140.899,nan,0.712,394784,56396.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.047,0,0,0,0,0 +main,disk,0,0,range:uniform:10000@8,8,0,2000000,5608,7.000,801.1,8060.928,29097.984,49807.360,63750.167,9983.979,22.510,249.1,14199750656,0,2532052.54,0.00,405.504,1622.016,458.346,954.63,1.205,55984795,7997602.5,7.000,0.071,7.072,0.007,0,274432,nan,3671592960,833474560,0.047,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.log new file mode 100644 index 000000000..51dc3e807 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.log @@ -0,0 +1,22 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-00-main.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.047 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.17 ops/s= 11659820 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.67s ops/cpu-s=2974411 rd=187.8 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=956687 notfound=0 +== point:uniform@8 T=8 ops=956687 secs= 7.00 ops/s= 136666 lat us p50=64.00 p99=119.81 p99.9=169.98 max=4045.3 mean=58.36 + cpu=6.81s ops/cpu-s=140382 rd=3529.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=4 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 160380 ops (+16037 ops/s) +== range:uniform:1@8 T=8 ops=394784 secs= 7.00 ops/s= 56396 lat us p50=128.00 p99=364.54 p99.9=1556.48 max=17712.6 mean=141.66 + cpu=58.61s ops/cpu-s=6735 rd=14154.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=128.00 p99=364.54 mean=140.90 per-tuple=nan ns deinit mean=0.71 us tuples/s=56396 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3830 ops (+1844533303155594496 ops/s) +close took 0.071 s +== range:uniform:10000@8 T=8 ops=5608 secs= 7.00 ops/s= 801 lat us p50=8060.93 p99=29097.98 p99.9=49807.36 max=63750.2 mean=9983.98 + cpu=22.51s ops/cpu-s=249 rd=2532052.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=405.50 p99=1622.02 mean=458.35 per-tuple=954.6 ns deinit mean=1.20 us tuples/s=7997603 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=833474560 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.csv new file mode 100644 index 000000000..ad9fa325e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,1,0,warm,8,1,2000000,2000000,0.177,11292143.0,nan,nan,nan,0.000,nan,0.674,2966795.6,375668736,32768,187.83,0.02,nan,nan,nan,nan,nan,2000000,11292143.0,0.177,0.000,0.177,0.000,0,0,nan,0,0,0.048,0,0,0,0,0 +candidate,disk,1,0,point:uniform@8,8,1,2000000,943897,7.000,134838.6,64.000,119.808,169.984,4627.208,59.142,6.560,143882.2,3331739648,0,3529.77,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.048,0,0,0,0,0 +candidate,disk,1,0,range:uniform:1@8,8,1,2000000,392378,7.000,56052.0,133.120,364.544,548.864,4175.104,142.494,58.569,6699.4,5548408832,0,14140.47,0.00,130.048,364.544,141.461,nan,0.985,392378,56052.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.048,0,0,0,0,0 +candidate,disk,1,0,range:uniform:10000@8,8,1,2000000,5578,7.000,796.8,8192.000,27525.120,36175.872,41467.383,10034.598,22.607,246.7,14126247936,0,2532493.36,0.00,405.504,1359.872,450.791,960.32,1.587,55689642,7955440.7,7.000,0.090,7.090,0.007,0,274432,nan,3671592960,833515520,0.048,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.log new file mode 100644 index 000000000..4b06c3480 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-01-candidate.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.048 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.18 ops/s= 11292143 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.67s ops/cpu-s=2966796 rd=187.8 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=943897 notfound=0 +== point:uniform@8 T=8 ops=943897 secs= 7.00 ops/s= 134839 lat us p50=64.00 p99=119.81 p99.9=169.98 max=4627.2 mean=59.14 + cpu=6.56s ops/cpu-s=143882 rd=3529.8 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 154952 ops (+15494 ops/s) +== range:uniform:1@8 T=8 ops=392378 secs= 7.00 ops/s= 56052 lat us p50=133.12 p99=364.54 p99.9=548.86 max=4175.1 mean=142.49 + cpu=58.57s ops/cpu-s=6699 rd=14140.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=130.05 p99=364.54 mean=141.46 per-tuple=nan ns deinit mean=0.98 us tuples/s=56052 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3780 ops (+1844556687578682880 ops/s) +close took 0.090 s +== range:uniform:10000@8 T=8 ops=5578 secs= 7.00 ops/s= 797 lat us p50=8192.00 p99=27525.12 p99.9=36175.87 max=41467.4 mean=10034.60 + cpu=22.61s ops/cpu-s=247 rd=2532493.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=405.50 p99=1359.87 mean=450.79 per-tuple=960.3 ns deinit mean=1.59 us tuples/s=7955441 + insert/run=7.00s drain(close)=0.09s total=7.09s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=833515520 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.csv new file mode 100644 index 000000000..bd7cf63c1 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,disk,2,0,warm,8,2,2000000,2000000,0.195,10247575.9,nan,nan,nan,0.000,nan,0.732,2730554.4,377102336,32768,188.55,0.02,nan,nan,nan,nan,nan,2000000,10247575.9,0.195,0.000,0.195,0.000,0,0,nan,0,0,0.047,0,0,0,0,0 +candidate,disk,2,0,point:uniform@8,8,2,2000000,935064,7.000,133577.2,64.000,121.856,282.624,3895.246,59.712,6.552,142704.7,3300474880,0,3529.68,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.047,0,0,7,0,0 +candidate,disk,2,0,range:uniform:1@8,8,2,2000000,385593,7.000,55082.8,133.120,372.736,1196.032,3446.774,145.031,58.652,6574.3,5452718080,0,14141.12,0.00,133.120,372.736,143.987,nan,0.995,385593,55082.8,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.047,0,0,0,0,0 +candidate,disk,2,0,range:uniform:10000@8,8,2,2000000,5513,7.000,787.5,8192.000,30146.560,45613.056,58419.732,10161.359,22.298,247.2,13970583552,0,2534116.37,0.00,413.696,1523.712,460.519,972.00,1.660,55039642,7862539.9,7.000,0.105,7.105,0.008,0,274432,nan,3671592960,833515520,0.047,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.log new file mode 100644 index 000000000..32df7c004 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-02-candidate.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=2 sabotage=0 +open took 0.047 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.20 ops/s= 10247576 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.73s ops/cpu-s=2730554 rd=188.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=935064 notfound=0 +== point:uniform@8 T=8 ops=935064 secs= 7.00 ops/s= 133577 lat us p50=64.00 p99=121.86 p99.9=282.62 max=3895.2 mean=59.71 + cpu=6.55s ops/cpu-s=142705 rd=3529.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=7 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 153438 ops (+15343 ops/s) +== range:uniform:1@8 T=8 ops=385593 secs= 7.00 ops/s= 55083 lat us p50=133.12 p99=372.74 p99.9=1196.03 max=3446.8 mean=145.03 + cpu=58.65s ops/cpu-s=6574 rd=14141.1 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=133.12 p99=372.74 mean=143.99 per-tuple=nan ns deinit mean=0.99 us tuples/s=55083 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3731 ops (+1844552345963998208 ops/s) +close took 0.105 s +== range:uniform:10000@8 T=8 ops=5513 secs= 7.00 ops/s= 788 lat us p50=8192.00 p99=30146.56 p99.9=45613.06 max=58419.7 mean=10161.36 + cpu=22.30s ops/cpu-s=247 rd=2534116.4 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=413.70 p99=1523.71 mean=460.52 per-tuple=972.0 ns deinit mean=1.66 us tuples/s=7862540 + insert/run=7.00s drain(close)=0.10s total=7.10s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=833515520 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.csv new file mode 100644 index 000000000..cfc3d4775 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,disk,3,0,warm,8,3,2000000,2000000,0.232,8620624.0,nan,nan,nan,0.000,nan,0.826,2421603.6,377384960,32768,188.69,0.02,nan,nan,nan,nan,nan,2000000,8620624.0,0.232,0.000,0.232,0.000,0,0,nan,0,0,0.049,0,0,0,0,0 +main,disk,3,0,point:uniform@8,8,3,2000000,925115,7.000,132155.7,64.000,123.904,958.464,4077.444,60.360,6.486,142630.4,3264372736,0,3528.61,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.049,0,0,1,0,0 +main,disk,3,0,range:uniform:1@8,8,3,2000000,373604,7.000,53370.4,133.120,421.888,1687.552,6784.185,149.674,58.475,6389.1,5291941888,0,14164.58,0.00,133.120,413.696,148.866,nan,0.759,373604,53370.4,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.049,0,0,6,0,0 +main,disk,3,0,range:uniform:10000@8,8,3,2000000,5521,7.000,788.7,8192.000,30146.560,44564.480,60930.301,10140.698,22.492,245.5,13914914816,0,2520361.31,0.00,397.312,1622.016,458.259,970.22,1.298,55119642,7874002.1,7.000,0.082,7.082,0.008,0,274432,nan,3671592960,833474560,0.049,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.log new file mode 100644 index 000000000..d989ff525 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.log @@ -0,0 +1,22 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-03-main.db mode=open n=2000000 cache_mib=64 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=3 sabotage=0 +open took 0.049 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=2000000 secs= 0.23 ops/s= 8620624 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.83s ops/cpu-s=2421604 rd=188.7 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=925115 notfound=0 +== point:uniform@8 T=8 ops=925115 secs= 7.00 ops/s= 132156 lat us p50=64.00 p99=123.90 p99.9=958.46 max=4077.4 mean=60.36 + cpu=6.49s ops/cpu-s=142630 rd=3528.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 146093 ops (+14608 ops/s) +== range:uniform:1@8 T=8 ops=373604 secs= 7.00 ops/s= 53370 lat us p50=133.12 p99=421.89 p99.9=1687.55 max=6784.2 mean=149.67 + cpu=58.47s ops/cpu-s=6389 rd=14164.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=6 swapout=0 majflt=0 + startup us p50=133.12 p99=413.70 mean=148.87 per-tuple=nan ns deinit mean=0.76 us tuples/s=53370 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 3647 ops (+1844554310837682688 ops/s) +close took 0.082 s +== range:uniform:10000@8 T=8 ops=5521 secs= 7.00 ops/s= 789 lat us p50=8192.00 p99=30146.56 p99.9=44564.48 max=60930.3 mean=10140.70 + cpu=22.49s ops/cpu-s=245 rd=2520361.3 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=397.31 p99=1622.02 mean=458.26 per-tuple=970.2 ns deinit mean=1.30 us tuples/s=7874002 + insert/run=7.00s drain(close)=0.08s total=7.08s drain_cpu=0.01s drain_rd=0 drain_wr=274432 wamp=nan db_apparent=3671592960 db_alloc=833474560 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/manifest.json b/benchmarks/results-20261014/prefix-main-6105c49f/reads/manifest.json new file mode 100644 index 000000000..1df4f55c5 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/manifest.json @@ -0,0 +1,4328 @@ +{ + "mode": "reads", + "started": 1792007320.897416, + "complete": true, + "runner_sha256": "eef41a21f8c4275c300fa24ed69b457b233c8ee0a470926d84c3f5ea755ebd25", + "build_json_sha256": "7bed995652687ea945106e764423ed445b4573d79dc5973b77f05c3cfda0051b", + "builds": { + "main": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main", + "commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "MAKEFLAGS=B -j8 --jobserver-auth=fifo:/tmp/prefix-main-build-6105c49f/GMfifo3 -- GIT_VERSION=6105c49f BUILD_MODE=release\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557" + } + }, + "candidate": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "BUILD_ROOT=build-main-6105c49f\nMAKEFLAGS= -j6 --jobserver-auth=fifo:/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-build-xn10vunh/GMfifo3 -- BUILD_MODE=release BUILD_ROOT=build-main-6105c49f\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a" + } + } + }, + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix]", + "database_directory": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases", + "io": "O_DIRECT", + "fixture_copy": "cp --reflink=auto --sparse=always, then fsync", + "cpu_affinity": "0-11", + "platform": "Linux-6.12.107+deb13-amd64-x86_64-with-glibc2.41", + "available_cpu_affinity": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19 + ], + "loadavg_start": [ + 0.38134765625, + 0.8818359375, + 0.8583984375 + ], + "environment": { + "PREFIX_PATTERN": "per case", + "PREFIX_DISABLE": "unset except candidate disabled case", + "KVBENCH_STATS_BEFORE_CLOSE": "1 for fixture creation only" + }, + "coordination": "Caller holds exclusive campaign benchmark and machine locks", + "seconds": 7, + "warmup_seconds": 1, + "seed": 42, + "loading_threads": 1, + "background_workers": 0, + "memtable_mib": 4, + "verification": "Every query verifies key/value or ordered range; overwrite validates up to 4096 measured keys per worker after timing", + "runs": [ + { + "label": "load-main-resident-common-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal0.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal0.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007320.8993094, + "log": "fixtures/load-main-resident-common-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007321.2648597, + "log_sha256": "18f3ad13ea489bad9da0c0ebfcc18b364a9225be43b0873da927de767debe8a2", + "process_cpu_s": 0.27833499999999994, + "process_read_bytes": 0, + "process_write_bytes": 37318656, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-resident-common-wal0.csv" + }, + { + "label": "space-main-resident-common-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal0.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal0.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007321.2657945, + "log": "fixtures/space-main-resident-common-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007321.380796, + "log_sha256": "5a00eb062d7e6700f3697a3036822c3b3fc58d0c1d7d8d3e4bc0e2f4812b7655", + "process_cpu_s": 0.007987000000000001, + "process_read_bytes": 282624, + "process_write_bytes": 323584, + "live_extents": 342 + }, + { + "label": "resident-common-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007321.61044, + "log": "reads/resident-common-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007345.7493966, + "log_sha256": "4483cce20da1d90cd5cfb362528a6198c32ea3a2e2a4192effafe7e08dea1d11", + "process_cpu_s": 192.05891799999998, + "process_read_bytes": 36823040, + "process_write_bytes": 327680, + "case": "resident-common", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.028341293334960938, + "csv": "reads/resident-common-wal0-00-main.csv", + "csv_sha256": "0f613440cb864b9d1dd4ae227f649d6e0842d5811cd56f0d016fbd1617317071", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-candidate-resident-common-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007345.7537627, + "log": "fixtures/load-candidate-resident-common-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007346.1194715, + "log_sha256": "fad0a52af9174b39e338a46b9764e8ad34ed1b79456bee038a6e0a269339edf0", + "process_cpu_s": 0.27261500000002475, + "process_read_bytes": 0, + "process_write_bytes": 26038272, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-resident-common-wal0.csv" + }, + { + "label": "space-candidate-resident-common-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007346.121212, + "log": "fixtures/space-candidate-resident-common-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007346.236161, + "log_sha256": "f8d316fb316dd1232d01db8fd42d5d243d41b0ddd92bb690ceb8276a7bb34581", + "process_cpu_s": 0.00840100000000052, + "process_read_bytes": 282624, + "process_write_bytes": 323584, + "live_extents": 256 + }, + { + "label": "resident-common-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007346.43102, + "log": "reads/resident-common-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007370.523143, + "log_sha256": "29c7c306a92939076027be113bdd9a1920bade59d547b1913c5047fad31091d9", + "process_cpu_s": 192.04360799999998, + "process_read_bytes": 25542656, + "process_write_bytes": 327680, + "case": "resident-common", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-common-wal0", + "fixture_sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "copy_fsynced": true, + "copy_seconds": 0.01937580108642578, + "csv": "reads/resident-common-wal0-01-candidate.csv", + "csv_sha256": "9165a462d1bac43a6d4da35c51fa052b75c026b9ab0552b12b7838060d6ed866", + "allocated_bytes": 26005504, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "resident-common-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007370.5424101, + "log": "reads/resident-common-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007394.632168, + "log_sha256": "2f140f48521fd5ba9170bcbcd07c17e225826e570fea11346ddb4aa5cab1c671", + "process_cpu_s": 192.04615500000003, + "process_read_bytes": 25542656, + "process_write_bytes": 335872, + "case": "resident-common", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-common-wal0", + "fixture_sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "copy_fsynced": true, + "copy_seconds": 0.01579451560974121, + "csv": "reads/resident-common-wal0-02-candidate.csv", + "csv_sha256": "f88ec6cf056491450410b555abbd666eb8b79c1ca4126a7487bcccb7fcc2e28d", + "allocated_bytes": 26005504, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "resident-common-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007394.6629915, + "log": "reads/resident-common-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007418.7962363, + "log_sha256": "0f7e80ffeb18e4ba2068eb8cdc5572f878f8bf0ffb86154d2bff15959be9f232", + "process_cpu_s": 191.99984299999988, + "process_read_bytes": 36823040, + "process_write_bytes": 327680, + "case": "resident-common", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.02751469612121582, + "csv": "reads/resident-common-wal0-03-main.csv", + "csv_sha256": "bf6400b52762b75f8606a5f418f24997a18ca955fe0469511836d14bcee6115f", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-main-resident-random-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal0.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal0.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007418.8008606, + "log": "fixtures/load-main-resident-random-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007419.366725, + "log_sha256": "b10a82fd89d784f75fba697224c2e0900c30582f56e56f5ddf2b4b95f1080195", + "process_cpu_s": 0.41713100000000825, + "process_read_bytes": 0, + "process_write_bytes": 37318656, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-resident-random-wal0.csv" + }, + { + "label": "space-main-resident-random-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal0.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal0.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007419.3751893, + "log": "fixtures/space-main-resident-random-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007419.540748, + "log_sha256": "acdaa32faf88bd61d63a036b854522d23c4c11f1ddef4072323908ec6e940c2d", + "process_cpu_s": 0.05717100000000597, + "process_read_bytes": 282624, + "process_write_bytes": 323584, + "live_extents": 342 + }, + { + "label": "resident-random-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792007419.8191059, + "log": "reads/resident-random-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007452.0309148, + "log_sha256": "9f03422ef7352eb0cb00e5b310ef14cb2a71b2843197271aff28dc037883b6d3", + "process_cpu_s": 200.0784959999999, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-random", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-random-wal0", + "fixture_sha256": "61b6513de7a5bc2bee5ea8de5e4f475dfefa9fe9afd5de49b2353066e11a4b1a", + "copy_fsynced": true, + "copy_seconds": 0.029645204544067383, + "csv": "reads/resident-random-wal0-00-main.csv", + "csv_sha256": "21bcabd89dea859a9faf2cd6d0eec2887912f42cb0b474dfa8ad42c7bf5bacfd", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + }, + { + "label": "load-candidate-resident-random-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal0.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal0.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007452.0422213, + "log": "fixtures/load-candidate-resident-random-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007452.5589545, + "log_sha256": "1a5daef79adeacea4aaf65f13cea8b9773b3ed9884c8628b52219315ca7ba851", + "process_cpu_s": 0.3712489999999927, + "process_read_bytes": 0, + "process_write_bytes": 37318656, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-resident-random-wal0.csv" + }, + { + "label": "space-candidate-resident-random-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal0.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal0.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007452.5674243, + "log": "fixtures/space-candidate-resident-random-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007452.7319896, + "log_sha256": "b1c96815f733bc3815444f4e2d46bddcecf3de02d94943a31804fb46a3e09c77", + "process_cpu_s": 0.05585700000000471, + "process_read_bytes": 282624, + "process_write_bytes": 323584, + "live_extents": 342 + }, + { + "label": "resident-random-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792007453.0087829, + "log": "reads/resident-random-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007485.1720135, + "log_sha256": "bd6b95a797eae86a20efd5ba42212e44822e6f3ef8403193e4c9f161f6e39137", + "process_cpu_s": 200.10427100000007, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-random", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-random-wal0", + "fixture_sha256": "fd1e976b91a26f529f5d3f7a2341b16f0dd61f0166973da8ee0424907081ef84", + "copy_fsynced": true, + "copy_seconds": 0.030730247497558594, + "csv": "reads/resident-random-wal0-01-candidate.csv", + "csv_sha256": "374333a2bf1babace068d70dc9b8216bf29dae58d3952a95efcaf4cadad2d1d7", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + }, + { + "label": "resident-random-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792007485.2032523, + "log": "reads/resident-random-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007517.371949, + "log_sha256": "1a52e2cbb98c55d05d90a96091b98e63885cd0a6683020ec1abb6607794ae8f3", + "process_cpu_s": 200.11143199999998, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-random", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-random-wal0", + "fixture_sha256": "fd1e976b91a26f529f5d3f7a2341b16f0dd61f0166973da8ee0424907081ef84", + "copy_fsynced": true, + "copy_seconds": 0.026772260665893555, + "csv": "reads/resident-random-wal0-02-candidate.csv", + "csv_sha256": "d4af4bb252248f300a2ebe838a20599523b69747fa42b3a01cbbdb72d4afd621", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + }, + { + "label": "resident-random-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792007517.4077384, + "log": "reads/resident-random-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007549.530244, + "log_sha256": "233e25ddf874e7823f0fb33e7ab18e72485edb84761bdf19559b86c1b5e6415e", + "process_cpu_s": 200.09610500000002, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-random", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-random-wal0", + "fixture_sha256": "61b6513de7a5bc2bee5ea8de5e4f475dfefa9fe9afd5de49b2353066e11a4b1a", + "copy_fsynced": true, + "copy_seconds": 0.029761791229248047, + "csv": "reads/resident-random-wal0-03-main.csv", + "csv_sha256": "5910f056e16b0f75ed5675afca09a6947a853923a8c4d34a62c56ac1e6639fa2", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + }, + { + "label": "load-main-resident-nonlexical-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-nonlexical-wal0.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-nonlexical-wal0.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007549.5347984, + "log": "fixtures/load-main-resident-nonlexical-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007549.9507275, + "log_sha256": "fd7ea90a8d8d4b6bd0f3e4840f7d4f9129f3ffaba82a01aa2d3813a0639c85aa", + "process_cpu_s": 0.2815930000001199, + "process_read_bytes": 0, + "process_write_bytes": 37318656, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-resident-nonlexical-wal0.csv" + }, + { + "label": "space-main-resident-nonlexical-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-nonlexical-wal0.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-nonlexical-wal0.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007549.952769, + "log": "fixtures/space-main-resident-nonlexical-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007550.0675282, + "log_sha256": "2354e63875c291b5462e42b979b9cb808575042e89b623379256ad5f8ddd155c", + "process_cpu_s": 0.009039999999949977, + "process_read_bytes": 282624, + "process_write_bytes": 323584, + "live_extents": 342 + }, + { + "label": "resident-nonlexical-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007550.3110907, + "log": "reads/resident-nonlexical-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007574.4546132, + "log_sha256": "78f01ee84cab01a4275df88f6ef85880c8b37fc38b0672fecef61583abe2f12a", + "process_cpu_s": 192.06528799999992, + "process_read_bytes": 36823040, + "process_write_bytes": 327680, + "case": "resident-nonlexical", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-nonlexical-wal0", + "fixture_sha256": "4ef44377d809c43746059d57e04cc593f0d2dc083e3e853f8422244d24fee6f3", + "copy_fsynced": true, + "copy_seconds": 0.029720544815063477, + "csv": "reads/resident-nonlexical-wal0-00-main.csv", + "csv_sha256": "a3a300f9b0418ab22148ae11aa7001d4dffae8b2aacc58bf1e94781ceb5bf009", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-candidate-resident-nonlexical-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-nonlexical-wal0.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-nonlexical-wal0.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007574.459896, + "log": "fixtures/load-candidate-resident-nonlexical-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007574.9261281, + "log_sha256": "caaaece8aeaa43a7c581acc681ef1bd5be09b98514a63d77f24a9820e7648c00", + "process_cpu_s": 0.30024199999982915, + "process_read_bytes": 0, + "process_write_bytes": 37318656, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-resident-nonlexical-wal0.csv" + }, + { + "label": "space-candidate-resident-nonlexical-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-nonlexical-wal0.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-nonlexical-wal0.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007574.934755, + "log": "fixtures/space-candidate-resident-nonlexical-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007575.0502958, + "log_sha256": "212fb0ce90510a59cc014c8a44bd724411084131bd720f6c7feb163beccd45cb", + "process_cpu_s": 0.009719999999921347, + "process_read_bytes": 282624, + "process_write_bytes": 323584, + "live_extents": 342 + }, + { + "label": "resident-nonlexical-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007575.3199549, + "log": "reads/resident-nonlexical-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007599.456583, + "log_sha256": "e14662c9c949d7a6cc1b3be1a17ef8a41d3e83660a5d5c4b4de5705b7bd6b5d7", + "process_cpu_s": 192.03332600000013, + "process_read_bytes": 36823040, + "process_write_bytes": 327680, + "case": "resident-nonlexical", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-nonlexical-wal0", + "fixture_sha256": "7d5571d7c9b6c34ce64fb3f264e3e8a775eddacafceac2b253076f7257635b05", + "copy_fsynced": true, + "copy_seconds": 0.0336003303527832, + "csv": "reads/resident-nonlexical-wal0-01-candidate.csv", + "csv_sha256": "b7e43f5881506bbd1f6ae390da93924cb50e34d3f616ce974c858a1e4e6ce6f1", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "resident-nonlexical-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007599.5003529, + "log": "reads/resident-nonlexical-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007623.6348042, + "log_sha256": "5e038ea7d77646db4310500a5ac8dcc2921f414a61fac2189206c18a3d7d0f07", + "process_cpu_s": 192.05994900000024, + "process_read_bytes": 36823040, + "process_write_bytes": 327680, + "case": "resident-nonlexical", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-nonlexical-wal0", + "fixture_sha256": "7d5571d7c9b6c34ce64fb3f264e3e8a775eddacafceac2b253076f7257635b05", + "copy_fsynced": true, + "copy_seconds": 0.03698396682739258, + "csv": "reads/resident-nonlexical-wal0-02-candidate.csv", + "csv_sha256": "d4f76f9f1a903cc461fac2c0775a46197d0ece935d7afc2aa49dbc96c87ab1ff", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "resident-nonlexical-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007623.6662908, + "log": "reads/resident-nonlexical-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007647.8033957, + "log_sha256": "5bb78777b2dc4e365fa4fbea39854a37b385ece8eb769e1ad4f11fe8213b64b9", + "process_cpu_s": 192.04209199999963, + "process_read_bytes": 36823040, + "process_write_bytes": 327680, + "case": "resident-nonlexical", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-nonlexical-wal0", + "fixture_sha256": "4ef44377d809c43746059d57e04cc593f0d2dc083e3e853f8422244d24fee6f3", + "copy_fsynced": true, + "copy_seconds": 0.026031494140625, + "csv": "reads/resident-nonlexical-wal0-03-main.csv", + "csv_sha256": "83e7b38fbbf08c92aab7c64d68fddcb283c37011fc477bb420bceb94e9744033", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-main-disk-common-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-common-wal0.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-common-wal0.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007647.8090432, + "log": "fixtures/load-main-disk-common-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007652.088279, + "log_sha256": "45edc445076b26576286e5f7c84fd6b089ddc1725580af7bc219b5ebebd58e33", + "process_cpu_s": 3.2633670000003097, + "process_read_bytes": 392429568, + "process_write_bytes": 833572864, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-disk-common-wal0.csv" + }, + { + "label": "space-main-disk-common-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-common-wal0.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-common-wal0.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007652.09016, + "log": "fixtures/space-main-disk-common-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007652.2056422, + "log_sha256": "0e528d189b6429e41bbbd7727611a57cdea215ddd26378e94915b08660d4d0e5", + "process_cpu_s": 0.0080680000001081, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 3414 + }, + { + "label": "disk-common-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-00-main.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007656.3348787, + "log": "reads/disk-common-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007680.597687, + "log_sha256": "c1b12d0d4c50ba15421c077cc20656fe60f7b52766b343cd0e0abdad434c9243", + "process_cpu_s": 106.28160399999993, + "process_read_bytes": 32361738240, + "process_write_bytes": 319488, + "case": "disk-common", + "wal": 0, + "index": 0, + "fixture_key": "main-disk-common-wal0", + "fixture_sha256": "dec5f2be82945a2752b28cc27276343ef7fab4af03af36a1c2d56a8cc0152d7a", + "copy_fsynced": true, + "copy_seconds": 0.5679550170898438, + "csv": "reads/disk-common-wal0-00-main.csv", + "csv_sha256": "17a3f00975f76f4d1aebca4b58db2602e0c0cfa289222788d6e81d6564e7aa4e", + "allocated_bytes": 833429504, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-candidate-disk-common-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-common-wal0.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-common-wal0.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007680.6758451, + "log": "fixtures/load-candidate-disk-common-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007684.801167, + "log_sha256": "d385d761493143bc774e727590e9086357268c0c91e97f39cb44f8d9c49ebe2f", + "process_cpu_s": 3.2873089999999223, + "process_read_bytes": 252567552, + "process_write_bytes": 544026624, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-disk-common-wal0.csv" + }, + { + "label": "space-candidate-disk-common-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-common-wal0.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-common-wal0.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007684.8034937, + "log": "fixtures/space-candidate-disk-common-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007684.9187396, + "log_sha256": "a720f6b26d8415ea53e9e63a0ba91c49dd90669a235204c9d7235f9ba7948952", + "process_cpu_s": 0.007408999999995558, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 2585 + }, + { + "label": "disk-common-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-01-candidate.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007688.381543, + "log": "reads/disk-common-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007712.6504068, + "log_sha256": "f5ce25533b334a493b3f15ecdc36a6d2ede200034a5555f3423b331f52be75d7", + "process_cpu_s": 108.23690300000014, + "process_read_bytes": 28450123776, + "process_write_bytes": 319488, + "case": "disk-common", + "wal": 0, + "index": 1, + "fixture_key": "candidate-disk-common-wal0", + "fixture_sha256": "94cc9c3c0b4ecf1ed96ea3248119b7d092a7c33cf2c5751ecea3aa31c61b1b61", + "copy_fsynced": true, + "copy_seconds": 0.3431582450866699, + "csv": "reads/disk-common-wal0-01-candidate.csv", + "csv_sha256": "a744cab385ad506add6f549a1e26a23e0e5032b2a703824034bb2781cf394007", + "allocated_bytes": 543969280, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "disk-common-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-02-candidate.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007713.3367677, + "log": "reads/disk-common-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007737.597948, + "log_sha256": "b5c7f0a0d45d819a9c6c638747dc3f6135709945489ce0cd714a984e2c721d3b", + "process_cpu_s": 107.42225099999979, + "process_read_bytes": 27023200256, + "process_write_bytes": 319488, + "case": "disk-common", + "wal": 0, + "index": 2, + "fixture_key": "candidate-disk-common-wal0", + "fixture_sha256": "94cc9c3c0b4ecf1ed96ea3248119b7d092a7c33cf2c5751ecea3aa31c61b1b61", + "copy_fsynced": true, + "copy_seconds": 0.6288220882415771, + "csv": "reads/disk-common-wal0-02-candidate.csv", + "csv_sha256": "4482cb17d862f723f04205d66168e791dc8bbf8565526aef077fa04f07d602a7", + "allocated_bytes": 543969280, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "disk-common-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-common-wal0-03-main.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-common-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007738.4140875, + "log": "reads/disk-common-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007762.732269, + "log_sha256": "7588ea5f45c70ede335f1681e1f2657d5d5892cd3174f4c708d41664b070edd3", + "process_cpu_s": 106.22381999999999, + "process_read_bytes": 31051370496, + "process_write_bytes": 319488, + "case": "disk-common", + "wal": 0, + "index": 3, + "fixture_key": "main-disk-common-wal0", + "fixture_sha256": "dec5f2be82945a2752b28cc27276343ef7fab4af03af36a1c2d56a8cc0152d7a", + "copy_fsynced": true, + "copy_seconds": 0.764068603515625, + "csv": "reads/disk-common-wal0-03-main.csv", + "csv_sha256": "5805277a977d10d189387b5a9acaa21c5597611eca22649e1e6ec0123000ea95", + "allocated_bytes": 833429504, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-main-disk-random-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-random-wal0.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-random-wal0.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007762.809847, + "log": "fixtures/load-main-disk-random-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007768.189341, + "log_sha256": "7680dad51adeed6719d18eac55feb2d6f43036c339f0872e037823058493e4ba", + "process_cpu_s": 4.108841000000325, + "process_read_bytes": 394334208, + "process_write_bytes": 833511424, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-disk-random-wal0.csv" + }, + { + "label": "space-main-disk-random-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-random-wal0.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-random-wal0.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007768.1915035, + "log": "fixtures/space-main-disk-random-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007768.8584685, + "log_sha256": "9be1f008bacf81ba12f0df9f98e96827810285805d3de698af71d4e28b409776", + "process_cpu_s": 0.5292030000002228, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 3415 + }, + { + "label": "disk-random-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-00-main.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007773.3770528, + "log": "reads/disk-random-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007798.3469474, + "log_sha256": "3563c04b339fc8970aedf56ec5796377bfaad08c4ad30f6b58e130076e0794d9", + "process_cpu_s": 101.82275599999997, + "process_read_bytes": 26918662144, + "process_write_bytes": 319488, + "case": "disk-random", + "wal": 0, + "index": 0, + "fixture_key": "main-disk-random-wal0", + "fixture_sha256": "0cfdb1bb3524e67d180e901b89b5db112353509ce4a1b18a296db3312c1b9353", + "copy_fsynced": true, + "copy_seconds": 0.8285815715789795, + "csv": "reads/disk-random-wal0-00-main.csv", + "csv_sha256": "fae1dec50849d38af6cdb78498f2c96b4cbddb0f071ec6a492faf6070c7c481c", + "allocated_bytes": 833474560, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-candidate-disk-random-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-random-wal0.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-random-wal0.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007798.4232552, + "log": "fixtures/load-candidate-disk-random-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007803.9539323, + "log_sha256": "417e14ff55ecc7c88a4438829eba66288bf4252114b925db916eadca06031c89", + "process_cpu_s": 4.24244299999981, + "process_read_bytes": 393678848, + "process_write_bytes": 833597440, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-disk-random-wal0.csv" + }, + { + "label": "space-candidate-disk-random-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-random-wal0.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-random-wal0.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007803.9557889, + "log": "fixtures/space-candidate-disk-random-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007804.622407, + "log_sha256": "69a4a53652f038cf9d3d1ccd7481299a62cf371b64b1787e2ab2c6b53ae69d8a", + "process_cpu_s": 0.5353760000002126, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 3415 + }, + { + "label": "disk-random-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-01-candidate.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007809.0709105, + "log": "reads/disk-random-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007833.9857595, + "log_sha256": "8df230ddd756287031f4a3b5982a65e916c9eddbaaaa26715abddd9d5729fbc1", + "process_cpu_s": 101.45987499999973, + "process_read_bytes": 26666450944, + "process_write_bytes": 319488, + "case": "disk-random", + "wal": 0, + "index": 1, + "fixture_key": "candidate-disk-random-wal0", + "fixture_sha256": "89cfb2d29cfb753c81867285e315cf6fa1ff347bf115264d8a3314c5dbe68fff", + "copy_fsynced": true, + "copy_seconds": 0.7880263328552246, + "csv": "reads/disk-random-wal0-01-candidate.csv", + "csv_sha256": "66aeb7cd450a5e75a1cb70c0d0dd0294d303b8cd8fd0ff9de0d8a122dc457864", + "allocated_bytes": 833515520, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "disk-random-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-02-candidate.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007835.107679, + "log": "reads/disk-random-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007860.0804183, + "log_sha256": "38389ee1d34ca638c9c00c165ba0f3e7e7c1869569c6f98157706d8b6a39de2d", + "process_cpu_s": 101.37889699999954, + "process_read_bytes": 26301431808, + "process_write_bytes": 319488, + "case": "disk-random", + "wal": 0, + "index": 2, + "fixture_key": "candidate-disk-random-wal0", + "fixture_sha256": "89cfb2d29cfb753c81867285e315cf6fa1ff347bf115264d8a3314c5dbe68fff", + "copy_fsynced": true, + "copy_seconds": 1.044053554534912, + "csv": "reads/disk-random-wal0-02-candidate.csv", + "csv_sha256": "6ebb822d7c159b599a24244b2fef2fd9561e140e9ab00e16b1a1a52a7b7e5d1f", + "allocated_bytes": 833515520, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "disk-random-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-random-wal0-03-main.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-random-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007860.970751, + "log": "reads/disk-random-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007885.9424162, + "log_sha256": "43e84814080518023ba4c408995d59a00cb3f1a1b5603f2c977b80050754ccb7", + "process_cpu_s": 101.36222600000053, + "process_read_bytes": 25976754176, + "process_write_bytes": 319488, + "case": "disk-random", + "wal": 0, + "index": 3, + "fixture_key": "main-disk-random-wal0", + "fixture_sha256": "0cfdb1bb3524e67d180e901b89b5db112353509ce4a1b18a296db3312c1b9353", + "copy_fsynced": true, + "copy_seconds": 0.8095407485961914, + "csv": "reads/disk-random-wal0-03-main.csv", + "csv_sha256": "b6d47f74d7ccf21681635f230c0133cd0e825765a1cd09da149821f6564ad58e", + "allocated_bytes": 833474560, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-main-disk-nonlexical-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-nonlexical-wal0.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-nonlexical-wal0.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007886.0238662, + "log": "fixtures/load-main-disk-nonlexical-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007891.001826, + "log_sha256": "f6e6eba78052b7a7f79786efbae89e4d8a11f7c06992ae8f5bd4a7169736e0aa", + "process_cpu_s": 3.619045999999912, + "process_read_bytes": 394637312, + "process_write_bytes": 833445888, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-disk-nonlexical-wal0.csv" + }, + { + "label": "space-main-disk-nonlexical-wal0", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-disk-nonlexical-wal0.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-disk-nonlexical-wal0.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007891.0040016, + "log": "fixtures/space-main-disk-nonlexical-wal0.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007891.1194177, + "log_sha256": "221a20eeb38b98049bdbf4f75052ce6fc1b49eb52df731b8ec9eff5e7b0cc378", + "process_cpu_s": 0.008033000000068569, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 3414 + }, + { + "label": "disk-nonlexical-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-00-main.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007896.1700928, + "log": "reads/disk-nonlexical-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007920.5380733, + "log_sha256": "553bfec55b20e53a88ff8c86eb20cf80e57154346248bc68108cb790a9dc4e5f", + "process_cpu_s": 101.41864699999951, + "process_read_bytes": 25798180864, + "process_write_bytes": 319488, + "case": "disk-nonlexical", + "wal": 0, + "index": 0, + "fixture_key": "main-disk-nonlexical-wal0", + "fixture_sha256": "24e07320763a98e7d8ef2e2c36272f1a13f309b5a0e0d01eec6dc0a5e7c7b14d", + "copy_fsynced": true, + "copy_seconds": 1.2546803951263428, + "csv": "reads/disk-nonlexical-wal0-00-main.csv", + "csv_sha256": "ab9feb2a4109866d250d134e65ee64a783cd85bf8eb66638b409e3b390b48b62", + "allocated_bytes": 833257472, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "load-candidate-disk-nonlexical-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-nonlexical-wal0.db", + "--create", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-nonlexical-wal0.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792007920.613068, + "log": "fixtures/load-candidate-disk-nonlexical-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007925.541582, + "log_sha256": "69dd0483b9beeaa174c80828e2e701b46f7015d3b1a31facd947739c584b0c8d", + "process_cpu_s": 3.6431890000001204, + "process_read_bytes": 392261632, + "process_write_bytes": 834170880, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-disk-nonlexical-wal0.csv" + }, + { + "label": "space-candidate-disk-nonlexical-wal0", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-disk-nonlexical-wal0.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-disk-nonlexical-wal0.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792007925.5434184, + "log": "fixtures/space-candidate-disk-nonlexical-wal0.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007925.70891, + "log_sha256": "2d699969afb74cba2a05b9c57a7b93bee1dab3d7278d8389df20041683d78ecd", + "process_cpu_s": 0.00783200000000761, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 3414 + }, + { + "label": "disk-nonlexical-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-01-candidate.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007930.1920724, + "log": "reads/disk-nonlexical-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007954.5606375, + "log_sha256": "8cde9d18aca4df590cad44e8cba37fff1b541e19f703ba68e0acf9e5a4aa1a81", + "process_cpu_s": 103.11980899999992, + "process_read_bytes": 26219646976, + "process_write_bytes": 319488, + "case": "disk-nonlexical", + "wal": 0, + "index": 1, + "fixture_key": "candidate-disk-nonlexical-wal0", + "fixture_sha256": "a20e0ea73c5fd2bcd76bd881d8454ed33499cfeac1f7eb57c6d3a94e3ce44532", + "copy_fsynced": true, + "copy_seconds": 0.7319114208221436, + "csv": "reads/disk-nonlexical-wal0-01-candidate.csv", + "csv_sha256": "00d81b27d38df58fe9a45fa2052bcf7ac1d8644d6f4dabd8d2e82643c019d0b2", + "allocated_bytes": 834019328, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "disk-nonlexical-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-02-candidate.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "disk", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007955.3856497, + "log": "reads/disk-nonlexical-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792007979.706226, + "log_sha256": "e89cf512bd93ce7a6dc3243bca36f7be44b96fc5960ec4a86a6b4873226f3cd1", + "process_cpu_s": 104.20305500000006, + "process_read_bytes": 28000595968, + "process_write_bytes": 319488, + "case": "disk-nonlexical", + "wal": 0, + "index": 2, + "fixture_key": "candidate-disk-nonlexical-wal0", + "fixture_sha256": "a20e0ea73c5fd2bcd76bd881d8454ed33499cfeac1f7eb57c6d3a94e3ce44532", + "copy_fsynced": true, + "copy_seconds": 0.746088981628418, + "csv": "reads/disk-nonlexical-wal0-02-candidate.csv", + "csv_sha256": "134e76299279de845d9eae74d0b53debcd24b306623d883ae527cfe84da59b90", + "allocated_bytes": 834019328, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "disk-nonlexical-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-disk-nonlexical-wal0-03-main.db", + "--open", + "--n", + "2000000", + "--cache-mib", + "64", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/disk-nonlexical-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "disk", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8" + ], + "started": 1792007980.8534684, + "log": "reads/disk-nonlexical-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008005.1776562, + "log_sha256": "0f7795cf5f9a51493ce3f215ebaf6f605e69f107bb67e540ef06d0c1897ce8ce", + "process_cpu_s": 106.50926700000025, + "process_read_bytes": 29251428352, + "process_write_bytes": 319488, + "case": "disk-nonlexical", + "wal": 0, + "index": 3, + "fixture_key": "main-disk-nonlexical-wal0", + "fixture_sha256": "24e07320763a98e7d8ef2e2c36272f1a13f309b5a0e0d01eec6dc0a5e7c7b14d", + "copy_fsynced": true, + "copy_seconds": 1.0639286041259766, + "csv": "reads/disk-nonlexical-wal0-03-main.csv", + "csv_sha256": "7c92e0d1489f470311efc309ebd03999a1b0610d775f535b173971079280af88", + "allocated_bytes": 833261568, + "errors": 0, + "violations": 0, + "phase_count": 4 + }, + { + "label": "resident-common-disabled-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008005.3589466, + "log": "reads/resident-common-disabled-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008037.5754604, + "log_sha256": "851389cf70d682c7a42414a38927683432cd87f011f212a554f7de9d603b915e", + "process_cpu_s": 200.06889300000023, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-common-disabled", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.09630966186523438, + "csv": "reads/resident-common-disabled-wal0-00-main.csv", + "csv_sha256": "dd6f7684418e133deee20de99272d25ab921a5add4e5025d37850523afa4429d", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + }, + { + "label": "load-candidate-resident-common-wal0-disabled", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0-disabled.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0-disabled.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "load:random@1" + ], + "started": 1792008037.587256, + "log": "fixtures/load-candidate-resident-common-wal0-disabled.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": true, + "verified": true, + "returncode": 0, + "finished": 1792008038.0533974, + "log_sha256": "148272476960ffe65d1cadb9b0bb06c091ab01150c5c8747bc2e93c2714361cd", + "process_cpu_s": 0.3065169999997579, + "process_read_bytes": 0, + "process_write_bytes": 37318656, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-resident-common-wal0-disabled.csv" + }, + { + "label": "space-candidate-resident-common-wal0-disabled", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal0-disabled.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal0-disabled.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "space" + ], + "started": 1792008038.0554943, + "log": "fixtures/space-candidate-resident-common-wal0-disabled.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": true, + "verified": true, + "returncode": 0, + "finished": 1792008038.1705449, + "log_sha256": "5fa0d7c08f1cdc2f901bb1466b51c09a5937c0693e13f7b32e57b832e0114578", + "process_cpu_s": 0.00969000000043252, + "process_read_bytes": 282624, + "process_write_bytes": 323584, + "live_extents": 342 + }, + { + "label": "resident-common-disabled-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008038.5539691, + "log": "reads/resident-common-disabled-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": true, + "verified": true, + "returncode": 0, + "finished": 1792008070.7126374, + "log_sha256": "bd92d15ffe743cd30f0d01f8ea7dcfa730eb44a50e08b5bf81b64c37ea2f2999", + "process_cpu_s": 200.08214999999973, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-common-disabled", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-common-wal0-disabled", + "fixture_sha256": "4548a1692b739e986afcc4af4a4824db55c941c2fea98ed5edb8389fcc33d60f", + "copy_fsynced": true, + "copy_seconds": 0.0386350154876709, + "csv": "reads/resident-common-disabled-wal0-01-candidate.csv", + "csv_sha256": "d54653b39b16bfa095d636e1c660a948fee37dff12b320a4bd001f5dc80cbd4d", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + }, + { + "label": "resident-common-disabled-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008070.7643044, + "log": "reads/resident-common-disabled-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": true, + "verified": true, + "returncode": 0, + "finished": 1792008102.9248226, + "log_sha256": "61359382525692e7619446c613ea09c9ef96975d38f1f6492c31c5c5d33db54a", + "process_cpu_s": 200.09949500000005, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-common-disabled", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-common-wal0-disabled", + "fixture_sha256": "4548a1692b739e986afcc4af4a4824db55c941c2fea98ed5edb8389fcc33d60f", + "copy_fsynced": true, + "copy_seconds": 0.044914960861206055, + "csv": "reads/resident-common-disabled-wal0-02-candidate.csv", + "csv_sha256": "343befd21ff92bfc2fcd10a711168add85deda244b588cb17e0646275b9af3e5", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + }, + { + "label": "resident-common-disabled-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "7", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/reads", + "warm", + "point:uniform@8", + "range:uniform:1@8", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008102.9732108, + "log": "reads/resident-common-disabled-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008135.1315808, + "log_sha256": "6a9e91d2e6fc5f44f2852d18ecc01a3e693f7e2ea052af4d4d8942c77b5ff893", + "process_cpu_s": 200.07155800000032, + "process_read_bytes": 36823040, + "process_write_bytes": 335872, + "case": "resident-common-disabled", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.04263114929199219, + "csv": "reads/resident-common-disabled-wal0-03-main.csv", + "csv_sha256": "d25c48a57605d94dc5a18a50c37ddcbf1af79c8357ca51b83675ad4dfbe05e57", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 5 + } + ], + "finished": 1792008135.1367507, + "loadavg_end": [ + 6.9853515625, + 7.5205078125, + 5.0498046875 + ] +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.csv new file mode 100644 index 000000000..764e29297 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.014,14033008.9,nan,nan,nan,0.000,nan,0.066,3008740.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14033008.9,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +main,resident,0,0,point:uniform@8,8,0,200000,24814293,7.000,3544771.5,2.144,2.976,10.368,224.336,2.173,55.995,443155.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,3,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,6249778,7.000,892793.3,8.000,12.160,21.760,435.547,8.903,55.993,111617.9,0,0,0.00,0.00,7.488,11.648,8.381,nan,0.470,6249778,892793.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,31031,7.000,4432.8,1490.944,3244.032,3309.568,3508.606,1804.406,55.998,554.1,0,4096,0.00,0.13,9.344,14.976,9.584,184.01,0.657,302539911,43218508.6,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@1,1,0,200000,8741,7.000,1248.7,811.008,860.160,974.848,994.427,800.754,7.000,1248.7,0,4096,0.00,0.47,6.976,8.128,6.962,81.41,0.351,85196913,12170706.7,7.000,0.151,7.151,0.012,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.log new file mode 100644 index 000000000..0a6d0f031 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-00-main.log @@ -0,0 +1,27 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14033009 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3008740 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=24814293 notfound=0 +== point:uniform@8 T=8 ops=24814293 secs= 7.00 ops/s= 3544772 lat us p50=2.14 p99=2.98 p99.9=10.37 max=224.3 mean=2.17 + cpu=55.99s ops/cpu-s=443156 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=3 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 2637073 ops (+263689 ops/s) +== range:uniform:1@8 T=8 ops=6249778 secs= 7.00 ops/s= 892793 lat us p50=8.00 p99=12.16 p99.9=21.76 max=435.5 mean=8.90 + cpu=55.99s ops/cpu-s=111618 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.49 p99=11.65 mean=8.38 per-tuple=nan ns deinit mean=0.47 us tuples/s=892793 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 22220 ops (+1844536965203351552 ops/s) +== range:uniform:10000@8 T=8 ops=31031 secs= 7.00 ops/s= 4433 lat us p50=1490.94 p99=3244.03 p99.9=3309.57 max=3508.6 mean=1804.41 + cpu=56.00s ops/cpu-s=554 rd=0.0 B/op wr=0.1 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=14.98 mean=9.58 per-tuple=184.0 ns deinit mean=0.66 us tuples/s=43218509 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 8641 ops (+1844439955628205568 ops/s) +close took 0.151 s +== range:uniform:10000@1 T=1 ops=8741 secs= 7.00 ops/s= 1249 lat us p50=811.01 p99=860.16 p99.9=974.85 max=994.4 mean=800.75 + cpu=7.00s ops/cpu-s=1249 rd=0.0 B/op wr=0.5 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.98 p99=8.13 mean=6.96 per-tuple=81.4 ns deinit mean=0.35 us tuples/s=12170707 + insert/run=7.00s drain(close)=0.15s total=7.15s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.csv new file mode 100644 index 000000000..19e9ecc1c --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.015,13471723.9,nan,nan,nan,0.000,nan,0.073,2731829.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13471723.9,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,point:uniform@8,8,1,200000,26491067,7.000,3784307.2,2.000,2.720,8.128,224.242,2.031,55.996,473088.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,1,0,0 +candidate,resident,1,0,range:uniform:1@8,8,1,200000,6844048,7.000,977689.1,7.232,11.136,20.224,221.366,8.131,55.996,122223.0,0,0,0.00,0.00,6.848,10.368,7.647,nan,0.437,6844048,977689.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,1,200000,20880,7.000,2982.7,2654.208,4030.464,4161.536,4228.139,2681.545,55.996,372.9,0,4096,0.00,0.20,9.856,14.208,9.970,273.83,0.753,203728741,29103015.1,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@1,1,1,200000,8704,7.000,1243.4,827.392,909.312,1327.104,1463.843,804.147,7.000,1243.4,0,4096,0.00,0.47,6.720,9.856,6.811,81.77,0.402,84841867,12119794.3,7.000,0.091,7.092,0.012,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.log new file mode 100644 index 000000000..d63b53cef --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-01-candidate.log @@ -0,0 +1,27 @@ +prefix-pattern=common key_bytes=64 compression_disabled=true +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13471724 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2731830 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=26491067 notfound=0 +== point:uniform@8 T=8 ops=26491067 secs= 7.00 ops/s= 3784307 lat us p50=2.00 p99=2.72 p99.9=8.13 max=224.2 mean=2.03 + cpu=56.00s ops/cpu-s=473089 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 2926441 ops (+292623 ops/s) +== range:uniform:1@8 T=8 ops=6844048 secs= 7.00 ops/s= 977689 lat us p50=7.23 p99=11.14 p99.9=20.22 max=221.4 mean=8.13 + cpu=56.00s ops/cpu-s=122223 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.85 p99=10.37 mean=7.65 per-tuple=nan ns deinit mean=0.44 us tuples/s=977689 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 14893 ops (+1844555143046502144 ops/s) +== range:uniform:10000@8 T=8 ops=20880 secs= 7.00 ops/s= 2983 lat us p50=2654.21 p99=4030.46 p99.9=4161.54 max=4228.1 mean=2681.55 + cpu=56.00s ops/cpu-s=373 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.86 p99=14.21 mean=9.97 per-tuple=273.8 ns deinit mean=0.75 us tuples/s=29103015 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 8642 ops (+1844429180551482368 ops/s) +close took 0.091 s +== range:uniform:10000@1 T=1 ops=8704 secs= 7.00 ops/s= 1243 lat us p50=827.39 p99=909.31 p99.9=1327.10 max=1463.8 mean=804.15 + cpu=7.00s ops/cpu-s=1243 rd=0.0 B/op wr=0.5 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=9.86 mean=6.81 per-tuple=81.8 ns deinit mean=0.40 us tuples/s=12119794 + insert/run=7.00s drain(close)=0.09s total=7.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.csv new file mode 100644 index 000000000..2f61fbf93 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.018,10971755.2,nan,nan,nan,0.000,nan,0.091,2203225.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,10971755.2,0.018,0.000,0.018,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,point:uniform@8,8,2,200000,27593518,7.000,3941791.0,1.936,2.528,9.088,238.514,1.947,55.995,492782.6,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,2,200000,6394853,7.000,913518.7,7.744,12.160,21.760,246.060,8.702,55.996,114202.6,0,0,0.00,0.00,7.232,11.392,8.175,nan,0.476,6394853,913518.7,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,2,200000,22963,7.000,3280.3,2195.456,5439.488,5570.560,5994.799,2438.062,55.997,410.1,0,4096,0.00,0.18,9.344,15.488,10.034,248.61,0.732,224082060,32010421.8,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,2,200000,9108,7.000,1301.1,778.240,876.544,991.232,1010.451,768.511,7.000,1301.1,0,4096,0.00,0.45,6.720,8.320,6.736,78.12,0.358,88777289,12681989.4,7.000,0.089,7.089,0.012,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.log new file mode 100644 index 000000000..7e1ed95da --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-02-candidate.log @@ -0,0 +1,27 @@ +prefix-pattern=common key_bytes=64 compression_disabled=true +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=2 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 10971755 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.09s ops/cpu-s=2203226 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=27593518 notfound=0 +== point:uniform@8 T=8 ops=27593518 secs= 7.00 ops/s= 3941791 lat us p50=1.94 p99=2.53 p99.9=9.09 max=238.5 mean=1.95 + cpu=56.00s ops/cpu-s=492783 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 2709053 ops (+270886 ops/s) +== range:uniform:1@8 T=8 ops=6394853 secs= 7.00 ops/s= 913519 lat us p50=7.74 p99=12.16 p99.9=21.76 max=246.1 mean=8.70 + cpu=56.00s ops/cpu-s=114203 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.23 p99=11.39 mean=8.18 per-tuple=nan ns deinit mean=0.48 us tuples/s=913519 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 16380 ops (+1844545775757558272 ops/s) +== range:uniform:10000@8 T=8 ops=22963 secs= 7.00 ops/s= 3280 lat us p50=2195.46 p99=5439.49 p99.9=5570.56 max=5994.8 mean=2438.06 + cpu=56.00s ops/cpu-s=410 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=15.49 mean=10.03 per-tuple=248.6 ns deinit mean=0.73 us tuples/s=32010422 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 8994 ops (+1844434611873733888 ops/s) +close took 0.089 s +== range:uniform:10000@1 T=1 ops=9108 secs= 7.00 ops/s= 1301 lat us p50=778.24 p99=876.54 p99.9=991.23 max=1010.5 mean=768.51 + cpu=7.00s ops/cpu-s=1301 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=8.32 mean=6.74 per-tuple=78.1 ns deinit mean=0.36 us tuples/s=12681989 + insert/run=7.00s drain(close)=0.09s total=7.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.csv new file mode 100644 index 000000000..5786436a1 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.014,13850857.7,nan,nan,nan,0.000,nan,0.066,3049245.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13850857.7,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,point:uniform@8,8,3,200000,26668076,7.000,3809599.8,1.968,2.784,9.600,227.078,2.020,55.995,476255.9,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,7030631,7.000,1004344.2,7.104,11.136,19.712,95.273,7.914,55.996,125556.1,0,0,0.00,0.00,6.592,10.624,7.457,nan,0.410,7030631,1004344.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,23838,7.000,3405.3,2260.992,5963.776,6094.848,6239.576,2349.013,55.996,425.7,0,4096,0.00,0.17,9.344,16.640,10.221,239.54,0.756,232636016,33232435.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@1,1,3,200000,9307,7.000,1329.5,761.856,925.696,1097.728,1245.701,752.065,7.000,1329.6,0,4096,0.00,0.44,6.592,10.112,6.666,76.40,0.320,90763461,12965691.9,7.000,0.114,7.114,0.012,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.log new file mode 100644 index 000000000..4fd683694 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-disabled-wal0-03-main.log @@ -0,0 +1,27 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-disabled-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=3 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13850858 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3049245 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=26668076 notfound=0 +== point:uniform@8 T=8 ops=26668076 secs= 7.00 ops/s= 3809600 lat us p50=1.97 p99=2.78 p99.9=9.60 max=227.1 mean=2.02 + cpu=56.00s ops/cpu-s=476256 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3015172 ops (+301496 ops/s) +== range:uniform:1@8 T=8 ops=7030631 secs= 7.00 ops/s= 1004344 lat us p50=7.10 p99=11.14 p99.9=19.71 max=95.3 mean=7.91 + cpu=56.00s ops/cpu-s=125556 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.59 p99=10.62 mean=7.46 per-tuple=nan ns deinit mean=0.41 us tuples/s=1004344 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 16992 ops (+1844543618160865792 ops/s) +== range:uniform:10000@8 T=8 ops=23838 secs= 7.00 ops/s= 3405 lat us p50=2260.99 p99=5963.78 p99.9=6094.85 max=6239.6 mean=2349.01 + cpu=56.00s ops/cpu-s=426 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=16.64 mean=10.22 per-tuple=239.5 ns deinit mean=0.76 us tuples/s=33232435 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 9241 ops (+1844417557655151872 ops/s) +close took 0.114 s +== range:uniform:10000@1 T=1 ops=9307 secs= 7.00 ops/s= 1330 lat us p50=761.86 p99=925.70 p99.9=1097.73 max=1245.7 mean=752.07 + cpu=7.00s ops/cpu-s=1330 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.59 p99=10.11 mean=6.67 per-tuple=76.4 ns deinit mean=0.32 us tuples/s=12965692 + insert/run=7.00s drain(close)=0.11s total=7.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.csv new file mode 100644 index 000000000..cde50b599 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.013,15289497.1,nan,nan,nan,0.000,nan,0.062,3235984.1,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15289497.1,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,point:uniform@8,8,0,200000,34486326,7.000,4926481.6,1.520,2.592,6.720,215.468,1.566,55.989,615952.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,8795830,7.000,1256510.3,5.696,8.832,14.720,205.493,6.326,55.997,157077.4,0,0,0.00,0.00,5.312,8.320,5.965,nan,0.323,8795830,1256510.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,38317,7.000,5473.7,1228.800,4161.536,4259.840,4332.152,1461.392,55.996,684.3,0,4096,0.00,0.11,7.232,11.648,7.761,148.92,0.525,373891964,53411363.6,7.000,0.072,7.073,0.012,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.log new file mode 100644 index 000000000..46585a528 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-00-main.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15289497 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3235984 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=34486326 notfound=0 +== point:uniform@8 T=8 ops=34486326 secs= 7.00 ops/s= 4926482 lat us p50=1.52 p99=2.59 p99.9=6.72 max=215.5 mean=1.57 + cpu=55.99s ops/cpu-s=615952 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3799624 ops (+379936 ops/s) +== range:uniform:1@8 T=8 ops=8795830 secs= 7.00 ops/s= 1256510 lat us p50=5.70 p99=8.83 p99.9=14.72 max=205.5 mean=6.33 + cpu=56.00s ops/cpu-s=157077 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.31 p99=8.32 mean=5.97 per-tuple=nan ns deinit mean=0.32 us tuples/s=1256510 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 27463 ops (+1844543462307916800 ops/s) +close took 0.072 s +== range:uniform:10000@8 T=8 ops=38317 secs= 7.00 ops/s= 5474 lat us p50=1228.80 p99=4161.54 p99.9=4259.84 max=4332.2 mean=1461.39 + cpu=56.00s ops/cpu-s=684 rd=0.0 B/op wr=0.1 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.23 p99=11.65 mean=7.76 per-tuple=148.9 ns deinit mean=0.53 us tuples/s=53411364 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.csv new file mode 100644 index 000000000..e1c001005 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.011,18733148.4,nan,nan,nan,0.000,nan,0.050,4035512.5,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,18733148.4,0.011,0.000,0.011,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,1,0,point:uniform@8,8,1,200000,34928175,7.000,4989583.4,1.520,2.144,5.184,210.645,1.539,55.987,623864.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@8,8,1,200000,8301591,7.000,1185895.4,5.824,9.344,15.488,4015.710,6.699,55.986,148278.8,0,0,0.00,0.00,5.440,8.576,6.224,nan,0.431,8301591,1185895.4,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,1,200000,31287,7.000,4469.4,892.928,4521.984,4653.056,4923.024,1789.791,55.998,558.7,0,0,0.00,0.00,5.824,10.624,6.345,182.91,0.535,305045642,43576512.9,7.000,0.065,7.066,0.011,0,311296,nan,207360000,26005504,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.log new file mode 100644 index 000000000..7b46485b4 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-01-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 18733148 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=4035513 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=34928175 notfound=0 +== point:uniform@8 T=8 ops=34928175 secs= 7.00 ops/s= 4989583 lat us p50=1.52 p99=2.14 p99.9=5.18 max=210.6 mean=1.54 + cpu=55.99s ops/cpu-s=623864 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3521113 ops (+352087 ops/s) +== range:uniform:1@8 T=8 ops=8301591 secs= 7.00 ops/s= 1185895 lat us p50=5.82 p99=9.34 p99.9=15.49 max=4015.7 mean=6.70 + cpu=55.99s ops/cpu-s=148279 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.44 p99=8.58 mean=6.22 per-tuple=nan ns deinit mean=0.43 us tuples/s=1185895 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 22415 ops (+1844556037967169792 ops/s) +close took 0.065 s +== range:uniform:10000@8 T=8 ops=31287 secs= 7.00 ops/s= 4469 lat us p50=892.93 p99=4521.98 p99.9=4653.06 max=4923.0 mean=1789.79 + cpu=56.00s ops/cpu-s=559 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.82 p99=10.62 mean=6.35 per-tuple=182.9 ns deinit mean=0.53 us tuples/s=43576513 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=311296 wamp=nan db_apparent=207360000 db_alloc=26005504 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.csv new file mode 100644 index 000000000..409b31408 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.010,19482410.8,nan,nan,nan,0.000,nan,0.044,4512228.1,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,19482410.8,0.010,0.000,0.010,0.000,0,0,nan,0,0,0.005,0,0,0,0,1 +candidate,resident,2,0,point:uniform@8,8,2,200000,31447243,7.000,4492319.2,1.680,2.336,6.848,217.912,1.709,55.993,561629.2,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,2,200000,8161166,7.000,1165847.2,5.824,9.856,19.200,213.200,6.815,55.994,145750.5,0,0,0.00,0.00,5.440,9.344,6.341,nan,0.431,8161166,1165847.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,2,200000,24372,7.000,3481.6,2195.456,3178.496,3375.104,3703.297,2297.487,55.995,435.3,0,0,0.00,0.00,7.360,12.416,7.525,234.65,0.651,237793967,33969267.1,7.000,0.063,7.063,0.012,0,311296,nan,207360000,26005504,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.log new file mode 100644 index 000000000..24ea64c22 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-02-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=2 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 19482411 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.04s ops/cpu-s=4512228 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=31447243 notfound=0 +== point:uniform@8 T=8 ops=31447243 secs= 7.00 ops/s= 4492319 lat us p50=1.68 p99=2.34 p99.9=6.85 max=217.9 mean=1.71 + cpu=55.99s ops/cpu-s=561629 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3520318 ops (+352008 ops/s) +== range:uniform:1@8 T=8 ops=8161166 secs= 7.00 ops/s= 1165847 lat us p50=5.82 p99=9.86 p99.9=19.20 max=213.2 mean=6.82 + cpu=55.99s ops/cpu-s=145750 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.44 p99=9.34 mean=6.34 per-tuple=nan ns deinit mean=0.43 us tuples/s=1165847 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 17303 ops (+1844543929128872192 ops/s) +close took 0.063 s +== range:uniform:10000@8 T=8 ops=24372 secs= 7.00 ops/s= 3482 lat us p50=2195.46 p99=3178.50 p99.9=3375.10 max=3703.3 mean=2297.49 + cpu=56.00s ops/cpu-s=435 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.36 p99=12.42 mean=7.52 per-tuple=234.6 ns deinit mean=0.65 us tuples/s=33969267 + insert/run=7.00s drain(close)=0.06s total=7.06s drain_cpu=0.01s drain_rd=0 drain_wr=311296 wamp=nan db_apparent=207360000 db_alloc=26005504 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.csv new file mode 100644 index 000000000..04a10d73d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.013,15529260.9,nan,nan,nan,0.000,nan,0.058,3448513.7,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15529260.9,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,point:uniform@8,8,3,200000,28523155,7.000,4074604.5,1.808,2.592,15.232,1058.691,1.889,55.968,509634.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,7507099,7.000,1072409.9,6.336,10.624,40.448,1056.212,7.405,55.974,134116.5,0,0,0.00,0.00,6.080,9.856,6.979,nan,0.383,7507099,1072409.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,27142,7.000,3877.3,2015.232,4521.984,4784.128,5422.148,2063.125,55.978,484.9,0,4096,0.00,0.15,8.320,16.256,8.928,210.67,0.638,264716007,37815225.2,7.000,0.071,7.071,0.014,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.log new file mode 100644 index 000000000..8e869259b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-common-wal0-03-main.log @@ -0,0 +1,22 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-common-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=3 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15529261 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3448514 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=28523155 notfound=0 +== point:uniform@8 T=8 ops=28523155 secs= 7.00 ops/s= 4074604 lat us p50=1.81 p99=2.59 p99.9=15.23 max=1058.7 mean=1.89 + cpu=55.97s ops/cpu-s=509634 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3207919 ops (+320770 ops/s) +== range:uniform:1@8 T=8 ops=7507099 secs= 7.00 ops/s= 1072410 lat us p50=6.34 p99=10.62 p99.9=40.45 max=1056.2 mean=7.40 + cpu=55.97s ops/cpu-s=134116 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.08 p99=9.86 mean=6.98 per-tuple=nan ns deinit mean=0.38 us tuples/s=1072410 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 19477 ops (+1844545856911867136 ops/s) +close took 0.071 s +== range:uniform:10000@8 T=8 ops=27142 secs= 7.00 ops/s= 3877 lat us p50=2015.23 p99=4521.98 p99.9=4784.13 max=5422.1 mean=2063.12 + cpu=55.98s ops/cpu-s=485 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.32 p99=16.26 mean=8.93 per-tuple=210.7 ns deinit mean=0.64 us tuples/s=37815225 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.csv new file mode 100644 index 000000000..6e4b5b0b3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.013,15180385.5,nan,nan,nan,0.000,nan,0.064,3131458.6,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15180385.5,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,point:uniform@8,8,0,200000,30550350,7.000,4364191.6,1.712,2.400,5.952,216.281,1.744,55.988,545662.8,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,7410428,7.000,1058596.2,6.592,10.368,19.200,333.864,7.486,55.994,132342.8,0,0,0.00,0.00,6.208,9.856,7.048,nan,0.393,7410428,1058596.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,24647,7.000,3520.9,2523.136,5439.488,5570.560,5749.182,2271.885,56.029,439.9,0,4096,0.00,0.17,7.872,11.904,8.322,231.92,0.582,240395708,34340894.3,7.000,0.066,7.066,0.013,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.log new file mode 100644 index 000000000..95d61e475 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-00-main.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15180385 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3131459 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=30550350 notfound=0 +== point:uniform@8 T=8 ops=30550350 secs= 7.00 ops/s= 4364192 lat us p50=1.71 p99=2.40 p99.9=5.95 max=216.3 mean=1.74 + cpu=55.99s ops/cpu-s=545663 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3131485 ops (+313127 ops/s) +== range:uniform:1@8 T=8 ops=7410428 secs= 7.00 ops/s= 1058596 lat us p50=6.59 p99=10.37 p99.9=19.20 max=333.9 mean=7.49 + cpu=55.99s ops/cpu-s=132343 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.21 p99=9.86 mean=7.05 per-tuple=nan ns deinit mean=0.39 us tuples/s=1058596 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 17568 ops (+1844548961993651968 ops/s) +close took 0.066 s +== range:uniform:10000@8 T=8 ops=24647 secs= 7.00 ops/s= 3521 lat us p50=2523.14 p99=5439.49 p99.9=5570.56 max=5749.2 mean=2271.88 + cpu=56.03s ops/cpu-s=440 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.87 p99=11.90 mean=8.32 per-tuple=231.9 ns deinit mean=0.58 us tuples/s=34340894 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.csv new file mode 100644 index 000000000..e1daa89ac --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.013,15033180.1,nan,nan,nan,0.000,nan,0.071,2813414.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,15033180.1,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +candidate,resident,1,0,point:uniform@8,8,1,200000,29780424,7.000,4254213.6,1.744,2.464,6.848,221.558,1.794,55.991,531876.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@8,8,1,200000,6898659,7.000,985488.4,7.232,11.136,21.760,1252.948,8.046,55.977,123240.7,0,0,0.00,0.00,6.848,10.368,7.565,nan,0.433,6898659,985488.4,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,1,200000,20081,7.000,2868.6,2523.136,5832.704,6094.848,6144.837,2788.353,55.973,358.8,0,4096,0.00,0.20,11.136,20.224,11.590,284.67,0.840,195973719,27995192.2,7.000,0.092,7.092,0.013,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.log new file mode 100644 index 000000000..a7184cc37 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-01-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15033180 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2813414 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=29780424 notfound=0 +== point:uniform@8 T=8 ops=29780424 secs= 7.00 ops/s= 4254214 lat us p50=1.74 p99=2.46 p99.9=6.85 max=221.6 mean=1.79 + cpu=55.99s ops/cpu-s=531877 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 2936734 ops (+293654 ops/s) +== range:uniform:1@8 T=8 ops=6898659 secs= 7.00 ops/s= 985488 lat us p50=7.23 p99=11.14 p99.9=21.76 max=1252.9 mean=8.05 + cpu=55.98s ops/cpu-s=123241 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.85 p99=10.37 mean=7.57 per-tuple=nan ns deinit mean=0.43 us tuples/s=985488 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 14186 ops (+1844539585176579328 ops/s) +close took 0.092 s +== range:uniform:10000@8 T=8 ops=20081 secs= 7.00 ops/s= 2869 lat us p50=2523.14 p99=5832.70 p99.9=6094.85 max=6144.8 mean=2788.35 + cpu=55.97s ops/cpu-s=359 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=11.14 p99=20.22 mean=11.59 per-tuple=284.7 ns deinit mean=0.84 us tuples/s=27995192 + insert/run=7.00s drain(close)=0.09s total=7.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.csv new file mode 100644 index 000000000..419db0ff4 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.016,12397170.9,nan,nan,nan,0.000,nan,0.085,2344528.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12397170.9,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +candidate,resident,2,0,point:uniform@8,8,2,200000,27601969,7.000,3943007.4,1.904,2.592,9.344,387.299,1.932,55.986,493016.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,2,200000,6903681,7.000,986207.5,7.104,11.136,20.736,410.237,8.040,55.991,123300.1,0,0,0.00,0.00,6.720,10.368,7.564,nan,0.428,6903681,986207.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,2,200000,24690,7.000,3527.0,1425.408,5177.344,5308.416,5581.226,2267.755,55.983,441.0,0,4096,0.00,0.17,8.576,14.720,9.184,231.38,0.678,240862887,34407714.6,7.000,0.087,7.087,0.012,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.log new file mode 100644 index 000000000..1c0def622 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-02-candidate.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=2 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12397171 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.09s ops/cpu-s=2344528 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=27601969 notfound=0 +== point:uniform@8 T=8 ops=27601969 secs= 7.00 ops/s= 3943007 lat us p50=1.90 p99=2.59 p99.9=9.34 max=387.3 mean=1.93 + cpu=55.99s ops/cpu-s=493016 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 2954997 ops (+295479 ops/s) +== range:uniform:1@8 T=8 ops=6903681 secs= 7.00 ops/s= 986207 lat us p50=7.10 p99=11.14 p99.9=20.74 max=410.2 mean=8.04 + cpu=55.99s ops/cpu-s=123300 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=10.37 mean=7.56 per-tuple=nan ns deinit mean=0.43 us tuples/s=986207 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 17536 ops (+1844541729299618560 ops/s) +close took 0.087 s +== range:uniform:10000@8 T=8 ops=24690 secs= 7.00 ops/s= 3527 lat us p50=1425.41 p99=5177.34 p99.9=5308.42 max=5581.2 mean=2267.75 + cpu=55.98s ops/cpu-s=441 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.58 p99=14.72 mean=9.18 per-tuple=231.4 ns deinit mean=0.68 us tuples/s=34407715 + insert/run=7.00s drain(close)=0.09s total=7.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.csv new file mode 100644 index 000000000..e54d5b34f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.csv @@ -0,0 +1,5 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.014,13982078.5,nan,nan,nan,0.000,nan,0.066,3050501.0,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13982078.5,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,point:uniform@8,8,3,200000,28203563,7.000,4028951.9,1.840,2.592,8.576,958.781,1.889,55.980,503819.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,7173633,7.000,1024771.4,6.848,10.880,20.224,964.130,7.733,55.991,128121.0,0,0,0.00,0.00,6.336,10.368,7.283,nan,0.406,7173633,1024771.4,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,22408,7.000,3201.0,2195.456,5046.272,5177.344,5376.230,2498.895,55.996,400.2,0,4096,0.00,0.18,8.576,14.464,9.248,255.21,0.693,218558625,31221381.6,7.000,0.066,7.066,0.013,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.log new file mode 100644 index 000000000..fcd956af8 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-nonlexical-wal0-03-main.log @@ -0,0 +1,22 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-nonlexical-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=3 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13982078 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3050501 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=28203563 notfound=0 +== point:uniform@8 T=8 ops=28203563 secs= 7.00 ops/s= 4028952 lat us p50=1.84 p99=2.59 p99.9=8.58 max=958.8 mean=1.89 + cpu=55.98s ops/cpu-s=503819 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3049382 ops (+304917 ops/s) +== range:uniform:1@8 T=8 ops=7173633 secs= 7.00 ops/s= 1024771 lat us p50=6.85 p99=10.88 p99.9=20.22 max=964.1 mean=7.73 + cpu=55.99s ops/cpu-s=128121 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.34 p99=10.37 mean=7.28 per-tuple=nan ns deinit mean=0.41 us tuples/s=1024771 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 15951 ops (+1844546282419055360 ops/s) +close took 0.066 s +== range:uniform:10000@8 T=8 ops=22408 secs= 7.00 ops/s= 3201 lat us p50=2195.46 p99=5046.27 p99.9=5177.34 max=5376.2 mean=2498.90 + cpu=56.00s ops/cpu-s=400 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.58 p99=14.46 mean=9.25 per-tuple=255.2 ns deinit mean=0.69 us tuples/s=31221382 + insert/run=7.00s drain(close)=0.07s total=7.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.csv new file mode 100644 index 000000000..6dc017851 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.013,14860743.3,nan,nan,nan,0.000,nan,0.071,2807096.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14860743.3,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.005,0,0,0,0,2 +main,resident,0,0,point:uniform@8,8,0,200000,26982490,7.000,3854472.2,1.840,2.848,10.368,1551.254,1.916,55.986,481951.4,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:1@8,8,0,200000,7443526,7.000,1063328.2,6.464,10.624,19.200,220.797,7.384,55.993,132937.9,0,0,0.00,0.00,6.080,9.856,6.958,nan,0.383,7443526,1063328.2,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@8,8,0,200000,21743,7.000,3106.0,2260.992,4096.000,4390.912,4618.460,2574.861,55.995,388.3,0,4096,0.00,0.19,9.856,21.248,10.709,262.91,0.746,212077576,30295658.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@1,1,0,200000,8114,7.000,1159.1,860.160,1228.800,1490.944,1873.758,862.545,7.000,1159.1,0,4096,0.00,0.50,7.360,14.976,7.786,87.70,0.399,79069477,11295212.5,7.000,0.087,7.088,0.012,0,307200,nan,237375488,37285888,0.005,0,0,13,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.log new file mode 100644 index 000000000..8d6c62a65 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-00-main.log @@ -0,0 +1,27 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=0 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14860743 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2807096 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=26982490 notfound=0 +== point:uniform@8 T=8 ops=26982490 secs= 7.00 ops/s= 3854472 lat us p50=1.84 p99=2.85 p99.9=10.37 max=1551.3 mean=1.92 + cpu=55.99s ops/cpu-s=481951 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3076381 ops (+307616 ops/s) +== range:uniform:1@8 T=8 ops=7443526 secs= 7.00 ops/s= 1063328 lat us p50=6.46 p99=10.62 p99.9=19.20 max=220.8 mean=7.38 + cpu=55.99s ops/cpu-s=132938 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.08 p99=9.86 mean=6.96 per-tuple=nan ns deinit mean=0.38 us tuples/s=1063328 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 15831 ops (+1844544483744210944 ops/s) +== range:uniform:10000@8 T=8 ops=21743 secs= 7.00 ops/s= 3106 lat us p50=2260.99 p99=4096.00 p99.9=4390.91 max=4618.5 mean=2574.86 + cpu=55.99s ops/cpu-s=388 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.86 p99=21.25 mean=10.71 per-tuple=262.9 ns deinit mean=0.75 us tuples/s=30295658 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 8072 ops (+1844548101755231488 ops/s) +close took 0.087 s +== range:uniform:10000@1 T=1 ops=8114 secs= 7.00 ops/s= 1159 lat us p50=860.16 p99=1228.80 p99.9=1490.94 max=1873.8 mean=862.54 + cpu=7.00s ops/cpu-s=1159 rd=0.0 B/op wr=0.5 B/op violations=0 errors=0 swapin=13 swapout=0 majflt=0 + startup us p50=7.36 p99=14.98 mean=7.79 per-tuple=87.7 ns deinit mean=0.40 us tuples/s=11295213 + insert/run=7.00s drain(close)=0.09s total=7.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.csv new file mode 100644 index 000000000..a0755de8e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.015,13412061.2,nan,nan,nan,0.000,nan,0.067,2992802.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13412061.2,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +candidate,resident,1,0,point:uniform@8,8,1,200000,28806195,7.000,4115031.1,1.744,2.464,8.576,356.632,1.794,55.987,514519.3,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@8,8,1,200000,7638741,7.000,1091214.3,6.336,10.112,18.176,369.979,7.199,55.995,136418.2,0,0,0.00,0.00,5.824,9.344,6.712,nan,0.443,7638741,1091214.3,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,1,200000,23058,7.000,3293.9,2392.064,4096.000,4259.840,4388.360,2428.203,55.995,411.8,0,4096,0.00,0.18,8.320,12.672,8.451,248.05,0.681,225010408,32143094.7,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@1,1,1,200000,8526,7.000,1218.0,843.776,1007.616,1130.496,1309.555,820.923,7.000,1218.0,0,4096,0.00,0.48,6.080,9.088,6.215,83.54,0.400,83105218,11871711.4,7.000,0.077,7.077,0.012,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.log new file mode 100644 index 000000000..2c327585e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-01-candidate.log @@ -0,0 +1,27 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13412061 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2992802 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=28806195 notfound=0 +== point:uniform@8 T=8 ops=28806195 secs= 7.00 ops/s= 4115031 lat us p50=1.74 p99=2.46 p99.9=8.58 max=356.6 mean=1.79 + cpu=55.99s ops/cpu-s=514519 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3230684 ops (+323046 ops/s) +== range:uniform:1@8 T=8 ops=7638741 secs= 7.00 ops/s= 1091214 lat us p50=6.34 p99=10.11 p99.9=18.18 max=370.0 mean=7.20 + cpu=56.00s ops/cpu-s=136418 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.82 p99=9.34 mean=6.71 per-tuple=nan ns deinit mean=0.44 us tuples/s=1091214 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 16412 ops (+1844542870251741696 ops/s) +== range:uniform:10000@8 T=8 ops=23058 secs= 7.00 ops/s= 3294 lat us p50=2392.06 p99=4096.00 p99.9=4259.84 max=4388.4 mean=2428.20 + cpu=55.99s ops/cpu-s=412 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.32 p99=12.67 mean=8.45 per-tuple=248.0 ns deinit mean=0.68 us tuples/s=32143095 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 8437 ops (+1844555909225777920 ops/s) +close took 0.077 s +== range:uniform:10000@1 T=1 ops=8526 secs= 7.00 ops/s= 1218 lat us p50=843.78 p99=1007.62 p99.9=1130.50 max=1309.6 mean=820.92 + cpu=7.00s ops/cpu-s=1218 rd=0.0 B/op wr=0.5 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.08 p99=9.09 mean=6.22 per-tuple=83.5 ns deinit mean=0.40 us tuples/s=11871711 + insert/run=7.00s drain(close)=0.08s total=7.08s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.csv new file mode 100644 index 000000000..569a2877a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.013,14862076.2,nan,nan,nan,0.000,nan,0.060,3344705.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14862076.2,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,2,0,point:uniform@8,8,2,200000,28479639,7.000,4068384.3,1.776,2.528,5.312,81.549,1.816,55.995,508614.7,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,2,200000,7402119,7.000,1057405.9,6.464,10.368,18.176,93.443,7.434,55.997,132187.7,0,0,0.00,0.00,5.952,9.856,6.937,nan,0.453,7402119,1057405.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@8,8,2,200000,26270,7.000,3752.7,1785.856,4390.912,4521.984,5929.434,2131.343,55.995,469.1,0,4096,0.00,0.16,9.344,14.976,9.543,217.38,0.738,256279502,36610039.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,2,200000,9002,7.000,1286.0,794.624,843.776,892.928,1170.252,777.536,6.999,1286.1,0,4096,0.00,0.46,5.696,7.616,5.809,79.15,0.364,87741573,12534026.5,7.000,0.060,7.060,0.011,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.log new file mode 100644 index 000000000..dde7cfa7e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-02-candidate.log @@ -0,0 +1,27 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=2 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14862076 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3344705 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=28479639 notfound=0 +== point:uniform@8 T=8 ops=28479639 secs= 7.00 ops/s= 4068384 lat us p50=1.78 p99=2.53 p99.9=5.31 max=81.5 mean=1.82 + cpu=55.99s ops/cpu-s=508615 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3143215 ops (+314301 ops/s) +== range:uniform:1@8 T=8 ops=7402119 secs= 7.00 ops/s= 1057406 lat us p50=6.46 p99=10.37 p99.9=18.18 max=93.4 mean=7.43 + cpu=56.00s ops/cpu-s=132188 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.95 p99=9.86 mean=6.94 per-tuple=nan ns deinit mean=0.45 us tuples/s=1057406 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 18687 ops (+1844547853311336448 ops/s) +== range:uniform:10000@8 T=8 ops=26270 secs= 7.00 ops/s= 3753 lat us p50=1785.86 p99=4390.91 p99.9=4521.98 max=5929.4 mean=2131.34 + cpu=56.00s ops/cpu-s=469 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=14.98 mean=9.54 per-tuple=217.4 ns deinit mean=0.74 us tuples/s=36610039 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 8939 ops (+1844549111761164800 ops/s) +close took 0.060 s +== range:uniform:10000@1 T=1 ops=9002 secs= 7.00 ops/s= 1286 lat us p50=794.62 p99=843.78 p99.9=892.93 max=1170.3 mean=777.54 + cpu=7.00s ops/cpu-s=1286 rd=0.0 B/op wr=0.5 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.70 p99=7.62 mean=5.81 per-tuple=79.1 ns deinit mean=0.36 us tuples/s=12534027 + insert/run=7.00s drain(close)=0.06s total=7.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.csv new file mode 100644 index 000000000..dddad215d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.csv @@ -0,0 +1,6 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.012,16044167.7,nan,nan,nan,0.000,nan,0.059,3382492.2,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,16044167.7,0.012,0.000,0.012,0.000,0,0,nan,0,0,0.005,0,0,0,0,2 +main,resident,3,0,point:uniform@8,8,3,200000,29159424,7.000,4165500.4,1.744,2.400,5.184,95.040,1.781,55.996,520741.1,0,0,0.00,0.00,nan,nan,nan,nan,nan,0,0.0,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:1@8,8,3,200000,7648380,7.000,1092590.9,6.336,10.112,18.176,223.730,7.197,55.995,136591.3,0,0,0.00,0.00,5.952,9.600,6.779,nan,0.375,7648380,1092590.9,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,24394,7.000,3484.7,2129.920,5439.488,5701.632,5893.065,2295.374,55.994,435.7,0,4096,0.00,0.17,8.320,14.720,8.916,234.44,0.618,237955654,33992453.5,7.000,0.000,7.000,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@1,1,3,200000,9296,7.000,1328.0,761.856,811.008,827.392,846.292,752.921,7.000,1328.0,0,4096,0.00,0.44,5.696,7.232,5.777,76.59,0.314,90659099,12950992.4,7.000,0.055,7.055,0.007,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.log new file mode 100644 index 000000000..e21ad9830 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/reads/resident-random-wal0-03-main.log @@ -0,0 +1,27 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/reads-resident-random-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=7.0 warmup=1.0 rep=3 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 16044168 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3382492 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase point:uniform@8: T=8 dist=uniform (fixed duration) + found=29159424 notfound=0 +== point:uniform@8 T=8 ops=29159424 secs= 7.00 ops/s= 4165500 lat us p50=1.74 p99=2.40 p99.9=5.18 max=95.0 mean=1.78 + cpu=56.00s ops/cpu-s=520741 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 3290220 ops (+328999 ops/s) +== range:uniform:1@8 T=8 ops=7648380 secs= 7.00 ops/s= 1092591 lat us p50=6.34 p99=10.11 p99.9=18.18 max=223.7 mean=7.20 + cpu=55.99s ops/cpu-s=136591 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.95 p99=9.60 mean=6.78 per-tuple=nan ns deinit mean=0.38 us tuples/s=1092591 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 17416 ops (+1844541273177337088 ops/s) +== range:uniform:10000@8 T=8 ops=24394 secs= 7.00 ops/s= 3485 lat us p50=2129.92 p99=5439.49 p99.9=5701.63 max=5893.1 mean=2295.37 + cpu=55.99s ops/cpu-s=436 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.32 p99=14.72 mean=8.92 per-tuple=234.4 ns deinit mean=0.62 us tuples/s=33992453 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 9237 ops (+1844493111958530304 ops/s) +close took 0.055 s +== range:uniform:10000@1 T=1 ops=9296 secs= 7.00 ops/s= 1328 lat us p50=761.86 p99=811.01 p99.9=827.39 max=846.3 mean=752.92 + cpu=7.00s ops/cpu-s=1328 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.70 p99=7.23 mean=5.78 per-tuple=76.6 ns deinit mean=0.31 us tuples/s=12950992 + insert/run=7.00s drain(close)=0.06s total=7.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat-progress.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat-progress.log new file mode 100644 index 000000000..9d12c8da0 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat-progress.log @@ -0,0 +1,24 @@ +resident-common-wal0-00-main +resident-common-wal0-01-candidate +resident-common-wal0-02-candidate +resident-common-wal0-03-main +resident-common-wal0-04-main +resident-common-wal0-05-candidate +resident-common-disabled-wal0-00-main +resident-common-disabled-wal0-01-candidate +resident-common-disabled-wal0-02-candidate +resident-common-disabled-wal0-03-main +resident-common-disabled-wal0-04-main +resident-common-disabled-wal0-05-candidate +resident-nonlexical-wal0-00-main +resident-nonlexical-wal0-01-candidate +resident-nonlexical-wal0-02-candidate +resident-nonlexical-wal0-03-main +resident-nonlexical-wal0-04-main +resident-nonlexical-wal0-05-candidate +resident-random-wal1-00-main +resident-random-wal1-01-candidate +resident-random-wal1-02-candidate +resident-random-wal1-03-main +resident-random-wal1-04-main +resident-random-wal1-05-candidate diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/manifest.json b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/manifest.json new file mode 100644 index 000000000..f92042003 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/manifest.json @@ -0,0 +1,2282 @@ +{ + "mode": "repeat", + "started": 1792008536.1936128, + "complete": true, + "runner_sha256": "eef41a21f8c4275c300fa24ed69b457b233c8ee0a470926d84c3f5ea755ebd25", + "build_json_sha256": "7bed995652687ea945106e764423ed445b4573d79dc5973b77f05c3cfda0051b", + "builds": { + "main": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main", + "commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "MAKEFLAGS=B -j8 --jobserver-auth=fifo:/tmp/prefix-main-build-6105c49f/GMfifo3 -- GIT_VERSION=6105c49f BUILD_MODE=release\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557" + } + }, + "candidate": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "BUILD_ROOT=build-main-6105c49f\nMAKEFLAGS= -j6 --jobserver-auth=fifo:/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-build-xn10vunh/GMfifo3 -- BUILD_MODE=release BUILD_ROOT=build-main-6105c49f\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a" + } + } + }, + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix]", + "database_directory": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases", + "io": "O_DIRECT", + "fixture_copy": "cp --reflink=auto --sparse=always, then fsync", + "cpu_affinity": "0-11", + "platform": "Linux-6.12.107+deb13-amd64-x86_64-with-glibc2.41", + "available_cpu_affinity": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19 + ], + "loadavg_start": [ + 0.64990234375, + 4.107421875, + 4.6240234375 + ], + "environment": { + "PREFIX_PATTERN": "per case", + "PREFIX_DISABLE": "unset except candidate disabled case", + "KVBENCH_STATS_BEFORE_CLOSE": "1 for fixture creation only" + }, + "coordination": "Caller holds exclusive campaign benchmark and machine locks", + "seconds": 15, + "warmup_seconds": 1, + "seed": 42, + "loading_threads": 1, + "background_workers": 0, + "memtable_mib": 4, + "verification": "Every query verifies key/value or ordered range; overwrite validates up to 4096 measured keys per worker after timing", + "runs": [ + { + "label": "resident-common-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8" + ], + "started": 1792008536.230394, + "log": "repeat/resident-common-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008552.3397408, + "log_sha256": "9d74b741e4d3d5940f44b653368abd6d6dd1184efa9eb244510219b225cee89e", + "process_cpu_s": 128.0728, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-common", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.03479290008544922, + "csv": "repeat/resident-common-wal0-00-main.csv", + "csv_sha256": "a323a479c67e4b37c49c529f69f84b1c225ad647f75cf2e2cd02c86bd6f09c7b", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8" + ], + "started": 1792008552.386048, + "log": "repeat/resident-common-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008568.5520551, + "log_sha256": "74c720df6a01c75d822581d83e642a56d379a842fa2b31ed521e3c6c0a6ee639", + "process_cpu_s": 128.05081199999998, + "process_read_bytes": 25186304, + "process_write_bytes": 319488, + "case": "resident-common", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-common-wal0", + "fixture_sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "copy_fsynced": true, + "copy_seconds": 0.041246652603149414, + "csv": "repeat/resident-common-wal0-01-candidate.csv", + "csv_sha256": "cf8483e031da6019e49cdc7d602bc4b1798325c61dd8b75fbb8009cd9cf109dd", + "allocated_bytes": 26005504, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8" + ], + "started": 1792008568.6021614, + "log": "repeat/resident-common-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008584.7648644, + "log_sha256": "812ad5cccd0d1d48ee63f5e0086ea7a704c7cde4696347ee466853db52307260", + "process_cpu_s": 128.129237, + "process_read_bytes": 25186304, + "process_write_bytes": 319488, + "case": "resident-common", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-common-wal0", + "fixture_sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "copy_fsynced": true, + "copy_seconds": 0.04519963264465332, + "csv": "repeat/resident-common-wal0-02-candidate.csv", + "csv_sha256": "af9695604a897972617619a8ee44a2f44fb2f6fe670fd8bd55cc647e8e2ab39a", + "allocated_bytes": 26005504, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8" + ], + "started": 1792008584.8261185, + "log": "repeat/resident-common-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008600.9893806, + "log_sha256": "27d7f026975bcfb13b1a50eeea44368690a3ed2d852ff7acb3662cd6913c8b2c", + "process_cpu_s": 128.06322000000006, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-common", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.0565950870513916, + "csv": "repeat/resident-common-wal0-03-main.csv", + "csv_sha256": "2526a3ecc08aa410ca42eac5e6b39eaae5cbd4679ea13e882fac1159d2ca64c7", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-04-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-04-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "4", + "--rep", + "4", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8" + ], + "started": 1792008601.0523083, + "log": "repeat/resident-common-wal0-04-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008617.2169607, + "log_sha256": "5315dce232e14a786f7f77ba29c5fdffb58b8cf12c8273d7755657db9b42bca0", + "process_cpu_s": 128.07915600000004, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-common", + "wal": 0, + "index": 4, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.05785250663757324, + "csv": "repeat/resident-common-wal0-04-main.csv", + "csv_sha256": "8bafb4930714708a243a3809ca309bd28a500714c68d6227ac03380d3abe162e", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-05-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-05-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "5", + "--rep", + "5", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8" + ], + "started": 1792008617.2621, + "log": "repeat/resident-common-wal0-05-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008633.4282928, + "log_sha256": "721765ff935fff4d2d709d033e08b97ea9fcd49aea238dfab96d291603378454", + "process_cpu_s": 128.07077999999998, + "process_read_bytes": 25186304, + "process_write_bytes": 327680, + "case": "resident-common", + "wal": 0, + "index": 5, + "fixture_key": "candidate-resident-common-wal0", + "fixture_sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "copy_fsynced": true, + "copy_seconds": 0.039354562759399414, + "csv": "repeat/resident-common-wal0-05-candidate.csv", + "csv_sha256": "001c62c8a025301cf1019d33b3a27d29d1bd5333ca20f86a646e25d69ca3dd8e", + "allocated_bytes": 26005504, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-disabled-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008633.4710393, + "log": "repeat/resident-common-disabled-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008665.641664, + "log_sha256": "002520c83d570ce327d30066a88c62f665c051ee3c97954f8cf48253fcfa6eea", + "process_cpu_s": 144.07882900000013, + "process_read_bytes": 36466688, + "process_write_bytes": 327680, + "case": "resident-common-disabled", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.038526296615600586, + "csv": "repeat/resident-common-disabled-wal0-00-main.csv", + "csv_sha256": "9fe54f133e773c9f9301e9646d4a5707690b3f9ebbdad03601ce75073347cb8d", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 3 + }, + { + "label": "resident-common-disabled-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008665.680968, + "log": "repeat/resident-common-disabled-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": true, + "verified": true, + "returncode": 0, + "finished": 1792008697.8540845, + "log_sha256": "c0385c0e382d4e2a877dc4dc6173be1a026b2272596fdbc902d87cd15daa9c1d", + "process_cpu_s": 144.07393200000007, + "process_read_bytes": 36466688, + "process_write_bytes": 331776, + "case": "resident-common-disabled", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-common-wal0-disabled", + "fixture_sha256": "4548a1692b739e986afcc4af4a4824db55c941c2fea98ed5edb8389fcc33d60f", + "copy_fsynced": true, + "copy_seconds": 0.03453993797302246, + "csv": "repeat/resident-common-disabled-wal0-01-candidate.csv", + "csv_sha256": "3fdfb925c730123a027ca7ed7d8a9c9e28bfc5119b51ae3b5d3efa69b1e2e176", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 3 + }, + { + "label": "resident-common-disabled-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008697.911381, + "log": "repeat/resident-common-disabled-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": true, + "verified": true, + "returncode": 0, + "finished": 1792008730.07609, + "log_sha256": "ebe74feaf307f9f375c86c85fe3213e8ee447d55439152e7af0e838f6409547e", + "process_cpu_s": 144.081577, + "process_read_bytes": 36466688, + "process_write_bytes": 331776, + "case": "resident-common-disabled", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-common-wal0-disabled", + "fixture_sha256": "4548a1692b739e986afcc4af4a4824db55c941c2fea98ed5edb8389fcc33d60f", + "copy_fsynced": true, + "copy_seconds": 0.05236697196960449, + "csv": "repeat/resident-common-disabled-wal0-02-candidate.csv", + "csv_sha256": "cee0086f84e23c1a2158e7dff736792be3cce6870706433bd9a6ae6830ad66ff", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 3 + }, + { + "label": "resident-common-disabled-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008730.132384, + "log": "repeat/resident-common-disabled-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008762.3020496, + "log_sha256": "67ee844e56716da0f3d3000edc0092023ae1e2941b47c7ea032fbb078ef9d3e6", + "process_cpu_s": 144.0842169999999, + "process_read_bytes": 36466688, + "process_write_bytes": 331776, + "case": "resident-common-disabled", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.051222801208496094, + "csv": "repeat/resident-common-disabled-wal0-03-main.csv", + "csv_sha256": "0162193328ccea413381a7e0c1f6621a7753e679cb9e4171600a8b736961c623", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 3 + }, + { + "label": "resident-common-disabled-wal0-04-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-04-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "4", + "--rep", + "4", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008762.3447998, + "log": "repeat/resident-common-disabled-wal0-04-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008794.45783, + "log_sha256": "8dc96d326e54f7882cbb11b3fd9947e76ea38a009d0ab76360d62df6a7511e2c", + "process_cpu_s": 144.0725669999999, + "process_read_bytes": 36466688, + "process_write_bytes": 331776, + "case": "resident-common-disabled", + "wal": 0, + "index": 4, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.03707075119018555, + "csv": "repeat/resident-common-disabled-wal0-04-main.csv", + "csv_sha256": "9b30bbe912a7b68b8e8cbc25a3cbaeec6f00fdccba19043ea6c150db677363f6", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 3 + }, + { + "label": "resident-common-disabled-wal0-05-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-05-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "5", + "--rep", + "5", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:10000@8", + "range:uniform:10000@1" + ], + "started": 1792008794.4947383, + "log": "repeat/resident-common-disabled-wal0-05-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": true, + "verified": true, + "returncode": 0, + "finished": 1792008826.6097443, + "log_sha256": "94fcf2ee4788c60a0c3f6b43a3dc54a8a94e2aaea070c4226cc8da9f9e3e8fa6", + "process_cpu_s": 144.08061300000023, + "process_read_bytes": 36466688, + "process_write_bytes": 331776, + "case": "resident-common-disabled", + "wal": 0, + "index": 5, + "fixture_key": "candidate-resident-common-wal0-disabled", + "fixture_sha256": "4548a1692b739e986afcc4af4a4824db55c941c2fea98ed5edb8389fcc33d60f", + "copy_fsynced": true, + "copy_seconds": 0.03179478645324707, + "csv": "repeat/resident-common-disabled-wal0-05-candidate.csv", + "csv_sha256": "5ad76bdf608baabea95ff81d4cb96ff67a4d748e8866b6f1b3bb3e2b6ec39db1", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 3 + }, + { + "label": "resident-nonlexical-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:1@8" + ], + "started": 1792008826.671003, + "log": "repeat/resident-nonlexical-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008842.7852273, + "log_sha256": "005f144b9cf2f543a9813058e83cb62d01c4c115572e98b150dcf1a6606009e7", + "process_cpu_s": 128.0575809999998, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-nonlexical", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-nonlexical-wal0", + "fixture_sha256": "4ef44377d809c43746059d57e04cc593f0d2dc083e3e853f8422244d24fee6f3", + "copy_fsynced": true, + "copy_seconds": 0.05597829818725586, + "csv": "repeat/resident-nonlexical-wal0-00-main.csv", + "csv_sha256": "db116e20d99bdd1f4b81828827e92f57c6fb870b8fdda2299565d7d9dbcdd892", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-nonlexical-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:1@8" + ], + "started": 1792008842.8527777, + "log": "repeat/resident-nonlexical-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008859.0163403, + "log_sha256": "01c5a8a499abec0ae0653287ef35b0dc9d8c91fd0ab9356eb19e91149ca2952b", + "process_cpu_s": 128.09087599999995, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-nonlexical", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-nonlexical-wal0", + "fixture_sha256": "7d5571d7c9b6c34ce64fb3f264e3e8a775eddacafceac2b253076f7257635b05", + "copy_fsynced": true, + "copy_seconds": 0.06180691719055176, + "csv": "repeat/resident-nonlexical-wal0-01-candidate.csv", + "csv_sha256": "7cb8ecb9dd462b9ced6887126f8c1e37bfddc9101c425e182f4aacc123fe49d7", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-nonlexical-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:1@8" + ], + "started": 1792008859.0676532, + "log": "repeat/resident-nonlexical-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008875.185679, + "log_sha256": "c17afae1883991a075247ee5b8e67b1c5c4f4372a6faee968850ae59b7050e0d", + "process_cpu_s": 128.0722819999999, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-nonlexical", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-nonlexical-wal0", + "fixture_sha256": "7d5571d7c9b6c34ce64fb3f264e3e8a775eddacafceac2b253076f7257635b05", + "copy_fsynced": true, + "copy_seconds": 0.037954092025756836, + "csv": "repeat/resident-nonlexical-wal0-02-candidate.csv", + "csv_sha256": "5ba11ef2ae3185736bfaefec9592fef78f886078aee4d3bfffeafd4c695d4379", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-nonlexical-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:1@8" + ], + "started": 1792008875.2274456, + "log": "repeat/resident-nonlexical-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008891.3422315, + "log_sha256": "e64af14daa924295b8fbecdf4907984a0962c743183054e11434ee10a15104b2", + "process_cpu_s": 128.08311400000014, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-nonlexical", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-nonlexical-wal0", + "fixture_sha256": "4ef44377d809c43746059d57e04cc593f0d2dc083e3e853f8422244d24fee6f3", + "copy_fsynced": true, + "copy_seconds": 0.03649258613586426, + "csv": "repeat/resident-nonlexical-wal0-03-main.csv", + "csv_sha256": "227b6564a581db01be822c9b80198b203affcada4b8e7396b638891cd89bc3a6", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-nonlexical-wal0-04-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-04-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "4", + "--rep", + "4", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:1@8" + ], + "started": 1792008891.3836527, + "log": "repeat/resident-nonlexical-wal0-04-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008907.482307, + "log_sha256": "60392997587535e056a61800fe9acbc575802c5a1d6fa839300b3463c1aea704", + "process_cpu_s": 128.05579900000018, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-nonlexical", + "wal": 0, + "index": 4, + "fixture_key": "main-resident-nonlexical-wal0", + "fixture_sha256": "4ef44377d809c43746059d57e04cc593f0d2dc083e3e853f8422244d24fee6f3", + "copy_fsynced": true, + "copy_seconds": 0.036432743072509766, + "csv": "repeat/resident-nonlexical-wal0-04-main.csv", + "csv_sha256": "ba919ea95ac9a2c668a925c4cf4a055085eee2b2c45f80008523448bf248a116", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-nonlexical-wal0-05-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-05-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "5", + "--rep", + "5", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "range:uniform:1@8" + ], + "started": 1792008907.5250237, + "log": "repeat/resident-nonlexical-wal0-05-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "nonlexical", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008923.6404123, + "log_sha256": "f415a8ec1c9ee38a69caf48c5bb69666839a81d6221c2d39a150de6fdfa9f588", + "process_cpu_s": 128.07235300000002, + "process_read_bytes": 36466688, + "process_write_bytes": 319488, + "case": "resident-nonlexical", + "wal": 0, + "index": 5, + "fixture_key": "candidate-resident-nonlexical-wal0", + "fixture_sha256": "7d5571d7c9b6c34ce64fb3f264e3e8a775eddacafceac2b253076f7257635b05", + "copy_fsynced": true, + "copy_seconds": 0.03870701789855957, + "csv": "repeat/resident-nonlexical-wal0-05-candidate.csv", + "csv_sha256": "dfb51a9bebd037afe9e57b60fecca4e3ac21b33c8a81f3c8d4e37fcee7c7187a", + "allocated_bytes": 37285888, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "ow:uniform@8" + ], + "started": 1792008923.7137616, + "log": "repeat/resident-random-wal1-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008940.3105943, + "log_sha256": "30178660f06c3073c97a08ad06aa25e34c8efb6bf29f52d51de46bb6182b2aaa", + "process_cpu_s": 66.88682399999993, + "process_read_bytes": 2701103104, + "process_write_bytes": 7211802624, + "case": "resident-random", + "wal": 1, + "index": 0, + "fixture_key": "main-resident-random-wal1", + "fixture_sha256": "7ee03b7eebb20d952f90527ff4622769833d9b849d0444ce08d528f3255fdcd1", + "copy_fsynced": true, + "copy_seconds": 0.06750607490539551, + "csv": "repeat/resident-random-wal1-00-main.csv", + "csv_sha256": "7f5767c3438605e808598c64e6d807b3706faff207b433be4a3b00305919f27b", + "allocated_bytes": 5274365952, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "ow:uniform@8" + ], + "started": 1792008940.4788888, + "log": "repeat/resident-random-wal1-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008957.127607, + "log_sha256": "964441dc228b89dc2fbd9e6adb8b797b4b9fcdd4cf899b6cebbb04f983822be9", + "process_cpu_s": 58.41632000000004, + "process_read_bytes": 2246316032, + "process_write_bytes": 6091640832, + "case": "resident-random", + "wal": 1, + "index": 1, + "fixture_key": "candidate-resident-random-wal1", + "fixture_sha256": "0327d5f0ced6cd12906480fdadec36abb6519d35948adcd8e1edde6411ad5451", + "copy_fsynced": true, + "copy_seconds": 0.12560391426086426, + "csv": "repeat/resident-random-wal1-01-candidate.csv", + "csv_sha256": "7a28f13ef145ce27905a56b79b7425349b730ab022ac15fe10313e7b0907ac75", + "allocated_bytes": 4774494208, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "ow:uniform@8" + ], + "started": 1792008957.3144195, + "log": "repeat/resident-random-wal1-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008974.2642555, + "log_sha256": "d36bebbbe057870c8693490ca21b9a28db6f0d53a26fcf68947a100ef927beb7", + "process_cpu_s": 53.92103999999958, + "process_read_bytes": 2196725760, + "process_write_bytes": 5686362112, + "case": "resident-random", + "wal": 1, + "index": 2, + "fixture_key": "candidate-resident-random-wal1", + "fixture_sha256": "0327d5f0ced6cd12906480fdadec36abb6519d35948adcd8e1edde6411ad5451", + "copy_fsynced": true, + "copy_seconds": 0.13734865188598633, + "csv": "repeat/resident-random-wal1-02-candidate.csv", + "csv_sha256": "e5342aaac8d4c6e0286d63d3c5bf9e87cc96adf83bb06a9e480ad81ab3854bca", + "allocated_bytes": 4548698112, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "ow:uniform@8" + ], + "started": 1792008974.3924441, + "log": "repeat/resident-random-wal1-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008991.090764, + "log_sha256": "d52af34d3ad1f6deeccca8bbbb06b29436b1a57bbb052bb46d7079b07f71bf70", + "process_cpu_s": 55.18639999999992, + "process_read_bytes": 2213904384, + "process_write_bytes": 5866754048, + "case": "resident-random", + "wal": 1, + "index": 3, + "fixture_key": "main-resident-random-wal1", + "fixture_sha256": "7ee03b7eebb20d952f90527ff4622769833d9b849d0444ce08d528f3255fdcd1", + "copy_fsynced": true, + "copy_seconds": 0.08330559730529785, + "csv": "repeat/resident-random-wal1-03-main.csv", + "csv_sha256": "176fa7dfc1b46711c184f3176e0abfc6383f5fecb5aaea1c6233e9dae2af78f8", + "allocated_bytes": 4623142912, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-04-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-04-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "4", + "--rep", + "4", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "ow:uniform@8" + ], + "started": 1792008991.2883081, + "log": "repeat/resident-random-wal1-04-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792009007.990247, + "log_sha256": "0ce1b25f46107ef015890b7aca921feff987151243a9d13e795a93679a63e25c", + "process_cpu_s": 51.18367599999975, + "process_read_bytes": 1871532032, + "process_write_bytes": 5303672832, + "case": "resident-random", + "wal": 1, + "index": 4, + "fixture_key": "main-resident-random-wal1", + "fixture_sha256": "7ee03b7eebb20d952f90527ff4622769833d9b849d0444ce08d528f3255fdcd1", + "copy_fsynced": true, + "copy_seconds": 0.11603474617004395, + "csv": "repeat/resident-random-wal1-04-main.csv", + "csv_sha256": "e759bd33d02cde7db44e8144e4e117a45901fb4248e29a09cfaa9e5fcda89975", + "allocated_bytes": 4363235328, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-05-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-05-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "15", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "5", + "--rep", + "5", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/repeat", + "warm", + "ow:uniform@8" + ], + "started": 1792009008.1666212, + "log": "repeat/resident-random-wal1-05-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792009025.1668036, + "log_sha256": "984e84da6d034fbb14c95c5b8b16489aeb768c2de08475af8bacc84c55d75d9e", + "process_cpu_s": 53.309396999999876, + "process_read_bytes": 2053611520, + "process_write_bytes": 5625188352, + "case": "resident-random", + "wal": 1, + "index": 5, + "fixture_key": "candidate-resident-random-wal1", + "fixture_sha256": "0327d5f0ced6cd12906480fdadec36abb6519d35948adcd8e1edde6411ad5451", + "copy_fsynced": true, + "copy_seconds": 0.13552331924438477, + "csv": "repeat/resident-random-wal1-05-candidate.csv", + "csv_sha256": "33f603888a3ec5159946905d57f2d88a021929d84ef93d73f0759f61ef091055", + "allocated_bytes": 4508598272, + "errors": 0, + "violations": 0, + "phase_count": 2 + } + ], + "followup_sha256": "d7729a74af101dc8ce0c4d1f5c301c9326094568c7f12ab9cfaa21e617c292bc", + "selection": "Adverse initial results: common long scans, disabled long scans, nonlexical short scans, logged random overwrites", + "order": [ + "main", + "candidate", + "candidate", + "main", + "main", + "candidate" + ], + "cases": [ + [ + "resident-common", + 0, + [ + "warm", + "range:uniform:10000@8" + ] + ], + [ + "resident-common-disabled", + 0, + [ + "warm", + "range:uniform:10000@8", + "range:uniform:10000@1" + ] + ], + [ + "resident-nonlexical", + 0, + [ + "warm", + "range:uniform:1@8" + ] + ], + [ + "resident-random", + 1, + [ + "warm", + "ow:uniform@8" + ] + ] + ], + "finished": 1792009025.2189007 +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.csv new file mode 100644 index 000000000..ceb77cb8a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.csv @@ -0,0 +1,4 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.015,13493847.1,nan,nan,nan,0.000,nan,0.070,2859430.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13493847.1,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,2 +main,resident,0,0,range:uniform:10000@8,8,0,200000,50483,15.000,3365.5,2326.528,3440.640,3768.320,4456.112,2376.945,119.976,420.8,0,0,0.00,0.00,8.832,15.232,9.074,242.65,0.670,492447776,32829345.7,15.000,0.000,15.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,range:uniform:10000@1,1,0,200000,20020,15.000,1334.6,761.856,843.776,1007.616,1182.304,749.186,14.998,1334.9,0,4096,0.00,0.20,6.336,8.320,6.381,76.11,0.329,195333995,13022041.9,15.000,0.136,15.136,0.012,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.log new file mode 100644 index 000000000..b9094316c --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-00-main.log @@ -0,0 +1,19 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=0 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13493847 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2859430 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 37070 ops (+3707 ops/s) +== range:uniform:10000@8 T=8 ops=50483 secs= 15.00 ops/s= 3365 lat us p50=2326.53 p99=3440.64 p99.9=3768.32 max=4456.1 mean=2376.95 + cpu=119.98s ops/cpu-s=421 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.83 p99=15.23 mean=9.07 per-tuple=242.6 ns deinit mean=0.67 us tuples/s=32829346 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 6471 ops (+1844491205495355392 ops/s) + [range:uniform:10000@1] progress 19902 ops (+1343 ops/s) +close took 0.136 s +== range:uniform:10000@1 T=1 ops=20020 secs= 15.00 ops/s= 1335 lat us p50=761.86 p99=843.78 p99.9=1007.62 max=1182.3 mean=749.19 + cpu=15.00s ops/cpu-s=1335 rd=0.0 B/op wr=0.2 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.34 p99=8.32 mean=6.38 per-tuple=76.1 ns deinit mean=0.33 us tuples/s=13022042 + insert/run=15.00s drain(close)=0.14s total=15.14s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.csv new file mode 100644 index 000000000..1c506c9cf --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.csv @@ -0,0 +1,4 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.014,13885125.4,nan,nan,nan,0.000,nan,0.067,2964719.8,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13885125.4,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,1,200000,57328,15.000,3821.8,2048.000,4161.536,4390.912,4722.230,2093.010,119.980,477.8,0,0,0.00,0.00,8.576,14.464,8.824,213.54,0.623,559279346,37284603.0,15.000,0.000,15.000,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@1,1,1,200000,20597,15.000,1373.1,745.472,827.392,974.848,1317.012,728.204,15.000,1373.2,0,8192,0.00,0.40,6.080,8.128,6.137,73.97,0.338,200968062,13397625.6,15.000,0.114,15.115,0.012,0,307200,nan,237375488,37285888,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.log new file mode 100644 index 000000000..2d28a4811 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-01-candidate.log @@ -0,0 +1,19 @@ +prefix-pattern=common key_bytes=64 compression_disabled=true +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=1 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13885125 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2964720 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 42213 ops (+4221 ops/s) +== range:uniform:10000@8 T=8 ops=57328 secs= 15.00 ops/s= 3822 lat us p50=2048.00 p99=4161.54 p99.9=4390.91 max=4722.2 mean=2093.01 + cpu=119.98s ops/cpu-s=478 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.58 p99=14.46 mean=8.82 per-tuple=213.5 ns deinit mean=0.62 us tuples/s=37284603 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 6661 ops (+1844451495816534272 ops/s) + [range:uniform:10000@1] progress 20482 ops (+1382 ops/s) +close took 0.114 s +== range:uniform:10000@1 T=1 ops=20597 secs= 15.00 ops/s= 1373 lat us p50=745.47 p99=827.39 p99.9=974.85 max=1317.0 mean=728.20 + cpu=15.00s ops/cpu-s=1373 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.08 p99=8.13 mean=6.14 per-tuple=74.0 ns deinit mean=0.34 us tuples/s=13397626 + insert/run=15.00s drain(close)=0.11s total=15.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.csv new file mode 100644 index 000000000..ee3852060 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.csv @@ -0,0 +1,4 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.015,13466847.2,nan,nan,nan,0.000,nan,0.063,3156117.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13466847.2,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,1 +candidate,resident,2,0,range:uniform:10000@8,8,2,200000,57800,15.000,3853.3,2129.920,5177.344,5177.344,5722.765,2075.956,119.988,481.7,0,0,0.00,0.00,7.872,14.720,8.684,211.89,0.655,563824699,37587699.6,15.000,0.000,15.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:10000@1,1,2,200000,20718,15.000,1381.2,745.472,811.008,860.160,889.337,723.966,15.000,1381.2,0,8192,0.00,0.40,5.952,7.616,6.048,73.55,0.345,202150554,13476467.8,15.000,0.113,15.113,0.013,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.log new file mode 100644 index 000000000..af867700f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-02-candidate.log @@ -0,0 +1,19 @@ +prefix-pattern=common key_bytes=64 compression_disabled=true +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=2 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13466847 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3156117 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 42562 ops (+4256 ops/s) +== range:uniform:10000@8 T=8 ops=57800 secs= 15.00 ops/s= 3853 lat us p50=2129.92 p99=5177.34 p99.9=5177.34 max=5722.8 mean=2075.96 + cpu=119.99s ops/cpu-s=482 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.87 p99=14.72 mean=8.68 per-tuple=211.9 ns deinit mean=0.65 us tuples/s=37587700 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 6729 ops (+1844551003588619520 ops/s) + [range:uniform:10000@1] progress 20625 ops (+1390 ops/s) +close took 0.113 s +== range:uniform:10000@1 T=1 ops=20718 secs= 15.00 ops/s= 1381 lat us p50=745.47 p99=811.01 p99.9=860.16 max=889.3 mean=723.97 + cpu=15.00s ops/cpu-s=1381 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.95 p99=7.62 mean=6.05 per-tuple=73.6 ns deinit mean=0.35 us tuples/s=13476468 + insert/run=15.00s drain(close)=0.11s total=15.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.csv new file mode 100644 index 000000000..7251bba40 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.csv @@ -0,0 +1,4 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.015,13696165.8,nan,nan,nan,0.000,nan,0.065,3070734.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13696165.8,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,57619,15.000,3841.2,2129.920,5046.272,5308.416,5393.067,2082.572,119.986,480.2,0,0,0.00,0.00,8.128,14.720,8.823,212.52,0.643,561947415,37462479.3,15.000,0.000,15.000,0.000,0,0,nan,0,0,0.007,0,0,7,0,0 +main,resident,3,0,range:uniform:10000@1,1,3,200000,20108,15.000,1340.5,761.856,925.696,1359.872,1573.980,745.936,14.999,1340.6,0,8192,0.00,0.41,6.208,10.880,6.390,75.77,0.335,196192286,13079257.1,15.000,0.107,15.107,0.012,0,307200,nan,237375488,37285888,0.007,0,0,2,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.log new file mode 100644 index 000000000..77ccf4cce --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-03-main.log @@ -0,0 +1,19 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=3 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13696166 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3070734 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 42391 ops (+4239 ops/s) +== range:uniform:10000@8 T=8 ops=57619 secs= 15.00 ops/s= 3841 lat us p50=2129.92 p99=5046.27 p99.9=5308.42 max=5393.1 mean=2082.57 + cpu=119.99s ops/cpu-s=480 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=7 swapout=0 majflt=0 + startup us p50=8.13 p99=14.72 mean=8.82 per-tuple=212.5 ns deinit mean=0.64 us tuples/s=37462479 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 6598 ops (+1844469910807493120 ops/s) + [range:uniform:10000@1] progress 20035 ops (+1343 ops/s) +close took 0.107 s +== range:uniform:10000@1 T=1 ops=20108 secs= 15.00 ops/s= 1341 lat us p50=761.86 p99=925.70 p99.9=1359.87 max=1574.0 mean=745.94 + cpu=15.00s ops/cpu-s=1341 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=2 swapout=0 majflt=0 + startup us p50=6.21 p99=10.88 mean=6.39 per-tuple=75.8 ns deinit mean=0.34 us tuples/s=13079257 + insert/run=15.00s drain(close)=0.11s total=15.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.csv new file mode 100644 index 000000000..14a44339d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.csv @@ -0,0 +1,4 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,4,0,warm,8,4,200000,200000,0.015,13440269.5,nan,nan,nan,0.000,nan,0.064,3101977.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13440269.5,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +main,resident,4,0,range:uniform:10000@8,8,4,200000,65367,15.000,4357.7,1458.176,3440.640,3637.248,3900.789,1835.610,119.980,544.8,0,0,0.00,0.00,9.344,14.464,9.539,187.25,0.658,637284853,42484835.2,15.000,0.000,15.000,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +main,resident,4,0,range:uniform:10000@1,1,4,200000,20661,15.000,1377.4,745.472,860.160,1294.336,1375.812,725.968,15.002,1377.2,0,8192,0.00,0.40,6.080,9.088,6.140,73.75,0.322,201614288,13440689.8,15.000,0.063,15.064,0.013,0,307200,nan,237375488,37285888,0.006,0,0,11,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.log new file mode 100644 index 000000000..b68f572ec --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-04-main.log @@ -0,0 +1,19 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-04-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=4 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13440269 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3101978 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 47941 ops (+4794 ops/s) +== range:uniform:10000@8 T=8 ops=65367 secs= 15.00 ops/s= 4358 lat us p50=1458.18 p99=3440.64 p99.9=3637.25 max=3900.8 mean=1835.61 + cpu=119.98s ops/cpu-s=545 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=9.34 p99=14.46 mean=9.54 per-tuple=187.2 ns deinit mean=0.66 us tuples/s=42484835 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 6817 ops (+1844459563798729728 ops/s) + [range:uniform:10000@1] progress 20581 ops (+1376 ops/s) +close took 0.063 s +== range:uniform:10000@1 T=1 ops=20661 secs= 15.00 ops/s= 1377 lat us p50=745.47 p99=860.16 p99.9=1294.34 max=1375.8 mean=725.97 + cpu=15.00s ops/cpu-s=1377 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=11 swapout=0 majflt=0 + startup us p50=6.08 p99=9.09 mean=6.14 per-tuple=73.7 ns deinit mean=0.32 us tuples/s=13440690 + insert/run=15.00s drain(close)=0.06s total=15.06s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.csv new file mode 100644 index 000000000..367bf9e9e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.csv @@ -0,0 +1,4 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,5,0,warm,8,5,200000,200000,0.015,13169287.0,nan,nan,nan,0.000,nan,0.070,2837765.0,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13169287.0,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,1 +candidate,resident,5,0,range:uniform:10000@8,8,5,200000,54208,15.000,3613.8,2129.920,4390.912,4653.056,7929.929,2213.640,119.976,451.8,0,0,0.00,0.00,8.320,13.952,8.852,226.07,0.663,528564892,35236974.5,15.000,0.000,15.000,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,5,0,range:uniform:10000@1,1,5,200000,20619,15.000,1374.6,745.472,794.624,974.848,1475.844,727.392,15.004,1374.3,0,8192,0.00,0.40,5.824,7.744,5.902,73.91,0.356,201214674,13414166.4,15.000,0.076,15.076,0.012,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.log new file mode 100644 index 000000000..cad00ea1a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-disabled-wal0-05-candidate.log @@ -0,0 +1,19 @@ +prefix-pattern=common key_bytes=64 compression_disabled=true +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-disabled-wal0-05-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=5 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 13169287 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2837765 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 39751 ops (+3975 ops/s) +== range:uniform:10000@8 T=8 ops=54208 secs= 15.00 ops/s= 3614 lat us p50=2129.92 p99=4390.91 p99.9=4653.06 max=7929.9 mean=2213.64 + cpu=119.98s ops/cpu-s=452 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.32 p99=13.95 mean=8.85 per-tuple=226.1 ns deinit mean=0.66 us tuples/s=35236975 +phase range:uniform:10000@1: T=1 dist=uniform (fixed duration) + [range:uniform:10000@1] progress 6789 ops (+1844500512105021440 ops/s) + [range:uniform:10000@1] progress 20579 ops (+1379 ops/s) +close took 0.076 s +== range:uniform:10000@1 T=1 ops=20619 secs= 15.00 ops/s= 1375 lat us p50=745.47 p99=794.62 p99.9=974.85 max=1475.8 mean=727.39 + cpu=15.00s ops/cpu-s=1374 rd=0.0 B/op wr=0.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=5.82 p99=7.74 mean=5.90 per-tuple=73.9 ns deinit mean=0.36 us tuples/s=13414166 + insert/run=15.00s drain(close)=0.08s total=15.08s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.csv new file mode 100644 index 000000000..e50af234a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.014,14246985.9,nan,nan,nan,0.000,nan,0.070,2869605.1,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14246985.9,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +main,resident,0,0,range:uniform:10000@8,8,0,200000,63528,15.000,4235.1,1818.624,4521.984,4653.056,4847.661,1888.733,119.983,529.5,0,0,0.00,0.00,7.616,17.664,8.601,192.70,0.597,619693995,41312221.4,15.000,0.067,15.068,0.005,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.log new file mode 100644 index 000000000..b4096e427 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-00-main.log @@ -0,0 +1,13 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=0 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14246986 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2869605 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 47229 ops (+4723 ops/s) +close took 0.067 s +== range:uniform:10000@8 T=8 ops=63528 secs= 15.00 ops/s= 4235 lat us p50=1818.62 p99=4521.98 p99.9=4653.06 max=4847.7 mean=1888.73 + cpu=119.98s ops/cpu-s=529 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.62 p99=17.66 mean=8.60 per-tuple=192.7 ns deinit mean=0.60 us tuples/s=41312221 + insert/run=15.00s drain(close)=0.07s total=15.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.csv new file mode 100644 index 000000000..c37c9e71b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.013,15376561.6,nan,nan,nan,0.000,nan,0.046,4326101.5,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,15376561.6,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +candidate,resident,1,0,range:uniform:10000@8,8,1,200000,60184,15.000,4012.2,2195.456,4521.984,5046.272,5539.713,1993.773,119.975,501.6,0,0,0.00,0.00,6.720,12.160,7.289,203.56,0.607,587037361,39135152.0,15.000,0.114,15.114,0.011,0,307200,nan,207360000,26005504,0.009,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.log new file mode 100644 index 000000000..9a77ee931 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-01-candidate.log @@ -0,0 +1,13 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=1 sabotage=0 +open took 0.009 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15376562 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=4326102 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 44130 ops (+4413 ops/s) +close took 0.114 s +== range:uniform:10000@8 T=8 ops=60184 secs= 15.00 ops/s= 4012 lat us p50=2195.46 p99=4521.98 p99.9=5046.27 max=5539.7 mean=1993.77 + cpu=119.98s ops/cpu-s=502 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=12.16 mean=7.29 per-tuple=203.6 ns deinit mean=0.61 us tuples/s=39135152 + insert/run=15.00s drain(close)=0.11s total=15.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=207360000 db_alloc=26005504 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.csv new file mode 100644 index 000000000..fcdc7c066 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.026,7690891.7,nan,nan,nan,0.000,nan,0.114,1760842.4,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,7690891.7,0.026,0.000,0.026,0.000,0,0,nan,0,0,0.008,0,0,0,0,2 +candidate,resident,2,0,range:uniform:10000@8,8,2,200000,51996,15.000,3466.3,2260.992,5177.344,5308.416,5877.597,2307.733,119.985,433.4,0,0,0.00,0.00,7.616,13.952,8.254,235.74,0.687,507070669,33804083.7,15.000,0.105,15.105,0.011,0,307200,nan,207360000,26005504,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.log new file mode 100644 index 000000000..826c2cac3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-02-candidate.log @@ -0,0 +1,13 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=2 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.03 ops/s= 7690892 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.11s ops/cpu-s=1760842 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 37925 ops (+3792 ops/s) +close took 0.105 s +== range:uniform:10000@8 T=8 ops=51996 secs= 15.00 ops/s= 3466 lat us p50=2260.99 p99=5177.34 p99.9=5308.42 max=5877.6 mean=2307.73 + cpu=119.99s ops/cpu-s=433 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.62 p99=13.95 mean=8.25 per-tuple=235.7 ns deinit mean=0.69 us tuples/s=33804084 + insert/run=15.00s drain(close)=0.11s total=15.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=207360000 db_alloc=26005504 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.csv new file mode 100644 index 000000000..7a4fb8b13 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.014,14235404.3,nan,nan,nan,0.000,nan,0.068,2927314.8,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14235404.3,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.009,0,0,0,0,0 +main,resident,3,0,range:uniform:10000@8,8,3,200000,58973,15.000,3931.5,1949.696,5046.272,5177.344,7664.836,2034.628,119.967,491.6,0,0,0.00,0.00,7.744,14.464,8.430,207.72,0.601,575259197,38350058.9,15.000,0.106,15.106,0.013,0,307200,nan,237375488,37285888,0.009,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.log new file mode 100644 index 000000000..c792be9ed --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-03-main.log @@ -0,0 +1,13 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=3 sabotage=0 +open took 0.009 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14235404 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2927315 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 43319 ops (+4332 ops/s) +close took 0.106 s +== range:uniform:10000@8 T=8 ops=58973 secs= 15.00 ops/s= 3931 lat us p50=1949.70 p99=5046.27 p99.9=5177.34 max=7664.8 mean=2034.63 + cpu=119.97s ops/cpu-s=492 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.74 p99=14.46 mean=8.43 per-tuple=207.7 ns deinit mean=0.60 us tuples/s=38350059 + insert/run=15.00s drain(close)=0.11s total=15.11s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.csv new file mode 100644 index 000000000..1f57a3c9c --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,4,0,warm,8,4,200000,200000,0.014,14457899.6,nan,nan,nan,0.000,nan,0.065,3068708.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14457899.6,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,4,0,range:uniform:10000@8,8,4,200000,58641,15.000,3909.3,1064.960,4259.840,4784.128,5276.639,2046.295,119.984,488.7,0,0,0.00,0.00,7.872,15.744,8.776,208.92,0.635,571945183,38129006.6,15.000,0.103,15.103,0.011,0,307200,nan,237375488,37285888,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.log new file mode 100644 index 000000000..16eed3e20 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-04-main.log @@ -0,0 +1,13 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-04-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=4 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14457900 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3068708 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 42898 ops (+4290 ops/s) +close took 0.103 s +== range:uniform:10000@8 T=8 ops=58641 secs= 15.00 ops/s= 3909 lat us p50=1064.96 p99=4259.84 p99.9=4784.13 max=5276.6 mean=2046.30 + cpu=119.98s ops/cpu-s=489 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=7.87 p99=15.74 mean=8.78 per-tuple=208.9 ns deinit mean=0.63 us tuples/s=38129007 + insert/run=15.00s drain(close)=0.10s total=15.10s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.csv new file mode 100644 index 000000000..8b6ec7015 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,5,0,warm,8,5,200000,200000,0.013,15641794.2,nan,nan,nan,0.000,nan,0.051,3949603.1,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,15641794.2,0.013,0.000,0.013,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,5,0,range:uniform:10000@8,8,5,200000,47050,15.000,3136.6,2588.672,3571.712,3768.320,4149.188,2550.422,119.991,392.1,0,0,0.00,0.00,8.320,12.160,8.233,260.45,0.698,459058129,30603298.0,15.000,0.119,15.119,0.011,0,311296,nan,207360000,26005504,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.log new file mode 100644 index 000000000..d99727c95 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-common-wal0-05-candidate.log @@ -0,0 +1,13 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-common-wal0-05-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=5 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 15641794 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=3949603 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:10000@8: T=8 dist=uniform (fixed duration) + [range:uniform:10000@8] progress 34394 ops (+3439 ops/s) +close took 0.119 s +== range:uniform:10000@8 T=8 ops=47050 secs= 15.00 ops/s= 3137 lat us p50=2588.67 p99=3571.71 p99.9=3768.32 max=4149.2 mean=2550.42 + cpu=119.99s ops/cpu-s=392 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=8.32 p99=12.16 mean=8.23 per-tuple=260.5 ns deinit mean=0.70 us tuples/s=30603298 + insert/run=15.00s drain(close)=0.12s total=15.12s drain_cpu=0.01s drain_rd=0 drain_wr=311296 wamp=nan db_apparent=207360000 db_alloc=26005504 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.csv new file mode 100644 index 000000000..6f4729cb2 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.014,14279228.5,nan,nan,nan,0.000,nan,0.061,3282778.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14279228.5,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +main,resident,0,0,range:uniform:1@8,8,0,200000,16220943,15.000,1081379.8,6.464,10.112,18.688,1592.644,7.330,119.979,135198.3,0,0,0.00,0.00,6.208,9.600,6.912,nan,0.375,16220943,1081379.8,15.000,0.084,15.084,0.013,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.log new file mode 100644 index 000000000..c1825fc74 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-00-main.log @@ -0,0 +1,13 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=0 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14279228 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3282779 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 12013974 ops (+1201319 ops/s) +close took 0.084 s +== range:uniform:1@8 T=8 ops=16220943 secs= 15.00 ops/s= 1081380 lat us p50=6.46 p99=10.11 p99.9=18.69 max=1592.6 mean=7.33 + cpu=119.98s ops/cpu-s=135198 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.21 p99=9.60 mean=6.91 per-tuple=nan ns deinit mean=0.37 us tuples/s=1081380 + insert/run=15.00s drain(close)=0.08s total=15.08s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.csv new file mode 100644 index 000000000..abe80d9f6 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.016,12680457.2,nan,nan,nan,0.000,nan,0.077,2586151.2,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12680457.2,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,range:uniform:1@8,8,1,200000,14170919,15.000,944712.2,7.360,11.648,21.760,3177.290,8.394,119.988,118102.7,0,0,0.00,0.00,6.976,11.136,7.890,nan,0.455,14170919,944712.2,15.000,0.093,15.093,0.014,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.log new file mode 100644 index 000000000..d72503300 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-01-candidate.log @@ -0,0 +1,13 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12680457 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.08s ops/cpu-s=2586151 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 10338211 ops (+1033750 ops/s) +close took 0.093 s +== range:uniform:1@8 T=8 ops=14170919 secs= 15.00 ops/s= 944712 lat us p50=7.36 p99=11.65 p99.9=21.76 max=3177.3 mean=8.39 + cpu=119.99s ops/cpu-s=118103 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.98 p99=11.14 mean=7.89 per-tuple=nan ns deinit mean=0.46 us tuples/s=944712 + insert/run=15.00s drain(close)=0.09s total=15.09s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.csv new file mode 100644 index 000000000..8323255e9 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.015,13285937.1,nan,nan,nan,0.000,nan,0.071,2815632.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13285937.1,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +candidate,resident,2,0,range:uniform:1@8,8,2,200000,14593857,15.000,972907.3,7.232,11.392,19.712,237.890,8.150,119.982,121633.3,0,0,0.00,0.00,6.720,10.624,7.664,nan,0.439,14593857,972907.3,15.000,0.078,15.078,0.007,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.log new file mode 100644 index 000000000..32fa25a4b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-02-candidate.log @@ -0,0 +1,13 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=2 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 13285937 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2815632 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 10671137 ops (+1067040 ops/s) +close took 0.078 s +== range:uniform:1@8 T=8 ops=14593857 secs= 15.00 ops/s= 972907 lat us p50=7.23 p99=11.39 p99.9=19.71 max=237.9 mean=8.15 + cpu=119.98s ops/cpu-s=121633 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=10.62 mean=7.66 per-tuple=nan ns deinit mean=0.44 us tuples/s=972907 + insert/run=15.00s drain(close)=0.08s total=15.08s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.csv new file mode 100644 index 000000000..1bdf56ea4 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.015,13354297.8,nan,nan,nan,0.000,nan,0.074,2702264.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13354297.8,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,1 +main,resident,3,0,range:uniform:1@8,8,3,200000,14933633,15.000,995559.2,7.104,10.880,20.736,223.751,7.961,119.984,124463.5,0,0,0.00,0.00,6.720,10.368,7.493,nan,0.420,14933633,995559.2,15.000,0.066,15.066,0.014,0,307200,nan,237375488,37285888,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.log new file mode 100644 index 000000000..4360bdab7 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-03-main.log @@ -0,0 +1,13 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=3 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13354298 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2702264 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 10907700 ops (+1090693 ops/s) +close took 0.066 s +== range:uniform:1@8 T=8 ops=14933633 secs= 15.00 ops/s= 995559 lat us p50=7.10 p99=10.88 p99.9=20.74 max=223.8 mean=7.96 + cpu=119.98s ops/cpu-s=124463 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.72 p99=10.37 mean=7.49 per-tuple=nan ns deinit mean=0.42 us tuples/s=995559 + insert/run=15.00s drain(close)=0.07s total=15.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.csv new file mode 100644 index 000000000..d7ed11141 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,4,0,warm,8,4,200000,200000,0.016,12605094.2,nan,nan,nan,0.000,nan,0.069,2906131.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12605094.2,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +main,resident,4,0,range:uniform:1@8,8,4,200000,15121727,15.000,1008099.6,6.976,10.880,20.224,754.280,7.863,119.963,126053.3,0,0,0.00,0.00,6.592,10.368,7.404,nan,0.412,15121727,1008099.6,15.000,0.069,15.070,0.013,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.log new file mode 100644 index 000000000..b8a511f8b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-04-main.log @@ -0,0 +1,13 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-04-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=4 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12605094 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2906132 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 11026604 ops (+1102592 ops/s) +close took 0.069 s +== range:uniform:1@8 T=8 ops=15121727 secs= 15.00 ops/s= 1008100 lat us p50=6.98 p99=10.88 p99.9=20.22 max=754.3 mean=7.86 + cpu=119.96s ops/cpu-s=126053 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.59 p99=10.37 mean=7.40 per-tuple=nan ns deinit mean=0.41 us tuples/s=1008100 + insert/run=15.00s drain(close)=0.07s total=15.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.csv new file mode 100644 index 000000000..8e3c35b7b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,5,0,warm,8,5,200000,200000,0.015,13294020.3,nan,nan,nan,0.000,nan,0.065,3072291.0,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13294020.3,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.006,0,0,0,0,1 +candidate,resident,5,0,range:uniform:1@8,8,5,200000,14858986,15.000,990583.5,6.976,11.136,20.224,232.912,8.005,119.984,123841.1,0,0,0.00,0.00,6.592,10.624,7.520,nan,0.437,14858986,990583.5,15.000,0.073,15.073,0.013,0,307200,nan,237375488,37285888,0.006,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.log new file mode 100644 index 000000000..f4563b2a7 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-nonlexical-wal0-05-candidate.log @@ -0,0 +1,13 @@ +prefix-pattern=nonlexical key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-nonlexical-wal0-05-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=5 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 13294020 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3072291 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase range:uniform:1@8: T=8 dist=uniform (fixed duration) + [range:uniform:1@8] progress 10863845 ops (+1086317 ops/s) +close took 0.073 s +== range:uniform:1@8 T=8 ops=14858986 secs= 15.00 ops/s= 990583 lat us p50=6.98 p99=11.14 p99.9=20.22 max=232.9 mean=8.01 + cpu=119.98s ops/cpu-s=123841 rd=0.0 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + startup us p50=6.59 p99=10.62 mean=7.52 per-tuple=nan ns deinit mean=0.44 us tuples/s=990583 + insert/run=15.00s drain(close)=0.07s total=15.07s drain_cpu=0.01s drain_rd=0 drain_wr=307200 wamp=nan db_apparent=237375488 db_alloc=37285888 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.csv new file mode 100644 index 000000000..bde87f923 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,1,warm,8,0,200000,200000,0.016,12852271.1,nan,nan,nan,0.000,nan,0.068,2927743.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12852271.1,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +main,resident,0,1,ow:uniform@8,8,0,200000,15751404,15.000,1050078.9,1.520,130.048,479.232,221195.577,7.462,63.459,248213.5,2599501824,6789079040,165.03,431.01,nan,nan,nan,nan,nan,0,0.0,15.000,0.119,15.119,0.044,516096,39399424,2.6434,8589934592,5274365952,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.log new file mode 100644 index 000000000..27db5436e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-00-main.log @@ -0,0 +1,12 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=0 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12852271 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2927743 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) + [ow:uniform@8] progress 10941135 ops (+1094042 ops/s) +close took 0.119 s +== ow:uniform@8 T=8 ops=15751404 secs= 15.00 ops/s= 1050079 lat us p50=1.52 p99=130.05 p99.9=479.23 max=221195.6 mean=7.46 + cpu=63.46s ops/cpu-s=248213 rd=165.0 B/op wr=431.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=15.00s drain(close)=0.12s total=15.12s drain_cpu=0.04s drain_rd=516096 drain_wr=39399424 wamp=2.643 db_apparent=8589934592 db_alloc=5274365952 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.csv new file mode 100644 index 000000000..47210041b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,1,warm,8,1,200000,200000,0.015,13644661.8,nan,nan,nan,0.000,nan,0.064,3110806.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13644661.8,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,1,ow:uniform@8,8,1,200000,13206831,15.000,880444.9,1.456,149.504,1196.032,265797.951,8.930,55.017,240051.1,2147401728,5672136704,162.60,429.49,nan,nan,nan,nan,nan,0,0.0,15.000,0.161,15.161,0.049,274432,39948288,2.6373,8589934592,4774494208,0.008,0,0,69,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.log new file mode 100644 index 000000000..32bbf9b24 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-01-candidate.log @@ -0,0 +1,12 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=1 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13644662 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3110807 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) + [ow:uniform@8] progress 9159844 ops (+915932 ops/s) +close took 0.161 s +== ow:uniform@8 T=8 ops=13206831 secs= 15.00 ops/s= 880445 lat us p50=1.46 p99=149.50 p99.9=1196.03 max=265798.0 mean=8.93 + cpu=55.02s ops/cpu-s=240051 rd=162.6 B/op wr=429.5 B/op violations=0 errors=0 swapin=69 swapout=0 majflt=0 + insert/run=15.00s drain(close)=0.16s total=15.16s drain_cpu=0.05s drain_rd=274432 drain_wr=39948288 wamp=2.637 db_apparent=8589934592 db_alloc=4774494208 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.csv new file mode 100644 index 000000000..b16c1838b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,1,warm,8,2,200000,200000,0.016,12713872.0,nan,nan,nan,0.000,nan,0.071,2832780.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12713872.0,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,2,1,ow:uniform@8,8,2,200000,12345298,15.000,823007.7,1.424,153.600,1359.872,295820.563,9.568,50.542,244257.4,2047361024,5333245952,165.84,432.01,nan,nan,nan,nan,nan,0,0.0,15.000,0.228,15.228,0.109,26345472,29122560,2.6486,8589934592,4548698112,0.008,0,0,120,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.log new file mode 100644 index 000000000..1ec4f89ff --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-02-candidate.log @@ -0,0 +1,12 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=2 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12713872 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2832781 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) + [ow:uniform@8] progress 8349654 ops (+834913 ops/s) +close took 0.228 s +== ow:uniform@8 T=8 ops=12345298 secs= 15.00 ops/s= 823008 lat us p50=1.42 p99=153.60 p99.9=1359.87 max=295820.6 mean=9.57 + cpu=50.54s ops/cpu-s=244257 rd=165.8 B/op wr=432.0 B/op violations=0 errors=0 swapin=120 swapout=0 majflt=0 + insert/run=15.00s drain(close)=0.23s total=15.23s drain_cpu=0.11s drain_rd=26345472 drain_wr=29122560 wamp=2.649 db_apparent=8589934592 db_alloc=4548698112 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.csv new file mode 100644 index 000000000..29efe4fd3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,1,warm,8,3,200000,200000,0.016,12884035.2,nan,nan,nan,0.000,nan,0.073,2745517.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12884035.2,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,3,1,ow:uniform@8,8,3,200000,12723628,15.000,848229.7,1.456,157.696,1261.568,270371.860,9.270,51.923,245046.6,2108645376,5499584512,165.73,432.23,nan,nan,nan,nan,nan,0,0.0,15.000,0.135,15.135,0.041,217088,24772608,2.6474,8589934592,4623142912,0.007,0,0,2,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.log new file mode 100644 index 000000000..7b5ce4f0c --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-03-main.log @@ -0,0 +1,12 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=3 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12884035 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2745518 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) + [ow:uniform@8] progress 8685951 ops (+868544 ops/s) +close took 0.135 s +== ow:uniform@8 T=8 ops=12723628 secs= 15.00 ops/s= 848230 lat us p50=1.46 p99=157.70 p99.9=1261.57 max=270371.9 mean=9.27 + cpu=51.92s ops/cpu-s=245047 rd=165.7 B/op wr=432.2 B/op violations=0 errors=0 swapin=2 swapout=0 majflt=0 + insert/run=15.00s drain(close)=0.14s total=15.14s drain_cpu=0.04s drain_rd=217088 drain_wr=24772608 wamp=2.647 db_apparent=8589934592 db_alloc=4623142912 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.csv new file mode 100644 index 000000000..f42e905c3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,4,1,warm,8,4,200000,200000,0.017,11518772.0,nan,nan,nan,0.000,nan,0.081,2462902.5,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,11518772.0,0.017,0.000,0.017,0.000,0,0,nan,0,0,0.008,0,0,0,0,2 +main,resident,4,1,ow:uniform@8,8,4,200000,11578720,15.000,771902.2,1.424,161.792,1392.640,282835.814,10.205,48.011,241168.8,1773715456,4962910208,153.19,428.62,nan,nan,nan,nan,nan,0,0.0,15.000,0.165,15.165,0.064,1142784,39501824,2.6344,8589934592,4363235328,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.log new file mode 100644 index 000000000..cbe67deac --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-04-main.log @@ -0,0 +1,12 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-04-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=4 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 11518772 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.08s ops/cpu-s=2462903 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) + [ow:uniform@8] progress 7833723 ops (+783317 ops/s) +close took 0.165 s +== ow:uniform@8 T=8 ops=11578720 secs= 15.00 ops/s= 771902 lat us p50=1.42 p99=161.79 p99.9=1392.64 max=282835.8 mean=10.21 + cpu=48.01s ops/cpu-s=241169 rd=153.2 B/op wr=428.6 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=15.00s drain(close)=0.16s total=15.17s drain_cpu=0.06s drain_rd=1142784 drain_wr=39501824 wamp=2.634 db_apparent=8589934592 db_alloc=4363235328 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.csv new file mode 100644 index 000000000..af9d1696f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,5,1,warm,8,5,200000,200000,0.016,12248375.5,nan,nan,nan,0.000,nan,0.074,2714993.6,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12248375.5,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,5,1,ow:uniform@8,8,5,200000,12140167,15.000,809333.6,1.392,153.600,1327.104,331558.542,9.738,49.999,242808.0,1891778560,5237198848,155.83,431.39,nan,nan,nan,nan,nan,0,0.0,15.000,0.116,15.116,0.035,270336,18898944,2.6399,8589934592,4508598272,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.log new file mode 100644 index 000000000..e28bc5d0d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/repeat/resident-random-wal1-05-candidate.log @@ -0,0 +1,12 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/repeat-resident-random-wal1-05-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=15.0 warmup=1.0 rep=5 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12248375 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2714994 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) + [ow:uniform@8] progress 8224016 ops (+822348 ops/s) +close took 0.116 s +== ow:uniform@8 T=8 ops=12140167 secs= 15.00 ops/s= 809334 lat us p50=1.39 p99=153.60 p99.9=1327.10 max=331558.5 mean=9.74 + cpu=50.00s ops/cpu-s=242808 rd=155.8 B/op wr=431.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=15.00s drain(close)=0.12s total=15.12s drain_cpu=0.03s drain_rd=270336 drain_wr=18898944 wamp=2.640 db_apparent=8589934592 db_alloc=4508598272 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/report.md b/benchmarks/results-20261014/prefix-main-6105c49f/report.md new file mode 100644 index 000000000..b55ea6985 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/report.md @@ -0,0 +1,107 @@ +# Prefix benchmark comparison against main 6105c49f + +Main source: `6105c49f66a24d3006ba0464d9558b52e692e27c`. Candidate source: `97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789`. + +This compares the integrated prefix feature with current main; it does not isolate the cost of merging main. + +CPU affinity 0–11, real disk with O_DIRECT, 64-byte keys, 100-byte values, fixed per-format images, fsynced copies, seed 42, one load thread, no background workers, and a 4 MiB memtable. Resident uses 200,000 keys and 128 MiB cache; disk uses 2 million keys and 64 MiB cache. Read phases have one second of warmup each. Query checks validate values and ordered ranges; overwrite checks up to 4,096 measured keys per worker after timing. + +ABBA provides two samples per version in the main matrix. Repeats are shown separately. Means and sample ranges are descriptive; overlapping ranges are not confidence intervals. Small differences and tail estimates need cautious interpretation. + +## Reads + +Status: complete. 28 verified query invocations; measured phases 7 seconds. All included rows have zero API errors and correctness violations. + +| Case / WAL | Phase | Main ops/s range | Candidate ops/s range | Mean throughput | CPU efficiency | Read B/op | Mean p99 | Ranges overlap | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | :---: | +| resident-common / 0 | point:uniform@8 | 4,074,604.5–4,926,481.6 | 4,492,319.2–4,989,583.4 | +5.34% | +5.32% | n/a | -13.58% | yes | +| resident-common / 0 | range:uniform:1@8 | 1,072,409.9–1,256,510.3 | 1,165,847.2–1,185,895.4 | +0.98% | +0.97% | n/a | -1.32% | yes | +| resident-common / 0 | range:uniform:10000@8 | 3,877.3–5,473.7 | 3,481.6–4,469.4 | -14.97% | -14.98% | n/a | -11.32% | yes | +| resident-random / 0 | point:uniform@8 | 3,854,472.2–4,165,500.4 | 4,068,384.3–4,115,031.1 | +2.04% | +2.04% | n/a | -4.88% | yes | +| resident-random / 0 | range:uniform:1@8 | 1,063,328.2–1,092,590.9 | 1,057,405.9–1,091,214.3 | -0.34% | -0.34% | n/a | -1.23% | yes | +| resident-random / 0 | range:uniform:10000@8 | 3,106.0–3,484.7 | 3,293.9–3,752.7 | +6.92% | +6.91% | n/a | -11.00% | yes | +| resident-random / 0 | range:uniform:10000@1 | 1,159.1–1,328.0 | 1,218.0–1,286.0 | +0.68% | +0.68% | n/a | -9.24% | yes | +| resident-nonlexical / 0 | point:uniform@8 | 4,028,951.9–4,364,191.6 | 3,943,007.4–4,254,213.6 | -2.33% | -2.34% | n/a | +1.28% | yes | +| resident-nonlexical / 0 | range:uniform:1@8 | 1,024,771.4–1,058,596.2 | 985,488.4–986,207.5 | -5.36% | -5.35% | n/a | +4.82% | no | +| resident-nonlexical / 0 | range:uniform:10000@8 | 3,201.0–3,520.9 | 2,868.6–3,527.0 | -4.85% | -4.80% | n/a | +5.00% | yes | +| disk-common / 0 | point:uniform@8 | 163,698.1–176,798.2 | 181,356.1–194,725.4 | +10.45% | +10.96% | -9.06% | -16.48% | no | +| disk-common / 0 | range:uniform:1@8 | 68,021.3–73,146.7 | 76,025.5–80,473.3 | +10.86% | +11.42% | -22.75% | -2.50% | no | +| disk-common / 0 | range:uniform:10000@8 | 900.0–918.3 | 1,061.8–1,125.4 | +20.29% | +12.02% | -29.09% | -13.68% | no | +| disk-random / 0 | point:uniform@8 | 132,155.7–136,666.5 | 133,577.2–134,838.6 | -0.15% | +1.26% | +0.02% | -0.84% | yes | +| disk-random / 0 | range:uniform:1@8 | 53,370.4–56,396.0 | 55,082.8–56,052.0 | +1.25% | +1.14% | -0.13% | -6.25% | yes | +| disk-random / 0 | range:uniform:10000@8 | 788.7–801.1 | 787.5–796.8 | -0.35% | -0.14% | +0.28% | -2.65% | yes | +| disk-nonlexical / 0 | point:uniform@8 | 133,323.3–158,039.7 | 130,352.7–143,969.4 | -5.85% | -7.69% | +0.00% | +5.50% | yes | +| disk-nonlexical / 0 | range:uniform:1@8 | 54,996.1–65,537.3 | 55,657.5–60,041.5 | -4.01% | -3.95% | -0.05% | +0.00% | yes | +| disk-nonlexical / 0 | range:uniform:10000@8 | 766.3–829.0 | 780.0–820.7 | +0.34% | +1.50% | +0.19% | -15.57% | yes | +| resident-common-disabled / 0 | point:uniform@8 | 3,544,771.5–3,809,599.8 | 3,784,307.2–3,941,791.0 | +5.05% | +5.05% | n/a | -8.89% | yes | +| resident-common-disabled / 0 | range:uniform:1@8 | 892,793.3–1,004,344.2 | 913,518.7–977,689.1 | -0.31% | -0.32% | n/a | +0.00% | yes | +| resident-common-disabled / 0 | range:uniform:10000@8 | 3,405.3–4,432.8 | 2,982.7–3,280.3 | -20.10% | -20.09% | n/a | +2.85% | no | +| resident-common-disabled / 0 | range:uniform:10000@1 | 1,248.7–1,329.5 | 1,243.4–1,301.1 | -1.31% | -1.31% | n/a | +0.00% | yes | + +## Writes + +Status: complete. 16 verified query invocations; measured phases 8 seconds. All included rows have zero API errors and correctness violations. + +| Case / WAL | Phase | Main ops/s range | Candidate ops/s range | Mean throughput | CPU efficiency | Read B/op | Mean p99 | Ranges overlap | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | :---: | +| resident-common / 0 | ow:uniform@8 | 1,651,774.3–2,281,818.6 | 1,951,505.2–2,078,472.6 | +2.45% | +3.82% | -40.13% | +1.02% | yes | +| resident-random / 0 | ow:uniform@8 | 1,417,795.4–1,646,774.8 | 1,583,743.5–1,645,339.0 | +5.37% | -0.54% | -8.30% | +1.06% | yes | +| resident-common / 1 | ow:uniform@8 | 578,949.9–680,238.2 | 691,557.9–806,782.3 | +18.99% | -0.83% | -40.55% | -5.66% | no | +| resident-random / 1 | ow:uniform@8 | 570,998.2–581,315.3 | 484,679.1–565,478.7 | -8.87% | -19.90% | -14.58% | +10.00% | no | + +Overwrite rates including close/drain: + +| Case / WAL | Main ops/s | Candidate ops/s | Change | +| --- | ---: | ---: | ---: | +| resident-common / 0 | 1,932,737.1 | 1,975,842.9 | +2.23% | +| resident-random / 0 | 1,498,383.2 | 1,588,280.8 | +6.00% | +| resident-common / 1 | 620,393.3 | 735,223.1 | +18.51% | +| resident-random / 1 | 566,929.2 | 510,361.0 | -9.98% | + +These bounded overwrites include one second of unmeasured warmup and post-measurement verification before close. The close-inclusive denominator adds measured time and close/drain time; it excludes warmup and verifier time. It is not a sustained-ingest or steady-state write-throughput measurement. WAL=1 exercises current main's automatic durable barriers; this harness does not measure recovery or count barriers. + +## Repeat + +Status: complete. 24 verified query invocations; measured phases 15 seconds. All included rows have zero API errors and correctness violations. + +| Case / WAL | Phase | Main ops/s range | Candidate ops/s range | Mean throughput | CPU efficiency | Read B/op | Mean p99 | Ranges overlap | +| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | :---: | +| resident-common / 0 | range:uniform:10000@8 | 3,909.3–4,235.1 | 3,136.6–4,012.2 | -12.10% | -12.10% | n/a | -4.03% | yes | +| resident-common-disabled / 0 | range:uniform:10000@8 | 3,365.5–4,357.7 | 3,613.8–3,853.3 | -2.38% | -2.39% | n/a | +15.11% | yes | +| resident-common-disabled / 0 | range:uniform:10000@1 | 1,334.6–1,377.4 | 1,373.1–1,381.2 | +1.89% | +1.88% | n/a | -7.48% | yes | +| resident-nonlexical / 0 | range:uniform:1@8 | 995,559.2–1,081,379.8 | 944,712.2–990,583.5 | -5.73% | -5.74% | n/a | +7.23% | no | +| resident-random / 1 | ow:uniform@8 | 771,902.2–1,050,078.9 | 809,333.6–880,444.9 | -5.90% | -1.00% | +0.07% | +1.59% | yes | + +Overwrite rates including close/drain: + +| Case / WAL | Main ops/s | Candidate ops/s | Change | +| --- | ---: | ---: | ---: | +| resident-random / 1 | 882,006.7 | 828,312.1 | -6.09% | + +These bounded overwrites include one second of unmeasured warmup and post-measurement verification before close. The close-inclusive denominator adds measured time and close/drain time; it excludes warmup and verifier time. It is not a sustained-ingest or steady-state write-throughput measurement. WAL=1 exercises current main's automatic durable barriers; this harness does not measure recovery or count barriers. + +## Fixture construction and space + +Each fixture is constructed once. Load/drain numbers are setup observations, not repeated write benchmarks. Allocated file bytes include historical written pages; mounted live extents show allocator ownership. Per-page-type counters are not durable and are not used here. + +| Fixture | Load + drain seconds | File allocation bytes | Live extents | +| --- | ---: | ---: | ---: | +| main-resident-common-wal0 | 0.352 | 37,408,768 | 342 | +| candidate-resident-common-wal0 | 0.346 | 26,128,384 | 256 | +| main-resident-random-wal0 | 0.443 | 37,408,768 | 342 | +| candidate-resident-random-wal0 | 0.422 | 37,408,768 | 342 | +| main-resident-nonlexical-wal0 | 0.379 | 37,408,768 | 342 | +| candidate-resident-nonlexical-wal0 | 0.409 | 37,408,768 | 342 | +| main-disk-common-wal0 | 4.245 | 833,761,280 | 3,414 | +| candidate-disk-common-wal0 | 4.071 | 544,198,656 | 2,585 | +| main-disk-random-wal0 | 4.740 | 833,708,032 | 3,415 | +| candidate-disk-random-wal0 | 4.872 | 833,789,952 | 3,415 | +| main-disk-nonlexical-wal0 | 4.913 | 833,634,304 | 3,414 | +| candidate-disk-nonlexical-wal0 | 4.847 | 834,351,104 | 3,414 | +| candidate-resident-common-wal0-disabled | 0.425 | 37,408,768 | 342 | +| main-resident-common-wal1 | 0.706 | 76,468,224 | 347 | +| candidate-resident-common-wal1 | 0.657 | 65,187,840 | 261 | +| main-resident-random-wal1 | 0.856 | 76,468,224 | 347 | +| candidate-resident-random-wal1 | 0.695 | 76,468,224 | 347 | + +Raw per-phase samples and latency percentiles are in the mode CSV files. `summary.csv` retains mean and min/max throughput, CPU efficiency, read/write bytes per operation and p99/p99.9. Manifests retain commands, environment controls, timings, source and binary hashes, fixture hashes, and verification outcomes. Database images and binaries are excluded from the evidence archive. diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/report.py b/benchmarks/results-20261014/prefix-main-6105c49f/report.py new file mode 100644 index 000000000..121fdbc09 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/report.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +"""Summarize verified prefix benchmark records; never combine different modes.""" + +import csv +import json +from pathlib import Path +import statistics + + +HERE = Path(__file__).resolve().parent + + +def average(rows, key): + return statistics.mean(float(row[key]) for row in rows) + + +def change(before, after): + return 100 * (after / before - 1) if before else None + + +def percentage(value): + return "n/a" if value is None else f"{value:+.2f}%" + + +def interval(values): + return f"{min(values):,.1f}–{max(values):,.1f}" + + +def main(): + summaries = [] + manifests = {} + for mode in ("reads", "writes", "repeat"): + manifest_path = HERE / mode / "manifest.json" + if not manifest_path.exists(): + continue + manifest = json.loads(manifest_path.read_text()) + manifests[mode] = manifest + groups = {} + for record in manifest["runs"]: + if "case" not in record or not record.get("verified"): + continue + with (HERE / record["csv"]).open() as stream: + for row in csv.DictReader(stream): + if row["phase"] == "warm": + continue + assert int(row["errors"]) == 0 and int(row["violations"]) == 0 + row["ops_with_drain_s"] = float(row["ops"]) / (float(row["secs"]) + float(row["drain_s"])) + key = (record["case"], record["wal"], row["phase"]) + groups.setdefault(key, {}).setdefault(record["profile"], []).append(row) + for (case, wal, phase), versions in groups.items(): + if set(versions) != {"main", "candidate"}: + continue + baseline, candidate = versions["main"], versions["candidate"] + summary = {"mode": mode, "case": case, "wal": wal, "phase": phase, + "main_samples": len(baseline), "candidate_samples": len(candidate)} + for metric in ("ops_s", "p99_us", "p999_us", "ops_per_cpu_s", "rd_B_op", "wr_B_op", "ops_with_drain_s"): + a, b = average(baseline, metric), average(candidate, metric) + summary.update({f"main_{metric}": a, f"candidate_{metric}": b, + f"change_{metric}_pct": change(a, b), + f"main_{metric}_min": min(float(row[metric]) for row in baseline), + f"main_{metric}_max": max(float(row[metric]) for row in baseline), + f"candidate_{metric}_min": min(float(row[metric]) for row in candidate), + f"candidate_{metric}_max": max(float(row[metric]) for row in candidate)}) + summary["throughput_ranges_overlap"] = max(summary["main_ops_s_min"], summary["candidate_ops_s_min"]) <= min(summary["main_ops_s_max"], summary["candidate_ops_s_max"]) + summaries.append(summary) + if not manifests: + raise SystemExit("No benchmark manifests found") + (HERE / "summary.json").write_text(json.dumps(summaries, indent=2) + "\n") + if summaries: + with (HERE / "summary.csv").open("w") as stream: + writer = csv.DictWriter(stream, fieldnames=list(summaries[0]), lineterminator="\n") + writer.writeheader() + writer.writerows(summaries) + build = json.loads((HERE / "build.json").read_text()) + lines = ["# Prefix benchmark comparison against main 6105c49f", "", + f"Main source: `{build['main']['commit']}`. Candidate source: `{build['candidate']['commit']}`.", "", + "This compares the integrated prefix feature with current main; it does not isolate the cost of merging main.", "", + "CPU affinity 0–11, real disk with O_DIRECT, 64-byte keys, 100-byte values, fixed per-format images, fsynced copies, seed 42, one load thread, no background workers, and a 4 MiB memtable. Resident uses 200,000 keys and 128 MiB cache; disk uses 2 million keys and 64 MiB cache. Read phases have one second of warmup each. Query checks validate values and ordered ranges; overwrite checks up to 4,096 measured keys per worker after timing.", "", + "ABBA provides two samples per version in the main matrix. Repeats are shown separately. Means and sample ranges are descriptive; overlapping ranges are not confidence intervals. Small differences and tail estimates need cautious interpretation.", ""] + for mode, manifest in manifests.items(): + verified = [record for record in manifest["runs"] if "case" in record and record.get("verified")] + lines += [f"## {mode.capitalize()}", "", + f"Status: {'complete' if manifest['complete'] else 'INCOMPLETE'}. {len(verified)} verified query invocations; measured phases {manifest['seconds']:g} seconds. All included rows have zero API errors and correctness violations.", ""] + lines += ["| Case / WAL | Phase | Main ops/s range | Candidate ops/s range | Mean throughput | CPU efficiency | Read B/op | Mean p99 | Ranges overlap |", + "| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: | :---: |"] + for item in summaries: + if item["mode"] != mode: + continue + a = [item["main_ops_s_min"], item["main_ops_s_max"]] + b = [item["candidate_ops_s_min"], item["candidate_ops_s_max"]] + lines.append(f"| {item['case']} / {item['wal']} | {item['phase']} | {interval(a)} | {interval(b)} | {percentage(item['change_ops_s_pct'])} | {percentage(item['change_ops_per_cpu_s_pct'])} | {percentage(item['change_rd_B_op_pct'])} | {percentage(item['change_p99_us_pct'])} | {'yes' if item['throughput_ranges_overlap'] else 'no'} |") + lines.append("") + if any(item["mode"] == mode and item["phase"].startswith("ow:") for item in summaries): + lines += ["Overwrite rates including close/drain:", "", + "| Case / WAL | Main ops/s | Candidate ops/s | Change |", + "| --- | ---: | ---: | ---: |"] + for item in summaries: + if item["mode"] == mode and item["phase"].startswith("ow:"): + lines.append(f"| {item['case']} / {item['wal']} | {item['main_ops_with_drain_s']:,.1f} | {item['candidate_ops_with_drain_s']:,.1f} | {percentage(item['change_ops_with_drain_s_pct'])} |") + lines += ["", "These bounded overwrites include one second of unmeasured warmup and post-measurement verification before close. The close-inclusive denominator adds measured time and close/drain time; it excludes warmup and verifier time. It is not a sustained-ingest or steady-state write-throughput measurement. WAL=1 exercises current main's automatic durable barriers; this harness does not measure recovery or count barriers.", ""] + fixture_path = HERE / "fixtures.json" + if fixture_path.exists(): + fixtures = json.loads(fixture_path.read_text()) + lines += ["## Fixture construction and space", "", + "Each fixture is constructed once. Load/drain numbers are setup observations, not repeated write benchmarks. Allocated file bytes include historical written pages; mounted live extents show allocator ownership. Per-page-type counters are not durable and are not used here.", "", + "| Fixture | Load + drain seconds | File allocation bytes | Live extents |", + "| --- | ---: | ---: | ---: |"] + for key, fixture in fixtures.items(): + lines.append(f"| {key} | {float(fixture['load']['total_s']):.3f} | {fixture['identity']['allocated_bytes']:,} | {fixture['live_extents']:,} |") + lines.append("") + lines += ["Raw per-phase samples and latency percentiles are in the mode CSV files. `summary.csv` retains mean and min/max throughput, CPU efficiency, read/write bytes per operation and p99/p99.9. Manifests retain commands, environment controls, timings, source and binary hashes, fixture hashes, and verification outcomes. Database images and binaries are excluded from the evidence archive.", ""] + (HERE / "report.md").write_text("\n".join(lines)) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/run_benchmarks.py b/benchmarks/results-20261014/prefix-main-6105c49f/run_benchmarks.py new file mode 100644 index 000000000..ed12377d3 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/run_benchmarks.py @@ -0,0 +1,289 @@ +#!/usr/bin/env python3 +"""Prefix A/B measurements. The caller must hold the campaign machine lock. + +build.json maps main/candidate to tree, commit, library, library_sha256, +binary, binary_sha256 and source_sha256. Paths may be absolute or relative to +the repository root. Databases are deliberately kept out of the archive. +""" + +import argparse +import csv +import hashlib +import json +import os +from pathlib import Path +import platform +import re +import resource +import signal +import subprocess +import time + + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[2] +DATABASES = ROOT / ".cache/prefix-main-6105c49f/databases" +CASES = [f"{regime}-{pattern}" for regime in ("resident", "disk") + for pattern in ("common", "random", "nonlexical")] +CASES.append("resident-common-disabled") + + +def sha(path): + result = hashlib.sha256() + with Path(path).open("rb") as stream: + for block in iter(lambda: stream.read(1024 * 1024), b""): + result.update(block) + return result.hexdigest() + + +def save(path, value): + temporary = path.with_suffix(path.suffix + ".tmp") + temporary.write_text(json.dumps(value, indent=2) + "\n") + temporary.replace(path) + + +def read_rows(path): + with path.open() as stream: + return list(csv.DictReader(stream)) + + +def sync(path): + with path.open("rb") as stream: + os.fsync(stream.fileno()) + + +def file_identity(path): + stat = path.stat() + return {"size": stat.st_size, "mtime_ns": stat.st_mtime_ns, + "inode": stat.st_ino, "allocated_bytes": stat.st_blocks * 512} + + +def verify_rows(path, phases, n): + rows = read_rows(path) + assert [row["phase"] for row in rows] == phases, (path, rows, phases) + assert all(int(row["ops"]) > 0 and int(row["errors"]) == 0 + and int(row["violations"]) == 0 for row in rows), path + assert all(int(row["ops"]) == n for row in rows + if row["phase"] == "warm" or row["phase"].startswith("load:")), path + return rows + + +class Campaign: + def __init__(self, args): + self.args = args + self.builds = json.loads((HERE / "build.json").read_text()) + for profile in ("main", "candidate"): + build = self.builds[profile] + for kind in ("binary", "library"): + path = Path(build[kind]) + if not path.is_absolute(): + path = ROOT / path + assert sha(path) == build[kind + "_sha256"], (profile, kind) + build[kind] = str(path) + DATABASES.mkdir(parents=True, exist_ok=True) + filesystem = subprocess.check_output( + ["findmnt", "-n", "-o", "FSTYPE,SOURCE", "-T", str(DATABASES)], + text=True).strip() + assert filesystem.split()[0] not in ("tmpfs", "ramfs"), filesystem + assert filesystem.split()[1].startswith("/dev/"), filesystem + self.folder = HERE / args.mode + self.folder.mkdir(exist_ok=False) + self.fixture_folder = HERE / "fixtures" + self.fixture_folder.mkdir(exist_ok=True) + fixtures_path = HERE / "fixtures.json" + self.fixtures = json.loads(fixtures_path.read_text()) if fixtures_path.exists() else {} + self.manifest = { + "mode": args.mode, "started": time.time(), "complete": False, + "runner_sha256": sha(__file__), "build_json_sha256": sha(HERE / "build.json"), + "builds": self.builds, "storage": filesystem, + "database_directory": str(DATABASES), "io": "O_DIRECT", + "fixture_copy": "cp --reflink=auto --sparse=always, then fsync", + "cpu_affinity": args.cpus, "platform": platform.platform(), + "available_cpu_affinity": sorted(os.sched_getaffinity(0)), + "loadavg_start": os.getloadavg(), "environment": { + "PREFIX_PATTERN": "per case", "PREFIX_DISABLE": "unset except candidate disabled case", + "KVBENCH_STATS_BEFORE_CLOSE": "1 for fixture creation only"}, + "coordination": "Caller holds exclusive campaign benchmark and machine locks", + "seconds": args.seconds, "warmup_seconds": 1, "seed": 42, + "loading_threads": 1, "background_workers": 0, "memtable_mib": 4, + "verification": "Every query verifies key/value or ordered range; overwrite validates up to 4096 measured keys per worker after timing", + "runs": [], + } + self.save() + + def save(self): + save(self.folder / "manifest.json", self.manifest) + + def invoke(self, folder, label, profile, argv, pattern, disabled=False, + fixture=False, timeout=600): + build = self.builds[profile] + command = ["taskset", "-c", self.args.cpus, build["binary"], *map(str, argv)] + environment = dict(os.environ) + environment.pop("PREFIX_DISABLE", None) + environment.pop("KVBENCH_STATS_BEFORE_CLOSE", None) + environment["PREFIX_PATTERN"] = pattern + if disabled: + environment["PREFIX_DISABLE"] = "1" + if fixture: + environment["KVBENCH_STATS_BEFORE_CLOSE"] = "1" + log = folder / (label + ".log") + assert not log.exists(), log + record = {"label": label, "profile": profile, "command": command, + "started": time.time(), "log": str(log.relative_to(HERE)), + "binary_sha256": build["binary_sha256"], + "library_sha256": build["library_sha256"], + "source_commit": build["commit"], "pattern": pattern, + "compression_disabled": disabled, "verified": False} + self.manifest["runs"].append(record) + self.save() + print(label, flush=True) + before = resource.getrusage(resource.RUSAGE_CHILDREN) + try: + with log.open("w") as output: + process = subprocess.Popen(command, cwd=ROOT, env=environment, + stdout=output, stderr=subprocess.STDOUT, + start_new_session=True) + try: + process.wait(timeout=timeout) + except BaseException: + os.killpg(process.pid, signal.SIGKILL) + process.wait() + raise + after = resource.getrusage(resource.RUSAGE_CHILDREN) + record.update(returncode=process.returncode, finished=time.time(), + log_sha256=sha(log), + process_cpu_s=after.ru_utime + after.ru_stime - before.ru_utime - before.ru_stime, + process_read_bytes=512 * (after.ru_inblock - before.ru_inblock), + process_write_bytes=512 * (after.ru_oublock - before.ru_oublock)) + assert process.returncode == 0, record + content = log.read_text() + assert "FINDING: splinterdb_close" not in content, log + assert "FATAL:" not in content and "VIOLATION:" not in content, log + expected = f"prefix-pattern={pattern} key_bytes=64 compression_disabled={'true' if disabled else 'false'}" + assert expected in content, (log, expected) + return record + except BaseException as error: + record.update(exception=repr(error), finished=time.time()) + raise + finally: + self.save() + + def kvargs(self, db, csvpath, profile, regime, wal, index, create=False, + seconds=None): + return ["--db", db, "--create" if create else "--open", + "--n", 200000 if regime == "resident" else 2000000, + "--cache-mib", 128 if regime == "resident" else 64, + "--disk-gib", 8, "--log", wal, "--threads", 1 if create else 8, + "--mt-bg", 0, "--normal-bg", 0, "--memtable-mib", 4, + "--secs", self.args.seconds if seconds is None else seconds, + "--warmup", 1, "--csv", csvpath, "--vtag", profile, + "--stag", regime, "--otag", index, "--rep", index, + "--seed", 42, "--hang-secs", 60, "--hang-dir", self.folder] + + def fixture(self, profile, regime, pattern, wal, disabled=False): + key = f"{profile}-{regime}-{pattern}-wal{wal}" + ("-disabled" if disabled else "") + db = DATABASES / ("fixture-" + key + ".db") + if key in self.fixtures: + result = self.fixtures[key] + assert file_identity(db) == result["identity"], key + assert result["binary_sha256"] == self.builds[profile]["binary_sha256"], key + return result + assert not db.exists(), db + csvpath = self.fixture_folder / (key + ".csv") + argv = self.kvargs(db, csvpath, profile, regime, wal, 0, create=True, seconds=1) + record = self.invoke(self.fixture_folder, "load-" + key, profile, + argv + ["load:random@1"], pattern, disabled, fixture=True) + rows = verify_rows(csvpath, ["load:random@1"], 200000 if regime == "resident" else 2000000) + record.update(verified=True, errors=0, violations=0, csv=str(csvpath.relative_to(HERE))) + self.save() + # Reopened allocator ownership is authoritative; per-page-type counters + # are not persisted and must not be interpreted after reopening. + space = self.invoke(self.fixture_folder, "space-" + key, profile, + self.kvargs(db, csvpath, profile, regime, wal, 0) + ["space"], + pattern, disabled) + matches = re.findall(r"Currently Allocated:\s+(\d+) extents", + (HERE / space["log"]).read_text()) + assert matches, space + space.update(verified=True, live_extents=int(matches[-1])) + sync(db) + result = {"key": key, "profile": profile, "regime": regime, + "pattern": pattern, "wal": wal, "disabled": disabled, + "path": str(db), "identity": file_identity(db), "sha256": sha(db), + "live_extents": int(matches[-1]), "load": rows[0], + "binary_sha256": self.builds[profile]["binary_sha256"], + "load_log": record["log"], "space_log": space["log"]} + self.fixtures[key] = result + save(HERE / "fixtures.json", self.fixtures) + self.save() + return result + + def query(self, case, profile, index, phases, wal=0): + regime, pattern, *tail = case.split("-") + disabled = bool(tail) and profile == "candidate" + fixture = self.fixture(profile, regime, pattern, wal, disabled) + source = Path(fixture["path"]) + before = file_identity(source) + label = f"{case}-wal{wal}-{index:02d}-{profile}" + db = DATABASES / (f"{self.args.mode}-{label}.db") + assert not db.exists(), db + copy_start = time.time() + subprocess.run(["cp", "--reflink=auto", "--sparse=always", str(source), str(db)], check=True) + sync(db) + copy_seconds = time.time() - copy_start + csvpath = self.folder / (label + ".csv") + argv = self.kvargs(db, csvpath, profile, regime, wal, index) + phases + record = self.invoke(self.folder, label, profile, argv, pattern, disabled) + rows = verify_rows(csvpath, phases, 200000 if regime == "resident" else 2000000) + assert file_identity(source) == before, source + record.update(case=case, wal=wal, index=index, fixture_key=fixture["key"], + fixture_sha256=fixture["sha256"], copy_fsynced=True, + copy_seconds=copy_seconds, csv=str(csvpath.relative_to(HERE)), + csv_sha256=sha(csvpath), allocated_bytes=db.stat().st_blocks * 512, + errors=0, violations=0, verified=True, + phase_count=len(rows)) + self.save() + db.unlink() # Only this verified run's disposable copy is removed. + + def run(self): + if self.args.mode == "writes": + cases = ["resident-common", "resident-random"] + for wal in (0, 1): + for case in cases: + for index, profile in enumerate(("main", "candidate", "candidate", "main")): + self.query(case, profile, index, ["warm", "ow:uniform@8"], wal) + else: + cases = self.args.case or (CASES if self.args.mode == "reads" else + ["resident-common", "resident-random", "resident-common-disabled"]) + order = ["main", "candidate", "candidate", "main"] + if self.args.mode == "repeat": + order = [profile for pair in range(self.args.pairs) + for profile in (("main", "candidate") if pair % 2 == 0 else ("candidate", "main"))] + for case in cases: + phases = ["warm", "point:uniform@8", "range:uniform:1@8", "range:uniform:10000@8"] + if self.args.mode == "repeat": + phases = ["warm", "range:uniform:10000@8", "range:uniform:10000@1"] + elif case in ("resident-random", "resident-common-disabled"): + phases.append("range:uniform:10000@1") + for index, profile in enumerate(order): + self.query(case, profile, index, phases) + self.manifest.update(complete=True, finished=time.time(), loadavg_end=os.getloadavg()) + self.save() + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--mode", choices=("reads", "writes", "repeat"), required=True) + parser.add_argument("--case", action="append", choices=CASES, + help="Restrict read/repeat cases; default reads cover the full matrix") + parser.add_argument("--seconds", type=float) + parser.add_argument("--pairs", type=int, default=3, help="Paired repeats per selected case") + parser.add_argument("--cpus", default="0-11") + args = parser.parse_args() + if args.seconds is None: + args.seconds = {"reads": 7, "writes": 8, "repeat": 20}[args.mode] + assert args.seconds > 0 and args.pairs > 0 + Campaign(args).run() + + +if __name__ == "__main__": + main() diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/sha256.json b/benchmarks/results-20261014/prefix-main-6105c49f/sha256.json new file mode 100644 index 000000000..215b0f170 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/sha256.json @@ -0,0 +1,237 @@ +{ + ".gitattributes": "59adc7ceefcd4a76b6455550e9529c05fd89f388e35e201fff983dba3c777bea", + ".gitignore": "32dae3052f331ee34d628ef535709b301259a45df7c7522c4d35dcf49873f00b", + "README.md": "ff9732beb4ac7bbfe1b827beffd19fd814f8ea23099627181f034beb9c7c2fe5", + "audit.json": "16c7a8561597e692405bab762a4dc12fb6622330d1ad7c30219b01c31d6d4e0f", + "audit.py": "999cb08eb224445dc166414212169773c20000cc6a5171e6688eecdb4dfafe03", + "build.json": "7bed995652687ea945106e764423ed445b4573d79dc5973b77f05c3cfda0051b", + "candidate-harness-build.log": "a7662dedaa76c0cca33f544b95ac15145336ad0b163ac4f35ddc46d76e6efc57", + "fixtures/candidate-disk-common-wal0.csv": "42d3457fcc0bc39364d257a12460ba0f9dd6c595af968fb77d74e614ddf3b191", + "fixtures/candidate-disk-nonlexical-wal0.csv": "c137fa9269747d3ac63955fe813255417e42902a05caf500d6a79dacf47d7b45", + "fixtures/candidate-disk-random-wal0.csv": "ea1b6933636fa2b75be9badf1945e19ae1729a3e482b9aeae05888cf574c1f30", + "fixtures/candidate-resident-common-wal0-disabled.csv": "e463b777473e081b5dffbe3d8a1f8c4e29f2ca74371c912aac2c142869ec7751", + "fixtures/candidate-resident-common-wal0.csv": "ef88440fde9a04e2335fd0ce2d8aef1bc6027c5cf4946e8e1736be134574b79d", + "fixtures/candidate-resident-common-wal1.csv": "bdcd05e82284046373476992d42c79974ee233d3becc8a8a10d7a1b895abaa37", + "fixtures/candidate-resident-nonlexical-wal0.csv": "bea48c12209fd4fffe0b15d79c29029a7bf89a1ffcd3c5bab79a1159c6e16573", + "fixtures/candidate-resident-random-wal0.csv": "b470ca4907ed6b9b35b1d1708b30992896da98e04099ec6319d90659c252c821", + "fixtures/candidate-resident-random-wal1.csv": "e5c9f55b93c11976812e5c6843916f3c862d3c501499d92428faff5e2f1231c1", + "fixtures/load-candidate-disk-common-wal0.log": "d385d761493143bc774e727590e9086357268c0c91e97f39cb44f8d9c49ebe2f", + "fixtures/load-candidate-disk-nonlexical-wal0.log": "69dd0483b9beeaa174c80828e2e701b46f7015d3b1a31facd947739c584b0c8d", + "fixtures/load-candidate-disk-random-wal0.log": "417e14ff55ecc7c88a4438829eba66288bf4252114b925db916eadca06031c89", + "fixtures/load-candidate-resident-common-wal0-disabled.log": "148272476960ffe65d1cadb9b0bb06c091ab01150c5c8747bc2e93c2714361cd", + "fixtures/load-candidate-resident-common-wal0.log": "fad0a52af9174b39e338a46b9764e8ad34ed1b79456bee038a6e0a269339edf0", + "fixtures/load-candidate-resident-common-wal1.log": "c5eaf969791b324c3a0f707c8a990a7116c7d35e3b47c3c865741d20e6b722b4", + "fixtures/load-candidate-resident-nonlexical-wal0.log": "caaaece8aeaa43a7c581acc681ef1bd5be09b98514a63d77f24a9820e7648c00", + "fixtures/load-candidate-resident-random-wal0.log": "1a5daef79adeacea4aaf65f13cea8b9773b3ed9884c8628b52219315ca7ba851", + "fixtures/load-candidate-resident-random-wal1.log": "c8918b811c9c8f4ce273a2633dc6e1a4a27117db59da0764624c002d681bab1f", + "fixtures/load-main-disk-common-wal0.log": "45edc445076b26576286e5f7c84fd6b089ddc1725580af7bc219b5ebebd58e33", + "fixtures/load-main-disk-nonlexical-wal0.log": "f6e6eba78052b7a7f79786efbae89e4d8a11f7c06992ae8f5bd4a7169736e0aa", + "fixtures/load-main-disk-random-wal0.log": "7680dad51adeed6719d18eac55feb2d6f43036c339f0872e037823058493e4ba", + "fixtures/load-main-resident-common-wal0.log": "18f3ad13ea489bad9da0c0ebfcc18b364a9225be43b0873da927de767debe8a2", + "fixtures/load-main-resident-common-wal1.log": "0048bd392310c3ede7f901b36d6e846884a51a9cbcaeb16313c9147852264257", + "fixtures/load-main-resident-nonlexical-wal0.log": "fd7ea90a8d8d4b6bd0f3e4840f7d4f9129f3ffaba82a01aa2d3813a0639c85aa", + "fixtures/load-main-resident-random-wal0.log": "b10a82fd89d784f75fba697224c2e0900c30582f56e56f5ddf2b4b95f1080195", + "fixtures/load-main-resident-random-wal1.log": "5388431799ac6253569c93c08505e2c6080e1b9a401f12a4677cc20b59f49869", + "fixtures/main-disk-common-wal0.csv": "3b7a9cc97282d4022bfd44a2a5f37f4660b390c3dcb53d0c1d83eb17d8cf3c26", + "fixtures/main-disk-nonlexical-wal0.csv": "88d7963cbaa422b60b2c91a696a9558938c2136ebbc3488c7760303bd8af00ff", + "fixtures/main-disk-random-wal0.csv": "6a3d454745af7506a292f6f33f7194b0e9bb15d43c44eb1a9b498d124b5b3512", + "fixtures/main-resident-common-wal0.csv": "b4a4bb29fd4b455b39da41626a7f1b0a3a08a2bd27f28c207e5d46f2250a3f39", + "fixtures/main-resident-common-wal1.csv": "280b293ced88f8063da3ed10a2c1b9fa6157e798e10b63f7fd7ec43167d4a343", + "fixtures/main-resident-nonlexical-wal0.csv": "bc84587e45b7f0ba9f2a71d8fddb3ada62b43e65305ab96b12641996f3b61d60", + "fixtures/main-resident-random-wal0.csv": "a1dfd1dcbd8603208137f58cb741c6d357d409d3e1d18b16a4fa8ffdff50265d", + "fixtures/main-resident-random-wal1.csv": "bc774e34d7465ab3edb359a032c58c455a9ce9b19fe894850583b27fe486e82c", + "fixtures/space-candidate-disk-common-wal0.log": "a720f6b26d8415ea53e9e63a0ba91c49dd90669a235204c9d7235f9ba7948952", + "fixtures/space-candidate-disk-nonlexical-wal0.log": "2d699969afb74cba2a05b9c57a7b93bee1dab3d7278d8389df20041683d78ecd", + "fixtures/space-candidate-disk-random-wal0.log": "69a4a53652f038cf9d3d1ccd7481299a62cf371b64b1787e2ab2c6b53ae69d8a", + "fixtures/space-candidate-resident-common-wal0-disabled.log": "5fa0d7c08f1cdc2f901bb1466b51c09a5937c0693e13f7b32e57b832e0114578", + "fixtures/space-candidate-resident-common-wal0.log": "f8d316fb316dd1232d01db8fd42d5d243d41b0ddd92bb690ceb8276a7bb34581", + "fixtures/space-candidate-resident-common-wal1.log": "396cc5934ab676fe64361c1b17a4c80ba086f37f9b6a7561d628062b0cac9ea8", + "fixtures/space-candidate-resident-nonlexical-wal0.log": "212fb0ce90510a59cc014c8a44bd724411084131bd720f6c7feb163beccd45cb", + "fixtures/space-candidate-resident-random-wal0.log": "b1c96815f733bc3815444f4e2d46bddcecf3de02d94943a31804fb46a3e09c77", + "fixtures/space-candidate-resident-random-wal1.log": "01f39efed5e205fa7a3fee92f8656a5a92e76414c49a21c4be63675231b17407", + "fixtures/space-main-disk-common-wal0.log": "0e528d189b6429e41bbbd7727611a57cdea215ddd26378e94915b08660d4d0e5", + "fixtures/space-main-disk-nonlexical-wal0.log": "221a20eeb38b98049bdbf4f75052ce6fc1b49eb52df731b8ec9eff5e7b0cc378", + "fixtures/space-main-disk-random-wal0.log": "9be1f008bacf81ba12f0df9f98e96827810285805d3de698af71d4e28b409776", + "fixtures/space-main-resident-common-wal0.log": "5a00eb062d7e6700f3697a3036822c3b3fc58d0c1d7d8d3e4bc0e2f4812b7655", + "fixtures/space-main-resident-common-wal1.log": "05e7995a1cf7767804894edd7ced6c6126e5294d2531ac88f99cbf1e7c78313e", + "fixtures/space-main-resident-nonlexical-wal0.log": "2354e63875c291b5462e42b979b9cb808575042e89b623379256ad5f8ddd155c", + "fixtures/space-main-resident-random-wal0.log": "acdaa32faf88bd61d63a036b854522d23c4c11f1ddef4072323908ec6e940c2d", + "fixtures/space-main-resident-random-wal1.log": "5483c4eff622bffe1d0de5e3a355aff34e42c853f91d3e1d4a0fbe93de0343fa", + "fixtures.json": "baa2d5c6fd149777ca2e94abdd1b49fb72ea635163f879d52b562fc18f87f527", + "followup.py": "d7729a74af101dc8ce0c4d1f5c301c9326094568c7f12ab9cfaa21e617c292bc", + "jobs.json": "e0878b086f08583ba25eb2eebad557dfc26fa5a88c4a170353021d3e4ec0b57e", + "main-build.log": "7e431b7de2d5354359b49836de5393bddc140f2df5b063e7eb56753c5b6352de", + "main-harness-build.log": "65398f59cb2389b0de1eae311671b087fdc688400ad09c6f82bced966250a7aa", + "reads/disk-common-wal0-00-main.csv": "17a3f00975f76f4d1aebca4b58db2602e0c0cfa289222788d6e81d6564e7aa4e", + "reads/disk-common-wal0-00-main.log": "c1b12d0d4c50ba15421c077cc20656fe60f7b52766b343cd0e0abdad434c9243", + "reads/disk-common-wal0-01-candidate.csv": "a744cab385ad506add6f549a1e26a23e0e5032b2a703824034bb2781cf394007", + "reads/disk-common-wal0-01-candidate.log": "f5ce25533b334a493b3f15ecdc36a6d2ede200034a5555f3423b331f52be75d7", + "reads/disk-common-wal0-02-candidate.csv": "4482cb17d862f723f04205d66168e791dc8bbf8565526aef077fa04f07d602a7", + "reads/disk-common-wal0-02-candidate.log": "b5c7f0a0d45d819a9c6c638747dc3f6135709945489ce0cd714a984e2c721d3b", + "reads/disk-common-wal0-03-main.csv": "5805277a977d10d189387b5a9acaa21c5597611eca22649e1e6ec0123000ea95", + "reads/disk-common-wal0-03-main.log": "7588ea5f45c70ede335f1681e1f2657d5d5892cd3174f4c708d41664b070edd3", + "reads/disk-nonlexical-wal0-00-main.csv": "ab9feb2a4109866d250d134e65ee64a783cd85bf8eb66638b409e3b390b48b62", + "reads/disk-nonlexical-wal0-00-main.log": "553bfec55b20e53a88ff8c86eb20cf80e57154346248bc68108cb790a9dc4e5f", + "reads/disk-nonlexical-wal0-01-candidate.csv": "00d81b27d38df58fe9a45fa2052bcf7ac1d8644d6f4dabd8d2e82643c019d0b2", + "reads/disk-nonlexical-wal0-01-candidate.log": "8cde9d18aca4df590cad44e8cba37fff1b541e19f703ba68e0acf9e5a4aa1a81", + "reads/disk-nonlexical-wal0-02-candidate.csv": "134e76299279de845d9eae74d0b53debcd24b306623d883ae527cfe84da59b90", + "reads/disk-nonlexical-wal0-02-candidate.log": "e89cf512bd93ce7a6dc3243bca36f7be44b96fc5960ec4a86a6b4873226f3cd1", + "reads/disk-nonlexical-wal0-03-main.csv": "7c92e0d1489f470311efc309ebd03999a1b0610d775f535b173971079280af88", + "reads/disk-nonlexical-wal0-03-main.log": "0f7795cf5f9a51493ce3f215ebaf6f605e69f107bb67e540ef06d0c1897ce8ce", + "reads/disk-random-wal0-00-main.csv": "fae1dec50849d38af6cdb78498f2c96b4cbddb0f071ec6a492faf6070c7c481c", + "reads/disk-random-wal0-00-main.log": "3563c04b339fc8970aedf56ec5796377bfaad08c4ad30f6b58e130076e0794d9", + "reads/disk-random-wal0-01-candidate.csv": "66aeb7cd450a5e75a1cb70c0d0dd0294d303b8cd8fd0ff9de0d8a122dc457864", + "reads/disk-random-wal0-01-candidate.log": "8df230ddd756287031f4a3b5982a65e916c9eddbaaaa26715abddd9d5729fbc1", + "reads/disk-random-wal0-02-candidate.csv": "6ebb822d7c159b599a24244b2fef2fd9561e140e9ab00e16b1a1a52a7b7e5d1f", + "reads/disk-random-wal0-02-candidate.log": "38389ee1d34ca638c9c00c165ba0f3e7e7c1869569c6f98157706d8b6a39de2d", + "reads/disk-random-wal0-03-main.csv": "b6d47f74d7ccf21681635f230c0133cd0e825765a1cd09da149821f6564ad58e", + "reads/disk-random-wal0-03-main.log": "43e84814080518023ba4c408995d59a00cb3f1a1b5603f2c977b80050754ccb7", + "reads/manifest.json": "accd7172d3263c651c6bcc3ea2c6575337b113dd42d5ac1b94415b952f45b128", + "reads/resident-common-disabled-wal0-00-main.csv": "dd6f7684418e133deee20de99272d25ab921a5add4e5025d37850523afa4429d", + "reads/resident-common-disabled-wal0-00-main.log": "851389cf70d682c7a42414a38927683432cd87f011f212a554f7de9d603b915e", + "reads/resident-common-disabled-wal0-01-candidate.csv": "d54653b39b16bfa095d636e1c660a948fee37dff12b320a4bd001f5dc80cbd4d", + "reads/resident-common-disabled-wal0-01-candidate.log": "bd92d15ffe743cd30f0d01f8ea7dcfa730eb44a50e08b5bf81b64c37ea2f2999", + "reads/resident-common-disabled-wal0-02-candidate.csv": "343befd21ff92bfc2fcd10a711168add85deda244b588cb17e0646275b9af3e5", + "reads/resident-common-disabled-wal0-02-candidate.log": "61359382525692e7619446c613ea09c9ef96975d38f1f6492c31c5c5d33db54a", + "reads/resident-common-disabled-wal0-03-main.csv": "d25c48a57605d94dc5a18a50c37ddcbf1af79c8357ca51b83675ad4dfbe05e57", + "reads/resident-common-disabled-wal0-03-main.log": "6a9e91d2e6fc5f44f2852d18ecc01a3e693f7e2ea052af4d4d8942c77b5ff893", + "reads/resident-common-wal0-00-main.csv": "0f613440cb864b9d1dd4ae227f649d6e0842d5811cd56f0d016fbd1617317071", + "reads/resident-common-wal0-00-main.log": "4483cce20da1d90cd5cfb362528a6198c32ea3a2e2a4192effafe7e08dea1d11", + "reads/resident-common-wal0-01-candidate.csv": "9165a462d1bac43a6d4da35c51fa052b75c026b9ab0552b12b7838060d6ed866", + "reads/resident-common-wal0-01-candidate.log": "29c7c306a92939076027be113bdd9a1920bade59d547b1913c5047fad31091d9", + "reads/resident-common-wal0-02-candidate.csv": "f88ec6cf056491450410b555abbd666eb8b79c1ca4126a7487bcccb7fcc2e28d", + "reads/resident-common-wal0-02-candidate.log": "2f140f48521fd5ba9170bcbcd07c17e225826e570fea11346ddb4aa5cab1c671", + "reads/resident-common-wal0-03-main.csv": "bf6400b52762b75f8606a5f418f24997a18ca955fe0469511836d14bcee6115f", + "reads/resident-common-wal0-03-main.log": "0f7e80ffeb18e4ba2068eb8cdc5572f878f8bf0ffb86154d2bff15959be9f232", + "reads/resident-nonlexical-wal0-00-main.csv": "a3a300f9b0418ab22148ae11aa7001d4dffae8b2aacc58bf1e94781ceb5bf009", + "reads/resident-nonlexical-wal0-00-main.log": "78f01ee84cab01a4275df88f6ef85880c8b37fc38b0672fecef61583abe2f12a", + "reads/resident-nonlexical-wal0-01-candidate.csv": "b7e43f5881506bbd1f6ae390da93924cb50e34d3f616ce974c858a1e4e6ce6f1", + "reads/resident-nonlexical-wal0-01-candidate.log": "e14662c9c949d7a6cc1b3be1a17ef8a41d3e83660a5d5c4b4de5705b7bd6b5d7", + "reads/resident-nonlexical-wal0-02-candidate.csv": "d4f76f9f1a903cc461fac2c0775a46197d0ece935d7afc2aa49dbc96c87ab1ff", + "reads/resident-nonlexical-wal0-02-candidate.log": "5e038ea7d77646db4310500a5ac8dcc2921f414a61fac2189206c18a3d7d0f07", + "reads/resident-nonlexical-wal0-03-main.csv": "83e7b38fbbf08c92aab7c64d68fddcb283c37011fc477bb420bceb94e9744033", + "reads/resident-nonlexical-wal0-03-main.log": "5bb78777b2dc4e365fa4fbea39854a37b385ece8eb769e1ad4f11fe8213b64b9", + "reads/resident-random-wal0-00-main.csv": "21bcabd89dea859a9faf2cd6d0eec2887912f42cb0b474dfa8ad42c7bf5bacfd", + "reads/resident-random-wal0-00-main.log": "9f03422ef7352eb0cb00e5b310ef14cb2a71b2843197271aff28dc037883b6d3", + "reads/resident-random-wal0-01-candidate.csv": "374333a2bf1babace068d70dc9b8216bf29dae58d3952a95efcaf4cadad2d1d7", + "reads/resident-random-wal0-01-candidate.log": "bd6b95a797eae86a20efd5ba42212e44822e6f3ef8403193e4c9f161f6e39137", + "reads/resident-random-wal0-02-candidate.csv": "d4af4bb252248f300a2ebe838a20599523b69747fa42b3a01cbbdb72d4afd621", + "reads/resident-random-wal0-02-candidate.log": "1a52e2cbb98c55d05d90a96091b98e63885cd0a6683020ec1abb6607794ae8f3", + "reads/resident-random-wal0-03-main.csv": "5910f056e16b0f75ed5675afca09a6947a853923a8c4d34a62c56ac1e6639fa2", + "reads/resident-random-wal0-03-main.log": "233e25ddf874e7823f0fb33e7ab18e72485edb84761bdf19559b86c1b5e6415e", + "reads-progress.log": "e03cf164a16951b0284cc135ed6b3eb06544c9c7a013f2e6bffe7941be9ffac3", + "repeat/manifest.json": "3037184c44bb226ea649f6c96e0bb744b64d7b98832931b0f782462d19e5ca62", + "repeat/resident-common-disabled-wal0-00-main.csv": "9fe54f133e773c9f9301e9646d4a5707690b3f9ebbdad03601ce75073347cb8d", + "repeat/resident-common-disabled-wal0-00-main.log": "002520c83d570ce327d30066a88c62f665c051ee3c97954f8cf48253fcfa6eea", + "repeat/resident-common-disabled-wal0-01-candidate.csv": "3fdfb925c730123a027ca7ed7d8a9c9e28bfc5119b51ae3b5d3efa69b1e2e176", + "repeat/resident-common-disabled-wal0-01-candidate.log": "c0385c0e382d4e2a877dc4dc6173be1a026b2272596fdbc902d87cd15daa9c1d", + "repeat/resident-common-disabled-wal0-02-candidate.csv": "cee0086f84e23c1a2158e7dff736792be3cce6870706433bd9a6ae6830ad66ff", + "repeat/resident-common-disabled-wal0-02-candidate.log": "ebe74feaf307f9f375c86c85fe3213e8ee447d55439152e7af0e838f6409547e", + "repeat/resident-common-disabled-wal0-03-main.csv": "0162193328ccea413381a7e0c1f6621a7753e679cb9e4171600a8b736961c623", + "repeat/resident-common-disabled-wal0-03-main.log": "67ee844e56716da0f3d3000edc0092023ae1e2941b47c7ea032fbb078ef9d3e6", + "repeat/resident-common-disabled-wal0-04-main.csv": "9b30bbe912a7b68b8e8cbc25a3cbaeec6f00fdccba19043ea6c150db677363f6", + "repeat/resident-common-disabled-wal0-04-main.log": "8dc96d326e54f7882cbb11b3fd9947e76ea38a009d0ab76360d62df6a7511e2c", + "repeat/resident-common-disabled-wal0-05-candidate.csv": "5ad76bdf608baabea95ff81d4cb96ff67a4d748e8866b6f1b3bb3e2b6ec39db1", + "repeat/resident-common-disabled-wal0-05-candidate.log": "94fcf2ee4788c60a0c3f6b43a3dc54a8a94e2aaea070c4226cc8da9f9e3e8fa6", + "repeat/resident-common-wal0-00-main.csv": "a323a479c67e4b37c49c529f69f84b1c225ad647f75cf2e2cd02c86bd6f09c7b", + "repeat/resident-common-wal0-00-main.log": "9d74b741e4d3d5940f44b653368abd6d6dd1184efa9eb244510219b225cee89e", + "repeat/resident-common-wal0-01-candidate.csv": "cf8483e031da6019e49cdc7d602bc4b1798325c61dd8b75fbb8009cd9cf109dd", + "repeat/resident-common-wal0-01-candidate.log": "74c720df6a01c75d822581d83e642a56d379a842fa2b31ed521e3c6c0a6ee639", + "repeat/resident-common-wal0-02-candidate.csv": "af9695604a897972617619a8ee44a2f44fb2f6fe670fd8bd55cc647e8e2ab39a", + "repeat/resident-common-wal0-02-candidate.log": "812ad5cccd0d1d48ee63f5e0086ea7a704c7cde4696347ee466853db52307260", + "repeat/resident-common-wal0-03-main.csv": "2526a3ecc08aa410ca42eac5e6b39eaae5cbd4679ea13e882fac1159d2ca64c7", + "repeat/resident-common-wal0-03-main.log": "27d7f026975bcfb13b1a50eeea44368690a3ed2d852ff7acb3662cd6913c8b2c", + "repeat/resident-common-wal0-04-main.csv": "8bafb4930714708a243a3809ca309bd28a500714c68d6227ac03380d3abe162e", + "repeat/resident-common-wal0-04-main.log": "5315dce232e14a786f7f77ba29c5fdffb58b8cf12c8273d7755657db9b42bca0", + "repeat/resident-common-wal0-05-candidate.csv": "001c62c8a025301cf1019d33b3a27d29d1bd5333ca20f86a646e25d69ca3dd8e", + "repeat/resident-common-wal0-05-candidate.log": "721765ff935fff4d2d709d033e08b97ea9fcd49aea238dfab96d291603378454", + "repeat/resident-nonlexical-wal0-00-main.csv": "db116e20d99bdd1f4b81828827e92f57c6fb870b8fdda2299565d7d9dbcdd892", + "repeat/resident-nonlexical-wal0-00-main.log": "005f144b9cf2f543a9813058e83cb62d01c4c115572e98b150dcf1a6606009e7", + "repeat/resident-nonlexical-wal0-01-candidate.csv": "7cb8ecb9dd462b9ced6887126f8c1e37bfddc9101c425e182f4aacc123fe49d7", + "repeat/resident-nonlexical-wal0-01-candidate.log": "01c5a8a499abec0ae0653287ef35b0dc9d8c91fd0ab9356eb19e91149ca2952b", + "repeat/resident-nonlexical-wal0-02-candidate.csv": "5ba11ef2ae3185736bfaefec9592fef78f886078aee4d3bfffeafd4c695d4379", + "repeat/resident-nonlexical-wal0-02-candidate.log": "c17afae1883991a075247ee5b8e67b1c5c4f4372a6faee968850ae59b7050e0d", + "repeat/resident-nonlexical-wal0-03-main.csv": "227b6564a581db01be822c9b80198b203affcada4b8e7396b638891cd89bc3a6", + "repeat/resident-nonlexical-wal0-03-main.log": "e64af14daa924295b8fbecdf4907984a0962c743183054e11434ee10a15104b2", + "repeat/resident-nonlexical-wal0-04-main.csv": "ba919ea95ac9a2c668a925c4cf4a055085eee2b2c45f80008523448bf248a116", + "repeat/resident-nonlexical-wal0-04-main.log": "60392997587535e056a61800fe9acbc575802c5a1d6fa839300b3463c1aea704", + "repeat/resident-nonlexical-wal0-05-candidate.csv": "dfb51a9bebd037afe9e57b60fecca4e3ac21b33c8a81f3c8d4e37fcee7c7187a", + "repeat/resident-nonlexical-wal0-05-candidate.log": "f415a8ec1c9ee38a69caf48c5bb69666839a81d6221c2d39a150de6fdfa9f588", + "repeat/resident-random-wal1-00-main.csv": "7f5767c3438605e808598c64e6d807b3706faff207b433be4a3b00305919f27b", + "repeat/resident-random-wal1-00-main.log": "30178660f06c3073c97a08ad06aa25e34c8efb6bf29f52d51de46bb6182b2aaa", + "repeat/resident-random-wal1-01-candidate.csv": "7a28f13ef145ce27905a56b79b7425349b730ab022ac15fe10313e7b0907ac75", + "repeat/resident-random-wal1-01-candidate.log": "964441dc228b89dc2fbd9e6adb8b797b4b9fcdd4cf899b6cebbb04f983822be9", + "repeat/resident-random-wal1-02-candidate.csv": "e5342aaac8d4c6e0286d63d3c5bf9e87cc96adf83bb06a9e480ad81ab3854bca", + "repeat/resident-random-wal1-02-candidate.log": "d36bebbbe057870c8693490ca21b9a28db6f0d53a26fcf68947a100ef927beb7", + "repeat/resident-random-wal1-03-main.csv": "176fa7dfc1b46711c184f3176e0abfc6383f5fecb5aaea1c6233e9dae2af78f8", + "repeat/resident-random-wal1-03-main.log": "d52af34d3ad1f6deeccca8bbbb06b29436b1a57bbb052bb46d7079b07f71bf70", + "repeat/resident-random-wal1-04-main.csv": "e759bd33d02cde7db44e8144e4e117a45901fb4248e29a09cfaa9e5fcda89975", + "repeat/resident-random-wal1-04-main.log": "0ce1b25f46107ef015890b7aca921feff987151243a9d13e795a93679a63e25c", + "repeat/resident-random-wal1-05-candidate.csv": "33f603888a3ec5159946905d57f2d88a021929d84ef93d73f0759f61ef091055", + "repeat/resident-random-wal1-05-candidate.log": "984e84da6d034fbb14c95c5b8b16489aeb768c2de08475af8bacc84c55d75d9e", + "repeat-progress.log": "9991a04d5490aa4aa6b74e41727f921ead595b7d5f551a755fdfedab7bea38be", + "report.md": "32cdce534759aece1086816c3085d43b30b840c76b3196c486ac7b519508b9b3", + "report.py": "39b1f7f0f2b9054cb9537c6c393fa54adc9a9a3ff24609f3f109d894d5b896ff", + "run_benchmarks.py": "eef41a21f8c4275c300fa24ed69b457b233c8ee0a470926d84c3f5ea755ebd25", + "summary.csv": "3d8a8a8a7851e196930fa7b86e5a092e03d95e74569bff385ac5413e8355a4e6", + "summary.json": "b1f561e5993635a9ddc927456eb0ff934cb4c53cf988979a6f31a94602677f98", + "tests/debug-automatic-log-recovery.log": "8dc9ad999563816f8e216bc466f0e27af5f128d687db59d144b9ccc6fd3887f1", + "tests/debug-btree.log": "8d6f3caf1bd818039731202863e513bfa32dffa0b668513bf8fc5b17721b9a9b", + "tests/debug-build.json": "7e5f3b9408277c819ed3e97c25e71d2a42b8984047623931bea12e63070bde8d", + "tests/debug-build.log": "ec851d07175da201343734413275610d482f4a8df028a2dd6973c0366772800a", + "tests/debug-functional-log.log": "eedf17c606920f787b8601ebc222198fe2eaa797d80870fd672096fa65c81222", + "tests/debug-merge.log": "90bda4d9f7155fdb6f9a2e394aa3acc5746f0d71217805fcf2210fa3d4f27a3b", + "tests/debug-results.json": "83de47b57000cee880355c2e1bd093cccbab888380d32c4b14200796dcce2e1d", + "tests/debug-source-check.json": "1ae748d5796cc995906ddf0fba5e5626f9c1c6ac79cec8fb465106e92254a77b", + "tests/debug-source-manifest.json": "ed29861d7925ae46d41dba199c9e41b9fd3adb97fafe99ddbbec5156936e1b9b", + "tests/debug-splinter.log": "4fb0254a17a2aa94f48c0a0a74fff31af30102d1db784cf5fc968d274bcd1731", + "tests/debug-splinterdb_quick.log": "f0f92daa0cb7550e9767a81139bd5abfc4428225588502b5245fae1af36de79b", + "tests/debug-superblock.log": "e2c7a8d4c83a3efbcdba82d51287d69fbb76a04a828b3d2b4d23fb08c2b8f6c7", + "tests/release-automatic-log-recovery.log": "4e1a3eea4cc3abba55ea549d48473a0815980bce645ad80d50e2adf7087ef83b", + "tests/release-btree.log": "1159d05f22b0856c2e5eb66afcb51bf70db527e8597e2f4aef0d4dce5894cead", + "tests/release-build.json": "451cb42faa7defc32d2e5093712ddccbf06d5bbaf2ffeda4d001b39d7e0ef24d", + "tests/release-build.log": "5905efb5904de017adee723fba2e69132469012570fe056af37573bc6b935562", + "tests/release-functional-log.log": "0a43cfe8076562afbe26fbe237e9e601d63b638bde798ba9abfced51d505cee1", + "tests/release-merge.log": "8321f9bc1d800a010cbe8c77234da380a5a6f3cfa6a499dfc557b29632a3cbe2", + "tests/release-results.json": "2bc9b64f0c7b3eaf1ba2d09c5b1aec75b1f369f937704de68066ab62849ef82c", + "tests/release-source-check.json": "1ae748d5796cc995906ddf0fba5e5626f9c1c6ac79cec8fb465106e92254a77b", + "tests/release-source-manifest.json": "ed29861d7925ae46d41dba199c9e41b9fd3adb97fafe99ddbbec5156936e1b9b", + "tests/release-splinter.log": "70df441665ddd1975c20649be48edba0bdd058ba0e2aa644d782cbfbda67ef99", + "tests/release-splinterdb_quick.log": "a334eaa7cf546f086b7796751627d2381d14a3824bf69ac5f903d5b7813a5b20", + "tests/release-superblock.log": "335762194e6cc9560c21f1feb24f5694bcc88031bcc1c072dca9413d08b68753", + "tests/validate.py": "22ccf4a9912852183d3a0d76ae883e1755ce4549057ec9dcb0944934a67c1ac6", + "writes/manifest.json": "83f6cb3fadc58f07f8fff0b5d6a93d195868ce6e24ed5b4cd37300b502a07f5e", + "writes/resident-common-wal0-00-main.csv": "8882b022747dca641e7228f74ca2e817654cb2980e6c113ade723576d51c2d70", + "writes/resident-common-wal0-00-main.log": "f09b3e1e9d2d6554edfb349576937113473fcb256f7692d2cd562c4bfb8d9245", + "writes/resident-common-wal0-01-candidate.csv": "dd3fe9c1d144a7da55c5b8ad074b96ed0fe3325c8064c5bce633f643a34387c5", + "writes/resident-common-wal0-01-candidate.log": "f0931c63cf82b382ed5227493a90fdf5746bc7de9f5d65806f3313197518a4b4", + "writes/resident-common-wal0-02-candidate.csv": "988dc3c82721c0e33085e4e2a9bf1820b9e3612148563c976bcdb0e2ec4a28cc", + "writes/resident-common-wal0-02-candidate.log": "08c5497eb94536a19388c030c2795bc2232089e5ac485b84511072d496dcf32d", + "writes/resident-common-wal0-03-main.csv": "40267adf5e8fe22864da435620d54cde085ccaf2eb9e5423cf4ed1b44371f682", + "writes/resident-common-wal0-03-main.log": "6a677217e04dffa48e6be53b816d8886faa1f9df97506dd6c42396e7be62dea7", + "writes/resident-common-wal1-00-main.csv": "cca6126514214c030b99b26a5d63cc1223e4fcfc4473a3d389d9c4c10e5cfa03", + "writes/resident-common-wal1-00-main.log": "fb404721b1140afea7331235cc182917f7baf24322c915ab69822b2fe1a01060", + "writes/resident-common-wal1-01-candidate.csv": "9237560d45ef9ea4d7f5a8a4d86e26581f6a7092c35f3959fee1ba2a626eee0e", + "writes/resident-common-wal1-01-candidate.log": "8de6d260b9b819b3fd0f4e794ce54aa43b1a9fbead933946aa3bd1af7dbea1e3", + "writes/resident-common-wal1-02-candidate.csv": "0a4236ab7bfeb47e356b6baaea2ffe7f9b838d0f325b0adf8685ee69dda91283", + "writes/resident-common-wal1-02-candidate.log": "2fe14f556187e18a6ea151f8f9ae90d0cca46d3e30ff66eb3728e7c206aa7c8d", + "writes/resident-common-wal1-03-main.csv": "318e61a360a6056fd30981b3e7ff3264cea52fc156e0a9cf8ff47bc90f7db40f", + "writes/resident-common-wal1-03-main.log": "6f14487ead729ae50ecae11b91c9607ed3e6dc89aa4fef673f5313e7851e6383", + "writes/resident-random-wal0-00-main.csv": "4294f432a65895f8ebca93bdbc81c1561a66c83d53e9a17d155b90b86039bed4", + "writes/resident-random-wal0-00-main.log": "4f5ac2c4699a2eed46c256e1f9d8a0268687c8c614df63121843bfd992a464e4", + "writes/resident-random-wal0-01-candidate.csv": "515c3887d2883b3cdd7d6ee2be7aa4ff7bd173652cd20ce28c388bc6d807882e", + "writes/resident-random-wal0-01-candidate.log": "13a9123e26fa805e02456364abd56ff9e7c7407da3bdf040370c4bf52b581598", + "writes/resident-random-wal0-02-candidate.csv": "e5a399256fa3e587fbd6905dbe6ba65871bc7e990617c6ae7dc7128ba9f71a23", + "writes/resident-random-wal0-02-candidate.log": "55e0ebe386d8537912bbd1d93d9f20c9841ad5ac4da02e528bde37cb26afc4dd", + "writes/resident-random-wal0-03-main.csv": "dfa1d0f854e26228da1233253002d50e6452b8bc8624d0b521436858934dd42b", + "writes/resident-random-wal0-03-main.log": "6896ee0363d31e82f91b99d9715fbe245001f77a0292367f880272c2cb62aa34", + "writes/resident-random-wal1-00-main.csv": "a55729078990c8b1ace115dded4a8053bdb6e84300e389cf381c855b526634b3", + "writes/resident-random-wal1-00-main.log": "6c5933a186a389ab971f65d8723ca660d12f52f66064d2fe6c4ad2f919a819bc", + "writes/resident-random-wal1-01-candidate.csv": "d98158ad3ef707ccea8927210937f34918eb670e3264508b453a92e6f7b5330c", + "writes/resident-random-wal1-01-candidate.log": "c7134994f4e27d5e7ba4437f4f564dfb3218c8e5bedae4840903708d93fd5102", + "writes/resident-random-wal1-02-candidate.csv": "8f03b8cb2c52641eda8fc3e0a15e1221861f47b2c0d089ec9f5454cd1ec7a48a", + "writes/resident-random-wal1-02-candidate.log": "61a7b1c61bda86ca7dbe49f63042fe0353219c43b45253bac38450b63db7b674", + "writes/resident-random-wal1-03-main.csv": "05aaf4807eb3e8005922ab4087d790bb381e04ecd0f3317e7fd71c75af22eaec", + "writes/resident-random-wal1-03-main.log": "03752930bd4d6efbc748790a766ae8042e26886c24795a02b45fe7208e078751", + "writes-progress.log": "5958deb97d0a3ff05852433d512189100be4de7b9932e4a05b47025a0bfd7d07" +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/summary.csv b/benchmarks/results-20261014/prefix-main-6105c49f/summary.csv new file mode 100644 index 000000000..555e78772 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/summary.csv @@ -0,0 +1,33 @@ +mode,case,wal,phase,main_samples,candidate_samples,main_ops_s,candidate_ops_s,change_ops_s_pct,main_ops_s_min,main_ops_s_max,candidate_ops_s_min,candidate_ops_s_max,main_p99_us,candidate_p99_us,change_p99_us_pct,main_p99_us_min,main_p99_us_max,candidate_p99_us_min,candidate_p99_us_max,main_p999_us,candidate_p999_us,change_p999_us_pct,main_p999_us_min,main_p999_us_max,candidate_p999_us_min,candidate_p999_us_max,main_ops_per_cpu_s,candidate_ops_per_cpu_s,change_ops_per_cpu_s_pct,main_ops_per_cpu_s_min,main_ops_per_cpu_s_max,candidate_ops_per_cpu_s_min,candidate_ops_per_cpu_s_max,main_rd_B_op,candidate_rd_B_op,change_rd_B_op_pct,main_rd_B_op_min,main_rd_B_op_max,candidate_rd_B_op_min,candidate_rd_B_op_max,main_wr_B_op,candidate_wr_B_op,change_wr_B_op_pct,main_wr_B_op_min,main_wr_B_op_max,candidate_wr_B_op_min,candidate_wr_B_op_max,main_ops_with_drain_s,candidate_ops_with_drain_s,change_ops_with_drain_s_pct,main_ops_with_drain_s_min,main_ops_with_drain_s_max,candidate_ops_with_drain_s_min,candidate_ops_with_drain_s_max,throughput_ranges_overlap +reads,resident-common,0,point:uniform@8,2,2,4500543.05,4740951.300000001,5.341760923717875,4074604.5,4926481.6,4492319.2,4989583.4,2.592,2.24,-13.58024691358024,2.592,2.592,2.144,2.336,10.975999999999999,6.016,-45.18950437317783,6.72,15.232,5.184,6.848,562793.25,592746.7,5.322283094191338,509634.3,615952.2,561629.2,623864.2,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,4500677.214285715,4741101.285714285,5.341953221293783,4074736.4285714286,4926618.0,4492463.285714285,4989739.285714285,True +reads,resident-common,0,range:uniform:1@8,2,2,1164460.1,1175871.2999999998,0.9799562904731385,1072409.9,1256510.3,1165847.2,1185895.4,9.728000000000002,9.6,-1.3157894736842257,8.832,10.624,9.344,9.856,27.584,17.344,-37.12296983758701,14.72,40.448,15.488,19.2,145596.95,147014.65,0.9737154521437308,134116.5,157077.4,145750.5,148278.8,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,1164494.9285714286,1175911.214285714,0.9803637125573861,1072442.7142857143,1256547.142857143,1165880.857142857,1185941.5714285714,True +reads,resident-common,0,range:uniform:10000@8,2,2,4675.5,3975.5,-14.971660784942786,3877.3,5473.7,3481.6,4469.4,4341.76,3850.2400000000002,-11.32075471698113,4161.536,4521.984,3178.496,4521.984,4521.984,4014.08,-11.231884057971019,4259.84,4784.128,3375.104,4653.056,584.5999999999999,497.0,-14.984604858022566,484.9,684.3,435.3,558.7,0.0,0.0,,0.0,0.0,0.0,0.0,0.13,0.0,-100.0,0.11,0.15,0.0,0.0,4628.311545196715,3939.554233313584,-14.881394762587385,3838.495262339132,5418.127828054298,3450.6583604700554,4428.450106157113,True +reads,resident-random,0,point:uniform@8,2,2,4009986.3,4091707.7,2.0379471121883874,3854472.2,4165500.4,4068384.3,4115031.1,2.6239999999999997,2.496,-4.8780487804877986,2.4,2.848,2.464,2.528,7.776,6.944000000000001,-10.69958847736624,5.184,10.368,5.312,8.576,501346.25,511567.0,2.038660905511902,481951.4,520741.1,508614.7,514519.3,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,4010136.7142857146,4091845.2857142854,2.037550768219254,3854641.4285714286,4165632.0,4068519.8571428573,4115170.714285714,True +reads,resident-random,0,range:uniform:1@8,2,2,1077959.5499999998,1074310.1,-0.33855166457773533,1063328.2,1092590.9,1057405.9,1091214.3,10.368,10.24,-1.2345679012345734,10.112,10.624,10.112,10.368,18.688,18.176,-2.73972602739726,18.176,19.2,18.176,18.176,134764.59999999998,134302.95,-0.34256028660343274,132937.9,136591.3,132187.7,136418.2,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,1077993.2857142857,1074347.1428571427,-0.3382342826678153,1063360.857142857,1092625.7142857143,1057445.5714285714,1091248.7142857143,True +reads,resident-random,0,range:uniform:10000@8,2,2,3295.35,3523.3,6.917322894381495,3106.0,3484.7,3293.9,3752.7,4767.744000000001,4243.456,-10.996563573883167,4096.0,5439.488,4096.0,4390.912,5046.272,4390.912,-12.98701298701298,4390.912,5701.632,4259.84,4521.984,412.0,440.45000000000005,6.905339805825261,388.3,435.7,411.8,469.1,0.0,0.0,,0.0,0.0,0.0,0.0,0.18,0.16999999999999998,-5.555555555555558,0.17,0.19,0.16,0.18,3295.5,3523.4285714285716,6.916357803931783,3106.1428571428573,3484.8571428571427,3294.0,3752.8571428571427,True +reads,resident-random,0,range:uniform:10000@1,2,2,1243.55,1252.0,0.6795062522616746,1159.1,1328.0,1218.0,1286.0,1019.904,925.6959999999999,-9.236947791164663,811.008,1228.8,843.776,1007.616,1159.1680000000001,1011.712,-12.720848056537115,827.392,1490.944,892.928,1130.496,1243.55,1252.05,0.6835269993164639,1159.1,1328.0,1218.0,1286.1,0.0,0.0,,0.0,0.0,0.0,0.0,0.47,0.47,0.0,0.44,0.5,0.46,0.48,1231.2801401074048,1239.9092980052287,0.7008281557332019,1144.9132213912799,1317.6470588235295,1204.7477744807122,1275.0708215297452,True +reads,resident-nonlexical,0,point:uniform@8,2,2,4196571.75,4098610.5,-2.3343160998021806,4028951.9,4364191.6,3943007.4,4254213.6,2.496,2.528,1.2820512820512775,2.4,2.592,2.464,2.592,7.264,8.096,11.45374449339207,5.952,8.576,6.848,9.344,524741.1000000001,512446.55,-2.342974468742798,503819.4,545662.8,493016.4,531876.7,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,4196708.071428572,4098742.3571428573,-2.334346650239283,4029080.4285714286,4364335.714285715,3943138.4285714286,4254346.285714285,True +reads,resident-nonlexical,0,range:uniform:1@8,2,2,1041683.8,985847.95,-5.360153436196291,1024771.4,1058596.2,985488.4,986207.5,10.624,11.136,4.819277108433728,10.368,10.88,11.136,11.136,19.712,21.248,7.792207792207795,19.2,20.224,20.736,21.76,130231.9,123270.4,-5.345464513686737,128121.0,132342.8,123240.7,123300.1,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,1041718.6428571428,985881.4285714286,-5.360105117497782,1024804.7142857143,1058632.5714285714,985522.7142857143,986240.1428571428,False +reads,resident-nonlexical,0,range:uniform:10000@8,2,2,3360.95,3197.8,-4.854282271381594,3201.0,3520.9,2868.6,3527.0,5242.88,5505.023999999999,4.999999999999982,5046.272,5439.488,5177.344,5832.704,5373.952,5701.632,6.097560975609739,5177.344,5570.56,5308.416,6094.848,420.04999999999995,399.9,-4.797047970479696,400.2,439.9,358.8,441.0,0.0,0.0,,0.0,0.0,0.0,0.0,0.175,0.185,5.714285714285716,0.17,0.18,0.17,0.2,3329.6773280498164,3157.6719697043854,-5.165826637206738,3171.2425700537788,3488.1120860458536,2831.500282007896,3483.843657400875,True +reads,disk-common,0,point:uniform@8,2,2,170248.15000000002,188040.75,10.4509799372269,163698.1,176798.2,181356.1,194725.4,93.184,77.824,-16.483516483516482,87.04,99.328,74.752,80.896,705.024,649.728,-7.843137254901967,115.712,1294.336,103.424,1196.032,138038.4,153160.65,10.955103797204258,132369.3,143707.5,149546.0,156775.3,3527.465,3207.825,-9.061464819636777,3527.4,3527.53,3207.41,3208.24,0.0,0.0,,0.0,0.0,0.0,0.0,170252.35714285716,188046.07142857142,10.451376171422822,163702.14285714287,176802.57142857142,181361.42857142858,194730.7142857143,False +reads,disk-common,0,range:uniform:1@8,2,2,70584.0,78249.4,10.859968264762543,68021.3,73146.7,76025.5,80473.3,286.72,279.552,-2.500000000000002,266.24,307.2,260.096,299.008,1095.68,1017.856,-7.102803738317764,372.736,1818.624,380.928,1654.784,8392.7,9350.95,11.417660585985434,8096.3,8689.1,9091.9,9610.0,14152.52,10932.815,-22.7500473413922,14141.46,14163.58,10930.2,10935.43,0.0,0.0,,0.0,0.0,0.0,0.0,70586.35714285714,78252.07142857142,10.860050859686554,68023.57142857143,73149.14285714286,76028.28571428571,80475.85714285714,False +reads,disk-common,0,range:uniform:10000@8,2,2,909.15,1093.6,20.288181268217564,900.0,918.3,1061.8,1125.4,24903.68,21495.807999999997,-13.684210526315798,23330.816,26476.544,19136.512,23855.104,41025.536,34734.08,-15.335463258785943,31195.136,50855.936,23855.104,45613.056,256.70000000000005,287.55,12.017919750681717,254.8,258.6,282.1,293.0,2541146.18,1801838.2349999999,-29.093483516166717,2538977.12,2543315.24,1793184.4,1810492.07,0.0,0.0,,0.0,0.0,0.0,0.0,901.1694943965135,1083.8224264048447,20.2684326471402,891.3412563667233,910.9977324263039,1051.9388621568073,1115.705990652882,False +reads,disk-random,0,point:uniform@8,2,2,134411.1,134207.90000000002,-0.15117799050821112,132155.7,136666.5,133577.2,134838.6,121.856,120.832,-0.8403361344537785,119.808,123.904,119.808,121.856,564.224,226.30400000000003,-59.89110707803993,169.984,958.464,169.984,282.624,141506.3,143293.45,1.2629473034063032,140382.2,142630.4,142704.7,143882.2,3529.025,3529.725,0.01983550697430836,3528.61,3529.44,3529.68,3529.77,0.0,0.0,,0.0,0.0,0.0,0.0,134414.42857142858,134211.5,-0.15097231270878586,132159.2857142857,136669.57142857142,133580.57142857142,134842.42857142858,True +reads,disk-random,0,range:uniform:1@8,2,2,54883.2,55567.4,1.2466474258060911,53370.4,56396.0,55082.8,56052.0,393.216,368.64,-6.25,364.544,421.888,364.544,372.736,1622.016,872.448,-46.21212121212122,1556.48,1687.552,548.864,1196.032,6562.25,6636.85,1.1368052116271121,6389.1,6735.4,6574.3,6699.4,14159.295,14140.795,-0.13065622264385457,14154.01,14164.58,14140.47,14141.12,0.0,0.0,,0.0,0.0,0.0,0.0,54884.857142857145,55569.357142857145,1.2471563845348976,53372.0,56397.71428571428,55084.71428571428,56054.0,True +reads,disk-random,0,range:uniform:10000@8,2,2,794.9000000000001,792.15,-0.3459554660963815,788.7,801.1,787.5,796.8,29622.272,28835.84,-2.6548672566371723,29097.984,30146.56,27525.12,30146.56,47185.92,40894.464,-13.33333333333333,44564.48,49807.36,36175.872,45613.056,247.3,246.95,-0.14152850788516913,245.5,249.1,246.7,247.2,2526206.925,2533304.865,0.2809722327081543,2520361.31,2532052.54,2532493.36,2534116.37,0.0,0.0,,0.0,0.0,0.0,0.0,786.3403053013228,781.3371659640949,-0.6362562498065993,779.5820389720418,793.0985716306039,775.9324419422941,786.7418899858957,True +reads,disk-nonlexical,0,point:uniform@8,2,2,145681.5,137161.05,-5.848683600869031,133323.3,158039.7,130352.7,143969.4,111.616,117.75999999999999,5.504587155963292,101.376,121.856,111.616,123.904,676.864,157.696,-76.70196671709532,223.232,1130.496,149.504,165.888,134923.65,124554.54999999999,-7.68516120042706,129978.7,139868.6,120347.4,128761.7,3528.52,3528.6800000000003,0.004534479045048556,3528.35,3528.69,3528.4,3528.96,0.0,0.0,,0.0,0.0,0.0,0.0,145685.42857142858,137164.5,-5.848854380965651,133327.0,158043.85714285713,130356.0,143973.0,True +reads,disk-nonlexical,0,range:uniform:1@8,2,2,60266.7,57849.5,-4.010838489580482,54996.1,65537.3,55657.5,60041.5,344.06399999999996,344.06399999999996,0.0,307.2,380.928,331.776,356.352,1605.632,499.712,-68.87755102040816,1490.944,1720.32,479.232,520.192,7183.049999999999,6899.45,-3.948183571045716,6568.9,7797.2,6639.4,7159.5,14149.82,14143.385,-0.04547761031589159,14141.35,14158.29,14140.26,14146.51,0.0,0.0,,0.0,0.0,0.0,0.0,60268.78571428571,57851.5,-4.010841907028384,54998.142857142855,65539.42857142857,55659.57142857143,60043.42857142857,True +reads,disk-nonlexical,0,range:uniform:10000@8,2,2,797.65,800.35,0.3384943270858143,766.3,829.0,780.0,820.7,31981.568,27000.832000000002,-15.573770491803273,30670.848,33292.288,26476.544,27525.12,60555.264,36175.872,-40.25974025974026,50855.936,70254.592,35127.296,37224.448,232.60000000000002,236.1,1.5047291487532144,231.9,233.3,233.2,239.0,2538518.9349999996,2543305.56,0.18855975167269,2526938.01,2550099.86,2537409.73,2549201.39,0.0,0.0,,0.0,0.0,0.0,0.0,788.5248525049924,790.5173553665702,0.2526873890211556,756.0253699788584,821.0243350311263,768.9057879171947,812.1289228159458,True +reads,resident-common-disabled,0,point:uniform@8,2,2,3677185.65,3863049.1,5.054502755388501,3544771.5,3809599.8,3784307.2,3941791.0,2.88,2.624,-8.888888888888879,2.784,2.976,2.528,2.72,9.984,8.608,-13.782051282051277,9.6,10.368,8.128,9.088,459705.80000000005,482935.6,5.053188365254457,443155.7,476255.9,473088.6,492782.6,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,3677312.0714285714,3863184.6428571427,5.054577033935637,3544899.0,3809725.1428571427,3784438.1428571427,3941931.1428571427,True +reads,resident-common-disabled,0,range:uniform:1@8,2,2,948568.75,945603.8999999999,-0.3125603705582902,892793.3,1004344.2,913518.7,977689.1,11.648,11.648,0.0,11.136,12.16,11.136,12.16,20.736,20.992,1.2345679012345734,19.712,21.76,20.224,21.76,118587.0,118212.8,-0.3155489218885643,111617.9,125556.1,114202.6,122223.0,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,948600.6428571428,945635.7857142857,-0.31255061496976433,892825.4285714285,1004375.8571428572,913550.4285714285,977721.1428571428,True +reads,resident-common-disabled,0,range:uniform:10000@8,2,2,3919.05,3131.5,-20.09543129074649,3405.3,4432.8,2982.7,3280.3,4603.904,4734.976000000001,2.8469750889679846,3244.032,5963.776,4030.464,5439.488,4702.2080000000005,4866.048000000001,3.4843205574912828,3309.568,6094.848,4161.536,5570.56,489.9,391.5,-20.08573178199632,425.7,554.1,372.9,410.1,0.0,0.0,,0.0,0.0,0.0,0.0,0.15000000000000002,0.19,26.66666666666664,0.13,0.17,0.18,0.2,3919.214285714286,3131.642857142857,-20.0951356868177,3405.4285714285716,4433.0,2982.8571428571427,3280.4285714285716,False +reads,resident-common-disabled,0,range:uniform:10000@1,2,2,1289.1,1272.25,-1.307113490031797,1248.7,1329.5,1243.4,1301.1,892.928,892.928,0.0,860.16,925.696,876.544,909.312,1036.288,1159.1680000000001,11.857707509881443,974.848,1097.728,991.232,1327.104,1289.15,1272.25,-1.3109413179226648,1248.7,1329.6,1243.4,1301.1,0.0,0.0,,0.0,0.0,0.0,0.0,0.45499999999999996,0.45999999999999996,1.098901098901095,0.44,0.47,0.45,0.47,1265.3059585729843,1256.1394454164658,-0.7244503271648606,1222.3465249615438,1308.265392184425,1227.471442673812,1284.8074481591198,True +writes,resident-common,0,ow:uniform@8,2,2,1966796.4500000002,2014988.9,2.4503018601645277,1651774.3,2281818.6,1951505.2,2078472.6,6.272,6.336,1.0204081632652962,6.208,6.336,6.336,6.336,80.64,36.864,-54.28571428571429,51.712,109.568,36.352,37.376,306398.75,318094.6,3.8171989931421013,290814.6,321982.9,316910.9,319278.3,141.47,84.695,-40.13218350180251,141.46,141.48,83.08,86.31,187.47,112.805,-39.827705766255924,187.39,187.55,112.58,113.03,1932737.1243178155,1975842.8933216466,2.2302965292833488,1615660.716469006,2249813.5321666254,1902096.978557505,2049588.8080857883,True +writes,resident-random,0,ow:uniform@8,2,2,1532285.1,1614541.25,5.368201387587712,1417795.4,1646774.8,1583743.5,1645339.0,6.016,6.08,1.0638297872340496,5.952,6.08,5.952,6.208,122.36800000000001,93.184,-23.84937238493725,103.424,141.312,74.752,111.616,294729.35,293141.45,-0.5387654809403841,288644.5,300814.2,291701.9,294581.0,150.51999999999998,138.03,-8.297900611214448,141.32,159.72,132.82,143.24,191.715,185.73000000000002,-3.1218214537203637,187.3,196.13,182.88,188.58,1498383.1798511934,1588280.7675773385,5.999639406995549,1380056.2112179098,1616710.1484844768,1558664.2883503507,1617897.2468043265,True +writes,resident-common,1,ow:uniform@8,2,2,629594.05,749170.1000000001,18.992563541539198,578949.9,680238.2,691557.9,806782.3,217.08800000000002,204.8,-5.660377358490576,198.656,235.52,190.464,219.136,1474.56,1044.48,-29.166666666666664,1425.408,1523.712,925.696,1163.264,259060.5,256907.85,-0.830944895111374,243713.3,274407.7,248907.8,264907.9,158.185,94.035,-40.5537819641559,156.79,159.58,89.4,98.67,427.605,353.375,-17.35947895838449,419.71,435.5,352.9,353.85,620393.2591604214,735223.1354268892,18.509207598720057,569917.558754768,670868.9595660749,678682.1638861629,791764.1069676154,False +writes,resident-random,1,ow:uniform@8,2,2,576156.75,525078.8999999999,-8.865269737792724,570998.2,581315.3,484679.1,565478.7,235.51999999999998,259.072,10.000000000000009,227.328,243.712,251.904,266.24,1425.408,1458.176,2.298850574712641,1327.104,1523.712,1327.104,1589.248,228188.05,182787.35,-19.89617773586302,216555.9,239820.2,162959.0,202615.7,153.7,131.29500000000002,-14.577098243331143,149.64,157.76,127.73,134.86,437.94,428.235,-2.2160569941087838,437.83,438.05,422.31,434.16,566929.2403528946,510361.04196030286,-9.977999786601233,561259.9827988697,572598.4979069195,473162.0500305064,547560.0338900993,False +repeat,resident-common,0,range:uniform:10000@8,3,3,4025.3,3538.366666666667,-12.096820940882258,3909.3,4235.1,3136.6,4012.2,4609.365333333333,4423.68,-4.028436018957338,4259.84,5046.272,3571.712,5177.344,4871.509333333333,4707.669333333333,-3.363228699551568,4653.056,5177.344,3768.32,5308.416,503.26666666666665,442.3666666666667,-12.10094052192343,488.7,529.5,392.1,501.6,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,4001.016958481691,3512.0952062839924,-12.219937012794734,3882.7385287691186,4216.366894537731,3111.9783054434815,3982.0034405187243,True +repeat,resident-common-disabled,0,range:uniform:10000@8,3,3,3854.7999999999997,3762.9666666666667,-2.3823112310193295,3365.5,4357.7,3613.8,3853.3,3975.8506666666667,4576.597333333333,15.1098901098901,3440.64,5046.272,4161.536,5177.344,4237.9946666666665,4740.437333333333,11.855670103092786,3637.248,5308.416,4390.912,5177.344,481.93333333333334,470.43333333333334,-2.386222160741458,420.8,544.8,451.8,481.7,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,3854.866666666667,3763.0222222222224,-2.382558266894952,3365.5333333333333,4357.8,3613.866666666667,3853.3333333333335,True +repeat,resident-common-disabled,0,range:uniform:10000@1,3,3,1350.8333333333333,1376.3,1.8852560148056696,1334.6,1377.4,1373.1,1381.2,876.544,811.008,-7.476635514018682,843.776,925.696,794.624,827.392,1220.608,936.6186666666666,-23.266219239373598,1007.616,1359.872,860.16,974.848,1350.9,1376.2333333333333,1.8752930145335078,1334.9,1377.2,1373.2,1381.2,0.0,0.0,,0.0,0.0,0.0,0.0,0.33666666666666667,0.4,18.811881188118807,0.2,0.41,0.4,0.4,1341.7840419000438,1367.106487376034,1.8872221374858666,1322.6744186046512,1371.639115714001,1362.7762339552733,1370.87275855224,True +repeat,resident-nonlexical,0,range:uniform:1@8,3,3,1028346.2,969401.0,-5.732038490539471,995559.2,1081379.8,944712.2,990583.5,10.624,11.392,7.228915662650581,10.112,10.88,11.136,11.648,19.882666666666665,20.565333333333335,3.4334763948498104,18.688,20.736,19.712,21.76,128571.7,121192.36666666667,-5.739469364823934,124463.5,135198.3,118102.7,123841.1,0.0,0.0,,0.0,0.0,0.0,0.0,0.0,0.0,,0.0,0.0,0.0,0.0,1023362.4445549916,964199.6596989221,-5.781215166811826,991214.1908934023,1075374.1050119333,938906.7117206652,985801.499369734,False +repeat,resident-random,1,ow:uniform@8,3,3,890070.2666666666,837595.4,-5.895586970137334,771902.2,1050078.9,809333.6,880444.9,149.84533333333334,152.23466666666667,1.5945330296127436,130.048,161.792,149.504,153.6,1044.48,1294.336,23.921568627450984,479.232,1392.64,1196.032,1359.872,244809.63333333333,242372.16666666666,-0.9956579867704041,241168.8,248213.5,240051.1,244257.4,161.31666666666666,161.42333333333335,0.06612253331956808,153.19,165.73,155.83,165.84,430.62,430.9633333333333,0.07973000170296007,428.62,432.23,429.49,432.01,882006.7343931693,828312.1230690569,-6.087777930749572,763515.9907682163,1041828.4278060718,803133.5670812385,871105.5339357562,True diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/summary.json b/benchmarks/results-20261014/prefix-main-6105c49f/summary.json new file mode 100644 index 000000000..63facbd1e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/summary.json @@ -0,0 +1,1858 @@ +[ + { + "mode": "reads", + "case": "resident-common", + "wal": 0, + "phase": "point:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 4500543.05, + "candidate_ops_s": 4740951.300000001, + "change_ops_s_pct": 5.341760923717875, + "main_ops_s_min": 4074604.5, + "main_ops_s_max": 4926481.6, + "candidate_ops_s_min": 4492319.2, + "candidate_ops_s_max": 4989583.4, + "main_p99_us": 2.592, + "candidate_p99_us": 2.24, + "change_p99_us_pct": -13.58024691358024, + "main_p99_us_min": 2.592, + "main_p99_us_max": 2.592, + "candidate_p99_us_min": 2.144, + "candidate_p99_us_max": 2.336, + "main_p999_us": 10.975999999999999, + "candidate_p999_us": 6.016, + "change_p999_us_pct": -45.18950437317783, + "main_p999_us_min": 6.72, + "main_p999_us_max": 15.232, + "candidate_p999_us_min": 5.184, + "candidate_p999_us_max": 6.848, + "main_ops_per_cpu_s": 562793.25, + "candidate_ops_per_cpu_s": 592746.7, + "change_ops_per_cpu_s_pct": 5.322283094191338, + "main_ops_per_cpu_s_min": 509634.3, + "main_ops_per_cpu_s_max": 615952.2, + "candidate_ops_per_cpu_s_min": 561629.2, + "candidate_ops_per_cpu_s_max": 623864.2, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 4500677.214285715, + "candidate_ops_with_drain_s": 4741101.285714285, + "change_ops_with_drain_s_pct": 5.341953221293783, + "main_ops_with_drain_s_min": 4074736.4285714286, + "main_ops_with_drain_s_max": 4926618.0, + "candidate_ops_with_drain_s_min": 4492463.285714285, + "candidate_ops_with_drain_s_max": 4989739.285714285, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-common", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 1164460.1, + "candidate_ops_s": 1175871.2999999998, + "change_ops_s_pct": 0.9799562904731385, + "main_ops_s_min": 1072409.9, + "main_ops_s_max": 1256510.3, + "candidate_ops_s_min": 1165847.2, + "candidate_ops_s_max": 1185895.4, + "main_p99_us": 9.728000000000002, + "candidate_p99_us": 9.6, + "change_p99_us_pct": -1.3157894736842257, + "main_p99_us_min": 8.832, + "main_p99_us_max": 10.624, + "candidate_p99_us_min": 9.344, + "candidate_p99_us_max": 9.856, + "main_p999_us": 27.584, + "candidate_p999_us": 17.344, + "change_p999_us_pct": -37.12296983758701, + "main_p999_us_min": 14.72, + "main_p999_us_max": 40.448, + "candidate_p999_us_min": 15.488, + "candidate_p999_us_max": 19.2, + "main_ops_per_cpu_s": 145596.95, + "candidate_ops_per_cpu_s": 147014.65, + "change_ops_per_cpu_s_pct": 0.9737154521437308, + "main_ops_per_cpu_s_min": 134116.5, + "main_ops_per_cpu_s_max": 157077.4, + "candidate_ops_per_cpu_s_min": 145750.5, + "candidate_ops_per_cpu_s_max": 148278.8, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 1164494.9285714286, + "candidate_ops_with_drain_s": 1175911.214285714, + "change_ops_with_drain_s_pct": 0.9803637125573861, + "main_ops_with_drain_s_min": 1072442.7142857143, + "main_ops_with_drain_s_max": 1256547.142857143, + "candidate_ops_with_drain_s_min": 1165880.857142857, + "candidate_ops_with_drain_s_max": 1185941.5714285714, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-common", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 4675.5, + "candidate_ops_s": 3975.5, + "change_ops_s_pct": -14.971660784942786, + "main_ops_s_min": 3877.3, + "main_ops_s_max": 5473.7, + "candidate_ops_s_min": 3481.6, + "candidate_ops_s_max": 4469.4, + "main_p99_us": 4341.76, + "candidate_p99_us": 3850.2400000000002, + "change_p99_us_pct": -11.32075471698113, + "main_p99_us_min": 4161.536, + "main_p99_us_max": 4521.984, + "candidate_p99_us_min": 3178.496, + "candidate_p99_us_max": 4521.984, + "main_p999_us": 4521.984, + "candidate_p999_us": 4014.08, + "change_p999_us_pct": -11.231884057971019, + "main_p999_us_min": 4259.84, + "main_p999_us_max": 4784.128, + "candidate_p999_us_min": 3375.104, + "candidate_p999_us_max": 4653.056, + "main_ops_per_cpu_s": 584.5999999999999, + "candidate_ops_per_cpu_s": 497.0, + "change_ops_per_cpu_s_pct": -14.984604858022566, + "main_ops_per_cpu_s_min": 484.9, + "main_ops_per_cpu_s_max": 684.3, + "candidate_ops_per_cpu_s_min": 435.3, + "candidate_ops_per_cpu_s_max": 558.7, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.13, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": -100.0, + "main_wr_B_op_min": 0.11, + "main_wr_B_op_max": 0.15, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 4628.311545196715, + "candidate_ops_with_drain_s": 3939.554233313584, + "change_ops_with_drain_s_pct": -14.881394762587385, + "main_ops_with_drain_s_min": 3838.495262339132, + "main_ops_with_drain_s_max": 5418.127828054298, + "candidate_ops_with_drain_s_min": 3450.6583604700554, + "candidate_ops_with_drain_s_max": 4428.450106157113, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-random", + "wal": 0, + "phase": "point:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 4009986.3, + "candidate_ops_s": 4091707.7, + "change_ops_s_pct": 2.0379471121883874, + "main_ops_s_min": 3854472.2, + "main_ops_s_max": 4165500.4, + "candidate_ops_s_min": 4068384.3, + "candidate_ops_s_max": 4115031.1, + "main_p99_us": 2.6239999999999997, + "candidate_p99_us": 2.496, + "change_p99_us_pct": -4.8780487804877986, + "main_p99_us_min": 2.4, + "main_p99_us_max": 2.848, + "candidate_p99_us_min": 2.464, + "candidate_p99_us_max": 2.528, + "main_p999_us": 7.776, + "candidate_p999_us": 6.944000000000001, + "change_p999_us_pct": -10.69958847736624, + "main_p999_us_min": 5.184, + "main_p999_us_max": 10.368, + "candidate_p999_us_min": 5.312, + "candidate_p999_us_max": 8.576, + "main_ops_per_cpu_s": 501346.25, + "candidate_ops_per_cpu_s": 511567.0, + "change_ops_per_cpu_s_pct": 2.038660905511902, + "main_ops_per_cpu_s_min": 481951.4, + "main_ops_per_cpu_s_max": 520741.1, + "candidate_ops_per_cpu_s_min": 508614.7, + "candidate_ops_per_cpu_s_max": 514519.3, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 4010136.7142857146, + "candidate_ops_with_drain_s": 4091845.2857142854, + "change_ops_with_drain_s_pct": 2.037550768219254, + "main_ops_with_drain_s_min": 3854641.4285714286, + "main_ops_with_drain_s_max": 4165632.0, + "candidate_ops_with_drain_s_min": 4068519.8571428573, + "candidate_ops_with_drain_s_max": 4115170.714285714, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-random", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 1077959.5499999998, + "candidate_ops_s": 1074310.1, + "change_ops_s_pct": -0.33855166457773533, + "main_ops_s_min": 1063328.2, + "main_ops_s_max": 1092590.9, + "candidate_ops_s_min": 1057405.9, + "candidate_ops_s_max": 1091214.3, + "main_p99_us": 10.368, + "candidate_p99_us": 10.24, + "change_p99_us_pct": -1.2345679012345734, + "main_p99_us_min": 10.112, + "main_p99_us_max": 10.624, + "candidate_p99_us_min": 10.112, + "candidate_p99_us_max": 10.368, + "main_p999_us": 18.688, + "candidate_p999_us": 18.176, + "change_p999_us_pct": -2.73972602739726, + "main_p999_us_min": 18.176, + "main_p999_us_max": 19.2, + "candidate_p999_us_min": 18.176, + "candidate_p999_us_max": 18.176, + "main_ops_per_cpu_s": 134764.59999999998, + "candidate_ops_per_cpu_s": 134302.95, + "change_ops_per_cpu_s_pct": -0.34256028660343274, + "main_ops_per_cpu_s_min": 132937.9, + "main_ops_per_cpu_s_max": 136591.3, + "candidate_ops_per_cpu_s_min": 132187.7, + "candidate_ops_per_cpu_s_max": 136418.2, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 1077993.2857142857, + "candidate_ops_with_drain_s": 1074347.1428571427, + "change_ops_with_drain_s_pct": -0.3382342826678153, + "main_ops_with_drain_s_min": 1063360.857142857, + "main_ops_with_drain_s_max": 1092625.7142857143, + "candidate_ops_with_drain_s_min": 1057445.5714285714, + "candidate_ops_with_drain_s_max": 1091248.7142857143, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-random", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 3295.35, + "candidate_ops_s": 3523.3, + "change_ops_s_pct": 6.917322894381495, + "main_ops_s_min": 3106.0, + "main_ops_s_max": 3484.7, + "candidate_ops_s_min": 3293.9, + "candidate_ops_s_max": 3752.7, + "main_p99_us": 4767.744000000001, + "candidate_p99_us": 4243.456, + "change_p99_us_pct": -10.996563573883167, + "main_p99_us_min": 4096.0, + "main_p99_us_max": 5439.488, + "candidate_p99_us_min": 4096.0, + "candidate_p99_us_max": 4390.912, + "main_p999_us": 5046.272, + "candidate_p999_us": 4390.912, + "change_p999_us_pct": -12.98701298701298, + "main_p999_us_min": 4390.912, + "main_p999_us_max": 5701.632, + "candidate_p999_us_min": 4259.84, + "candidate_p999_us_max": 4521.984, + "main_ops_per_cpu_s": 412.0, + "candidate_ops_per_cpu_s": 440.45000000000005, + "change_ops_per_cpu_s_pct": 6.905339805825261, + "main_ops_per_cpu_s_min": 388.3, + "main_ops_per_cpu_s_max": 435.7, + "candidate_ops_per_cpu_s_min": 411.8, + "candidate_ops_per_cpu_s_max": 469.1, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.18, + "candidate_wr_B_op": 0.16999999999999998, + "change_wr_B_op_pct": -5.555555555555558, + "main_wr_B_op_min": 0.17, + "main_wr_B_op_max": 0.19, + "candidate_wr_B_op_min": 0.16, + "candidate_wr_B_op_max": 0.18, + "main_ops_with_drain_s": 3295.5, + "candidate_ops_with_drain_s": 3523.4285714285716, + "change_ops_with_drain_s_pct": 6.916357803931783, + "main_ops_with_drain_s_min": 3106.1428571428573, + "main_ops_with_drain_s_max": 3484.8571428571427, + "candidate_ops_with_drain_s_min": 3294.0, + "candidate_ops_with_drain_s_max": 3752.8571428571427, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-random", + "wal": 0, + "phase": "range:uniform:10000@1", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 1243.55, + "candidate_ops_s": 1252.0, + "change_ops_s_pct": 0.6795062522616746, + "main_ops_s_min": 1159.1, + "main_ops_s_max": 1328.0, + "candidate_ops_s_min": 1218.0, + "candidate_ops_s_max": 1286.0, + "main_p99_us": 1019.904, + "candidate_p99_us": 925.6959999999999, + "change_p99_us_pct": -9.236947791164663, + "main_p99_us_min": 811.008, + "main_p99_us_max": 1228.8, + "candidate_p99_us_min": 843.776, + "candidate_p99_us_max": 1007.616, + "main_p999_us": 1159.1680000000001, + "candidate_p999_us": 1011.712, + "change_p999_us_pct": -12.720848056537115, + "main_p999_us_min": 827.392, + "main_p999_us_max": 1490.944, + "candidate_p999_us_min": 892.928, + "candidate_p999_us_max": 1130.496, + "main_ops_per_cpu_s": 1243.55, + "candidate_ops_per_cpu_s": 1252.05, + "change_ops_per_cpu_s_pct": 0.6835269993164639, + "main_ops_per_cpu_s_min": 1159.1, + "main_ops_per_cpu_s_max": 1328.0, + "candidate_ops_per_cpu_s_min": 1218.0, + "candidate_ops_per_cpu_s_max": 1286.1, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.47, + "candidate_wr_B_op": 0.47, + "change_wr_B_op_pct": 0.0, + "main_wr_B_op_min": 0.44, + "main_wr_B_op_max": 0.5, + "candidate_wr_B_op_min": 0.46, + "candidate_wr_B_op_max": 0.48, + "main_ops_with_drain_s": 1231.2801401074048, + "candidate_ops_with_drain_s": 1239.9092980052287, + "change_ops_with_drain_s_pct": 0.7008281557332019, + "main_ops_with_drain_s_min": 1144.9132213912799, + "main_ops_with_drain_s_max": 1317.6470588235295, + "candidate_ops_with_drain_s_min": 1204.7477744807122, + "candidate_ops_with_drain_s_max": 1275.0708215297452, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-nonlexical", + "wal": 0, + "phase": "point:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 4196571.75, + "candidate_ops_s": 4098610.5, + "change_ops_s_pct": -2.3343160998021806, + "main_ops_s_min": 4028951.9, + "main_ops_s_max": 4364191.6, + "candidate_ops_s_min": 3943007.4, + "candidate_ops_s_max": 4254213.6, + "main_p99_us": 2.496, + "candidate_p99_us": 2.528, + "change_p99_us_pct": 1.2820512820512775, + "main_p99_us_min": 2.4, + "main_p99_us_max": 2.592, + "candidate_p99_us_min": 2.464, + "candidate_p99_us_max": 2.592, + "main_p999_us": 7.264, + "candidate_p999_us": 8.096, + "change_p999_us_pct": 11.45374449339207, + "main_p999_us_min": 5.952, + "main_p999_us_max": 8.576, + "candidate_p999_us_min": 6.848, + "candidate_p999_us_max": 9.344, + "main_ops_per_cpu_s": 524741.1000000001, + "candidate_ops_per_cpu_s": 512446.55, + "change_ops_per_cpu_s_pct": -2.342974468742798, + "main_ops_per_cpu_s_min": 503819.4, + "main_ops_per_cpu_s_max": 545662.8, + "candidate_ops_per_cpu_s_min": 493016.4, + "candidate_ops_per_cpu_s_max": 531876.7, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 4196708.071428572, + "candidate_ops_with_drain_s": 4098742.3571428573, + "change_ops_with_drain_s_pct": -2.334346650239283, + "main_ops_with_drain_s_min": 4029080.4285714286, + "main_ops_with_drain_s_max": 4364335.714285715, + "candidate_ops_with_drain_s_min": 3943138.4285714286, + "candidate_ops_with_drain_s_max": 4254346.285714285, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-nonlexical", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 1041683.8, + "candidate_ops_s": 985847.95, + "change_ops_s_pct": -5.360153436196291, + "main_ops_s_min": 1024771.4, + "main_ops_s_max": 1058596.2, + "candidate_ops_s_min": 985488.4, + "candidate_ops_s_max": 986207.5, + "main_p99_us": 10.624, + "candidate_p99_us": 11.136, + "change_p99_us_pct": 4.819277108433728, + "main_p99_us_min": 10.368, + "main_p99_us_max": 10.88, + "candidate_p99_us_min": 11.136, + "candidate_p99_us_max": 11.136, + "main_p999_us": 19.712, + "candidate_p999_us": 21.248, + "change_p999_us_pct": 7.792207792207795, + "main_p999_us_min": 19.2, + "main_p999_us_max": 20.224, + "candidate_p999_us_min": 20.736, + "candidate_p999_us_max": 21.76, + "main_ops_per_cpu_s": 130231.9, + "candidate_ops_per_cpu_s": 123270.4, + "change_ops_per_cpu_s_pct": -5.345464513686737, + "main_ops_per_cpu_s_min": 128121.0, + "main_ops_per_cpu_s_max": 132342.8, + "candidate_ops_per_cpu_s_min": 123240.7, + "candidate_ops_per_cpu_s_max": 123300.1, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 1041718.6428571428, + "candidate_ops_with_drain_s": 985881.4285714286, + "change_ops_with_drain_s_pct": -5.360105117497782, + "main_ops_with_drain_s_min": 1024804.7142857143, + "main_ops_with_drain_s_max": 1058632.5714285714, + "candidate_ops_with_drain_s_min": 985522.7142857143, + "candidate_ops_with_drain_s_max": 986240.1428571428, + "throughput_ranges_overlap": false + }, + { + "mode": "reads", + "case": "resident-nonlexical", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 3360.95, + "candidate_ops_s": 3197.8, + "change_ops_s_pct": -4.854282271381594, + "main_ops_s_min": 3201.0, + "main_ops_s_max": 3520.9, + "candidate_ops_s_min": 2868.6, + "candidate_ops_s_max": 3527.0, + "main_p99_us": 5242.88, + "candidate_p99_us": 5505.023999999999, + "change_p99_us_pct": 4.999999999999982, + "main_p99_us_min": 5046.272, + "main_p99_us_max": 5439.488, + "candidate_p99_us_min": 5177.344, + "candidate_p99_us_max": 5832.704, + "main_p999_us": 5373.952, + "candidate_p999_us": 5701.632, + "change_p999_us_pct": 6.097560975609739, + "main_p999_us_min": 5177.344, + "main_p999_us_max": 5570.56, + "candidate_p999_us_min": 5308.416, + "candidate_p999_us_max": 6094.848, + "main_ops_per_cpu_s": 420.04999999999995, + "candidate_ops_per_cpu_s": 399.9, + "change_ops_per_cpu_s_pct": -4.797047970479696, + "main_ops_per_cpu_s_min": 400.2, + "main_ops_per_cpu_s_max": 439.9, + "candidate_ops_per_cpu_s_min": 358.8, + "candidate_ops_per_cpu_s_max": 441.0, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.175, + "candidate_wr_B_op": 0.185, + "change_wr_B_op_pct": 5.714285714285716, + "main_wr_B_op_min": 0.17, + "main_wr_B_op_max": 0.18, + "candidate_wr_B_op_min": 0.17, + "candidate_wr_B_op_max": 0.2, + "main_ops_with_drain_s": 3329.6773280498164, + "candidate_ops_with_drain_s": 3157.6719697043854, + "change_ops_with_drain_s_pct": -5.165826637206738, + "main_ops_with_drain_s_min": 3171.2425700537788, + "main_ops_with_drain_s_max": 3488.1120860458536, + "candidate_ops_with_drain_s_min": 2831.500282007896, + "candidate_ops_with_drain_s_max": 3483.843657400875, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "disk-common", + "wal": 0, + "phase": "point:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 170248.15000000002, + "candidate_ops_s": 188040.75, + "change_ops_s_pct": 10.4509799372269, + "main_ops_s_min": 163698.1, + "main_ops_s_max": 176798.2, + "candidate_ops_s_min": 181356.1, + "candidate_ops_s_max": 194725.4, + "main_p99_us": 93.184, + "candidate_p99_us": 77.824, + "change_p99_us_pct": -16.483516483516482, + "main_p99_us_min": 87.04, + "main_p99_us_max": 99.328, + "candidate_p99_us_min": 74.752, + "candidate_p99_us_max": 80.896, + "main_p999_us": 705.024, + "candidate_p999_us": 649.728, + "change_p999_us_pct": -7.843137254901967, + "main_p999_us_min": 115.712, + "main_p999_us_max": 1294.336, + "candidate_p999_us_min": 103.424, + "candidate_p999_us_max": 1196.032, + "main_ops_per_cpu_s": 138038.4, + "candidate_ops_per_cpu_s": 153160.65, + "change_ops_per_cpu_s_pct": 10.955103797204258, + "main_ops_per_cpu_s_min": 132369.3, + "main_ops_per_cpu_s_max": 143707.5, + "candidate_ops_per_cpu_s_min": 149546.0, + "candidate_ops_per_cpu_s_max": 156775.3, + "main_rd_B_op": 3527.465, + "candidate_rd_B_op": 3207.825, + "change_rd_B_op_pct": -9.061464819636777, + "main_rd_B_op_min": 3527.4, + "main_rd_B_op_max": 3527.53, + "candidate_rd_B_op_min": 3207.41, + "candidate_rd_B_op_max": 3208.24, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 170252.35714285716, + "candidate_ops_with_drain_s": 188046.07142857142, + "change_ops_with_drain_s_pct": 10.451376171422822, + "main_ops_with_drain_s_min": 163702.14285714287, + "main_ops_with_drain_s_max": 176802.57142857142, + "candidate_ops_with_drain_s_min": 181361.42857142858, + "candidate_ops_with_drain_s_max": 194730.7142857143, + "throughput_ranges_overlap": false + }, + { + "mode": "reads", + "case": "disk-common", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 70584.0, + "candidate_ops_s": 78249.4, + "change_ops_s_pct": 10.859968264762543, + "main_ops_s_min": 68021.3, + "main_ops_s_max": 73146.7, + "candidate_ops_s_min": 76025.5, + "candidate_ops_s_max": 80473.3, + "main_p99_us": 286.72, + "candidate_p99_us": 279.552, + "change_p99_us_pct": -2.500000000000002, + "main_p99_us_min": 266.24, + "main_p99_us_max": 307.2, + "candidate_p99_us_min": 260.096, + "candidate_p99_us_max": 299.008, + "main_p999_us": 1095.68, + "candidate_p999_us": 1017.856, + "change_p999_us_pct": -7.102803738317764, + "main_p999_us_min": 372.736, + "main_p999_us_max": 1818.624, + "candidate_p999_us_min": 380.928, + "candidate_p999_us_max": 1654.784, + "main_ops_per_cpu_s": 8392.7, + "candidate_ops_per_cpu_s": 9350.95, + "change_ops_per_cpu_s_pct": 11.417660585985434, + "main_ops_per_cpu_s_min": 8096.3, + "main_ops_per_cpu_s_max": 8689.1, + "candidate_ops_per_cpu_s_min": 9091.9, + "candidate_ops_per_cpu_s_max": 9610.0, + "main_rd_B_op": 14152.52, + "candidate_rd_B_op": 10932.815, + "change_rd_B_op_pct": -22.7500473413922, + "main_rd_B_op_min": 14141.46, + "main_rd_B_op_max": 14163.58, + "candidate_rd_B_op_min": 10930.2, + "candidate_rd_B_op_max": 10935.43, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 70586.35714285714, + "candidate_ops_with_drain_s": 78252.07142857142, + "change_ops_with_drain_s_pct": 10.860050859686554, + "main_ops_with_drain_s_min": 68023.57142857143, + "main_ops_with_drain_s_max": 73149.14285714286, + "candidate_ops_with_drain_s_min": 76028.28571428571, + "candidate_ops_with_drain_s_max": 80475.85714285714, + "throughput_ranges_overlap": false + }, + { + "mode": "reads", + "case": "disk-common", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 909.15, + "candidate_ops_s": 1093.6, + "change_ops_s_pct": 20.288181268217564, + "main_ops_s_min": 900.0, + "main_ops_s_max": 918.3, + "candidate_ops_s_min": 1061.8, + "candidate_ops_s_max": 1125.4, + "main_p99_us": 24903.68, + "candidate_p99_us": 21495.807999999997, + "change_p99_us_pct": -13.684210526315798, + "main_p99_us_min": 23330.816, + "main_p99_us_max": 26476.544, + "candidate_p99_us_min": 19136.512, + "candidate_p99_us_max": 23855.104, + "main_p999_us": 41025.536, + "candidate_p999_us": 34734.08, + "change_p999_us_pct": -15.335463258785943, + "main_p999_us_min": 31195.136, + "main_p999_us_max": 50855.936, + "candidate_p999_us_min": 23855.104, + "candidate_p999_us_max": 45613.056, + "main_ops_per_cpu_s": 256.70000000000005, + "candidate_ops_per_cpu_s": 287.55, + "change_ops_per_cpu_s_pct": 12.017919750681717, + "main_ops_per_cpu_s_min": 254.8, + "main_ops_per_cpu_s_max": 258.6, + "candidate_ops_per_cpu_s_min": 282.1, + "candidate_ops_per_cpu_s_max": 293.0, + "main_rd_B_op": 2541146.18, + "candidate_rd_B_op": 1801838.2349999999, + "change_rd_B_op_pct": -29.093483516166717, + "main_rd_B_op_min": 2538977.12, + "main_rd_B_op_max": 2543315.24, + "candidate_rd_B_op_min": 1793184.4, + "candidate_rd_B_op_max": 1810492.07, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 901.1694943965135, + "candidate_ops_with_drain_s": 1083.8224264048447, + "change_ops_with_drain_s_pct": 20.2684326471402, + "main_ops_with_drain_s_min": 891.3412563667233, + "main_ops_with_drain_s_max": 910.9977324263039, + "candidate_ops_with_drain_s_min": 1051.9388621568073, + "candidate_ops_with_drain_s_max": 1115.705990652882, + "throughput_ranges_overlap": false + }, + { + "mode": "reads", + "case": "disk-random", + "wal": 0, + "phase": "point:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 134411.1, + "candidate_ops_s": 134207.90000000002, + "change_ops_s_pct": -0.15117799050821112, + "main_ops_s_min": 132155.7, + "main_ops_s_max": 136666.5, + "candidate_ops_s_min": 133577.2, + "candidate_ops_s_max": 134838.6, + "main_p99_us": 121.856, + "candidate_p99_us": 120.832, + "change_p99_us_pct": -0.8403361344537785, + "main_p99_us_min": 119.808, + "main_p99_us_max": 123.904, + "candidate_p99_us_min": 119.808, + "candidate_p99_us_max": 121.856, + "main_p999_us": 564.224, + "candidate_p999_us": 226.30400000000003, + "change_p999_us_pct": -59.89110707803993, + "main_p999_us_min": 169.984, + "main_p999_us_max": 958.464, + "candidate_p999_us_min": 169.984, + "candidate_p999_us_max": 282.624, + "main_ops_per_cpu_s": 141506.3, + "candidate_ops_per_cpu_s": 143293.45, + "change_ops_per_cpu_s_pct": 1.2629473034063032, + "main_ops_per_cpu_s_min": 140382.2, + "main_ops_per_cpu_s_max": 142630.4, + "candidate_ops_per_cpu_s_min": 142704.7, + "candidate_ops_per_cpu_s_max": 143882.2, + "main_rd_B_op": 3529.025, + "candidate_rd_B_op": 3529.725, + "change_rd_B_op_pct": 0.01983550697430836, + "main_rd_B_op_min": 3528.61, + "main_rd_B_op_max": 3529.44, + "candidate_rd_B_op_min": 3529.68, + "candidate_rd_B_op_max": 3529.77, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 134414.42857142858, + "candidate_ops_with_drain_s": 134211.5, + "change_ops_with_drain_s_pct": -0.15097231270878586, + "main_ops_with_drain_s_min": 132159.2857142857, + "main_ops_with_drain_s_max": 136669.57142857142, + "candidate_ops_with_drain_s_min": 133580.57142857142, + "candidate_ops_with_drain_s_max": 134842.42857142858, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "disk-random", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 54883.2, + "candidate_ops_s": 55567.4, + "change_ops_s_pct": 1.2466474258060911, + "main_ops_s_min": 53370.4, + "main_ops_s_max": 56396.0, + "candidate_ops_s_min": 55082.8, + "candidate_ops_s_max": 56052.0, + "main_p99_us": 393.216, + "candidate_p99_us": 368.64, + "change_p99_us_pct": -6.25, + "main_p99_us_min": 364.544, + "main_p99_us_max": 421.888, + "candidate_p99_us_min": 364.544, + "candidate_p99_us_max": 372.736, + "main_p999_us": 1622.016, + "candidate_p999_us": 872.448, + "change_p999_us_pct": -46.21212121212122, + "main_p999_us_min": 1556.48, + "main_p999_us_max": 1687.552, + "candidate_p999_us_min": 548.864, + "candidate_p999_us_max": 1196.032, + "main_ops_per_cpu_s": 6562.25, + "candidate_ops_per_cpu_s": 6636.85, + "change_ops_per_cpu_s_pct": 1.1368052116271121, + "main_ops_per_cpu_s_min": 6389.1, + "main_ops_per_cpu_s_max": 6735.4, + "candidate_ops_per_cpu_s_min": 6574.3, + "candidate_ops_per_cpu_s_max": 6699.4, + "main_rd_B_op": 14159.295, + "candidate_rd_B_op": 14140.795, + "change_rd_B_op_pct": -0.13065622264385457, + "main_rd_B_op_min": 14154.01, + "main_rd_B_op_max": 14164.58, + "candidate_rd_B_op_min": 14140.47, + "candidate_rd_B_op_max": 14141.12, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 54884.857142857145, + "candidate_ops_with_drain_s": 55569.357142857145, + "change_ops_with_drain_s_pct": 1.2471563845348976, + "main_ops_with_drain_s_min": 53372.0, + "main_ops_with_drain_s_max": 56397.71428571428, + "candidate_ops_with_drain_s_min": 55084.71428571428, + "candidate_ops_with_drain_s_max": 56054.0, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "disk-random", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 794.9000000000001, + "candidate_ops_s": 792.15, + "change_ops_s_pct": -0.3459554660963815, + "main_ops_s_min": 788.7, + "main_ops_s_max": 801.1, + "candidate_ops_s_min": 787.5, + "candidate_ops_s_max": 796.8, + "main_p99_us": 29622.272, + "candidate_p99_us": 28835.84, + "change_p99_us_pct": -2.6548672566371723, + "main_p99_us_min": 29097.984, + "main_p99_us_max": 30146.56, + "candidate_p99_us_min": 27525.12, + "candidate_p99_us_max": 30146.56, + "main_p999_us": 47185.92, + "candidate_p999_us": 40894.464, + "change_p999_us_pct": -13.33333333333333, + "main_p999_us_min": 44564.48, + "main_p999_us_max": 49807.36, + "candidate_p999_us_min": 36175.872, + "candidate_p999_us_max": 45613.056, + "main_ops_per_cpu_s": 247.3, + "candidate_ops_per_cpu_s": 246.95, + "change_ops_per_cpu_s_pct": -0.14152850788516913, + "main_ops_per_cpu_s_min": 245.5, + "main_ops_per_cpu_s_max": 249.1, + "candidate_ops_per_cpu_s_min": 246.7, + "candidate_ops_per_cpu_s_max": 247.2, + "main_rd_B_op": 2526206.925, + "candidate_rd_B_op": 2533304.865, + "change_rd_B_op_pct": 0.2809722327081543, + "main_rd_B_op_min": 2520361.31, + "main_rd_B_op_max": 2532052.54, + "candidate_rd_B_op_min": 2532493.36, + "candidate_rd_B_op_max": 2534116.37, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 786.3403053013228, + "candidate_ops_with_drain_s": 781.3371659640949, + "change_ops_with_drain_s_pct": -0.6362562498065993, + "main_ops_with_drain_s_min": 779.5820389720418, + "main_ops_with_drain_s_max": 793.0985716306039, + "candidate_ops_with_drain_s_min": 775.9324419422941, + "candidate_ops_with_drain_s_max": 786.7418899858957, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "disk-nonlexical", + "wal": 0, + "phase": "point:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 145681.5, + "candidate_ops_s": 137161.05, + "change_ops_s_pct": -5.848683600869031, + "main_ops_s_min": 133323.3, + "main_ops_s_max": 158039.7, + "candidate_ops_s_min": 130352.7, + "candidate_ops_s_max": 143969.4, + "main_p99_us": 111.616, + "candidate_p99_us": 117.75999999999999, + "change_p99_us_pct": 5.504587155963292, + "main_p99_us_min": 101.376, + "main_p99_us_max": 121.856, + "candidate_p99_us_min": 111.616, + "candidate_p99_us_max": 123.904, + "main_p999_us": 676.864, + "candidate_p999_us": 157.696, + "change_p999_us_pct": -76.70196671709532, + "main_p999_us_min": 223.232, + "main_p999_us_max": 1130.496, + "candidate_p999_us_min": 149.504, + "candidate_p999_us_max": 165.888, + "main_ops_per_cpu_s": 134923.65, + "candidate_ops_per_cpu_s": 124554.54999999999, + "change_ops_per_cpu_s_pct": -7.68516120042706, + "main_ops_per_cpu_s_min": 129978.7, + "main_ops_per_cpu_s_max": 139868.6, + "candidate_ops_per_cpu_s_min": 120347.4, + "candidate_ops_per_cpu_s_max": 128761.7, + "main_rd_B_op": 3528.52, + "candidate_rd_B_op": 3528.6800000000003, + "change_rd_B_op_pct": 0.004534479045048556, + "main_rd_B_op_min": 3528.35, + "main_rd_B_op_max": 3528.69, + "candidate_rd_B_op_min": 3528.4, + "candidate_rd_B_op_max": 3528.96, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 145685.42857142858, + "candidate_ops_with_drain_s": 137164.5, + "change_ops_with_drain_s_pct": -5.848854380965651, + "main_ops_with_drain_s_min": 133327.0, + "main_ops_with_drain_s_max": 158043.85714285713, + "candidate_ops_with_drain_s_min": 130356.0, + "candidate_ops_with_drain_s_max": 143973.0, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "disk-nonlexical", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 60266.7, + "candidate_ops_s": 57849.5, + "change_ops_s_pct": -4.010838489580482, + "main_ops_s_min": 54996.1, + "main_ops_s_max": 65537.3, + "candidate_ops_s_min": 55657.5, + "candidate_ops_s_max": 60041.5, + "main_p99_us": 344.06399999999996, + "candidate_p99_us": 344.06399999999996, + "change_p99_us_pct": 0.0, + "main_p99_us_min": 307.2, + "main_p99_us_max": 380.928, + "candidate_p99_us_min": 331.776, + "candidate_p99_us_max": 356.352, + "main_p999_us": 1605.632, + "candidate_p999_us": 499.712, + "change_p999_us_pct": -68.87755102040816, + "main_p999_us_min": 1490.944, + "main_p999_us_max": 1720.32, + "candidate_p999_us_min": 479.232, + "candidate_p999_us_max": 520.192, + "main_ops_per_cpu_s": 7183.049999999999, + "candidate_ops_per_cpu_s": 6899.45, + "change_ops_per_cpu_s_pct": -3.948183571045716, + "main_ops_per_cpu_s_min": 6568.9, + "main_ops_per_cpu_s_max": 7797.2, + "candidate_ops_per_cpu_s_min": 6639.4, + "candidate_ops_per_cpu_s_max": 7159.5, + "main_rd_B_op": 14149.82, + "candidate_rd_B_op": 14143.385, + "change_rd_B_op_pct": -0.04547761031589159, + "main_rd_B_op_min": 14141.35, + "main_rd_B_op_max": 14158.29, + "candidate_rd_B_op_min": 14140.26, + "candidate_rd_B_op_max": 14146.51, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 60268.78571428571, + "candidate_ops_with_drain_s": 57851.5, + "change_ops_with_drain_s_pct": -4.010841907028384, + "main_ops_with_drain_s_min": 54998.142857142855, + "main_ops_with_drain_s_max": 65539.42857142857, + "candidate_ops_with_drain_s_min": 55659.57142857143, + "candidate_ops_with_drain_s_max": 60043.42857142857, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "disk-nonlexical", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 797.65, + "candidate_ops_s": 800.35, + "change_ops_s_pct": 0.3384943270858143, + "main_ops_s_min": 766.3, + "main_ops_s_max": 829.0, + "candidate_ops_s_min": 780.0, + "candidate_ops_s_max": 820.7, + "main_p99_us": 31981.568, + "candidate_p99_us": 27000.832000000002, + "change_p99_us_pct": -15.573770491803273, + "main_p99_us_min": 30670.848, + "main_p99_us_max": 33292.288, + "candidate_p99_us_min": 26476.544, + "candidate_p99_us_max": 27525.12, + "main_p999_us": 60555.264, + "candidate_p999_us": 36175.872, + "change_p999_us_pct": -40.25974025974026, + "main_p999_us_min": 50855.936, + "main_p999_us_max": 70254.592, + "candidate_p999_us_min": 35127.296, + "candidate_p999_us_max": 37224.448, + "main_ops_per_cpu_s": 232.60000000000002, + "candidate_ops_per_cpu_s": 236.1, + "change_ops_per_cpu_s_pct": 1.5047291487532144, + "main_ops_per_cpu_s_min": 231.9, + "main_ops_per_cpu_s_max": 233.3, + "candidate_ops_per_cpu_s_min": 233.2, + "candidate_ops_per_cpu_s_max": 239.0, + "main_rd_B_op": 2538518.9349999996, + "candidate_rd_B_op": 2543305.56, + "change_rd_B_op_pct": 0.18855975167269, + "main_rd_B_op_min": 2526938.01, + "main_rd_B_op_max": 2550099.86, + "candidate_rd_B_op_min": 2537409.73, + "candidate_rd_B_op_max": 2549201.39, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 788.5248525049924, + "candidate_ops_with_drain_s": 790.5173553665702, + "change_ops_with_drain_s_pct": 0.2526873890211556, + "main_ops_with_drain_s_min": 756.0253699788584, + "main_ops_with_drain_s_max": 821.0243350311263, + "candidate_ops_with_drain_s_min": 768.9057879171947, + "candidate_ops_with_drain_s_max": 812.1289228159458, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-common-disabled", + "wal": 0, + "phase": "point:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 3677185.65, + "candidate_ops_s": 3863049.1, + "change_ops_s_pct": 5.054502755388501, + "main_ops_s_min": 3544771.5, + "main_ops_s_max": 3809599.8, + "candidate_ops_s_min": 3784307.2, + "candidate_ops_s_max": 3941791.0, + "main_p99_us": 2.88, + "candidate_p99_us": 2.624, + "change_p99_us_pct": -8.888888888888879, + "main_p99_us_min": 2.784, + "main_p99_us_max": 2.976, + "candidate_p99_us_min": 2.528, + "candidate_p99_us_max": 2.72, + "main_p999_us": 9.984, + "candidate_p999_us": 8.608, + "change_p999_us_pct": -13.782051282051277, + "main_p999_us_min": 9.6, + "main_p999_us_max": 10.368, + "candidate_p999_us_min": 8.128, + "candidate_p999_us_max": 9.088, + "main_ops_per_cpu_s": 459705.80000000005, + "candidate_ops_per_cpu_s": 482935.6, + "change_ops_per_cpu_s_pct": 5.053188365254457, + "main_ops_per_cpu_s_min": 443155.7, + "main_ops_per_cpu_s_max": 476255.9, + "candidate_ops_per_cpu_s_min": 473088.6, + "candidate_ops_per_cpu_s_max": 492782.6, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 3677312.0714285714, + "candidate_ops_with_drain_s": 3863184.6428571427, + "change_ops_with_drain_s_pct": 5.054577033935637, + "main_ops_with_drain_s_min": 3544899.0, + "main_ops_with_drain_s_max": 3809725.1428571427, + "candidate_ops_with_drain_s_min": 3784438.1428571427, + "candidate_ops_with_drain_s_max": 3941931.1428571427, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-common-disabled", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 948568.75, + "candidate_ops_s": 945603.8999999999, + "change_ops_s_pct": -0.3125603705582902, + "main_ops_s_min": 892793.3, + "main_ops_s_max": 1004344.2, + "candidate_ops_s_min": 913518.7, + "candidate_ops_s_max": 977689.1, + "main_p99_us": 11.648, + "candidate_p99_us": 11.648, + "change_p99_us_pct": 0.0, + "main_p99_us_min": 11.136, + "main_p99_us_max": 12.16, + "candidate_p99_us_min": 11.136, + "candidate_p99_us_max": 12.16, + "main_p999_us": 20.736, + "candidate_p999_us": 20.992, + "change_p999_us_pct": 1.2345679012345734, + "main_p999_us_min": 19.712, + "main_p999_us_max": 21.76, + "candidate_p999_us_min": 20.224, + "candidate_p999_us_max": 21.76, + "main_ops_per_cpu_s": 118587.0, + "candidate_ops_per_cpu_s": 118212.8, + "change_ops_per_cpu_s_pct": -0.3155489218885643, + "main_ops_per_cpu_s_min": 111617.9, + "main_ops_per_cpu_s_max": 125556.1, + "candidate_ops_per_cpu_s_min": 114202.6, + "candidate_ops_per_cpu_s_max": 122223.0, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 948600.6428571428, + "candidate_ops_with_drain_s": 945635.7857142857, + "change_ops_with_drain_s_pct": -0.31255061496976433, + "main_ops_with_drain_s_min": 892825.4285714285, + "main_ops_with_drain_s_max": 1004375.8571428572, + "candidate_ops_with_drain_s_min": 913550.4285714285, + "candidate_ops_with_drain_s_max": 977721.1428571428, + "throughput_ranges_overlap": true + }, + { + "mode": "reads", + "case": "resident-common-disabled", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 3919.05, + "candidate_ops_s": 3131.5, + "change_ops_s_pct": -20.09543129074649, + "main_ops_s_min": 3405.3, + "main_ops_s_max": 4432.8, + "candidate_ops_s_min": 2982.7, + "candidate_ops_s_max": 3280.3, + "main_p99_us": 4603.904, + "candidate_p99_us": 4734.976000000001, + "change_p99_us_pct": 2.8469750889679846, + "main_p99_us_min": 3244.032, + "main_p99_us_max": 5963.776, + "candidate_p99_us_min": 4030.464, + "candidate_p99_us_max": 5439.488, + "main_p999_us": 4702.2080000000005, + "candidate_p999_us": 4866.048000000001, + "change_p999_us_pct": 3.4843205574912828, + "main_p999_us_min": 3309.568, + "main_p999_us_max": 6094.848, + "candidate_p999_us_min": 4161.536, + "candidate_p999_us_max": 5570.56, + "main_ops_per_cpu_s": 489.9, + "candidate_ops_per_cpu_s": 391.5, + "change_ops_per_cpu_s_pct": -20.08573178199632, + "main_ops_per_cpu_s_min": 425.7, + "main_ops_per_cpu_s_max": 554.1, + "candidate_ops_per_cpu_s_min": 372.9, + "candidate_ops_per_cpu_s_max": 410.1, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.15000000000000002, + "candidate_wr_B_op": 0.19, + "change_wr_B_op_pct": 26.66666666666664, + "main_wr_B_op_min": 0.13, + "main_wr_B_op_max": 0.17, + "candidate_wr_B_op_min": 0.18, + "candidate_wr_B_op_max": 0.2, + "main_ops_with_drain_s": 3919.214285714286, + "candidate_ops_with_drain_s": 3131.642857142857, + "change_ops_with_drain_s_pct": -20.0951356868177, + "main_ops_with_drain_s_min": 3405.4285714285716, + "main_ops_with_drain_s_max": 4433.0, + "candidate_ops_with_drain_s_min": 2982.8571428571427, + "candidate_ops_with_drain_s_max": 3280.4285714285716, + "throughput_ranges_overlap": false + }, + { + "mode": "reads", + "case": "resident-common-disabled", + "wal": 0, + "phase": "range:uniform:10000@1", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 1289.1, + "candidate_ops_s": 1272.25, + "change_ops_s_pct": -1.307113490031797, + "main_ops_s_min": 1248.7, + "main_ops_s_max": 1329.5, + "candidate_ops_s_min": 1243.4, + "candidate_ops_s_max": 1301.1, + "main_p99_us": 892.928, + "candidate_p99_us": 892.928, + "change_p99_us_pct": 0.0, + "main_p99_us_min": 860.16, + "main_p99_us_max": 925.696, + "candidate_p99_us_min": 876.544, + "candidate_p99_us_max": 909.312, + "main_p999_us": 1036.288, + "candidate_p999_us": 1159.1680000000001, + "change_p999_us_pct": 11.857707509881443, + "main_p999_us_min": 974.848, + "main_p999_us_max": 1097.728, + "candidate_p999_us_min": 991.232, + "candidate_p999_us_max": 1327.104, + "main_ops_per_cpu_s": 1289.15, + "candidate_ops_per_cpu_s": 1272.25, + "change_ops_per_cpu_s_pct": -1.3109413179226648, + "main_ops_per_cpu_s_min": 1248.7, + "main_ops_per_cpu_s_max": 1329.6, + "candidate_ops_per_cpu_s_min": 1243.4, + "candidate_ops_per_cpu_s_max": 1301.1, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.45499999999999996, + "candidate_wr_B_op": 0.45999999999999996, + "change_wr_B_op_pct": 1.098901098901095, + "main_wr_B_op_min": 0.44, + "main_wr_B_op_max": 0.47, + "candidate_wr_B_op_min": 0.45, + "candidate_wr_B_op_max": 0.47, + "main_ops_with_drain_s": 1265.3059585729843, + "candidate_ops_with_drain_s": 1256.1394454164658, + "change_ops_with_drain_s_pct": -0.7244503271648606, + "main_ops_with_drain_s_min": 1222.3465249615438, + "main_ops_with_drain_s_max": 1308.265392184425, + "candidate_ops_with_drain_s_min": 1227.471442673812, + "candidate_ops_with_drain_s_max": 1284.8074481591198, + "throughput_ranges_overlap": true + }, + { + "mode": "writes", + "case": "resident-common", + "wal": 0, + "phase": "ow:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 1966796.4500000002, + "candidate_ops_s": 2014988.9, + "change_ops_s_pct": 2.4503018601645277, + "main_ops_s_min": 1651774.3, + "main_ops_s_max": 2281818.6, + "candidate_ops_s_min": 1951505.2, + "candidate_ops_s_max": 2078472.6, + "main_p99_us": 6.272, + "candidate_p99_us": 6.336, + "change_p99_us_pct": 1.0204081632652962, + "main_p99_us_min": 6.208, + "main_p99_us_max": 6.336, + "candidate_p99_us_min": 6.336, + "candidate_p99_us_max": 6.336, + "main_p999_us": 80.64, + "candidate_p999_us": 36.864, + "change_p999_us_pct": -54.28571428571429, + "main_p999_us_min": 51.712, + "main_p999_us_max": 109.568, + "candidate_p999_us_min": 36.352, + "candidate_p999_us_max": 37.376, + "main_ops_per_cpu_s": 306398.75, + "candidate_ops_per_cpu_s": 318094.6, + "change_ops_per_cpu_s_pct": 3.8171989931421013, + "main_ops_per_cpu_s_min": 290814.6, + "main_ops_per_cpu_s_max": 321982.9, + "candidate_ops_per_cpu_s_min": 316910.9, + "candidate_ops_per_cpu_s_max": 319278.3, + "main_rd_B_op": 141.47, + "candidate_rd_B_op": 84.695, + "change_rd_B_op_pct": -40.13218350180251, + "main_rd_B_op_min": 141.46, + "main_rd_B_op_max": 141.48, + "candidate_rd_B_op_min": 83.08, + "candidate_rd_B_op_max": 86.31, + "main_wr_B_op": 187.47, + "candidate_wr_B_op": 112.805, + "change_wr_B_op_pct": -39.827705766255924, + "main_wr_B_op_min": 187.39, + "main_wr_B_op_max": 187.55, + "candidate_wr_B_op_min": 112.58, + "candidate_wr_B_op_max": 113.03, + "main_ops_with_drain_s": 1932737.1243178155, + "candidate_ops_with_drain_s": 1975842.8933216466, + "change_ops_with_drain_s_pct": 2.2302965292833488, + "main_ops_with_drain_s_min": 1615660.716469006, + "main_ops_with_drain_s_max": 2249813.5321666254, + "candidate_ops_with_drain_s_min": 1902096.978557505, + "candidate_ops_with_drain_s_max": 2049588.8080857883, + "throughput_ranges_overlap": true + }, + { + "mode": "writes", + "case": "resident-random", + "wal": 0, + "phase": "ow:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 1532285.1, + "candidate_ops_s": 1614541.25, + "change_ops_s_pct": 5.368201387587712, + "main_ops_s_min": 1417795.4, + "main_ops_s_max": 1646774.8, + "candidate_ops_s_min": 1583743.5, + "candidate_ops_s_max": 1645339.0, + "main_p99_us": 6.016, + "candidate_p99_us": 6.08, + "change_p99_us_pct": 1.0638297872340496, + "main_p99_us_min": 5.952, + "main_p99_us_max": 6.08, + "candidate_p99_us_min": 5.952, + "candidate_p99_us_max": 6.208, + "main_p999_us": 122.36800000000001, + "candidate_p999_us": 93.184, + "change_p999_us_pct": -23.84937238493725, + "main_p999_us_min": 103.424, + "main_p999_us_max": 141.312, + "candidate_p999_us_min": 74.752, + "candidate_p999_us_max": 111.616, + "main_ops_per_cpu_s": 294729.35, + "candidate_ops_per_cpu_s": 293141.45, + "change_ops_per_cpu_s_pct": -0.5387654809403841, + "main_ops_per_cpu_s_min": 288644.5, + "main_ops_per_cpu_s_max": 300814.2, + "candidate_ops_per_cpu_s_min": 291701.9, + "candidate_ops_per_cpu_s_max": 294581.0, + "main_rd_B_op": 150.51999999999998, + "candidate_rd_B_op": 138.03, + "change_rd_B_op_pct": -8.297900611214448, + "main_rd_B_op_min": 141.32, + "main_rd_B_op_max": 159.72, + "candidate_rd_B_op_min": 132.82, + "candidate_rd_B_op_max": 143.24, + "main_wr_B_op": 191.715, + "candidate_wr_B_op": 185.73000000000002, + "change_wr_B_op_pct": -3.1218214537203637, + "main_wr_B_op_min": 187.3, + "main_wr_B_op_max": 196.13, + "candidate_wr_B_op_min": 182.88, + "candidate_wr_B_op_max": 188.58, + "main_ops_with_drain_s": 1498383.1798511934, + "candidate_ops_with_drain_s": 1588280.7675773385, + "change_ops_with_drain_s_pct": 5.999639406995549, + "main_ops_with_drain_s_min": 1380056.2112179098, + "main_ops_with_drain_s_max": 1616710.1484844768, + "candidate_ops_with_drain_s_min": 1558664.2883503507, + "candidate_ops_with_drain_s_max": 1617897.2468043265, + "throughput_ranges_overlap": true + }, + { + "mode": "writes", + "case": "resident-common", + "wal": 1, + "phase": "ow:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 629594.05, + "candidate_ops_s": 749170.1000000001, + "change_ops_s_pct": 18.992563541539198, + "main_ops_s_min": 578949.9, + "main_ops_s_max": 680238.2, + "candidate_ops_s_min": 691557.9, + "candidate_ops_s_max": 806782.3, + "main_p99_us": 217.08800000000002, + "candidate_p99_us": 204.8, + "change_p99_us_pct": -5.660377358490576, + "main_p99_us_min": 198.656, + "main_p99_us_max": 235.52, + "candidate_p99_us_min": 190.464, + "candidate_p99_us_max": 219.136, + "main_p999_us": 1474.56, + "candidate_p999_us": 1044.48, + "change_p999_us_pct": -29.166666666666664, + "main_p999_us_min": 1425.408, + "main_p999_us_max": 1523.712, + "candidate_p999_us_min": 925.696, + "candidate_p999_us_max": 1163.264, + "main_ops_per_cpu_s": 259060.5, + "candidate_ops_per_cpu_s": 256907.85, + "change_ops_per_cpu_s_pct": -0.830944895111374, + "main_ops_per_cpu_s_min": 243713.3, + "main_ops_per_cpu_s_max": 274407.7, + "candidate_ops_per_cpu_s_min": 248907.8, + "candidate_ops_per_cpu_s_max": 264907.9, + "main_rd_B_op": 158.185, + "candidate_rd_B_op": 94.035, + "change_rd_B_op_pct": -40.5537819641559, + "main_rd_B_op_min": 156.79, + "main_rd_B_op_max": 159.58, + "candidate_rd_B_op_min": 89.4, + "candidate_rd_B_op_max": 98.67, + "main_wr_B_op": 427.605, + "candidate_wr_B_op": 353.375, + "change_wr_B_op_pct": -17.35947895838449, + "main_wr_B_op_min": 419.71, + "main_wr_B_op_max": 435.5, + "candidate_wr_B_op_min": 352.9, + "candidate_wr_B_op_max": 353.85, + "main_ops_with_drain_s": 620393.2591604214, + "candidate_ops_with_drain_s": 735223.1354268892, + "change_ops_with_drain_s_pct": 18.509207598720057, + "main_ops_with_drain_s_min": 569917.558754768, + "main_ops_with_drain_s_max": 670868.9595660749, + "candidate_ops_with_drain_s_min": 678682.1638861629, + "candidate_ops_with_drain_s_max": 791764.1069676154, + "throughput_ranges_overlap": false + }, + { + "mode": "writes", + "case": "resident-random", + "wal": 1, + "phase": "ow:uniform@8", + "main_samples": 2, + "candidate_samples": 2, + "main_ops_s": 576156.75, + "candidate_ops_s": 525078.8999999999, + "change_ops_s_pct": -8.865269737792724, + "main_ops_s_min": 570998.2, + "main_ops_s_max": 581315.3, + "candidate_ops_s_min": 484679.1, + "candidate_ops_s_max": 565478.7, + "main_p99_us": 235.51999999999998, + "candidate_p99_us": 259.072, + "change_p99_us_pct": 10.000000000000009, + "main_p99_us_min": 227.328, + "main_p99_us_max": 243.712, + "candidate_p99_us_min": 251.904, + "candidate_p99_us_max": 266.24, + "main_p999_us": 1425.408, + "candidate_p999_us": 1458.176, + "change_p999_us_pct": 2.298850574712641, + "main_p999_us_min": 1327.104, + "main_p999_us_max": 1523.712, + "candidate_p999_us_min": 1327.104, + "candidate_p999_us_max": 1589.248, + "main_ops_per_cpu_s": 228188.05, + "candidate_ops_per_cpu_s": 182787.35, + "change_ops_per_cpu_s_pct": -19.89617773586302, + "main_ops_per_cpu_s_min": 216555.9, + "main_ops_per_cpu_s_max": 239820.2, + "candidate_ops_per_cpu_s_min": 162959.0, + "candidate_ops_per_cpu_s_max": 202615.7, + "main_rd_B_op": 153.7, + "candidate_rd_B_op": 131.29500000000002, + "change_rd_B_op_pct": -14.577098243331143, + "main_rd_B_op_min": 149.64, + "main_rd_B_op_max": 157.76, + "candidate_rd_B_op_min": 127.73, + "candidate_rd_B_op_max": 134.86, + "main_wr_B_op": 437.94, + "candidate_wr_B_op": 428.235, + "change_wr_B_op_pct": -2.2160569941087838, + "main_wr_B_op_min": 437.83, + "main_wr_B_op_max": 438.05, + "candidate_wr_B_op_min": 422.31, + "candidate_wr_B_op_max": 434.16, + "main_ops_with_drain_s": 566929.2403528946, + "candidate_ops_with_drain_s": 510361.04196030286, + "change_ops_with_drain_s_pct": -9.977999786601233, + "main_ops_with_drain_s_min": 561259.9827988697, + "main_ops_with_drain_s_max": 572598.4979069195, + "candidate_ops_with_drain_s_min": 473162.0500305064, + "candidate_ops_with_drain_s_max": 547560.0338900993, + "throughput_ranges_overlap": false + }, + { + "mode": "repeat", + "case": "resident-common", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 3, + "candidate_samples": 3, + "main_ops_s": 4025.3, + "candidate_ops_s": 3538.366666666667, + "change_ops_s_pct": -12.096820940882258, + "main_ops_s_min": 3909.3, + "main_ops_s_max": 4235.1, + "candidate_ops_s_min": 3136.6, + "candidate_ops_s_max": 4012.2, + "main_p99_us": 4609.365333333333, + "candidate_p99_us": 4423.68, + "change_p99_us_pct": -4.028436018957338, + "main_p99_us_min": 4259.84, + "main_p99_us_max": 5046.272, + "candidate_p99_us_min": 3571.712, + "candidate_p99_us_max": 5177.344, + "main_p999_us": 4871.509333333333, + "candidate_p999_us": 4707.669333333333, + "change_p999_us_pct": -3.363228699551568, + "main_p999_us_min": 4653.056, + "main_p999_us_max": 5177.344, + "candidate_p999_us_min": 3768.32, + "candidate_p999_us_max": 5308.416, + "main_ops_per_cpu_s": 503.26666666666665, + "candidate_ops_per_cpu_s": 442.3666666666667, + "change_ops_per_cpu_s_pct": -12.10094052192343, + "main_ops_per_cpu_s_min": 488.7, + "main_ops_per_cpu_s_max": 529.5, + "candidate_ops_per_cpu_s_min": 392.1, + "candidate_ops_per_cpu_s_max": 501.6, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 4001.016958481691, + "candidate_ops_with_drain_s": 3512.0952062839924, + "change_ops_with_drain_s_pct": -12.219937012794734, + "main_ops_with_drain_s_min": 3882.7385287691186, + "main_ops_with_drain_s_max": 4216.366894537731, + "candidate_ops_with_drain_s_min": 3111.9783054434815, + "candidate_ops_with_drain_s_max": 3982.0034405187243, + "throughput_ranges_overlap": true + }, + { + "mode": "repeat", + "case": "resident-common-disabled", + "wal": 0, + "phase": "range:uniform:10000@8", + "main_samples": 3, + "candidate_samples": 3, + "main_ops_s": 3854.7999999999997, + "candidate_ops_s": 3762.9666666666667, + "change_ops_s_pct": -2.3823112310193295, + "main_ops_s_min": 3365.5, + "main_ops_s_max": 4357.7, + "candidate_ops_s_min": 3613.8, + "candidate_ops_s_max": 3853.3, + "main_p99_us": 3975.8506666666667, + "candidate_p99_us": 4576.597333333333, + "change_p99_us_pct": 15.1098901098901, + "main_p99_us_min": 3440.64, + "main_p99_us_max": 5046.272, + "candidate_p99_us_min": 4161.536, + "candidate_p99_us_max": 5177.344, + "main_p999_us": 4237.9946666666665, + "candidate_p999_us": 4740.437333333333, + "change_p999_us_pct": 11.855670103092786, + "main_p999_us_min": 3637.248, + "main_p999_us_max": 5308.416, + "candidate_p999_us_min": 4390.912, + "candidate_p999_us_max": 5177.344, + "main_ops_per_cpu_s": 481.93333333333334, + "candidate_ops_per_cpu_s": 470.43333333333334, + "change_ops_per_cpu_s_pct": -2.386222160741458, + "main_ops_per_cpu_s_min": 420.8, + "main_ops_per_cpu_s_max": 544.8, + "candidate_ops_per_cpu_s_min": 451.8, + "candidate_ops_per_cpu_s_max": 481.7, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 3854.866666666667, + "candidate_ops_with_drain_s": 3763.0222222222224, + "change_ops_with_drain_s_pct": -2.382558266894952, + "main_ops_with_drain_s_min": 3365.5333333333333, + "main_ops_with_drain_s_max": 4357.8, + "candidate_ops_with_drain_s_min": 3613.866666666667, + "candidate_ops_with_drain_s_max": 3853.3333333333335, + "throughput_ranges_overlap": true + }, + { + "mode": "repeat", + "case": "resident-common-disabled", + "wal": 0, + "phase": "range:uniform:10000@1", + "main_samples": 3, + "candidate_samples": 3, + "main_ops_s": 1350.8333333333333, + "candidate_ops_s": 1376.3, + "change_ops_s_pct": 1.8852560148056696, + "main_ops_s_min": 1334.6, + "main_ops_s_max": 1377.4, + "candidate_ops_s_min": 1373.1, + "candidate_ops_s_max": 1381.2, + "main_p99_us": 876.544, + "candidate_p99_us": 811.008, + "change_p99_us_pct": -7.476635514018682, + "main_p99_us_min": 843.776, + "main_p99_us_max": 925.696, + "candidate_p99_us_min": 794.624, + "candidate_p99_us_max": 827.392, + "main_p999_us": 1220.608, + "candidate_p999_us": 936.6186666666666, + "change_p999_us_pct": -23.266219239373598, + "main_p999_us_min": 1007.616, + "main_p999_us_max": 1359.872, + "candidate_p999_us_min": 860.16, + "candidate_p999_us_max": 974.848, + "main_ops_per_cpu_s": 1350.9, + "candidate_ops_per_cpu_s": 1376.2333333333333, + "change_ops_per_cpu_s_pct": 1.8752930145335078, + "main_ops_per_cpu_s_min": 1334.9, + "main_ops_per_cpu_s_max": 1377.2, + "candidate_ops_per_cpu_s_min": 1373.2, + "candidate_ops_per_cpu_s_max": 1381.2, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.33666666666666667, + "candidate_wr_B_op": 0.4, + "change_wr_B_op_pct": 18.811881188118807, + "main_wr_B_op_min": 0.2, + "main_wr_B_op_max": 0.41, + "candidate_wr_B_op_min": 0.4, + "candidate_wr_B_op_max": 0.4, + "main_ops_with_drain_s": 1341.7840419000438, + "candidate_ops_with_drain_s": 1367.106487376034, + "change_ops_with_drain_s_pct": 1.8872221374858666, + "main_ops_with_drain_s_min": 1322.6744186046512, + "main_ops_with_drain_s_max": 1371.639115714001, + "candidate_ops_with_drain_s_min": 1362.7762339552733, + "candidate_ops_with_drain_s_max": 1370.87275855224, + "throughput_ranges_overlap": true + }, + { + "mode": "repeat", + "case": "resident-nonlexical", + "wal": 0, + "phase": "range:uniform:1@8", + "main_samples": 3, + "candidate_samples": 3, + "main_ops_s": 1028346.2, + "candidate_ops_s": 969401.0, + "change_ops_s_pct": -5.732038490539471, + "main_ops_s_min": 995559.2, + "main_ops_s_max": 1081379.8, + "candidate_ops_s_min": 944712.2, + "candidate_ops_s_max": 990583.5, + "main_p99_us": 10.624, + "candidate_p99_us": 11.392, + "change_p99_us_pct": 7.228915662650581, + "main_p99_us_min": 10.112, + "main_p99_us_max": 10.88, + "candidate_p99_us_min": 11.136, + "candidate_p99_us_max": 11.648, + "main_p999_us": 19.882666666666665, + "candidate_p999_us": 20.565333333333335, + "change_p999_us_pct": 3.4334763948498104, + "main_p999_us_min": 18.688, + "main_p999_us_max": 20.736, + "candidate_p999_us_min": 19.712, + "candidate_p999_us_max": 21.76, + "main_ops_per_cpu_s": 128571.7, + "candidate_ops_per_cpu_s": 121192.36666666667, + "change_ops_per_cpu_s_pct": -5.739469364823934, + "main_ops_per_cpu_s_min": 124463.5, + "main_ops_per_cpu_s_max": 135198.3, + "candidate_ops_per_cpu_s_min": 118102.7, + "candidate_ops_per_cpu_s_max": 123841.1, + "main_rd_B_op": 0.0, + "candidate_rd_B_op": 0.0, + "change_rd_B_op_pct": null, + "main_rd_B_op_min": 0.0, + "main_rd_B_op_max": 0.0, + "candidate_rd_B_op_min": 0.0, + "candidate_rd_B_op_max": 0.0, + "main_wr_B_op": 0.0, + "candidate_wr_B_op": 0.0, + "change_wr_B_op_pct": null, + "main_wr_B_op_min": 0.0, + "main_wr_B_op_max": 0.0, + "candidate_wr_B_op_min": 0.0, + "candidate_wr_B_op_max": 0.0, + "main_ops_with_drain_s": 1023362.4445549916, + "candidate_ops_with_drain_s": 964199.6596989221, + "change_ops_with_drain_s_pct": -5.781215166811826, + "main_ops_with_drain_s_min": 991214.1908934023, + "main_ops_with_drain_s_max": 1075374.1050119333, + "candidate_ops_with_drain_s_min": 938906.7117206652, + "candidate_ops_with_drain_s_max": 985801.499369734, + "throughput_ranges_overlap": false + }, + { + "mode": "repeat", + "case": "resident-random", + "wal": 1, + "phase": "ow:uniform@8", + "main_samples": 3, + "candidate_samples": 3, + "main_ops_s": 890070.2666666666, + "candidate_ops_s": 837595.4, + "change_ops_s_pct": -5.895586970137334, + "main_ops_s_min": 771902.2, + "main_ops_s_max": 1050078.9, + "candidate_ops_s_min": 809333.6, + "candidate_ops_s_max": 880444.9, + "main_p99_us": 149.84533333333334, + "candidate_p99_us": 152.23466666666667, + "change_p99_us_pct": 1.5945330296127436, + "main_p99_us_min": 130.048, + "main_p99_us_max": 161.792, + "candidate_p99_us_min": 149.504, + "candidate_p99_us_max": 153.6, + "main_p999_us": 1044.48, + "candidate_p999_us": 1294.336, + "change_p999_us_pct": 23.921568627450984, + "main_p999_us_min": 479.232, + "main_p999_us_max": 1392.64, + "candidate_p999_us_min": 1196.032, + "candidate_p999_us_max": 1359.872, + "main_ops_per_cpu_s": 244809.63333333333, + "candidate_ops_per_cpu_s": 242372.16666666666, + "change_ops_per_cpu_s_pct": -0.9956579867704041, + "main_ops_per_cpu_s_min": 241168.8, + "main_ops_per_cpu_s_max": 248213.5, + "candidate_ops_per_cpu_s_min": 240051.1, + "candidate_ops_per_cpu_s_max": 244257.4, + "main_rd_B_op": 161.31666666666666, + "candidate_rd_B_op": 161.42333333333335, + "change_rd_B_op_pct": 0.06612253331956808, + "main_rd_B_op_min": 153.19, + "main_rd_B_op_max": 165.73, + "candidate_rd_B_op_min": 155.83, + "candidate_rd_B_op_max": 165.84, + "main_wr_B_op": 430.62, + "candidate_wr_B_op": 430.9633333333333, + "change_wr_B_op_pct": 0.07973000170296007, + "main_wr_B_op_min": 428.62, + "main_wr_B_op_max": 432.23, + "candidate_wr_B_op_min": 429.49, + "candidate_wr_B_op_max": 432.01, + "main_ops_with_drain_s": 882006.7343931693, + "candidate_ops_with_drain_s": 828312.1230690569, + "change_ops_with_drain_s_pct": -6.087777930749572, + "main_ops_with_drain_s_min": 763515.9907682163, + "main_ops_with_drain_s_max": 1041828.4278060718, + "candidate_ops_with_drain_s_min": 803133.5670812385, + "candidate_ops_with_drain_s_max": 871105.5339357562, + "throughput_ranges_overlap": true + } +] diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-automatic-log-recovery.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-automatic-log-recovery.log new file mode 100644 index 000000000..e3ce73261 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-automatic-log-recovery.log @@ -0,0 +1,3 @@ +Running 1 CTests, suite name 'splinterdb_forked_child', test case 'automatic_log_barriers_survive_process_exit'. +TEST 1/1 splinterdb_forked_child:automatic_log_barriers_survive_process_exit [OK] +RESULTS: 1 tests (1 ok, 0 failed, 0 skipped) ran in 750 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-btree.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-btree.log new file mode 100644 index 000000000..d67a52443 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-btree.log @@ -0,0 +1,36 @@ +Running 1 CTests, suite name 'btree', test case 'all'. +TEST 1/12 btree:test_compressed_suffix_copy [OK] +TEST 2/12 btree:test_leaf_hdr [OK] +TEST 3/12 btree:test_leaf_hdr_search [OK] +TEST 4/12 btree:test_index_hdr [OK] +TEST 5/12 btree:test_index_hdr_search [OK] +TEST 6/12 btree:test_leaf_split [OK] +TEST 7/12 btree:test_defragmented_leaf_bytes [OK] +TEST 8/12 btree:test_defragmented_index_bytes [OK] +TEST 9/12 btree:test_invalid_branch_point_lookup Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +TEST 10/12 btree:test_invalid_branch_async_point_lookup Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +TEST 11/12 btree:test_invalid_branch_iterator Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +TEST 12/12 btree:test_invalid_branch_metadata_queries Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +RESULTS: 12 tests (12 ok, 0 failed, 0 skipped) ran in 12 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.json new file mode 100644 index 000000000..62f4e5808 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.json @@ -0,0 +1,199 @@ +{ + "command": [ + "make", + "-j6", + "BUILD_ROOT=build-main-6105c49f", + "BUILD_MODE=debug", + "all" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "started": 1792006846.5902853, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792006848.9100454, + "log_sha256": "ec851d07175da201343734413275610d482f4a8df028a2dd6973c0366772800a", + "log": "debug-build.log", + "seconds": 2.3197600841522217, + "TMPDIR": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-build-9mdij74s", + "source_manifest": { + "head": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "origin_main": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "source_sha256": { + "Makefile": "64ffc4bcbe25fca2a45da700ead4a6d4add7601c6f406290e2cf5cde52e95296", + "examples/README.md": "e5f70bd344661c7018b43dc9fe02fa9bfa047f277b2de4535f0e035b1ffb2d71", + "examples/splinterdb_custom_ipv4_addr_sortcmp_example.c": "add1a04c25e8bb1ae9d8dfdf1a04c50228b9820c3da01e021f5359be816118bb", + "examples/splinterdb_intro_example.c": "ba0138e7994d16e45c77667c1e5576ca38e727aaa0cab0872ba0e5afb5ea44cc", + "examples/splinterdb_iterators_example.c": "22a9ca47be0433c276e9ad4ce119962edcc2911814e1e62cb22d3c8a8a26beed", + "examples/splinterdb_optimize_example.c": "bbc5a089afc7e62f06d00ffab1fd2b1c1cf1111669a1a7452d587e1f68f62c06", + "examples/splinterdb_wide_values_example.c": "a333d406974f0b3a85ed418d21e2846e3e2e80028d18254469d61f900a95d831", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb", + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "tests/config.c": "2a4487280f7d81a78e4d27e14e62c0c4c62dd1539e94df380fdf097a859556b7", + "tests/config.h": "754d9e0aca8f9d0359b73a5d6e470e80a2ac48ac43eb46d43aa1a5104fd89065", + "tests/functional/README.md": "c95907cfe5f4aaebc303d0d94cdcbd51e78d717ec11e4c5ecea6b8efaf723be0", + "tests/functional/avlTree.c": "5c24865aa50a21c626dacb2bd6172ff182a25e3532f5aee73a25aeb47c6bb043", + "tests/functional/avlTree.h": "39d82dc2b4c99a635c095800efcd060e7c95822a1194de0f03524a970040ac86", + "tests/functional/btree_test.c": "c011e72c204cc7640d1d259c791ba7ead40ef2a2c01fcfff3140d988d6666547", + "tests/functional/cache_test.c": "549f326d035fbb81cf9f272a66948f34f30313495624c6320e4a75b47c042e48", + "tests/functional/driver_test.c": "aef8d611eae488b287a796007c2a4e2a5f2e7f3f3190dce51be0e2be78ecb765", + "tests/functional/filter_test.c": "d58945f7c783584c65963381068c0225ed34dcb8d7dad7b2dfe865692a452853", + "tests/functional/io_apis_test.c": "be9b36b3af71975782f42ecc8087a922dea828d82049844d0833845cc1698ec5", + "tests/functional/log_test.c": "5464ef364dddffcb9aa5d80c1ee47994fb2ef6c451da25ac69b80c330f69d28c", + "tests/functional/random.h": "8b6567f2e066099fc21d9f6548b561169ffadb0da07150be7bf940c86d146082", + "tests/functional/scan_benchmark.c": "cb06609cf0134f1952a8742d19ef850ff4c80d86a6ffca85607998a2c921b17a", + "tests/functional/splinter_test.c": "b6c2e683dd48e23bc5d035e5d00142012f64085a21cff563b44d54fbaf2c7b9c", + "tests/functional/splinter_test.h": "9eb16fb6c779b27df477213c341031421d383c1c72051f2f42abec4c3c5b0f79", + "tests/functional/test.h": "fc47bbf44ca520c6ebcbc8843871e394a2de4521cb3c679c55a01a4b8c278d21", + "tests/functional/test_async.c": "258f7c56c6c500c783e659b69b157d3c9a06812fcbc31a8fb165b6c66f213acd", + "tests/functional/test_async.h": "c3530305b730c3d9a2c3c73ed438ee7ccd6c5c45cd26e0e02e6a821350b1d778", + "tests/functional/test_dispatcher.c": "60eaa54ce5ffd0d50095722ecd488b448e875fa07a44acc4ba560534c16d67b9", + "tests/functional/test_functionality.c": "d7b71e53f78b88257a10d8cc4fddd3daa48d704a89f6b4c5590af507da4637cd", + "tests/functional/test_functionality.h": "d065e9b63d00f37a88ee9cf962a1280040d7ee4684a1141a506e393fa38913b0", + "tests/functional/test_splinter_shadow.c": "4b856d30739b5ae544b65f514a55cc9d91cbc550044c498bedc51e8d5da26bd5", + "tests/functional/test_splinter_shadow.h": "a1b23c891db62785db9c4f80035ea1060de68c79aa0230dd6dbc03a8fe0b118d", + "tests/functional/ycsb_test.c": "5b1be412e93cfe56b8578051583fa231c138e2acee1afe4b3d1dfb925e0ad26f", + "tests/test_common.c": "fd1d18926096852a7dcfb54622d534d76a8ec62437ce72143c261f402587e493", + "tests/test_common.h": "3691f4e6bdaedb246dc9edea3d62a5cc69b456240492ba6cca8a2320c27cd595", + "tests/test_data.c": "48433bcf29a2e5ce1540a7b479bf0ddf85278e3d2a3c5ca6d8e4538cd1f0012f", + "tests/test_data.h": "61af4814f5d37200fa2393fc40abc7aa19acf4af322ca159390da3332af2952a", + "tests/unit/README.md": "9d4dc976f63738ebe5b73d446e2d6de088f29b26e2683f3c3c552c964949de2d", + "tests/unit/btree_stress_test.c": "1aa7a844349a1070f497f8ded0be9a36a5cf492d8731b49d626a771664f3ba79", + "tests/unit/btree_test.c": "cfb4057349c6580acead4950876f9665ac0d0d38ef7d8289bf90db00e88878e3", + "tests/unit/btree_test_common.c": "3fa17ff41ec7afa5e7204aeb68767a7fcb7e1c7cf81695ef9506876a2af324bf", + "tests/unit/btree_test_common.h": "b7b30bdc02449e81d2fe263c0ef74a4a28c728f717d1ea20d16e3f1acb10a6a2", + "tests/unit/config_parse_test.c": "700a56f940237508e1ce647cc011f2f42c503aab262f930fd1baf0f265a9a112", + "tests/unit/ctest.h": "db9f53f9da859ff1d72be00efb993ca551720e0acaf747236e34e031368c7a16", + "tests/unit/large_inserts_stress_test.c": "df90d2de303f72829779f23cad3881cc65465d5d1a22fcdaf10000b23430b7ae", + "tests/unit/limitations_test.c": "e851344911b8c835578ccd9ae777b79369d339a375cca1468a12c70f03a9efe3", + "tests/unit/main.c": "a4a3ca6e237e3f40f07682c6528b1ef6f32105afc6071810e15411ad297b7a38", + "tests/unit/merge_test.c": "8c916b53e14f3a1f03b314f33d6d67975d7c60909a06c5c5b41b62ef02dc94f4", + "tests/unit/misc_test.c": "4ec5cf57c933275ccdf532a529ae79909840f7d41d36b842a4cb9d9a291ea05b", + "tests/unit/notification_test.c": "b9dcf332b319cf1ff0c1f9c3aa7fc32a35c9f19b81f8122d55c6ed7f6e02e84b", + "tests/unit/platform_apis_test.c": "c3623021ae04b4305b0971cfb2760f895c5b6908310a6e4c192f65769262c860", + "tests/unit/platform_threads_test.c": "bd8e8bb58926344add7b38357c15237687165da8995b052f02612967b6bd8af5", + "tests/unit/splinter_test.c": "297752b1102d3d85ef8cd4be54c0fa15d9a6aeb7e03ce092d14a967ccff42244", + "tests/unit/splinterdb_forked_child_test.c": "88fb68b05aef1238ddce814eccd636b1dfffcb3f439d4892f66b82ad686a075d", + "tests/unit/splinterdb_heap_id_mgmt_test.c": "43729def7a6d91cf66f5bc1fe2e6f0a4a45d63ebbb55887ed10a5eafcdc8235e", + "tests/unit/splinterdb_optimize_test.c": "719af1e83c60df31e63dfd782ace852605edbc355dfb487608e9c77a8f33ebae", + "tests/unit/splinterdb_quick_test.c": "9515f6fe840c1012f54701e1e5a75430f764063b6a4f3091f426bd3038bc2eda", + "tests/unit/splinterdb_stress_test.c": "21a7f8725c82e4d8ec780131eff514294304aba322d8a2650ae893efaaf66f3a", + "tests/unit/superblock_test.c": "04864b8fce2142d49abefebd0dd3acca6158ebea495484ef05d670013a6c8977", + "tests/unit/task_system_test.c": "bd8ad9ca2632f17a6353f3c1e4d0849d98604e6b3a30f9c0c0b7ee13904a3024", + "tests/unit/trunk_async_test.c": "00c51d4302a48e09bdfacf217d45fc3c935f59bac130ded3f3164cc64ec5713b", + "tests/unit/trunk_gc_test.c": "00d6134ad82ed061cbc16d4b19fc21f41432c4b7c5a4b7ade80c3bed3b2dfdca", + "tests/unit/trunk_split_test.c": "4237641a463b28b7be333ed5d4f80a4830c3b0ef75335b196da34318a9f58b18", + "tests/unit/unit_test_template_dot_c": "ffb5e31229ca59caaece995122fcefe11f360ae45953caae0b5d4a72b2a6bcf7", + "tests/unit/unit_tests.h": "4e15f58455d8d759e9fad8432a02b1ec70f3a47a3e74eb39ea11b6a2ad44af42", + "tests/unit/unit_tests_common.c": "7a47eb40fadea397842e2f56932083d7e8840f08834788d6774b1f688288e735", + "tests/unit/util_test.c": "e992dff255d18e84673ea3954eb2da314de0815e64d55fd1980018b22444508b", + "tests/unit/vector_test.c": "463c0ae5b0c7525844f198c6859988a1bc33274d26cace87b9229673bc7c5186", + "tests/unit/writable_buffer_test.c": "3418d6ae29c5bc09dda485c1c1fe1768a1a3fc66b9b6bfdd05aa50e52516241e", + "tests/unit/writeback_set_test.c": "7bef6ea2a4a9d13fe0d83549cadd8e9497018068ac397ac8c31edea6909ee398" + }, + "tracked_source_diff": "diff --git a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\nindex 7a251f1c..8855fc0c 100644\n--- a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n+++ b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n@@ -140,6 +140,8 @@ main()\n // up-front. Every insert will invoke this method to insert the new key\n // in custom-sorted order.\n splinter_data_cfg.key_compare = custom_key_compare;\n+ // IP address order differs from bytewise lexical order.\n+ splinter_data_cfg.key_compare_is_lexical = FALSE;\n \n // Basic configuration of a SplinterDB instance\n splinterdb_config splinterdb_cfg;" + }, + "build_config": null +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.log new file mode 100644 index 000000000..14761b542 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-build.log @@ -0,0 +1,131 @@ +Checking for mismatched config...No mismatched config found +Saving config to build-main-6105c49f/debug/build-config.e33dfc688a9c2bf2dad4e17ef758ec3e +Compiling src/PackedArray.c [build-main-6105c49f/debug/obj/src/PackedArray.o] +Compiling src/batch_rwlock.c [build-main-6105c49f/debug/obj/src/batch_rwlock.o] +Compiling src/core.c [build-main-6105c49f/debug/obj/src/core.o] +Compiling src/default_data_config.c [build-main-6105c49f/debug/obj/src/default_data_config.o] +Compiling src/memtable.c [build-main-6105c49f/debug/obj/src/memtable.o] +Compiling src/merge.c [build-main-6105c49f/debug/obj/src/merge.o] +Compiling src/notification.c [build-main-6105c49f/debug/obj/src/notification.o] +Compiling src/routing_filter.c [build-main-6105c49f/debug/obj/src/routing_filter.o] +Compiling src/shard_log.c [build-main-6105c49f/debug/obj/src/shard_log.o] +Compiling src/splinterdb.c [build-main-6105c49f/debug/obj/src/splinterdb.o] +Compiling src/superblock.c [build-main-6105c49f/debug/obj/src/superblock.o] +Compiling src/trunk.c [build-main-6105c49f/debug/obj/src/trunk.o] +Compiling tools/splinter_inspect.c [build-main-6105c49f/debug/obj/tools/splinter_inspect.o] +Compiling src/allocator.c [build-main-6105c49f/debug/obj/src/allocator.o] +Compiling src/blob.c [build-main-6105c49f/debug/obj/src/blob.o] +Compiling src/blob_build.c [build-main-6105c49f/debug/obj/src/blob_build.o] +Compiling src/btree.c [build-main-6105c49f/debug/obj/src/btree.o] +Compiling src/clockcache.c [build-main-6105c49f/debug/obj/src/clockcache.o] +Compiling src/data_blob_build.c [build-main-6105c49f/debug/obj/src/data_blob_build.o] +Compiling src/data_internal.c [build-main-6105c49f/debug/obj/src/data_internal.o] +Compiling src/histogram.c [build-main-6105c49f/debug/obj/src/histogram.o] +Compiling src/mini_allocator.c [build-main-6105c49f/debug/obj/src/mini_allocator.o] +Compiling src/ondisk_ref.c [build-main-6105c49f/debug/obj/src/ondisk_ref.o] +Compiling src/platform_linux/laio.c [build-main-6105c49f/debug/obj/src/platform_linux/laio.o] +Compiling src/platform_linux/platform_assert.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_assert.o] +Compiling src/platform_linux/platform_buffer.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_buffer.o] +Compiling src/platform_linux/platform_condvar.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_condvar.o] +Compiling src/platform_linux/platform_heap.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_heap.o] +Compiling src/platform_linux/platform_io.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_io.o] +Compiling src/platform_linux/platform_log.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_log.o] +Compiling src/platform_linux/platform_mutex.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_mutex.o] +Compiling src/platform_linux/platform_threads.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_threads.o] +Compiling src/platform_linux/platform_trace.c [build-main-6105c49f/debug/obj/src/platform_linux/platform_trace.o] +Compiling src/platform_linux/shmalloc.c [build-main-6105c49f/debug/obj/src/platform_linux/shmalloc.o] +Compiling src/rc_allocator.c [build-main-6105c49f/debug/obj/src/rc_allocator.o] +Compiling src/task.c [build-main-6105c49f/debug/obj/src/task.o] +Compiling src/util.c [build-main-6105c49f/debug/obj/src/util.o] +Compiling src/writeback_set.c [build-main-6105c49f/debug/obj/src/writeback_set.o] +Compiling tests/functional/avlTree.c [build-main-6105c49f/debug/obj/tests/functional/avlTree.o] +Compiling tests/functional/btree_test.c [build-main-6105c49f/debug/obj/tests/functional/btree_test.o] +Compiling tests/functional/cache_test.c [build-main-6105c49f/debug/obj/tests/functional/cache_test.o] +Compiling tests/functional/driver_test.c [build-main-6105c49f/debug/obj/tests/functional/driver_test.o] +Compiling tests/functional/filter_test.c [build-main-6105c49f/debug/obj/tests/functional/filter_test.o] +Compiling tests/functional/io_apis_test.c [build-main-6105c49f/debug/obj/tests/functional/io_apis_test.o] +Compiling tests/functional/log_test.c [build-main-6105c49f/debug/obj/tests/functional/log_test.o] +Compiling tests/functional/scan_benchmark.c [build-main-6105c49f/debug/obj/tests/functional/scan_benchmark.o] +Compiling tests/functional/splinter_test.c [build-main-6105c49f/debug/obj/tests/functional/splinter_test.o] +Compiling tests/functional/test_async.c [build-main-6105c49f/debug/obj/tests/functional/test_async.o] +Compiling tests/functional/test_dispatcher.c [build-main-6105c49f/debug/obj/tests/functional/test_dispatcher.o] +Compiling tests/functional/test_functionality.c [build-main-6105c49f/debug/obj/tests/functional/test_functionality.o] +Compiling tests/functional/test_splinter_shadow.c [build-main-6105c49f/debug/obj/tests/functional/test_splinter_shadow.o] +Compiling tests/functional/ycsb_test.c [build-main-6105c49f/debug/obj/tests/functional/ycsb_test.o] +Compiling tests/config.c [build-main-6105c49f/debug/obj/tests/config.o] +Compiling tests/test_common.c [build-main-6105c49f/debug/obj/tests/test_common.o] +In file included from src/PackedArray.c:296, + from src/PackedArray.c:356: +src/PackedArray.c: In function ‘__PackedArray_unpack_21’: +src/PackedArray.c:177: note: ‘-Wmisleading-indentation’ is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers + 177 | PACKEDARRAY_IMPL_UNPACK_CASE_BREAK +src/PackedArray.c:177: note: adding ‘-flarge-source-files’ will allow for more column-tracking support, at the expense of compilation time and memory +Compiling tests/test_data.c [build-main-6105c49f/debug/obj/tests/test_data.o] +Compiling tests/unit/btree_stress_test.c [build-main-6105c49f/debug/obj/tests/unit/btree_stress_test.o] +Compiling tests/unit/btree_test.c [build-main-6105c49f/debug/obj/tests/unit/btree_test.o] +Compiling tests/unit/btree_test_common.c [build-main-6105c49f/debug/obj/tests/unit/btree_test_common.o] +Compiling tests/unit/limitations_test.c [build-main-6105c49f/debug/obj/tests/unit/limitations_test.o] +Compiling tests/unit/main.c [build-main-6105c49f/debug/obj/tests/unit/main.o] +Compiling tests/unit/merge_test.c [build-main-6105c49f/debug/obj/tests/unit/merge_test.o] +Compiling tests/unit/misc_test.c [build-main-6105c49f/debug/obj/tests/unit/misc_test.o] +Compiling tests/unit/notification_test.c [build-main-6105c49f/debug/obj/tests/unit/notification_test.o] +Compiling tests/unit/platform_apis_test.c [build-main-6105c49f/debug/obj/tests/unit/platform_apis_test.o] +Compiling tests/unit/splinterdb_heap_id_mgmt_test.c [build-main-6105c49f/debug/obj/tests/unit/splinterdb_heap_id_mgmt_test.o] +Compiling tests/unit/platform_threads_test.c [build-main-6105c49f/debug/obj/tests/unit/platform_threads_test.o] +Compiling tests/unit/splinterdb_optimize_test.c [build-main-6105c49f/debug/obj/tests/unit/splinterdb_optimize_test.o] +Compiling tests/unit/splinterdb_quick_test.c [build-main-6105c49f/debug/obj/tests/unit/splinterdb_quick_test.o] +Compiling tests/unit/splinterdb_stress_test.c [build-main-6105c49f/debug/obj/tests/unit/splinterdb_stress_test.o] +Compiling tests/unit/superblock_test.c [build-main-6105c49f/debug/obj/tests/unit/superblock_test.o] +Compiling tests/unit/task_system_test.c [build-main-6105c49f/debug/obj/tests/unit/task_system_test.o] +Compiling tests/unit/trunk_async_test.c [build-main-6105c49f/debug/obj/tests/unit/trunk_async_test.o] +Compiling tests/unit/trunk_gc_test.c [build-main-6105c49f/debug/obj/tests/unit/trunk_gc_test.o] +Compiling tests/unit/trunk_split_test.c [build-main-6105c49f/debug/obj/tests/unit/trunk_split_test.o] +Compiling tests/unit/unit_tests_common.c [build-main-6105c49f/debug/obj/tests/unit/unit_tests_common.o] +Compiling tests/unit/util_test.c [build-main-6105c49f/debug/obj/tests/unit/util_test.o] +Compiling tests/unit/vector_test.c [build-main-6105c49f/debug/obj/tests/unit/vector_test.o] +Compiling tests/unit/writable_buffer_test.c [build-main-6105c49f/debug/obj/tests/unit/writable_buffer_test.o] +Compiling tests/unit/writeback_set_test.c [build-main-6105c49f/debug/obj/tests/unit/writeback_set_test.o] +Linking build-main-6105c49f/debug/bin/unit/btree_stress_test +Linking build-main-6105c49f/debug/bin/unit/btree_test +Compiling tests/unit/config_parse_test.c [build-main-6105c49f/debug/obj/tests/unit/config_parse_test.o] +Compiling tests/unit/large_inserts_stress_test.c [build-main-6105c49f/debug/obj/tests/unit/large_inserts_stress_test.o] +Linking build-main-6105c49f/debug/bin/unit/misc_test +Linking build-main-6105c49f/debug/bin/unit/platform_apis_test +Linking build-main-6105c49f/debug/bin/unit/platform_threads_test +Compiling tests/unit/splinter_test.c [build-main-6105c49f/debug/obj/tests/unit/splinter_test.o] +Compiling tests/unit/splinterdb_forked_child_test.c [build-main-6105c49f/debug/obj/tests/unit/splinterdb_forked_child_test.o] +Linking build-main-6105c49f/debug/bin/unit/util_test +Linking build-main-6105c49f/debug/bin/unit/vector_test +Linking build-main-6105c49f/debug/bin/unit/writeback_set_test +Compiling examples/splinterdb_custom_ipv4_addr_sortcmp_example.c [build-main-6105c49f/debug/obj/examples/splinterdb_custom_ipv4_addr_sortcmp_example.o] +Compiling examples/splinterdb_intro_example.c [build-main-6105c49f/debug/obj/examples/splinterdb_intro_example.o] +Compiling examples/splinterdb_iterators_example.c [build-main-6105c49f/debug/obj/examples/splinterdb_iterators_example.o] +Compiling examples/splinterdb_optimize_example.c [build-main-6105c49f/debug/obj/examples/splinterdb_optimize_example.o] +Compiling examples/splinterdb_wide_values_example.c [build-main-6105c49f/debug/obj/examples/splinterdb_wide_values_example.o] +Building archive build-main-6105c49f/debug/lib/libsplinterdb.a +Linking build-main-6105c49f/debug/lib/libsplinterdb.so +Linking build-main-6105c49f/debug/bin/splinter_inspect +Linking build-main-6105c49f/debug/bin/driver_test +Linking build-main-6105c49f/debug/bin/unit_test +Linking build-main-6105c49f/debug/bin/unit/config_parse_test +Linking build-main-6105c49f/debug/bin/unit/large_inserts_stress_test +Linking build-main-6105c49f/debug/bin/unit/limitations_test +Linking build-main-6105c49f/debug/bin/unit/merge_test +Linking build-main-6105c49f/debug/bin/unit/notification_test +Linking build-main-6105c49f/debug/bin/unit/splinterdb_forked_child_test +Linking build-main-6105c49f/debug/bin/unit/splinterdb_heap_id_mgmt_test +Linking build-main-6105c49f/debug/bin/unit/splinterdb_optimize_test +Linking build-main-6105c49f/debug/bin/unit/splinterdb_quick_test +Linking build-main-6105c49f/debug/bin/unit/splinterdb_stress_test +Linking build-main-6105c49f/debug/bin/unit/superblock_test +Linking build-main-6105c49f/debug/bin/unit/task_system_test +Linking build-main-6105c49f/debug/bin/unit/trunk_async_test +Linking build-main-6105c49f/debug/bin/unit/trunk_gc_test +Linking build-main-6105c49f/debug/bin/unit/trunk_split_test +Linking build-main-6105c49f/debug/bin/unit/writable_buffer_test +Linking build-main-6105c49f/debug/bin/examples/splinterdb_custom_ipv4_addr_sortcmp_example +Linking build-main-6105c49f/debug/bin/examples/splinterdb_intro_example +Linking build-main-6105c49f/debug/bin/examples/splinterdb_iterators_example +Linking build-main-6105c49f/debug/bin/examples/splinterdb_optimize_example +Linking build-main-6105c49f/debug/bin/examples/splinterdb_wide_values_example +Linking build-main-6105c49f/debug/bin/unit/splinter_test diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-functional-log.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-functional-log.log new file mode 100644 index 000000000..ff9b156f2 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-functional-log.log @@ -0,0 +1,11 @@ +/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/driver_test: splinterdb_build_version 97e5c0e3-dirty +Dispatch test log_test + +Started log_test!! +Malformed log page sequence at page 9052160: group=3 page=0 follows group=1 page=0 (terminated). +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +shard_log_iterator_init: record validation failed in group 1 at log page 146800640: Invalid argument; discarding this group and the rest +Malformed log page sequence at page 147587072: group=1 page=0 follows group=1 page=0. +shard_log_iterator_init: record validation failed in group 2 at log page 148377600: Input/output error; discarding this group and the rest +log returned 500000 of 500000 entries diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-merge.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-merge.log new file mode 100644 index 000000000..c2c001f9c --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-merge.log @@ -0,0 +1,18 @@ +Running 1 CTests, suite name 'merge', test case 'all'. +TEST 1/10 merge:direction_change_propagates_child_errors [OK] +TEST 2/10 merge:direction_change_succeeds [OK] +TEST 3/10 merge:failed_direction_change_preserves_iterator_ownership setup_ordered_iterators: exception: Cannot allocate memory +setup_ordered_iterators: exception: Cannot allocate memory +[OK] +TEST 4/10 merge:failed_creation_cleans_up setup_ordered_iterators: exception: Cannot allocate memory +[OK] +TEST 5/10 merge:maximum_arity_is_accepted merge_iterator_create: bad parameter merge_itor 0x7ffd3240b168 num_trees 1025 itor_arr 0x7ffd3240b170 cfg 0x7ffd3240d1b0 +[OK] +TEST 6/10 merge:direction_change_clears_stale_equal_key_flag [OK] +TEST 7/10 merge:direction_change_at_duplicate_key_moves_to_adjacent_key [OK] +TEST 8/10 merge:random_direction_changes_match_merged_sequence [OK] +TEST 9/10 merge:filtering_does_not_eagerly_drain_nonmatching_sources [OK] +TEST 10/10 merge:filtering_propagates_errors_while_skipping_rejected_keys setup_ordered_iterators: exception: Input/output error +setup_ordered_iterators: exception: Input/output error +[OK] +RESULTS: 10 tests (10 ok, 0 failed, 0 skipped) ran in 1 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-results.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-results.json new file mode 100644 index 000000000..609fc3d84 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-results.json @@ -0,0 +1,156 @@ +[ + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/unit/btree_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-debug-d9ao8tfw/btree", + "started": 1792007050.2731333, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007050.2888684, + "log_sha256": "8d6f3caf1bd818039731202863e513bfa32dffa0b668513bf8fc5b17721b9a9b", + "log": "debug-btree.log", + "seconds": 0.015735149383544922, + "name": "btree", + "binary_sha256": "ba072fdd14e78f0380656584a82ed3c2175a08ba73a6873f68524846260dab49", + "summaries": [ + "RESULTS: 12 tests (12 ok, 0 failed, 0 skipped) ran in 12 ms" + ], + "library_sha256": "ea4f3738e0f55b1f4799195e5ebab6478d5be74b22c384550bb59a66430f4e2a" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/unit/superblock_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-debug-d9ao8tfw/superblock", + "started": 1792007050.2913764, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007050.3555405, + "log_sha256": "e2c7a8d4c83a3efbcdba82d51287d69fbb76a04a828b3d2b4d23fb08c2b8f6c7", + "log": "debug-superblock.log", + "seconds": 0.0641641616821289, + "name": "superblock", + "binary_sha256": "82ea68f6be0882de693de207ad870b0e198355e48599d8d90d047345fbee84d1", + "summaries": [ + "RESULTS: 17 tests (17 ok, 0 failed, 0 skipped) ran in 37 ms" + ], + "library_sha256": "ea4f3738e0f55b1f4799195e5ebab6478d5be74b22c384550bb59a66430f4e2a" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/unit/merge_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-debug-d9ao8tfw/merge", + "started": 1792007050.35791, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007050.3619225, + "log_sha256": "90bda4d9f7155fdb6f9a2e394aa3acc5746f0d71217805fcf2210fa3d4f27a3b", + "log": "debug-merge.log", + "seconds": 0.004012584686279297, + "name": "merge", + "binary_sha256": "d3a5968c15ecaf68bbc936d9a9333534f6f0a6eab5498161f25e5792146ff380", + "summaries": [ + "RESULTS: 10 tests (10 ok, 0 failed, 0 skipped) ran in 1 ms" + ], + "library_sha256": "ea4f3738e0f55b1f4799195e5ebab6478d5be74b22c384550bb59a66430f4e2a" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/unit/splinterdb_quick_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-debug-d9ao8tfw/splinterdb_quick", + "started": 1792007050.3634038, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007062.9243162, + "log_sha256": "f0f92daa0cb7550e9767a81139bd5abfc4428225588502b5245fae1af36de79b", + "log": "debug-splinterdb_quick.log", + "seconds": 12.560912370681763, + "name": "splinterdb_quick", + "binary_sha256": "6d0c03c6dec785b01bced9e71e1ce2f92777e5b8b954529781b01045400d9450", + "summaries": [ + "RESULTS: 57 tests (57 ok, 0 failed, 0 skipped) ran in 12535 ms" + ], + "library_sha256": "ea4f3738e0f55b1f4799195e5ebab6478d5be74b22c384550bb59a66430f4e2a" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/unit/splinter_test", + "--db-location", + "core.db", + "--cache-capacity-mib", + "128", + "--db-capacity-gib", + "64" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-debug-d9ao8tfw/splinter", + "started": 1792007062.9262893, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007145.0106342, + "log_sha256": "4fb0254a17a2aa94f48c0a0a74fff31af30102d1db784cf5fc968d274bcd1731", + "log": "debug-splinter.log", + "seconds": 82.0843448638916, + "name": "splinter", + "binary_sha256": "7b7adc92ad3bb3fc2cea2fc3c2dba6a444858ace2cd440f4ebc407a3efc76f5c", + "summaries": [ + "RESULTS: 44 tests (44 ok, 0 failed, 0 skipped) ran in 82052 ms" + ], + "library_sha256": "ea4f3738e0f55b1f4799195e5ebab6478d5be74b22c384550bb59a66430f4e2a", + "blob_cases": [ + "TEST 1/44 splinter:test_blob_checksums [OK]", + "TEST 42/44 splinter:test_blob_descriptor_sizes [OK]", + "TEST 43/44 splinter:test_blob_trees [OK]", + "TEST 44/44 splinter:test_blob_height_three_and_large_stats [OK]" + ] + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/unit/splinterdb_forked_child_test", + "automatic_log_barriers_survive_process_exit" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-debug-d9ao8tfw/automatic-log-recovery", + "started": 1792007145.0127292, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007145.779022, + "log_sha256": "8dc9ad999563816f8e216bc466f0e27af5f128d687db59d144b9ccc6fd3887f1", + "log": "debug-automatic-log-recovery.log", + "seconds": 0.7662928104400635, + "name": "automatic-log-recovery", + "binary_sha256": "32b4522bfcc17783570f036b93ae38e27a8ee30a10c7da8db70f79805ceaa30d", + "summaries": [ + "RESULTS: 1 tests (1 ok, 0 failed, 0 skipped) ran in 750 ms" + ], + "library_sha256": "ea4f3738e0f55b1f4799195e5ebab6478d5be74b22c384550bb59a66430f4e2a" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/debug/bin/driver_test", + "log_test", + "--db-location", + "log.db", + "--cache-capacity-mib", + "64", + "--db-capacity-gib", + "4" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-debug-d9ao8tfw/functional-log", + "started": 1792007145.7811332, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007146.6978927, + "log_sha256": "eedf17c606920f787b8601ebc222198fe2eaa797d80870fd672096fa65c81222", + "log": "debug-functional-log.log", + "seconds": 0.9167594909667969, + "name": "functional-log", + "binary_sha256": "14080d49b4ee400c6766550232a558f17d7e115e880f3973a04ce30c6a73eaf0", + "summaries": [], + "library_sha256": "ea4f3738e0f55b1f4799195e5ebab6478d5be74b22c384550bb59a66430f4e2a", + "replay_summary": [ + "log returned 500000 of 500000 entries" + ] + } +] diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-check.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-check.json new file mode 100644 index 000000000..3629d318a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-check.json @@ -0,0 +1,3 @@ +{ + "unchanged": true +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-manifest.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-manifest.json new file mode 100644 index 000000000..e0e39bcbe --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-source-manifest.json @@ -0,0 +1,180 @@ +{ + "head": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "origin_main": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "source_sha256": { + "Makefile": "64ffc4bcbe25fca2a45da700ead4a6d4add7601c6f406290e2cf5cde52e95296", + "examples/README.md": "e5f70bd344661c7018b43dc9fe02fa9bfa047f277b2de4535f0e035b1ffb2d71", + "examples/splinterdb_custom_ipv4_addr_sortcmp_example.c": "add1a04c25e8bb1ae9d8dfdf1a04c50228b9820c3da01e021f5359be816118bb", + "examples/splinterdb_intro_example.c": "ba0138e7994d16e45c77667c1e5576ca38e727aaa0cab0872ba0e5afb5ea44cc", + "examples/splinterdb_iterators_example.c": "22a9ca47be0433c276e9ad4ce119962edcc2911814e1e62cb22d3c8a8a26beed", + "examples/splinterdb_optimize_example.c": "bbc5a089afc7e62f06d00ffab1fd2b1c1cf1111669a1a7452d587e1f68f62c06", + "examples/splinterdb_wide_values_example.c": "a333d406974f0b3a85ed418d21e2846e3e2e80028d18254469d61f900a95d831", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb", + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "tests/config.c": "2a4487280f7d81a78e4d27e14e62c0c4c62dd1539e94df380fdf097a859556b7", + "tests/config.h": "754d9e0aca8f9d0359b73a5d6e470e80a2ac48ac43eb46d43aa1a5104fd89065", + "tests/functional/README.md": "c95907cfe5f4aaebc303d0d94cdcbd51e78d717ec11e4c5ecea6b8efaf723be0", + "tests/functional/avlTree.c": "5c24865aa50a21c626dacb2bd6172ff182a25e3532f5aee73a25aeb47c6bb043", + "tests/functional/avlTree.h": "39d82dc2b4c99a635c095800efcd060e7c95822a1194de0f03524a970040ac86", + "tests/functional/btree_test.c": "c011e72c204cc7640d1d259c791ba7ead40ef2a2c01fcfff3140d988d6666547", + "tests/functional/cache_test.c": "549f326d035fbb81cf9f272a66948f34f30313495624c6320e4a75b47c042e48", + "tests/functional/driver_test.c": "aef8d611eae488b287a796007c2a4e2a5f2e7f3f3190dce51be0e2be78ecb765", + "tests/functional/filter_test.c": "d58945f7c783584c65963381068c0225ed34dcb8d7dad7b2dfe865692a452853", + "tests/functional/io_apis_test.c": "be9b36b3af71975782f42ecc8087a922dea828d82049844d0833845cc1698ec5", + "tests/functional/log_test.c": "5464ef364dddffcb9aa5d80c1ee47994fb2ef6c451da25ac69b80c330f69d28c", + "tests/functional/random.h": "8b6567f2e066099fc21d9f6548b561169ffadb0da07150be7bf940c86d146082", + "tests/functional/scan_benchmark.c": "cb06609cf0134f1952a8742d19ef850ff4c80d86a6ffca85607998a2c921b17a", + "tests/functional/splinter_test.c": "b6c2e683dd48e23bc5d035e5d00142012f64085a21cff563b44d54fbaf2c7b9c", + "tests/functional/splinter_test.h": "9eb16fb6c779b27df477213c341031421d383c1c72051f2f42abec4c3c5b0f79", + "tests/functional/test.h": "fc47bbf44ca520c6ebcbc8843871e394a2de4521cb3c679c55a01a4b8c278d21", + "tests/functional/test_async.c": "258f7c56c6c500c783e659b69b157d3c9a06812fcbc31a8fb165b6c66f213acd", + "tests/functional/test_async.h": "c3530305b730c3d9a2c3c73ed438ee7ccd6c5c45cd26e0e02e6a821350b1d778", + "tests/functional/test_dispatcher.c": "60eaa54ce5ffd0d50095722ecd488b448e875fa07a44acc4ba560534c16d67b9", + "tests/functional/test_functionality.c": "d7b71e53f78b88257a10d8cc4fddd3daa48d704a89f6b4c5590af507da4637cd", + "tests/functional/test_functionality.h": "d065e9b63d00f37a88ee9cf962a1280040d7ee4684a1141a506e393fa38913b0", + "tests/functional/test_splinter_shadow.c": "4b856d30739b5ae544b65f514a55cc9d91cbc550044c498bedc51e8d5da26bd5", + "tests/functional/test_splinter_shadow.h": "a1b23c891db62785db9c4f80035ea1060de68c79aa0230dd6dbc03a8fe0b118d", + "tests/functional/ycsb_test.c": "5b1be412e93cfe56b8578051583fa231c138e2acee1afe4b3d1dfb925e0ad26f", + "tests/test_common.c": "fd1d18926096852a7dcfb54622d534d76a8ec62437ce72143c261f402587e493", + "tests/test_common.h": "3691f4e6bdaedb246dc9edea3d62a5cc69b456240492ba6cca8a2320c27cd595", + "tests/test_data.c": "48433bcf29a2e5ce1540a7b479bf0ddf85278e3d2a3c5ca6d8e4538cd1f0012f", + "tests/test_data.h": "61af4814f5d37200fa2393fc40abc7aa19acf4af322ca159390da3332af2952a", + "tests/unit/README.md": "9d4dc976f63738ebe5b73d446e2d6de088f29b26e2683f3c3c552c964949de2d", + "tests/unit/btree_stress_test.c": "1aa7a844349a1070f497f8ded0be9a36a5cf492d8731b49d626a771664f3ba79", + "tests/unit/btree_test.c": "cfb4057349c6580acead4950876f9665ac0d0d38ef7d8289bf90db00e88878e3", + "tests/unit/btree_test_common.c": "3fa17ff41ec7afa5e7204aeb68767a7fcb7e1c7cf81695ef9506876a2af324bf", + "tests/unit/btree_test_common.h": "b7b30bdc02449e81d2fe263c0ef74a4a28c728f717d1ea20d16e3f1acb10a6a2", + "tests/unit/config_parse_test.c": "700a56f940237508e1ce647cc011f2f42c503aab262f930fd1baf0f265a9a112", + "tests/unit/ctest.h": "db9f53f9da859ff1d72be00efb993ca551720e0acaf747236e34e031368c7a16", + "tests/unit/large_inserts_stress_test.c": "df90d2de303f72829779f23cad3881cc65465d5d1a22fcdaf10000b23430b7ae", + "tests/unit/limitations_test.c": "e851344911b8c835578ccd9ae777b79369d339a375cca1468a12c70f03a9efe3", + "tests/unit/main.c": "a4a3ca6e237e3f40f07682c6528b1ef6f32105afc6071810e15411ad297b7a38", + "tests/unit/merge_test.c": "8c916b53e14f3a1f03b314f33d6d67975d7c60909a06c5c5b41b62ef02dc94f4", + "tests/unit/misc_test.c": "4ec5cf57c933275ccdf532a529ae79909840f7d41d36b842a4cb9d9a291ea05b", + "tests/unit/notification_test.c": "b9dcf332b319cf1ff0c1f9c3aa7fc32a35c9f19b81f8122d55c6ed7f6e02e84b", + "tests/unit/platform_apis_test.c": "c3623021ae04b4305b0971cfb2760f895c5b6908310a6e4c192f65769262c860", + "tests/unit/platform_threads_test.c": "bd8e8bb58926344add7b38357c15237687165da8995b052f02612967b6bd8af5", + "tests/unit/splinter_test.c": "297752b1102d3d85ef8cd4be54c0fa15d9a6aeb7e03ce092d14a967ccff42244", + "tests/unit/splinterdb_forked_child_test.c": "88fb68b05aef1238ddce814eccd636b1dfffcb3f439d4892f66b82ad686a075d", + "tests/unit/splinterdb_heap_id_mgmt_test.c": "43729def7a6d91cf66f5bc1fe2e6f0a4a45d63ebbb55887ed10a5eafcdc8235e", + "tests/unit/splinterdb_optimize_test.c": "719af1e83c60df31e63dfd782ace852605edbc355dfb487608e9c77a8f33ebae", + "tests/unit/splinterdb_quick_test.c": "9515f6fe840c1012f54701e1e5a75430f764063b6a4f3091f426bd3038bc2eda", + "tests/unit/splinterdb_stress_test.c": "21a7f8725c82e4d8ec780131eff514294304aba322d8a2650ae893efaaf66f3a", + "tests/unit/superblock_test.c": "04864b8fce2142d49abefebd0dd3acca6158ebea495484ef05d670013a6c8977", + "tests/unit/task_system_test.c": "bd8ad9ca2632f17a6353f3c1e4d0849d98604e6b3a30f9c0c0b7ee13904a3024", + "tests/unit/trunk_async_test.c": "00c51d4302a48e09bdfacf217d45fc3c935f59bac130ded3f3164cc64ec5713b", + "tests/unit/trunk_gc_test.c": "00d6134ad82ed061cbc16d4b19fc21f41432c4b7c5a4b7ade80c3bed3b2dfdca", + "tests/unit/trunk_split_test.c": "4237641a463b28b7be333ed5d4f80a4830c3b0ef75335b196da34318a9f58b18", + "tests/unit/unit_test_template_dot_c": "ffb5e31229ca59caaece995122fcefe11f360ae45953caae0b5d4a72b2a6bcf7", + "tests/unit/unit_tests.h": "4e15f58455d8d759e9fad8432a02b1ec70f3a47a3e74eb39ea11b6a2ad44af42", + "tests/unit/unit_tests_common.c": "7a47eb40fadea397842e2f56932083d7e8840f08834788d6774b1f688288e735", + "tests/unit/util_test.c": "e992dff255d18e84673ea3954eb2da314de0815e64d55fd1980018b22444508b", + "tests/unit/vector_test.c": "463c0ae5b0c7525844f198c6859988a1bc33274d26cace87b9229673bc7c5186", + "tests/unit/writable_buffer_test.c": "3418d6ae29c5bc09dda485c1c1fe1768a1a3fc66b9b6bfdd05aa50e52516241e", + "tests/unit/writeback_set_test.c": "7bef6ea2a4a9d13fe0d83549cadd8e9497018068ac397ac8c31edea6909ee398" + }, + "tracked_source_diff": "diff --git a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\nindex 7a251f1c..8855fc0c 100644\n--- a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n+++ b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n@@ -140,6 +140,8 @@ main()\n // up-front. Every insert will invoke this method to insert the new key\n // in custom-sorted order.\n splinter_data_cfg.key_compare = custom_key_compare;\n+ // IP address order differs from bytewise lexical order.\n+ splinter_data_cfg.key_compare_is_lexical = FALSE;\n \n // Basic configuration of a SplinterDB instance\n splinterdb_config splinterdb_cfg;" +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinter.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinter.log new file mode 100644 index 000000000..6b014360d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinter.log @@ -0,0 +1,96 @@ +Running 1 CTests, suite name 'splinter', test case 'all'. +TEST 1/44 splinter:test_blob_checksums [OK] +TEST 2/44 splinter:test_inserts [OK] +TEST 3/44 splinter:test_btree_pack_abort_releases_reserved_extents btree_pack error status: 5 +[OK] +TEST 4/44 splinter:test_btree_pack_rejects_counter_overflow btree_pack: output statistics exceed the on-disk limit +btree_pack error status: 28 +[OK] +TEST 5/44 splinter:test_malformed_trunk_pivot_bundle [OK] +TEST 6/44 splinter:test_invalid_branch_reference_rejected Unsupported branch format version 3 at 8519680; this build requires version 2. +ondisk_bundle_merge_lookup: btree_lookup_and_merge failed: 22 +trunk_merge_lookup: ondisk_bundle_merge_lookup failed: 22 +Unsupported branch format version 3 at 8519680; this build requires version 2. +ondisk_bundle_merge_lookup_async: btree_lookup_and_merge_async failed: 22 +trunk_merge_lookup_async: ondisk_bundle_merge_lookup_async failed: 22 +Unsupported branch format version 3 at 8519680; this build requires version 2. +trunk_collect_branches: trunk_collect_bundle_branches failed: 22 +ondisk_bundle_merge_lookup: btree_lookup_and_merge failed: 22 +trunk_merge_lookup: ondisk_bundle_merge_lookup failed: 22 +ondisk_bundle_merge_lookup_async: btree_lookup_and_merge_async failed: 22 +trunk_merge_lookup_async: ondisk_bundle_merge_lookup_async failed: 22 +trunk_collect_branches: trunk_collect_bundle_branches failed: 22 +[OK] +TEST 7/44 splinter:test_malformed_trunk_pivot_stats trunk_merge_lookup: ondisk_node_find_pivot failed: 22 +trunk_merge_lookup_async: ondisk_node_find_pivot_async failed: 22 +[OK] +TEST 8/44 splinter:test_malformed_trunk_child_height trunk_merge_lookup_async: ondisk_node_handle_init_async failed: 22 +[OK] +TEST 9/44 splinter:test_two_log_checkpoint [OK] +TEST 10/44 splinter:test_reopen_with_changed_filter_config [OK] +TEST 11/44 splinter:test_logged_large_insert_shares_blob_extents [OK] +TEST 12/44 splinter:test_durable_barrier_waits_for_visible_insert_log_write [OK] +TEST 13/44 splinter:test_durable_barrier_packs_concurrent_small_tails [OK] +TEST 14/44 splinter:test_shard_log_first_fit_decreasing_packing [OK] +TEST 15/44 splinter:test_shard_log_page_alloc_failure_retries_open_buffer shard_log_graduate_buffer: out of log space +shard_log_graduate_group: failed to terminate group 1: No space left on device +[OK] +TEST 16/44 splinter:test_async_durable_barrier_reports_device_failure [OK] +TEST 17/44 splinter:test_async_durable_barrier_defers_nested_wait [OK] +TEST 18/44 splinter:test_async_durable_barrier_launches_with_blocked_device [OK] +TEST 19/44 splinter:test_durable_barrier_without_log_publishes_root [OK] +TEST 20/44 splinter:test_checkpoint_reports_terminal_incorporation_failure trunk_node_serialize():2802: cache_alloc() failedserialize_nodes():2986: node_serialize() failedserialize_nodes_and_save_contingent_compactions: serialize_nodes failed: 12 +restore_balance_leaf():6155: serialize_nodes() failed: Cannot allocate memorytrunk_flush_prepare: flush_then_compact failed: 12 +trunk_incorporate_prepare failed: Cannot allocate memory +Memtable incorporation failed: generation=0 state=INCORPORATION_ASSIGNED status=Cannot allocate memory memtable_root=2228224 +memtable flush failed: Cannot allocate memory +Shutdown found memtable from failed incorporation: generation=0 state=INCORPORATION_FAILED status=Cannot allocate memory memtable_root=2228224 compacted_root=0 +[OK] +TEST 21/44 splinter:test_durable_barrier_reopens_writers_before_device_barrier [OK] +TEST 22/44 splinter:test_concurrent_durable_barriers_coalesce [OK] +TEST 23/44 splinter:test_durable_barrier_waits_for_checkpoint_publication [OK] +TEST 24/44 splinter:test_log_prepare_failure_leaves_update_unapplied core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_unmount: failed to publish the unmount root: Input/output error +core_unmount: shutdown retained recovery state; the next mount must recover +[OK] +TEST 25/44 splinter:test_checkpoint_advance_retries_cut_publish_failure core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +[OK] +TEST 26/44 splinter:test_checkpoint_advance_retries_completion_failure core_checkpoint_advance: completion publish failed: Input/output error +core_checkpoint_advance: completion publish failed: Input/output error +[OK] +TEST 27/44 splinter:test_self_managed_checkpoints_reclaim_log_space [OK] +TEST 28/44 splinter:test_auto_checkpoint [OK] +TEST 29/44 splinter:test_auto_checkpoint_grace_allows_natural_rotation [OK] +TEST 30/44 splinter:test_auto_checkpoint_grace_forces_overwrite_rotation [OK] +TEST 31/44 splinter:test_auto_checkpoint_on_overwrites [OK] +TEST 32/44 splinter:test_recover_allocations_reproduces_persisted_map [OK] +TEST 33/44 splinter:test_unmount_skips_allocator_map_that_needs_rebuild core_unmount: allocator reference accounting is incomplete; leaving allocation state invalid for rebuild on the next mount +[OK] +TEST 34/44 splinter:test_late_reclamation_failure_requires_recovery WARNING: abandoned reclamation of mini allocator at 8519680 (type misc): Connection timed out. Remaining space is unavailable until reopen; clean allocation state will not be written. Recovery is required. +WARNING: core_unmount: reclamation failed (Connection timed out); remaining space was retained. Shutdown requires recovery and the next open will rebuild allocation state. +core_unmount: allocator reference accounting is incomplete; leaving allocation state invalid for rebuild on the next mount +[OK] +TEST 35/44 splinter:test_mount_active_checkpoint_stays_mountable [OK] +TEST 36/44 splinter:test_lookups [OK] +TEST 37/44 splinter:test_splinter_print_diags [OK] +TEST 38/44 splinter:test_automatic_log_barrier_reports_failure_and_retries WARNING: fire-and-forget durable barrier failed: Input/output error; recent writes may not be durable. A later barrier can retry. +[OK] +TEST 39/44 splinter:test_automatic_log_barrier_submission_failure_retries WARNING: automatic durable barrier submission failed: Cannot allocate memory; recent writes may not be durable. +[OK] +TEST 40/44 splinter:test_automatic_log_barrier_insert_does_not_wait [OK] +TEST 41/44 splinter:test_cache_read_errors_reach_core_operations ondisk_bundle_merge_lookup: btree_lookup_and_merge failed: 110 +trunk_merge_lookup: ondisk_bundle_merge_lookup failed: 110 +ondisk_bundle_merge_lookup_async: btree_lookup_and_merge_async failed: 110 +trunk_merge_lookup_async: ondisk_bundle_merge_lookup_async failed: 110 +[OK] +TEST 42/44 splinter:test_blob_descriptor_sizes [OK] +TEST 43/44 splinter:test_blob_trees [OK] +TEST 44/44 splinter:test_blob_height_three_and_large_stats [OK] +RESULTS: 44 tests (44 ok, 0 failed, 0 skipped) ran in 82052 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinterdb_quick.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinterdb_quick.log new file mode 100644 index 000000000..bbb0639b0 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-splinterdb_quick.log @@ -0,0 +1,64 @@ +Running 1 CTests, suite name 'splinterdb_quick', test case 'all'. +TEST 1/57 splinterdb_quick:test_get_config_returns_effective_config [OK] +TEST 2/57 splinterdb_quick:test_get_cost_stats [OK] +TEST 3/57 splinterdb_quick:test_checkpoint_log_grace_default [OK] +TEST 4/57 splinterdb_quick:test_durable_barrier [OK] +TEST 5/57 splinterdb_quick:test_async_durable_barrier_notifications [OK] +TEST 6/57 splinterdb_quick:test_logged_large_value_replaces_old_value [OK] +TEST 7/57 splinterdb_quick:test_basic_flow [OK] +TEST 8/57 splinterdb_quick:test_pthread_auto_registration [OK] +TEST 9/57 splinterdb_quick:test_result_auto_registration_with_stats [OK] +TEST 10/57 splinterdb_quick:test_stats_reset_clears_cache_io [OK] +TEST 11/57 splinterdb_quick:test_final_merge_error_propagation [OK] +TEST 12/57 splinterdb_quick:test_fetch_and_update_catches_up_after_rotation [OK] +TEST 13/57 splinterdb_quick:test_fetch_and_update_rejects_incorporated_boundary [OK] +TEST 14/57 splinterdb_quick:test_range_init_error_cleanup_preserves_branches setup_ordered_iterators: exception: Cannot allocate memory +core_apply_to_range: range iterator init failed: Cannot allocate memory +[OK] +TEST 15/57 splinterdb_quick:stats_reset_excludes_active_operations [OK] +TEST 16/57 splinterdb_quick:test_apis_for_large_key [OK] +TEST 17/57 splinterdb_quick:test_key_size_gt_max_inline_key_size [OK] +TEST 18/57 splinterdb_quick:test_value_size_gt_max_value_size [OK] +TEST 19/57 splinterdb_quick:test_large_lookup_survives_memtable_recycle [OK] +TEST 20/57 splinterdb_quick:test_iterator_survives_memtable_recycle [OK] +TEST 21/57 splinterdb_quick:test_variable_length_values [OK] +TEST 22/57 splinterdb_quick:test_branch_prefix_roundtrip [OK] +TEST 23/57 splinterdb_quick:test_basic_iterator [OK] +TEST 24/57 splinterdb_quick:test_iterator_delete_current [OK] +TEST 25/57 splinterdb_quick:test_empty_iterator [OK] +TEST 26/57 splinterdb_quick:test_bounded_iterator [OK] +TEST 27/57 splinterdb_quick:test_bounded_iterator_start_normalization [OK] +TEST 28/57 splinterdb_quick:test_splinterdb_iterator_with_startkey [OK] +TEST 29/57 splinterdb_quick:test_splinterdb_iterator_with_non_existent_startkey [OK] +TEST 30/57 splinterdb_quick:test_splinterdb_iterator_with_missing_startkey_in_sequence [OK] +TEST 31/57 splinterdb_quick:test_iterator_prev_and_next [OK] +TEST 32/57 splinterdb_quick:test_iterator_reversal_on_key_in_two_branches [OK] +TEST 33/57 splinterdb_quick:test_iterator_reversal_with_three_branches [OK] +TEST 34/57 splinterdb_quick:test_rewriting_keys_does_not_grow_trunk [OK] +TEST 35/57 splinterdb_quick:test_close_and_reopen [OK] +TEST 36/57 splinterdb_quick:test_logged_close_and_reopen [OK] +TEST 37/57 splinterdb_quick:test_repeated_insert_close_reopen [OK] +TEST 38/57 splinterdb_quick:test_custom_data_config [OK] +TEST 39/57 splinterdb_quick:test_existence_only_memtable_lookup [OK] +TEST 40/57 splinterdb_quick:test_existence_only_trunk_lookup_skips_branches [OK] +TEST 41/57 splinterdb_quick:test_write_api_returns_old_value [OK] +TEST 42/57 splinterdb_quick:test_write_api_old_result_existence_only [OK] +TEST 43/57 splinterdb_quick:test_write_api_old_result_custom_merge_semantics [OK] +TEST 44/57 splinterdb_quick:test_write_api_old_result_merges_memtable_and_trunk [OK] +TEST 45/57 splinterdb_quick:test_write_api_old_result_respects_trunk_delete_shadow [OK] +TEST 46/57 splinterdb_quick:test_iterator_custom_comparator [OK] +TEST 47/57 splinterdb_quick:test_iterator_init_bug [OK] +TEST 48/57 splinterdb_quick:test_splinterdb_create_w_background_threads [OK] +TEST 49/57 splinterdb_quick:test_splinterdb_create_w_all_background_threads [OK] +TEST 50/57 splinterdb_quick:test_filtered_range_merges_only_matching_keys [OK] +TEST 51/57 splinterdb_quick:test_filtered_range_crosses_empty_trunk_leaves [OK] +TEST 52/57 splinterdb_quick:test_filtered_range_persisted_mixed_seeds [OK] +TEST 53/57 splinterdb_quick:test_filtered_range_predicate_only_and_bounds [OK] +TEST 54/57 splinterdb_quick:test_filtered_range_propagates_matching_merge_errors setup_ordered_iterators: exception: Cannot allocate memory +[OK] +TEST 55/57 splinterdb_quick:test_filtered_range_context_survives_thread_handoff [OK] +TEST 56/57 splinterdb_quick:test_iterator_thread_handoff [OK] +TEST 57/57 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery [OK] +RESULTS: 57 tests (57 ok, 0 failed, 0 skipped) ran in 12535 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-superblock.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-superblock.log new file mode 100644 index 000000000..c6f009cb1 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/debug-superblock.log @@ -0,0 +1,50 @@ +Running 1 CTests, suite name 'superblock', test case 'all'. +TEST 1/17 superblock:test_format_sets_fresh_state [OK] +TEST 2/17 superblock:test_rejects_other_experiment_formats Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 32774; this build requires version 8. +Unsupported superblock format version 32774; this build requires version 8. +Unsupported superblock format version 32775; this build requires version 8. +Unsupported superblock format version 32775; this build requires version 8. +[OK] +TEST 3/17 superblock:test_snapshot_persists_state [OK] +TEST 4/17 superblock:test_two_log_checkpoint_transitions [OK] +TEST 5/17 superblock:test_snapshot_preserves_unincorporated_sealed_log [OK] +TEST 6/17 superblock:test_two_log_checkpoint_torn_begin [OK] +TEST 7/17 superblock:test_torn_write_falls_back_to_older_generation [OK] +TEST 8/17 superblock:test_generation_wrap_selects_newest_slot [OK] +TEST 9/17 superblock:test_both_slots_corrupt_is_not_found superblock_mount: no valid superblock found +[OK] +TEST 10/17 superblock:test_mount_rejects_invalid_metadata superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +[OK] +TEST 11/17 superblock:test_slot_read_error_falls_back_to_peer [OK] +TEST 12/17 superblock:test_both_slot_read_errors_are_reported superblock_mount: no readable valid superblock found: Input/output error +[OK] +TEST 13/17 superblock:test_read_geometry superblock_read_bootstrap: no valid superblock found +[OK] +TEST 14/17 superblock:test_read_bootstrap_allocation_state superblock_read_bootstrap: no valid superblock found +[OK] +TEST 15/17 superblock:test_bootstrap_geometry_metadata_budget Device geometry needs 134217728 bytes of cache lookup metadata, which exceeds the configured cache budget of 67108864 bytes. +Failed to open existing SplinterDB device 'db' with specified configuration: No space left on device +[OK] +TEST 16/17 superblock:test_unknown_structure_version_rejected Unsupported trunk format version 2; this build requires version 1. +Unsupported trunk format version 2; this build requires version 1. +Unsupported allocator format version 2; this build requires version 1. +Unsupported allocator format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +[OK] +TEST 17/17 superblock:test_unsupported_superblock_version_rejected Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 9; this build requires version 8. +Unsupported superblock format version 9; this build requires version 8. +Unsupported superblock format version 9; this build requires version 8. +[OK] +RESULTS: 17 tests (17 ok, 0 failed, 0 skipped) ran in 37 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-automatic-log-recovery.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-automatic-log-recovery.log new file mode 100644 index 000000000..91175dae4 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-automatic-log-recovery.log @@ -0,0 +1,3 @@ +Running 1 CTests, suite name 'splinterdb_forked_child', test case 'automatic_log_barriers_survive_process_exit'. +TEST 1/1 splinterdb_forked_child:automatic_log_barriers_survive_process_exit [OK] +RESULTS: 1 tests (1 ok, 0 failed, 0 skipped) ran in 743 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-btree.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-btree.log new file mode 100644 index 000000000..172fb2026 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-btree.log @@ -0,0 +1,36 @@ +Running 1 CTests, suite name 'btree', test case 'all'. +TEST 1/12 btree:test_leaf_hdr [OK] +TEST 2/12 btree:test_leaf_hdr_search [OK] +TEST 3/12 btree:test_index_hdr [OK] +TEST 4/12 btree:test_index_hdr_search [OK] +TEST 5/12 btree:test_leaf_split [OK] +TEST 6/12 btree:test_defragmented_leaf_bytes [OK] +TEST 7/12 btree:test_defragmented_index_bytes [OK] +TEST 8/12 btree:test_invalid_branch_point_lookup Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +TEST 9/12 btree:test_invalid_branch_async_point_lookup Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +TEST 10/12 btree:test_invalid_branch_iterator Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +TEST 11/12 btree:test_invalid_branch_metadata_queries Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 1 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +Unsupported branch format version 3 at 4096; this build requires version 2. +[OK] +TEST 12/12 btree:test_compressed_suffix_copy [OK] +RESULTS: 12 tests (12 ok, 0 failed, 0 skipped) ran in 2 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.json new file mode 100644 index 000000000..8a3c3c134 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.json @@ -0,0 +1,200 @@ +{ + "command": [ + "make", + "-j6", + "BUILD_ROOT=build-main-6105c49f", + "BUILD_MODE=release", + "all", + "benchmarks" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "started": 1792006709.9028127, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792006726.7072697, + "log_sha256": "5905efb5904de017adee723fba2e69132469012570fe056af37573bc6b935562", + "log": "release-build.log", + "seconds": 16.80445694923401, + "TMPDIR": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-build-xn10vunh", + "source_manifest": { + "head": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "origin_main": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "source_sha256": { + "Makefile": "64ffc4bcbe25fca2a45da700ead4a6d4add7601c6f406290e2cf5cde52e95296", + "examples/README.md": "e5f70bd344661c7018b43dc9fe02fa9bfa047f277b2de4535f0e035b1ffb2d71", + "examples/splinterdb_custom_ipv4_addr_sortcmp_example.c": "add1a04c25e8bb1ae9d8dfdf1a04c50228b9820c3da01e021f5359be816118bb", + "examples/splinterdb_intro_example.c": "ba0138e7994d16e45c77667c1e5576ca38e727aaa0cab0872ba0e5afb5ea44cc", + "examples/splinterdb_iterators_example.c": "22a9ca47be0433c276e9ad4ce119962edcc2911814e1e62cb22d3c8a8a26beed", + "examples/splinterdb_optimize_example.c": "bbc5a089afc7e62f06d00ffab1fd2b1c1cf1111669a1a7452d587e1f68f62c06", + "examples/splinterdb_wide_values_example.c": "a333d406974f0b3a85ed418d21e2846e3e2e80028d18254469d61f900a95d831", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb", + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "tests/config.c": "2a4487280f7d81a78e4d27e14e62c0c4c62dd1539e94df380fdf097a859556b7", + "tests/config.h": "754d9e0aca8f9d0359b73a5d6e470e80a2ac48ac43eb46d43aa1a5104fd89065", + "tests/functional/README.md": "c95907cfe5f4aaebc303d0d94cdcbd51e78d717ec11e4c5ecea6b8efaf723be0", + "tests/functional/avlTree.c": "5c24865aa50a21c626dacb2bd6172ff182a25e3532f5aee73a25aeb47c6bb043", + "tests/functional/avlTree.h": "39d82dc2b4c99a635c095800efcd060e7c95822a1194de0f03524a970040ac86", + "tests/functional/btree_test.c": "c011e72c204cc7640d1d259c791ba7ead40ef2a2c01fcfff3140d988d6666547", + "tests/functional/cache_test.c": "549f326d035fbb81cf9f272a66948f34f30313495624c6320e4a75b47c042e48", + "tests/functional/driver_test.c": "aef8d611eae488b287a796007c2a4e2a5f2e7f3f3190dce51be0e2be78ecb765", + "tests/functional/filter_test.c": "d58945f7c783584c65963381068c0225ed34dcb8d7dad7b2dfe865692a452853", + "tests/functional/io_apis_test.c": "be9b36b3af71975782f42ecc8087a922dea828d82049844d0833845cc1698ec5", + "tests/functional/log_test.c": "5464ef364dddffcb9aa5d80c1ee47994fb2ef6c451da25ac69b80c330f69d28c", + "tests/functional/random.h": "8b6567f2e066099fc21d9f6548b561169ffadb0da07150be7bf940c86d146082", + "tests/functional/scan_benchmark.c": "cb06609cf0134f1952a8742d19ef850ff4c80d86a6ffca85607998a2c921b17a", + "tests/functional/splinter_test.c": "b6c2e683dd48e23bc5d035e5d00142012f64085a21cff563b44d54fbaf2c7b9c", + "tests/functional/splinter_test.h": "9eb16fb6c779b27df477213c341031421d383c1c72051f2f42abec4c3c5b0f79", + "tests/functional/test.h": "fc47bbf44ca520c6ebcbc8843871e394a2de4521cb3c679c55a01a4b8c278d21", + "tests/functional/test_async.c": "258f7c56c6c500c783e659b69b157d3c9a06812fcbc31a8fb165b6c66f213acd", + "tests/functional/test_async.h": "c3530305b730c3d9a2c3c73ed438ee7ccd6c5c45cd26e0e02e6a821350b1d778", + "tests/functional/test_dispatcher.c": "60eaa54ce5ffd0d50095722ecd488b448e875fa07a44acc4ba560534c16d67b9", + "tests/functional/test_functionality.c": "d7b71e53f78b88257a10d8cc4fddd3daa48d704a89f6b4c5590af507da4637cd", + "tests/functional/test_functionality.h": "d065e9b63d00f37a88ee9cf962a1280040d7ee4684a1141a506e393fa38913b0", + "tests/functional/test_splinter_shadow.c": "4b856d30739b5ae544b65f514a55cc9d91cbc550044c498bedc51e8d5da26bd5", + "tests/functional/test_splinter_shadow.h": "a1b23c891db62785db9c4f80035ea1060de68c79aa0230dd6dbc03a8fe0b118d", + "tests/functional/ycsb_test.c": "5b1be412e93cfe56b8578051583fa231c138e2acee1afe4b3d1dfb925e0ad26f", + "tests/test_common.c": "fd1d18926096852a7dcfb54622d534d76a8ec62437ce72143c261f402587e493", + "tests/test_common.h": "3691f4e6bdaedb246dc9edea3d62a5cc69b456240492ba6cca8a2320c27cd595", + "tests/test_data.c": "48433bcf29a2e5ce1540a7b479bf0ddf85278e3d2a3c5ca6d8e4538cd1f0012f", + "tests/test_data.h": "61af4814f5d37200fa2393fc40abc7aa19acf4af322ca159390da3332af2952a", + "tests/unit/README.md": "9d4dc976f63738ebe5b73d446e2d6de088f29b26e2683f3c3c552c964949de2d", + "tests/unit/btree_stress_test.c": "1aa7a844349a1070f497f8ded0be9a36a5cf492d8731b49d626a771664f3ba79", + "tests/unit/btree_test.c": "cfb4057349c6580acead4950876f9665ac0d0d38ef7d8289bf90db00e88878e3", + "tests/unit/btree_test_common.c": "3fa17ff41ec7afa5e7204aeb68767a7fcb7e1c7cf81695ef9506876a2af324bf", + "tests/unit/btree_test_common.h": "b7b30bdc02449e81d2fe263c0ef74a4a28c728f717d1ea20d16e3f1acb10a6a2", + "tests/unit/config_parse_test.c": "700a56f940237508e1ce647cc011f2f42c503aab262f930fd1baf0f265a9a112", + "tests/unit/ctest.h": "db9f53f9da859ff1d72be00efb993ca551720e0acaf747236e34e031368c7a16", + "tests/unit/large_inserts_stress_test.c": "df90d2de303f72829779f23cad3881cc65465d5d1a22fcdaf10000b23430b7ae", + "tests/unit/limitations_test.c": "e851344911b8c835578ccd9ae777b79369d339a375cca1468a12c70f03a9efe3", + "tests/unit/main.c": "a4a3ca6e237e3f40f07682c6528b1ef6f32105afc6071810e15411ad297b7a38", + "tests/unit/merge_test.c": "8c916b53e14f3a1f03b314f33d6d67975d7c60909a06c5c5b41b62ef02dc94f4", + "tests/unit/misc_test.c": "4ec5cf57c933275ccdf532a529ae79909840f7d41d36b842a4cb9d9a291ea05b", + "tests/unit/notification_test.c": "b9dcf332b319cf1ff0c1f9c3aa7fc32a35c9f19b81f8122d55c6ed7f6e02e84b", + "tests/unit/platform_apis_test.c": "c3623021ae04b4305b0971cfb2760f895c5b6908310a6e4c192f65769262c860", + "tests/unit/platform_threads_test.c": "bd8e8bb58926344add7b38357c15237687165da8995b052f02612967b6bd8af5", + "tests/unit/splinter_test.c": "297752b1102d3d85ef8cd4be54c0fa15d9a6aeb7e03ce092d14a967ccff42244", + "tests/unit/splinterdb_forked_child_test.c": "88fb68b05aef1238ddce814eccd636b1dfffcb3f439d4892f66b82ad686a075d", + "tests/unit/splinterdb_heap_id_mgmt_test.c": "43729def7a6d91cf66f5bc1fe2e6f0a4a45d63ebbb55887ed10a5eafcdc8235e", + "tests/unit/splinterdb_optimize_test.c": "719af1e83c60df31e63dfd782ace852605edbc355dfb487608e9c77a8f33ebae", + "tests/unit/splinterdb_quick_test.c": "9515f6fe840c1012f54701e1e5a75430f764063b6a4f3091f426bd3038bc2eda", + "tests/unit/splinterdb_stress_test.c": "21a7f8725c82e4d8ec780131eff514294304aba322d8a2650ae893efaaf66f3a", + "tests/unit/superblock_test.c": "04864b8fce2142d49abefebd0dd3acca6158ebea495484ef05d670013a6c8977", + "tests/unit/task_system_test.c": "bd8ad9ca2632f17a6353f3c1e4d0849d98604e6b3a30f9c0c0b7ee13904a3024", + "tests/unit/trunk_async_test.c": "00c51d4302a48e09bdfacf217d45fc3c935f59bac130ded3f3164cc64ec5713b", + "tests/unit/trunk_gc_test.c": "00d6134ad82ed061cbc16d4b19fc21f41432c4b7c5a4b7ade80c3bed3b2dfdca", + "tests/unit/trunk_split_test.c": "4237641a463b28b7be333ed5d4f80a4830c3b0ef75335b196da34318a9f58b18", + "tests/unit/unit_test_template_dot_c": "ffb5e31229ca59caaece995122fcefe11f360ae45953caae0b5d4a72b2a6bcf7", + "tests/unit/unit_tests.h": "4e15f58455d8d759e9fad8432a02b1ec70f3a47a3e74eb39ea11b6a2ad44af42", + "tests/unit/unit_tests_common.c": "7a47eb40fadea397842e2f56932083d7e8840f08834788d6774b1f688288e735", + "tests/unit/util_test.c": "e992dff255d18e84673ea3954eb2da314de0815e64d55fd1980018b22444508b", + "tests/unit/vector_test.c": "463c0ae5b0c7525844f198c6859988a1bc33274d26cace87b9229673bc7c5186", + "tests/unit/writable_buffer_test.c": "3418d6ae29c5bc09dda485c1c1fe1768a1a3fc66b9b6bfdd05aa50e52516241e", + "tests/unit/writeback_set_test.c": "7bef6ea2a4a9d13fe0d83549cadd8e9497018068ac397ac8c31edea6909ee398" + }, + "tracked_source_diff": "diff --git a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\nindex 7a251f1c..8855fc0c 100644\n--- a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n+++ b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n@@ -140,6 +140,8 @@ main()\n // up-front. Every insert will invoke this method to insert the new key\n // in custom-sorted order.\n splinter_data_cfg.key_compare = custom_key_compare;\n+ // IP address order differs from bytewise lexical order.\n+ splinter_data_cfg.key_compare_is_lexical = FALSE;\n \n // Basic configuration of a SplinterDB instance\n splinterdb_config splinterdb_cfg;" + }, + "build_config": null +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.log new file mode 100644 index 000000000..d086d6612 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-build.log @@ -0,0 +1,133 @@ +Checking for mismatched config...No mismatched config found +Saving config to build-main-6105c49f/release/build-config.fb6bc8eeb8390429253883c09491f5bd +Compiling src/PackedArray.c [build-main-6105c49f/release/obj/src/PackedArray.o] +Compiling src/batch_rwlock.c [build-main-6105c49f/release/obj/src/batch_rwlock.o] +Compiling src/core.c [build-main-6105c49f/release/obj/src/core.o] +Compiling src/default_data_config.c [build-main-6105c49f/release/obj/src/default_data_config.o] +Compiling src/memtable.c [build-main-6105c49f/release/obj/src/memtable.o] +Compiling src/merge.c [build-main-6105c49f/release/obj/src/merge.o] +Compiling src/notification.c [build-main-6105c49f/release/obj/src/notification.o] +Compiling src/routing_filter.c [build-main-6105c49f/release/obj/src/routing_filter.o] +Compiling src/shard_log.c [build-main-6105c49f/release/obj/src/shard_log.o] +Compiling src/splinterdb.c [build-main-6105c49f/release/obj/src/splinterdb.o] +Compiling src/superblock.c [build-main-6105c49f/release/obj/src/superblock.o] +Compiling src/trunk.c [build-main-6105c49f/release/obj/src/trunk.o] +Compiling tools/splinter_inspect.c [build-main-6105c49f/release/obj/tools/splinter_inspect.o] +Compiling src/allocator.c [build-main-6105c49f/release/obj/src/allocator.o] +Compiling src/blob.c [build-main-6105c49f/release/obj/src/blob.o] +Compiling src/blob_build.c [build-main-6105c49f/release/obj/src/blob_build.o] +Compiling src/btree.c [build-main-6105c49f/release/obj/src/btree.o] +Compiling src/clockcache.c [build-main-6105c49f/release/obj/src/clockcache.o] +Compiling src/data_blob_build.c [build-main-6105c49f/release/obj/src/data_blob_build.o] +Compiling src/data_internal.c [build-main-6105c49f/release/obj/src/data_internal.o] +Compiling src/histogram.c [build-main-6105c49f/release/obj/src/histogram.o] +Compiling src/mini_allocator.c [build-main-6105c49f/release/obj/src/mini_allocator.o] +Compiling src/ondisk_ref.c [build-main-6105c49f/release/obj/src/ondisk_ref.o] +Compiling src/platform_linux/laio.c [build-main-6105c49f/release/obj/src/platform_linux/laio.o] +Compiling src/platform_linux/platform_assert.c [build-main-6105c49f/release/obj/src/platform_linux/platform_assert.o] +Compiling src/platform_linux/platform_buffer.c [build-main-6105c49f/release/obj/src/platform_linux/platform_buffer.o] +Compiling src/platform_linux/platform_condvar.c [build-main-6105c49f/release/obj/src/platform_linux/platform_condvar.o] +Compiling src/platform_linux/platform_heap.c [build-main-6105c49f/release/obj/src/platform_linux/platform_heap.o] +Compiling src/platform_linux/platform_io.c [build-main-6105c49f/release/obj/src/platform_linux/platform_io.o] +Compiling src/platform_linux/platform_log.c [build-main-6105c49f/release/obj/src/platform_linux/platform_log.o] +Compiling src/platform_linux/platform_mutex.c [build-main-6105c49f/release/obj/src/platform_linux/platform_mutex.o] +Compiling src/platform_linux/platform_threads.c [build-main-6105c49f/release/obj/src/platform_linux/platform_threads.o] +Compiling src/platform_linux/platform_trace.c [build-main-6105c49f/release/obj/src/platform_linux/platform_trace.o] +Compiling src/platform_linux/shmalloc.c [build-main-6105c49f/release/obj/src/platform_linux/shmalloc.o] +Compiling src/rc_allocator.c [build-main-6105c49f/release/obj/src/rc_allocator.o] +Compiling src/task.c [build-main-6105c49f/release/obj/src/task.o] +Compiling src/util.c [build-main-6105c49f/release/obj/src/util.o] +Compiling src/writeback_set.c [build-main-6105c49f/release/obj/src/writeback_set.o] +Compiling tests/functional/avlTree.c [build-main-6105c49f/release/obj/tests/functional/avlTree.o] +Compiling tests/functional/btree_test.c [build-main-6105c49f/release/obj/tests/functional/btree_test.o] +Compiling tests/functional/cache_test.c [build-main-6105c49f/release/obj/tests/functional/cache_test.o] +Compiling tests/functional/driver_test.c [build-main-6105c49f/release/obj/tests/functional/driver_test.o] +Compiling tests/functional/filter_test.c [build-main-6105c49f/release/obj/tests/functional/filter_test.o] +Compiling tests/functional/io_apis_test.c [build-main-6105c49f/release/obj/tests/functional/io_apis_test.o] +Compiling tests/functional/log_test.c [build-main-6105c49f/release/obj/tests/functional/log_test.o] +Compiling tests/functional/scan_benchmark.c [build-main-6105c49f/release/obj/tests/functional/scan_benchmark.o] +Compiling tests/functional/splinter_test.c [build-main-6105c49f/release/obj/tests/functional/splinter_test.o] +Compiling tests/functional/test_async.c [build-main-6105c49f/release/obj/tests/functional/test_async.o] +Compiling tests/functional/test_dispatcher.c [build-main-6105c49f/release/obj/tests/functional/test_dispatcher.o] +Compiling tests/functional/test_functionality.c [build-main-6105c49f/release/obj/tests/functional/test_functionality.o] +Compiling tests/functional/test_splinter_shadow.c [build-main-6105c49f/release/obj/tests/functional/test_splinter_shadow.o] +Compiling tests/functional/ycsb_test.c [build-main-6105c49f/release/obj/tests/functional/ycsb_test.o] +Compiling tests/config.c [build-main-6105c49f/release/obj/tests/config.o] +Compiling tests/test_common.c [build-main-6105c49f/release/obj/tests/test_common.o] +Compiling tests/test_data.c [build-main-6105c49f/release/obj/tests/test_data.o] +Compiling tests/unit/btree_stress_test.c [build-main-6105c49f/release/obj/tests/unit/btree_stress_test.o] +Compiling tests/unit/btree_test.c [build-main-6105c49f/release/obj/tests/unit/btree_test.o] +Compiling tests/unit/btree_test_common.c [build-main-6105c49f/release/obj/tests/unit/btree_test_common.o] +Compiling tests/unit/limitations_test.c [build-main-6105c49f/release/obj/tests/unit/limitations_test.o] +Compiling tests/unit/main.c [build-main-6105c49f/release/obj/tests/unit/main.o] +Compiling tests/unit/merge_test.c [build-main-6105c49f/release/obj/tests/unit/merge_test.o] +Compiling tests/unit/misc_test.c [build-main-6105c49f/release/obj/tests/unit/misc_test.o] +Compiling tests/unit/notification_test.c [build-main-6105c49f/release/obj/tests/unit/notification_test.o] +In file included from src/PackedArray.c:296, + from src/PackedArray.c:356: +src/PackedArray.c: In function ‘__PackedArray_unpack_21’: +src/PackedArray.c:177: note: ‘-Wmisleading-indentation’ is disabled from this point onwards, since column-tracking was disabled due to the size of the code/headers + 177 | PACKEDARRAY_IMPL_UNPACK_CASE_BREAK +src/PackedArray.c:177: note: adding ‘-flarge-source-files’ will allow for more column-tracking support, at the expense of compilation time and memory +Compiling tests/unit/platform_apis_test.c [build-main-6105c49f/release/obj/tests/unit/platform_apis_test.o] +Compiling tests/unit/platform_threads_test.c [build-main-6105c49f/release/obj/tests/unit/platform_threads_test.o] +Compiling tests/unit/splinterdb_heap_id_mgmt_test.c [build-main-6105c49f/release/obj/tests/unit/splinterdb_heap_id_mgmt_test.o] +Compiling tests/unit/splinterdb_optimize_test.c [build-main-6105c49f/release/obj/tests/unit/splinterdb_optimize_test.o] +Compiling tests/unit/splinterdb_quick_test.c [build-main-6105c49f/release/obj/tests/unit/splinterdb_quick_test.o] +Compiling tests/unit/splinterdb_stress_test.c [build-main-6105c49f/release/obj/tests/unit/splinterdb_stress_test.o] +Compiling tests/unit/superblock_test.c [build-main-6105c49f/release/obj/tests/unit/superblock_test.o] +Compiling tests/unit/task_system_test.c [build-main-6105c49f/release/obj/tests/unit/task_system_test.o] +Compiling tests/unit/trunk_async_test.c [build-main-6105c49f/release/obj/tests/unit/trunk_async_test.o] +Compiling tests/unit/trunk_gc_test.c [build-main-6105c49f/release/obj/tests/unit/trunk_gc_test.o] +Compiling tests/unit/trunk_split_test.c [build-main-6105c49f/release/obj/tests/unit/trunk_split_test.o] +Compiling tests/unit/unit_tests_common.c [build-main-6105c49f/release/obj/tests/unit/unit_tests_common.o] +Compiling tests/unit/util_test.c [build-main-6105c49f/release/obj/tests/unit/util_test.o] +Compiling tests/unit/vector_test.c [build-main-6105c49f/release/obj/tests/unit/vector_test.o] +Compiling tests/unit/writable_buffer_test.c [build-main-6105c49f/release/obj/tests/unit/writable_buffer_test.o] +Compiling tests/unit/writeback_set_test.c [build-main-6105c49f/release/obj/tests/unit/writeback_set_test.o] +Linking build-main-6105c49f/release/bin/unit/btree_stress_test +Linking build-main-6105c49f/release/bin/unit/btree_test +Compiling tests/unit/config_parse_test.c [build-main-6105c49f/release/obj/tests/unit/config_parse_test.o] +Compiling tests/unit/large_inserts_stress_test.c [build-main-6105c49f/release/obj/tests/unit/large_inserts_stress_test.o] +Linking build-main-6105c49f/release/bin/unit/misc_test +Linking build-main-6105c49f/release/bin/unit/platform_apis_test +Linking build-main-6105c49f/release/bin/unit/platform_threads_test +Compiling tests/unit/splinter_test.c [build-main-6105c49f/release/obj/tests/unit/splinter_test.o] +Linking build-main-6105c49f/release/lib/libsplinterdb.so +Compiling tests/unit/splinterdb_forked_child_test.c [build-main-6105c49f/release/obj/tests/unit/splinterdb_forked_child_test.o] +Linking build-main-6105c49f/release/bin/unit/util_test +Linking build-main-6105c49f/release/bin/unit/vector_test +Linking build-main-6105c49f/release/bin/unit/writeback_set_test +Compiling examples/splinterdb_custom_ipv4_addr_sortcmp_example.c [build-main-6105c49f/release/obj/examples/splinterdb_custom_ipv4_addr_sortcmp_example.o] +Compiling examples/splinterdb_intro_example.c [build-main-6105c49f/release/obj/examples/splinterdb_intro_example.o] +Compiling examples/splinterdb_iterators_example.c [build-main-6105c49f/release/obj/examples/splinterdb_iterators_example.o] +Compiling examples/splinterdb_optimize_example.c [build-main-6105c49f/release/obj/examples/splinterdb_optimize_example.o] +Compiling examples/splinterdb_wide_values_example.c [build-main-6105c49f/release/obj/examples/splinterdb_wide_values_example.o] +Compiling benchmarks/insert_benchmark.c [build-main-6105c49f/release/obj/benchmarks/insert_benchmark.o] +Building archive build-main-6105c49f/release/lib/libsplinterdb.a +Linking build-main-6105c49f/release/bin/splinter_inspect +Linking build-main-6105c49f/release/bin/insert_benchmark +Linking build-main-6105c49f/release/bin/driver_test +Linking build-main-6105c49f/release/bin/unit_test +Linking build-main-6105c49f/release/bin/unit/config_parse_test +Linking build-main-6105c49f/release/bin/unit/large_inserts_stress_test +Linking build-main-6105c49f/release/bin/unit/limitations_test +Linking build-main-6105c49f/release/bin/unit/merge_test +Linking build-main-6105c49f/release/bin/unit/notification_test +Linking build-main-6105c49f/release/bin/unit/splinter_test +Linking build-main-6105c49f/release/bin/unit/splinterdb_forked_child_test +Linking build-main-6105c49f/release/bin/unit/splinterdb_heap_id_mgmt_test +Linking build-main-6105c49f/release/bin/unit/splinterdb_optimize_test +Linking build-main-6105c49f/release/bin/unit/splinterdb_quick_test +Linking build-main-6105c49f/release/bin/unit/splinterdb_stress_test +Linking build-main-6105c49f/release/bin/unit/superblock_test +Linking build-main-6105c49f/release/bin/unit/task_system_test +Linking build-main-6105c49f/release/bin/unit/trunk_async_test +Linking build-main-6105c49f/release/bin/unit/trunk_gc_test +Linking build-main-6105c49f/release/bin/unit/trunk_split_test +Linking build-main-6105c49f/release/bin/unit/writable_buffer_test +Linking build-main-6105c49f/release/bin/examples/splinterdb_custom_ipv4_addr_sortcmp_example +Linking build-main-6105c49f/release/bin/examples/splinterdb_intro_example +Linking build-main-6105c49f/release/bin/examples/splinterdb_iterators_example +Linking build-main-6105c49f/release/bin/examples/splinterdb_optimize_example +Linking build-main-6105c49f/release/bin/examples/splinterdb_wide_values_example diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-functional-log.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-functional-log.log new file mode 100644 index 000000000..1516d2e16 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-functional-log.log @@ -0,0 +1,11 @@ +/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/driver_test: splinterdb_build_version 97e5c0e3-dirty +Dispatch test log_test + +Started log_test!! +Malformed log page sequence at page 9052160: group=3 page=0 follows group=1 page=0 (terminated). +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +shard_log_iterator_init: record validation failed in group 1 at log page 146800640: Invalid argument; discarding this group and the rest +Malformed log page sequence at page 147587072: group=1 page=0 follows group=1 page=0. +shard_log_iterator_init: record validation failed in group 2 at log page 148377600: Input/output error; discarding this group and the rest +log returned 500000 of 500000 entries diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-merge.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-merge.log new file mode 100644 index 000000000..8fe45babc --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-merge.log @@ -0,0 +1,18 @@ +Running 1 CTests, suite name 'merge', test case 'all'. +TEST 1/10 merge:filtering_propagates_errors_while_skipping_rejected_keys setup_ordered_iterators: exception: Input/output error +setup_ordered_iterators: exception: Input/output error +[OK] +TEST 2/10 merge:filtering_does_not_eagerly_drain_nonmatching_sources [OK] +TEST 3/10 merge:random_direction_changes_match_merged_sequence [OK] +TEST 4/10 merge:direction_change_at_duplicate_key_moves_to_adjacent_key [OK] +TEST 5/10 merge:direction_change_clears_stale_equal_key_flag [OK] +TEST 6/10 merge:maximum_arity_is_accepted merge_iterator_create: bad parameter merge_itor 0x7ffd5318ad78 num_trees 1025 itor_arr 0x7ffd5318ae00 cfg 0x7ffd5318ad80 +[OK] +TEST 7/10 merge:failed_creation_cleans_up setup_ordered_iterators: exception: Cannot allocate memory +[OK] +TEST 8/10 merge:failed_direction_change_preserves_iterator_ownership setup_ordered_iterators: exception: Cannot allocate memory +setup_ordered_iterators: exception: Cannot allocate memory +[OK] +TEST 9/10 merge:direction_change_succeeds [OK] +TEST 10/10 merge:direction_change_propagates_child_errors [OK] +RESULTS: 10 tests (10 ok, 0 failed, 0 skipped) ran in 0 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-results.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-results.json new file mode 100644 index 000000000..18e451773 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-results.json @@ -0,0 +1,156 @@ +[ + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/unit/btree_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-release-faya0ddo/btree", + "started": 1792007146.7631073, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007146.7668188, + "log_sha256": "1159d05f22b0856c2e5eb66afcb51bf70db527e8597e2f4aef0d4dce5894cead", + "log": "release-btree.log", + "seconds": 0.0037114620208740234, + "name": "btree", + "binary_sha256": "9e13dfc7722c83b7e9c81ce1201fca63d99b5cd2691b3680cf403b29d74cb598", + "summaries": [ + "RESULTS: 12 tests (12 ok, 0 failed, 0 skipped) ran in 2 ms" + ], + "library_sha256": "5a0426fed5a0606c55dc38c7bbddfb8c5c65580fb79fc9d09b17f7890fcff32f" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/unit/superblock_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-release-faya0ddo/superblock", + "started": 1792007146.7718694, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007146.8359447, + "log_sha256": "335762194e6cc9560c21f1feb24f5694bcc88031bcc1c072dca9413d08b68753", + "log": "release-superblock.log", + "seconds": 0.06407523155212402, + "name": "superblock", + "binary_sha256": "1e4ae4214e791a5b53bdc620646b2b2cfa44e53769d211510a02235963f568f2", + "summaries": [ + "RESULTS: 17 tests (17 ok, 0 failed, 0 skipped) ran in 53 ms" + ], + "library_sha256": "5a0426fed5a0606c55dc38c7bbddfb8c5c65580fb79fc9d09b17f7890fcff32f" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/unit/merge_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-release-faya0ddo/merge", + "started": 1792007146.8399613, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007146.8435314, + "log_sha256": "8321f9bc1d800a010cbe8c77234da380a5a6f3cfa6a499dfc557b29632a3cbe2", + "log": "release-merge.log", + "seconds": 0.003570079803466797, + "name": "merge", + "binary_sha256": "09b450c5b37b640812cfc611107392b9e11938e75faa5e1778584a5f84c1b9f6", + "summaries": [ + "RESULTS: 10 tests (10 ok, 0 failed, 0 skipped) ran in 0 ms" + ], + "library_sha256": "5a0426fed5a0606c55dc38c7bbddfb8c5c65580fb79fc9d09b17f7890fcff32f" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/unit/splinterdb_quick_test" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-release-faya0ddo/splinterdb_quick", + "started": 1792007146.8465574, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007158.1051238, + "log_sha256": "a334eaa7cf546f086b7796751627d2381d14a3824bf69ac5f903d5b7813a5b20", + "log": "release-splinterdb_quick.log", + "seconds": 11.25856637954712, + "name": "splinterdb_quick", + "binary_sha256": "fea895f31fa091285f586b15903a52278fd5355b8649b1324810f9fc7b6df619", + "summaries": [ + "RESULTS: 57 tests (57 ok, 0 failed, 0 skipped) ran in 11224 ms" + ], + "library_sha256": "5a0426fed5a0606c55dc38c7bbddfb8c5c65580fb79fc9d09b17f7890fcff32f" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/unit/splinter_test", + "--db-location", + "core.db", + "--cache-capacity-mib", + "128", + "--db-capacity-gib", + "64" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-release-faya0ddo/splinter", + "started": 1792007158.1083732, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007193.827915, + "log_sha256": "70df441665ddd1975c20649be48edba0bdd058ba0e2aa644d782cbfbda67ef99", + "log": "release-splinter.log", + "seconds": 35.719541788101196, + "name": "splinter", + "binary_sha256": "5323a085431471afb5916e347eedc3187a40b5acc318ce9d55a4c2bac382ccbe", + "summaries": [ + "RESULTS: 44 tests (44 ok, 0 failed, 0 skipped) ran in 35678 ms" + ], + "library_sha256": "5a0426fed5a0606c55dc38c7bbddfb8c5c65580fb79fc9d09b17f7890fcff32f", + "blob_cases": [ + "TEST 41/44 splinter:test_blob_descriptor_sizes [OK]", + "TEST 42/44 splinter:test_blob_trees [OK]", + "TEST 43/44 splinter:test_blob_height_three_and_large_stats [OK]", + "TEST 44/44 splinter:test_blob_checksums [OK]" + ] + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/unit/splinterdb_forked_child_test", + "automatic_log_barriers_survive_process_exit" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-release-faya0ddo/automatic-log-recovery", + "started": 1792007193.8316197, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007194.5980272, + "log_sha256": "4e1a3eea4cc3abba55ea549d48473a0815980bce645ad80d50e2adf7087ef83b", + "log": "release-automatic-log-recovery.log", + "seconds": 0.7664074897766113, + "name": "automatic-log-recovery", + "binary_sha256": "0079b294e35e06264c1275a37d241f308c6d71532ae3c66eb937229b6c631fc7", + "summaries": [ + "RESULTS: 1 tests (1 ok, 0 failed, 0 skipped) ran in 743 ms" + ], + "library_sha256": "5a0426fed5a0606c55dc38c7bbddfb8c5c65580fb79fc9d09b17f7890fcff32f" + }, + { + "command": [ + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/driver_test", + "log_test", + "--db-location", + "log.db", + "--cache-capacity-mib", + "64", + "--db-capacity-gib", + "4" + ], + "cwd": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-validation-release-faya0ddo/functional-log", + "started": 1792007194.6013877, + "timeout_seconds": 900, + "returncode": 0, + "finished": 1792007195.2673273, + "log_sha256": "0a43cfe8076562afbe26fbe237e9e601d63b638bde798ba9abfced51d505cee1", + "log": "release-functional-log.log", + "seconds": 0.6659395694732666, + "name": "functional-log", + "binary_sha256": "c6a8e12c52c81ebdb1889ac331d4fb4a56a88711a2a8325852673991c4b0d3fc", + "summaries": [], + "library_sha256": "5a0426fed5a0606c55dc38c7bbddfb8c5c65580fb79fc9d09b17f7890fcff32f", + "replay_summary": [ + "log returned 500000 of 500000 entries" + ] + } +] diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-check.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-check.json new file mode 100644 index 000000000..3629d318a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-check.json @@ -0,0 +1,3 @@ +{ + "unchanged": true +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-manifest.json b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-manifest.json new file mode 100644 index 000000000..e0e39bcbe --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-source-manifest.json @@ -0,0 +1,180 @@ +{ + "head": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "origin_main": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "source_sha256": { + "Makefile": "64ffc4bcbe25fca2a45da700ead4a6d4add7601c6f406290e2cf5cde52e95296", + "examples/README.md": "e5f70bd344661c7018b43dc9fe02fa9bfa047f277b2de4535f0e035b1ffb2d71", + "examples/splinterdb_custom_ipv4_addr_sortcmp_example.c": "add1a04c25e8bb1ae9d8dfdf1a04c50228b9820c3da01e021f5359be816118bb", + "examples/splinterdb_intro_example.c": "ba0138e7994d16e45c77667c1e5576ca38e727aaa0cab0872ba0e5afb5ea44cc", + "examples/splinterdb_iterators_example.c": "22a9ca47be0433c276e9ad4ce119962edcc2911814e1e62cb22d3c8a8a26beed", + "examples/splinterdb_optimize_example.c": "bbc5a089afc7e62f06d00ffab1fd2b1c1cf1111669a1a7452d587e1f68f62c06", + "examples/splinterdb_wide_values_example.c": "a333d406974f0b3a85ed418d21e2846e3e2e80028d18254469d61f900a95d831", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb", + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "tests/config.c": "2a4487280f7d81a78e4d27e14e62c0c4c62dd1539e94df380fdf097a859556b7", + "tests/config.h": "754d9e0aca8f9d0359b73a5d6e470e80a2ac48ac43eb46d43aa1a5104fd89065", + "tests/functional/README.md": "c95907cfe5f4aaebc303d0d94cdcbd51e78d717ec11e4c5ecea6b8efaf723be0", + "tests/functional/avlTree.c": "5c24865aa50a21c626dacb2bd6172ff182a25e3532f5aee73a25aeb47c6bb043", + "tests/functional/avlTree.h": "39d82dc2b4c99a635c095800efcd060e7c95822a1194de0f03524a970040ac86", + "tests/functional/btree_test.c": "c011e72c204cc7640d1d259c791ba7ead40ef2a2c01fcfff3140d988d6666547", + "tests/functional/cache_test.c": "549f326d035fbb81cf9f272a66948f34f30313495624c6320e4a75b47c042e48", + "tests/functional/driver_test.c": "aef8d611eae488b287a796007c2a4e2a5f2e7f3f3190dce51be0e2be78ecb765", + "tests/functional/filter_test.c": "d58945f7c783584c65963381068c0225ed34dcb8d7dad7b2dfe865692a452853", + "tests/functional/io_apis_test.c": "be9b36b3af71975782f42ecc8087a922dea828d82049844d0833845cc1698ec5", + "tests/functional/log_test.c": "5464ef364dddffcb9aa5d80c1ee47994fb2ef6c451da25ac69b80c330f69d28c", + "tests/functional/random.h": "8b6567f2e066099fc21d9f6548b561169ffadb0da07150be7bf940c86d146082", + "tests/functional/scan_benchmark.c": "cb06609cf0134f1952a8742d19ef850ff4c80d86a6ffca85607998a2c921b17a", + "tests/functional/splinter_test.c": "b6c2e683dd48e23bc5d035e5d00142012f64085a21cff563b44d54fbaf2c7b9c", + "tests/functional/splinter_test.h": "9eb16fb6c779b27df477213c341031421d383c1c72051f2f42abec4c3c5b0f79", + "tests/functional/test.h": "fc47bbf44ca520c6ebcbc8843871e394a2de4521cb3c679c55a01a4b8c278d21", + "tests/functional/test_async.c": "258f7c56c6c500c783e659b69b157d3c9a06812fcbc31a8fb165b6c66f213acd", + "tests/functional/test_async.h": "c3530305b730c3d9a2c3c73ed438ee7ccd6c5c45cd26e0e02e6a821350b1d778", + "tests/functional/test_dispatcher.c": "60eaa54ce5ffd0d50095722ecd488b448e875fa07a44acc4ba560534c16d67b9", + "tests/functional/test_functionality.c": "d7b71e53f78b88257a10d8cc4fddd3daa48d704a89f6b4c5590af507da4637cd", + "tests/functional/test_functionality.h": "d065e9b63d00f37a88ee9cf962a1280040d7ee4684a1141a506e393fa38913b0", + "tests/functional/test_splinter_shadow.c": "4b856d30739b5ae544b65f514a55cc9d91cbc550044c498bedc51e8d5da26bd5", + "tests/functional/test_splinter_shadow.h": "a1b23c891db62785db9c4f80035ea1060de68c79aa0230dd6dbc03a8fe0b118d", + "tests/functional/ycsb_test.c": "5b1be412e93cfe56b8578051583fa231c138e2acee1afe4b3d1dfb925e0ad26f", + "tests/test_common.c": "fd1d18926096852a7dcfb54622d534d76a8ec62437ce72143c261f402587e493", + "tests/test_common.h": "3691f4e6bdaedb246dc9edea3d62a5cc69b456240492ba6cca8a2320c27cd595", + "tests/test_data.c": "48433bcf29a2e5ce1540a7b479bf0ddf85278e3d2a3c5ca6d8e4538cd1f0012f", + "tests/test_data.h": "61af4814f5d37200fa2393fc40abc7aa19acf4af322ca159390da3332af2952a", + "tests/unit/README.md": "9d4dc976f63738ebe5b73d446e2d6de088f29b26e2683f3c3c552c964949de2d", + "tests/unit/btree_stress_test.c": "1aa7a844349a1070f497f8ded0be9a36a5cf492d8731b49d626a771664f3ba79", + "tests/unit/btree_test.c": "cfb4057349c6580acead4950876f9665ac0d0d38ef7d8289bf90db00e88878e3", + "tests/unit/btree_test_common.c": "3fa17ff41ec7afa5e7204aeb68767a7fcb7e1c7cf81695ef9506876a2af324bf", + "tests/unit/btree_test_common.h": "b7b30bdc02449e81d2fe263c0ef74a4a28c728f717d1ea20d16e3f1acb10a6a2", + "tests/unit/config_parse_test.c": "700a56f940237508e1ce647cc011f2f42c503aab262f930fd1baf0f265a9a112", + "tests/unit/ctest.h": "db9f53f9da859ff1d72be00efb993ca551720e0acaf747236e34e031368c7a16", + "tests/unit/large_inserts_stress_test.c": "df90d2de303f72829779f23cad3881cc65465d5d1a22fcdaf10000b23430b7ae", + "tests/unit/limitations_test.c": "e851344911b8c835578ccd9ae777b79369d339a375cca1468a12c70f03a9efe3", + "tests/unit/main.c": "a4a3ca6e237e3f40f07682c6528b1ef6f32105afc6071810e15411ad297b7a38", + "tests/unit/merge_test.c": "8c916b53e14f3a1f03b314f33d6d67975d7c60909a06c5c5b41b62ef02dc94f4", + "tests/unit/misc_test.c": "4ec5cf57c933275ccdf532a529ae79909840f7d41d36b842a4cb9d9a291ea05b", + "tests/unit/notification_test.c": "b9dcf332b319cf1ff0c1f9c3aa7fc32a35c9f19b81f8122d55c6ed7f6e02e84b", + "tests/unit/platform_apis_test.c": "c3623021ae04b4305b0971cfb2760f895c5b6908310a6e4c192f65769262c860", + "tests/unit/platform_threads_test.c": "bd8e8bb58926344add7b38357c15237687165da8995b052f02612967b6bd8af5", + "tests/unit/splinter_test.c": "297752b1102d3d85ef8cd4be54c0fa15d9a6aeb7e03ce092d14a967ccff42244", + "tests/unit/splinterdb_forked_child_test.c": "88fb68b05aef1238ddce814eccd636b1dfffcb3f439d4892f66b82ad686a075d", + "tests/unit/splinterdb_heap_id_mgmt_test.c": "43729def7a6d91cf66f5bc1fe2e6f0a4a45d63ebbb55887ed10a5eafcdc8235e", + "tests/unit/splinterdb_optimize_test.c": "719af1e83c60df31e63dfd782ace852605edbc355dfb487608e9c77a8f33ebae", + "tests/unit/splinterdb_quick_test.c": "9515f6fe840c1012f54701e1e5a75430f764063b6a4f3091f426bd3038bc2eda", + "tests/unit/splinterdb_stress_test.c": "21a7f8725c82e4d8ec780131eff514294304aba322d8a2650ae893efaaf66f3a", + "tests/unit/superblock_test.c": "04864b8fce2142d49abefebd0dd3acca6158ebea495484ef05d670013a6c8977", + "tests/unit/task_system_test.c": "bd8ad9ca2632f17a6353f3c1e4d0849d98604e6b3a30f9c0c0b7ee13904a3024", + "tests/unit/trunk_async_test.c": "00c51d4302a48e09bdfacf217d45fc3c935f59bac130ded3f3164cc64ec5713b", + "tests/unit/trunk_gc_test.c": "00d6134ad82ed061cbc16d4b19fc21f41432c4b7c5a4b7ade80c3bed3b2dfdca", + "tests/unit/trunk_split_test.c": "4237641a463b28b7be333ed5d4f80a4830c3b0ef75335b196da34318a9f58b18", + "tests/unit/unit_test_template_dot_c": "ffb5e31229ca59caaece995122fcefe11f360ae45953caae0b5d4a72b2a6bcf7", + "tests/unit/unit_tests.h": "4e15f58455d8d759e9fad8432a02b1ec70f3a47a3e74eb39ea11b6a2ad44af42", + "tests/unit/unit_tests_common.c": "7a47eb40fadea397842e2f56932083d7e8840f08834788d6774b1f688288e735", + "tests/unit/util_test.c": "e992dff255d18e84673ea3954eb2da314de0815e64d55fd1980018b22444508b", + "tests/unit/vector_test.c": "463c0ae5b0c7525844f198c6859988a1bc33274d26cace87b9229673bc7c5186", + "tests/unit/writable_buffer_test.c": "3418d6ae29c5bc09dda485c1c1fe1768a1a3fc66b9b6bfdd05aa50e52516241e", + "tests/unit/writeback_set_test.c": "7bef6ea2a4a9d13fe0d83549cadd8e9497018068ac397ac8c31edea6909ee398" + }, + "tracked_source_diff": "diff --git a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\nindex 7a251f1c..8855fc0c 100644\n--- a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n+++ b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c\n@@ -140,6 +140,8 @@ main()\n // up-front. Every insert will invoke this method to insert the new key\n // in custom-sorted order.\n splinter_data_cfg.key_compare = custom_key_compare;\n+ // IP address order differs from bytewise lexical order.\n+ splinter_data_cfg.key_compare_is_lexical = FALSE;\n \n // Basic configuration of a SplinterDB instance\n splinterdb_config splinterdb_cfg;" +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinter.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinter.log new file mode 100644 index 000000000..104cac8bc --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinter.log @@ -0,0 +1,96 @@ +Running 1 CTests, suite name 'splinter', test case 'all'. +TEST 1/44 splinter:test_inserts [OK] +TEST 2/44 splinter:test_btree_pack_abort_releases_reserved_extents btree_pack error status: 5 +[OK] +TEST 3/44 splinter:test_btree_pack_rejects_counter_overflow btree_pack: output statistics exceed the on-disk limit +btree_pack error status: 28 +[OK] +TEST 4/44 splinter:test_malformed_trunk_pivot_bundle [OK] +TEST 5/44 splinter:test_invalid_branch_reference_rejected Unsupported branch format version 3 at 8519680; this build requires version 2. +ondisk_bundle_merge_lookup: btree_lookup_and_merge failed: 22 +trunk_merge_lookup: ondisk_bundle_merge_lookup failed: 22 +Unsupported branch format version 3 at 8519680; this build requires version 2. +ondisk_bundle_merge_lookup_async: btree_lookup_and_merge_async failed: 22 +trunk_merge_lookup_async: ondisk_bundle_merge_lookup_async failed: 22 +Unsupported branch format version 3 at 8519680; this build requires version 2. +trunk_collect_branches: trunk_collect_bundle_branches failed: 22 +ondisk_bundle_merge_lookup: btree_lookup_and_merge failed: 22 +trunk_merge_lookup: ondisk_bundle_merge_lookup failed: 22 +ondisk_bundle_merge_lookup_async: btree_lookup_and_merge_async failed: 22 +trunk_merge_lookup_async: ondisk_bundle_merge_lookup_async failed: 22 +trunk_collect_branches: trunk_collect_bundle_branches failed: 22 +[OK] +TEST 6/44 splinter:test_malformed_trunk_pivot_stats trunk_merge_lookup: ondisk_node_find_pivot failed: 22 +trunk_merge_lookup_async: ondisk_node_find_pivot_async failed: 22 +[OK] +TEST 7/44 splinter:test_malformed_trunk_child_height trunk_merge_lookup_async: ondisk_node_handle_init_async failed: 22 +[OK] +TEST 8/44 splinter:test_two_log_checkpoint [OK] +TEST 9/44 splinter:test_reopen_with_changed_filter_config [OK] +TEST 10/44 splinter:test_logged_large_insert_shares_blob_extents [OK] +TEST 11/44 splinter:test_durable_barrier_waits_for_visible_insert_log_write [OK] +TEST 12/44 splinter:test_durable_barrier_packs_concurrent_small_tails [OK] +TEST 13/44 splinter:test_shard_log_first_fit_decreasing_packing [OK] +TEST 14/44 splinter:test_shard_log_page_alloc_failure_retries_open_buffer shard_log_graduate_buffer: out of log space +shard_log_graduate_group: failed to terminate group 1: No space left on device +[OK] +TEST 15/44 splinter:test_async_durable_barrier_reports_device_failure [OK] +TEST 16/44 splinter:test_async_durable_barrier_defers_nested_wait [OK] +TEST 17/44 splinter:test_async_durable_barrier_launches_with_blocked_device [OK] +TEST 18/44 splinter:test_durable_barrier_without_log_publishes_root [OK] +TEST 19/44 splinter:test_checkpoint_reports_terminal_incorporation_failure trunk_node_serialize():2802: cache_alloc() failedserialize_nodes():2986: node_serialize() failedserialize_nodes_and_save_contingent_compactions: serialize_nodes failed: 12 +restore_balance_leaf():6155: serialize_nodes() failed: Cannot allocate memorytrunk_flush_prepare: flush_then_compact failed: 12 +trunk_incorporate_prepare failed: Cannot allocate memory +Memtable incorporation failed: generation=0 state=INCORPORATION_ASSIGNED status=Cannot allocate memory memtable_root=2228224 +memtable flush failed: Cannot allocate memory +Shutdown found memtable from failed incorporation: generation=0 state=INCORPORATION_FAILED status=Cannot allocate memory memtable_root=2228224 compacted_root=0 +[OK] +TEST 20/44 splinter:test_durable_barrier_reopens_writers_before_device_barrier [OK] +TEST 21/44 splinter:test_concurrent_durable_barriers_coalesce [OK] +TEST 22/44 splinter:test_durable_barrier_waits_for_checkpoint_publication [OK] +TEST 23/44 splinter:test_log_prepare_failure_leaves_update_unapplied core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_unmount: failed to publish the unmount root: Input/output error +core_unmount: shutdown retained recovery state; the next mount must recover +[OK] +TEST 24/44 splinter:test_checkpoint_advance_retries_cut_publish_failure core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +core_checkpoint_advance: failed to publish the log cut; will retry: Input/output error +[OK] +TEST 25/44 splinter:test_checkpoint_advance_retries_completion_failure core_checkpoint_advance: completion publish failed: Input/output error +core_checkpoint_advance: completion publish failed: Input/output error +[OK] +TEST 26/44 splinter:test_self_managed_checkpoints_reclaim_log_space [OK] +TEST 27/44 splinter:test_auto_checkpoint [OK] +TEST 28/44 splinter:test_auto_checkpoint_grace_allows_natural_rotation [OK] +TEST 29/44 splinter:test_auto_checkpoint_grace_forces_overwrite_rotation [OK] +TEST 30/44 splinter:test_auto_checkpoint_on_overwrites [OK] +TEST 31/44 splinter:test_recover_allocations_reproduces_persisted_map [OK] +TEST 32/44 splinter:test_unmount_skips_allocator_map_that_needs_rebuild core_unmount: allocator reference accounting is incomplete; leaving allocation state invalid for rebuild on the next mount +[OK] +TEST 33/44 splinter:test_late_reclamation_failure_requires_recovery WARNING: abandoned reclamation of mini allocator at 8519680 (type misc): Connection timed out. Remaining space is unavailable until reopen; clean allocation state will not be written. Recovery is required. +WARNING: core_unmount: reclamation failed (Connection timed out); remaining space was retained. Shutdown requires recovery and the next open will rebuild allocation state. +core_unmount: allocator reference accounting is incomplete; leaving allocation state invalid for rebuild on the next mount +[OK] +TEST 34/44 splinter:test_mount_active_checkpoint_stays_mountable [OK] +TEST 35/44 splinter:test_lookups [OK] +TEST 36/44 splinter:test_splinter_print_diags [OK] +TEST 37/44 splinter:test_automatic_log_barrier_reports_failure_and_retries WARNING: fire-and-forget durable barrier failed: Input/output error; recent writes may not be durable. A later barrier can retry. +[OK] +TEST 38/44 splinter:test_automatic_log_barrier_submission_failure_retries WARNING: automatic durable barrier submission failed: Cannot allocate memory; recent writes may not be durable. +[OK] +TEST 39/44 splinter:test_automatic_log_barrier_insert_does_not_wait [OK] +TEST 40/44 splinter:test_cache_read_errors_reach_core_operations ondisk_bundle_merge_lookup: btree_lookup_and_merge failed: 110 +trunk_merge_lookup: ondisk_bundle_merge_lookup failed: 110 +ondisk_bundle_merge_lookup_async: btree_lookup_and_merge_async failed: 110 +trunk_merge_lookup_async: ondisk_bundle_merge_lookup_async failed: 110 +[OK] +TEST 41/44 splinter:test_blob_descriptor_sizes [OK] +TEST 42/44 splinter:test_blob_trees [OK] +TEST 43/44 splinter:test_blob_height_three_and_large_stats [OK] +TEST 44/44 splinter:test_blob_checksums [OK] +RESULTS: 44 tests (44 ok, 0 failed, 0 skipped) ran in 35678 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinterdb_quick.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinterdb_quick.log new file mode 100644 index 000000000..1cb39099b --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-splinterdb_quick.log @@ -0,0 +1,64 @@ +Running 1 CTests, suite name 'splinterdb_quick', test case 'all'. +TEST 1/57 splinterdb_quick:test_get_cost_stats [OK] +TEST 2/57 splinterdb_quick:test_checkpoint_log_grace_default [OK] +TEST 3/57 splinterdb_quick:test_durable_barrier [OK] +TEST 4/57 splinterdb_quick:test_async_durable_barrier_notifications [OK] +TEST 5/57 splinterdb_quick:test_logged_large_value_replaces_old_value [OK] +TEST 6/57 splinterdb_quick:test_basic_flow [OK] +TEST 7/57 splinterdb_quick:test_pthread_auto_registration [OK] +TEST 8/57 splinterdb_quick:test_result_auto_registration_with_stats [OK] +TEST 9/57 splinterdb_quick:test_stats_reset_clears_cache_io [OK] +TEST 10/57 splinterdb_quick:test_final_merge_error_propagation [OK] +TEST 11/57 splinterdb_quick:test_fetch_and_update_catches_up_after_rotation [OK] +TEST 12/57 splinterdb_quick:test_fetch_and_update_rejects_incorporated_boundary [OK] +TEST 13/57 splinterdb_quick:test_range_init_error_cleanup_preserves_branches setup_ordered_iterators: exception: Cannot allocate memory +core_apply_to_range: range iterator init failed: Cannot allocate memory +[OK] +TEST 14/57 splinterdb_quick:stats_reset_excludes_active_operations [OK] +TEST 15/57 splinterdb_quick:test_apis_for_large_key [OK] +TEST 16/57 splinterdb_quick:test_key_size_gt_max_inline_key_size [OK] +TEST 17/57 splinterdb_quick:test_value_size_gt_max_value_size [OK] +TEST 18/57 splinterdb_quick:test_large_lookup_survives_memtable_recycle [OK] +TEST 19/57 splinterdb_quick:test_iterator_survives_memtable_recycle [OK] +TEST 20/57 splinterdb_quick:test_variable_length_values [OK] +TEST 21/57 splinterdb_quick:test_branch_prefix_roundtrip [OK] +TEST 22/57 splinterdb_quick:test_basic_iterator [OK] +TEST 23/57 splinterdb_quick:test_iterator_delete_current [OK] +TEST 24/57 splinterdb_quick:test_empty_iterator [OK] +TEST 25/57 splinterdb_quick:test_bounded_iterator [OK] +TEST 26/57 splinterdb_quick:test_bounded_iterator_start_normalization [OK] +TEST 27/57 splinterdb_quick:test_splinterdb_iterator_with_startkey [OK] +TEST 28/57 splinterdb_quick:test_splinterdb_iterator_with_non_existent_startkey [OK] +TEST 29/57 splinterdb_quick:test_splinterdb_iterator_with_missing_startkey_in_sequence [OK] +TEST 30/57 splinterdb_quick:test_iterator_prev_and_next [OK] +TEST 31/57 splinterdb_quick:test_iterator_reversal_on_key_in_two_branches [OK] +TEST 32/57 splinterdb_quick:test_iterator_reversal_with_three_branches [OK] +TEST 33/57 splinterdb_quick:test_rewriting_keys_does_not_grow_trunk [OK] +TEST 34/57 splinterdb_quick:test_close_and_reopen [OK] +TEST 35/57 splinterdb_quick:test_logged_close_and_reopen [OK] +TEST 36/57 splinterdb_quick:test_repeated_insert_close_reopen [OK] +TEST 37/57 splinterdb_quick:test_custom_data_config [OK] +TEST 38/57 splinterdb_quick:test_existence_only_memtable_lookup [OK] +TEST 39/57 splinterdb_quick:test_existence_only_trunk_lookup_skips_branches [OK] +TEST 40/57 splinterdb_quick:test_write_api_returns_old_value [OK] +TEST 41/57 splinterdb_quick:test_write_api_old_result_existence_only [OK] +TEST 42/57 splinterdb_quick:test_write_api_old_result_custom_merge_semantics [OK] +TEST 43/57 splinterdb_quick:test_write_api_old_result_merges_memtable_and_trunk [OK] +TEST 44/57 splinterdb_quick:test_write_api_old_result_respects_trunk_delete_shadow [OK] +TEST 45/57 splinterdb_quick:test_iterator_custom_comparator [OK] +TEST 46/57 splinterdb_quick:test_iterator_init_bug [OK] +TEST 47/57 splinterdb_quick:test_splinterdb_create_w_background_threads [OK] +TEST 48/57 splinterdb_quick:test_splinterdb_create_w_all_background_threads [OK] +TEST 49/57 splinterdb_quick:test_filtered_range_merges_only_matching_keys [OK] +TEST 50/57 splinterdb_quick:test_filtered_range_crosses_empty_trunk_leaves [OK] +TEST 51/57 splinterdb_quick:test_filtered_range_persisted_mixed_seeds [OK] +TEST 52/57 splinterdb_quick:test_filtered_range_predicate_only_and_bounds [OK] +TEST 53/57 splinterdb_quick:test_filtered_range_propagates_matching_merge_errors setup_ordered_iterators: exception: Cannot allocate memory +[OK] +TEST 54/57 splinterdb_quick:test_filtered_range_context_survives_thread_handoff [OK] +TEST 55/57 splinterdb_quick:test_iterator_thread_handoff [OK] +TEST 56/57 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery Running 1 CTests, suite name 'splinterdb_quick', test case 'test_blob_tree_crash_recovery'. +TEST 1/1 splinterdb_quick:test_blob_tree_crash_recovery [OK] +TEST 57/57 splinterdb_quick:test_get_config_returns_effective_config [OK] +RESULTS: 57 tests (57 ok, 0 failed, 0 skipped) ran in 11224 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-superblock.log b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-superblock.log new file mode 100644 index 000000000..be313f51e --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/release-superblock.log @@ -0,0 +1,50 @@ +Running 1 CTests, suite name 'superblock', test case 'all'. +TEST 1/17 superblock:test_rejects_other_experiment_formats Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 32774; this build requires version 8. +Unsupported superblock format version 32774; this build requires version 8. +Unsupported superblock format version 32775; this build requires version 8. +Unsupported superblock format version 32775; this build requires version 8. +[OK] +TEST 2/17 superblock:test_snapshot_persists_state [OK] +TEST 3/17 superblock:test_two_log_checkpoint_transitions [OK] +TEST 4/17 superblock:test_snapshot_preserves_unincorporated_sealed_log [OK] +TEST 5/17 superblock:test_two_log_checkpoint_torn_begin [OK] +TEST 6/17 superblock:test_torn_write_falls_back_to_older_generation [OK] +TEST 7/17 superblock:test_generation_wrap_selects_newest_slot [OK] +TEST 8/17 superblock:test_both_slots_corrupt_is_not_found superblock_mount: no valid superblock found +[OK] +TEST 9/17 superblock:test_mount_rejects_invalid_metadata superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +superblock_mount: no valid superblock found +[OK] +TEST 10/17 superblock:test_slot_read_error_falls_back_to_peer [OK] +TEST 11/17 superblock:test_both_slot_read_errors_are_reported superblock_mount: no readable valid superblock found: Input/output error +[OK] +TEST 12/17 superblock:test_read_geometry superblock_read_bootstrap: no valid superblock found +[OK] +TEST 13/17 superblock:test_read_bootstrap_allocation_state superblock_read_bootstrap: no valid superblock found +[OK] +TEST 14/17 superblock:test_bootstrap_geometry_metadata_budget Device geometry needs 134217728 bytes of cache lookup metadata, which exceeds the configured cache budget of 67108864 bytes. +Failed to open existing SplinterDB device 'db' with specified configuration: No space left on device +[OK] +TEST 15/17 superblock:test_unknown_structure_version_rejected Unsupported trunk format version 2; this build requires version 1. +Unsupported trunk format version 2; this build requires version 1. +Unsupported allocator format version 2; this build requires version 1. +Unsupported allocator format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +Unsupported log format version 2; this build requires version 1. +[OK] +TEST 16/17 superblock:test_unsupported_superblock_version_rejected Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 7; this build requires version 8. +Unsupported superblock format version 9; this build requires version 8. +Unsupported superblock format version 9; this build requires version 8. +Unsupported superblock format version 9; this build requires version 8. +[OK] +TEST 17/17 superblock:test_format_sets_fresh_state [OK] +RESULTS: 17 tests (17 ok, 0 failed, 0 skipped) ran in 53 ms diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/tests/validate.py b/benchmarks/results-20261014/prefix-main-6105c49f/tests/validate.py new file mode 100644 index 000000000..cf6bd1675 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/tests/validate.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +"""Build/test the prefix merge; serialize with exclusive campaign benchmarks.""" + +import argparse +import fcntl +import hashlib +import json +import os +from pathlib import Path +import re +import signal +import subprocess +import tempfile +import time + + +ARCHIVE = Path(__file__).resolve().parent +TREE = ARCHIVE.parents[3] +BUILD = TREE / "build-main-6105c49f" +MACHINE_LOCK = Path( + "/home/rob/projects/splinterdb/.cache/projects-20261011/coordination/machine.lock" +) + + +def sha256(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def write_json(path, value): + path.write_text(json.dumps(value, indent=2) + "\n") + + +def git(*args): + return subprocess.check_output(["git", *args], cwd=TREE, text=True).strip() + + +def source_manifest(): + paths = git("ls-files", "Makefile", "src", "include", "tests", "examples") + return { + "head": git("rev-parse", "HEAD"), + "origin_main": git("rev-parse", "origin/main"), + "source_sha256": {p: sha256(TREE / p) for p in paths.splitlines()}, + "tracked_source_diff": git("diff", "HEAD", "--", "Makefile", "src", "include", "tests", "examples"), + } + + +def run(command, cwd, log, timeout, env=None): + record = { + "command": [str(arg) for arg in command], + "cwd": str(cwd), + "started": time.time(), + "timeout_seconds": timeout, + } + with log.open("w") as output: + process = subprocess.Popen(command, cwd=cwd, env=env, stdout=output, + stderr=subprocess.STDOUT, start_new_session=True) + try: + record["returncode"] = process.wait(timeout=timeout) + except subprocess.TimeoutExpired: + os.killpg(process.pid, signal.SIGTERM) + try: + process.wait(timeout=10) + except subprocess.TimeoutExpired: + os.killpg(process.pid, signal.SIGKILL) + process.wait() + record.update(returncode=124, timed_out=True) + record.update(finished=time.time(), log_sha256=sha256(log), log=log.name) + record["seconds"] = record["finished"] - record["started"] + return record + + +def build(mode): + command = ["make", "-j6", "BUILD_ROOT=" + BUILD.name, + "BUILD_MODE=" + mode, "all"] + if mode == "release": + command.append("benchmarks") + env = os.environ.copy() + with tempfile.TemporaryDirectory(prefix="prefix-build-", dir=TREE / ".cache") as tmp: + env["TMPDIR"] = tmp + record = run(command, TREE, ARCHIVE / (mode + "-build.log"), 900, env) + record["TMPDIR"] = tmp + record["source_manifest"] = source_manifest() + record["build_config"] = (BUILD / mode / ".build_config").read_text() if (BUILD / mode / ".build_config").exists() else None + write_json(ARCHIVE / (mode + "-build.json"), record) + print(mode, "build", record["returncode"], flush=True) + return record["returncode"] + + +def test(mode): + initial_sources = source_manifest() + write_json(ARCHIVE / (mode + "-source-manifest.json"), initial_sources) + scratch_root = Path(tempfile.mkdtemp(prefix="prefix-validation-" + mode + "-", dir=TREE / ".cache")) + jobs = [(name, "unit/" + name + "_test", []) for name in + ["btree", "superblock", "merge", "splinterdb_quick", "splinter"]] + jobs.extend([ + ("automatic-log-recovery", "unit/splinterdb_forked_child_test", + ["automatic_log_barriers_survive_process_exit"]), + ("functional-log", "driver_test", ["log_test", "--db-location", "log.db", + "--cache-capacity-mib", "64", "--db-capacity-gib", "4"]), + ]) + records = [] + for name, binary_name, args in jobs: + scratch = scratch_root / name + scratch.mkdir() + (scratch / BUILD.name).symlink_to(BUILD, target_is_directory=True) + binary = BUILD / mode / "bin" / binary_name + command = [str(binary), *args] + if name == "splinter": + command.extend(["--db-location", "core.db", "--cache-capacity-mib", "128", "--db-capacity-gib", "64"]) + log = ARCHIVE / (mode + "-" + name + ".log") + record = run(command, scratch, log, 900) + content = log.read_text() + summaries = re.findall(r"RESULTS:.*", content) + record.update(name=name, binary_sha256=sha256(binary), summaries=summaries, + library_sha256=sha256(BUILD / mode / "lib/libsplinterdb.so")) + if name == "splinter": + record["blob_cases"] = [line for line in content.splitlines() if "test_blob_" in line] + if name == "functional-log": + record["replay_summary"] = [line for line in content.splitlines() if "500000" in line or "500,000" in line] + if name != "functional-log" and not re.search(r"RESULTS: [1-9][0-9]* tests", content): + record["missing_test_summary"] = True + record["returncode"] = record["returncode"] or 125 + records.append(record) + write_json(ARCHIVE / (mode + "-results.json"), records) + print(mode, name, record["returncode"], summaries, flush=True) + if record["returncode"]: + return record["returncode"] + final_sources = source_manifest() + unchanged = initial_sources["source_sha256"] == final_sources["source_sha256"] + write_json(ARCHIVE / (mode + "-source-check.json"), {"unchanged": unchanged}) + return 0 if unchanged else 126 + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("action", choices=["build", "test"]) + parser.add_argument("mode", choices=["debug", "release"]) + args = parser.parse_args() + (TREE / ".cache").mkdir(exist_ok=True) + with MACHINE_LOCK.open("rb") as lock: + print("Waiting for shared campaign machine lock", flush=True) + fcntl.flock(lock, fcntl.LOCK_SH) + print("Acquired shared campaign machine lock", flush=True) + return build(args.mode) if args.action == "build" else test(args.mode) + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes-progress.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes-progress.log new file mode 100644 index 000000000..85686da0d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes-progress.log @@ -0,0 +1,24 @@ +resident-common-wal0-00-main +resident-common-wal0-01-candidate +resident-common-wal0-02-candidate +resident-common-wal0-03-main +resident-random-wal0-00-main +resident-random-wal0-01-candidate +resident-random-wal0-02-candidate +resident-random-wal0-03-main +load-main-resident-common-wal1 +space-main-resident-common-wal1 +resident-common-wal1-00-main +load-candidate-resident-common-wal1 +space-candidate-resident-common-wal1 +resident-common-wal1-01-candidate +resident-common-wal1-02-candidate +resident-common-wal1-03-main +load-main-resident-random-wal1 +space-main-resident-random-wal1 +resident-random-wal1-00-main +load-candidate-resident-random-wal1 +space-candidate-resident-random-wal1 +resident-random-wal1-01-candidate +resident-random-wal1-02-candidate +resident-random-wal1-03-main diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/manifest.json b/benchmarks/results-20261014/prefix-main-6105c49f/writes/manifest.json new file mode 100644 index 000000000..69441692a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/manifest.json @@ -0,0 +1,2140 @@ +{ + "mode": "writes", + "started": 1792008135.2144141, + "complete": true, + "runner_sha256": "eef41a21f8c4275c300fa24ed69b457b233c8ee0a470926d84c3f5ea755ebd25", + "build_json_sha256": "7bed995652687ea945106e764423ed445b4573d79dc5973b77f05c3cfda0051b", + "builds": { + "main": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main", + "commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "8b059dfa240564a7fca21379b467afc7635b9128d2ca72555300333ae06dbc97", + "src/btree.h": "2dc405429d4d84f606412d3a16dc07dd2aee2877524d658e946cb1a8bf1d865e", + "src/btree_private.h": "43693dd3048ae050b3358ccfc9b91371a3d9dff4f3d6d5c8b07445897dee09f6", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "161352f5247978f3d57033818d05a79d0a1a0d0ffac2bc9f25f4f33eabca2227", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "57be61933a057f52f679dfcf21755a8645e6228cd1a7cdee983f5d57768923ab", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "MAKEFLAGS=B -j8 --jobserver-auth=fifo:/tmp/prefix-main-build-6105c49f/GMfifo3 -- GIT_VERSION=6105c49f BUILD_MODE=release\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557" + } + }, + "candidate": { + "tree": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix", + "commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "library": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "binary": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "source_files_sha256": { + "src/PackedArray.c": "97b64eb0a4f550e55f3385d39d729a878fbc581909ea16ec3b8987a7f46604cc", + "src/PackedArray.h": "e46f854b487a8b130f0613efcab11836012d27c8aacf9ca9e76a2de1a7eb6874", + "src/allocator.c": "96c7f0a5e0808719cf114d267c84da1f057b5eed748b0672d60686d7f130b96f", + "src/allocator.h": "06da1d6a491a15ef5229e8e2e4b4ad6468cb3c9ba620e0d956032dc0a1b6aec1", + "src/batch_rwlock.c": "c043d9e5ead75cd9e1266a6f51fb555012269f3822d7f0233dc2abbd962c3aae", + "src/batch_rwlock.h": "0ff5f0bd7fdf5f9a63ca2f77c387d574d8009ad726b47283c93566cf06bc0927", + "src/blob.c": "75e01e92c06d775b1cb36ea63a7cddf191b5179b94c3e9cd6b5b23ab0480485b", + "src/blob.h": "8f68d2f67de8a9d81a422b28d47aa636cc7234fccc3dbabe59f2355bc361e93c", + "src/blob_build.c": "e484e9c14fd8a9b3c1d211485c35931c944fc66ac4ee78ea20ffc5b3f074b10b", + "src/blob_build.h": "38176881cf9159247e6f578bbc7abb725cfa969c493715df7d1388cb7cbfd119", + "src/btree.c": "37261b2d1237adc99be07c53f211b0ece5def9c5e1377eb9e5af0281e28f8dfd", + "src/btree.h": "af862c7ec14b2c7ff9e610a700fbb2628479ec31c04e77b4037cf81895cbf486", + "src/btree_private.h": "4093945f3edd1e5915469b2b780e4c7bac93f78048c9c2bd00c1b96198bd8166", + "src/cache.h": "d4c1e133d6423fff324d0ebcf5c95e13647c0022a3458935156746b90d816d6d", + "src/clockcache.c": "e0ef2e19a8280849df4ee80d9b8a54a0faaf56a13faefe7a91d54f5b7269f933", + "src/clockcache.h": "68f4e7b019d0440f85929bfc0da1891ce941318ee7dfd14a3d4d923e3d4e72d8", + "src/core.c": "7f4c49cc68de619c588abd65df69583b0c1cb4634da5e2096cd7538f96cc0025", + "src/core.h": "c820a39abdcf0e69bb7aba1f8f9741d72e77609df4b85dbd2233b693559869ec", + "src/data_blob_build.c": "13475faa56bba94ee26ef7fec4e4da8a5045e0efe510a63291fd5e2697cb5d22", + "src/data_blob_build.h": "dd7f263a0b1138325b211c561ba7289183a2cc8472978cba3ca430295e11e5f3", + "src/data_internal.c": "0a42dd477aaa6ad6c4910841045c4c768ad8d248c0126c64c51035f53e769cde", + "src/data_internal.h": "98b4ebe77576c4cbb7dd9984ca5e297851175494062073f1a4c137c5afb8b587", + "src/default_data_config.c": "08a6f5e78d3874f5a1ead8d309efb910a0900bcd5ff5e4e981de3593ccd09f9e", + "src/histogram.c": "24e09dfabd6085021d8a06ef9b10f6e85b24914d95831be359df09f8a9729aff", + "src/histogram.h": "7ccfde6d3ada7ead18fe477c06a6b021db83ca8c041ab0998ca023b945a3c1c7", + "src/iterator.h": "2fcddeb9fa6bd49f4e3da933224219bdb830f9e2f11638ea1ed13eba534fa27f", + "src/log.h": "da650095ba27154c029a2ef10c5fcac963002e294ad65688b80b5805786b8a45", + "src/log_data.h": "8b9198c49c95367f5c66cfa23ec1a3b6cab2abd875fe74c4afb4dafb5a5c44fe", + "src/lookup_result.h": "7528b988a28ef91b6bd7a4fa10dfa51b9ce2475e801b3b6a8bf30adf88f1ef16", + "src/memtable.c": "7db3b4754497c73b4071c7e7e591cc76fc226197fb70d98fb46caf139b3953f4", + "src/memtable.h": "244cac7cf304df85a25c8bede2df106d6f840d65bbd1a3551b3d9f2ed9129fc1", + "src/merge.c": "0b9547090a291b88f957689d8786fbaab35a2e2a18a4ae72b532c11415f5a9a7", + "src/merge.h": "771c1c2b5c581901c67aefa07d9e8c9d4f730e1137633b5b5efe35d14a6bd0d1", + "src/mini_allocator.c": "d620cbdff9867ce64c752992ede58783010fb09366220ad3bd6d8518911205ca", + "src/mini_allocator.h": "39d245b58914d28b26dfe230b9de15582382cec1c2a90fa14db19f5f2c203632", + "src/notification.c": "54af1fe6af2e5fc84fbee21a74ff55069a8aa7e4ec7f9d8c9485e85e91669b58", + "src/notification.h": "f4df33131f407e6a957602a05c72f4bca7efed98b1a39134f94bf889a6ca5f29", + "src/ondisk_ref.c": "2ace8cbbce3f80a54ff7762ad03a79a564665fa660394f1d3446235a3e40ed7b", + "src/ondisk_ref.h": "643325c8b4f16fab41d8c884c97bdfcf6c86e5178398508fa0f81b6b0606926d", + "src/pcq.h": "862cd346b0097014ccae797dc1463e7b3fc387f409319d5adcef7613b6f82f84", + "src/platform_linux/async.h": "41383b57e21f0f51d737749a4ce7c2c5330ac9363e742330625c9aedd4f13a52", + "src/platform_linux/laio.c": "0ce628806e6896070359a9e39d069f326f460ab697c6c17ff17d171614290881", + "src/platform_linux/laio.h": "f3987e22f1fd7a9d6b46c79f84e75559aec5410239a13d52a7a5343ba792b28e", + "src/platform_linux/platform.h": "f1c3d7c5bcd089ed7a7df129d3b8d00d7617de9a7aa6f9d1f7deeb739281e768", + "src/platform_linux/platform_assert.c": "112e803b6db03dd8c14a3bfc3f1139bbcc4b81f1d5e24a232b7b99ce89146c2d", + "src/platform_linux/platform_assert.h": "751dccceac9ce4a97d25d441b5216ced5ee5f079a13c9ccd43551b0994aa7cc2", + "src/platform_linux/platform_backtrace.h": "ef13ccbf4ae4747b0de244a37c026ad8769018d84f9fc4d6493db43d9714358c", + "src/platform_linux/platform_buffer.c": "b790d645b3dc5f638da871bf9611865dc700927f3b594a1d645b0350bd1bd027", + "src/platform_linux/platform_buffer.h": "72e016dbb19b8250378b3a5c79fbebf9c3d72a31d07a232f36431e04f0e4afa6", + "src/platform_linux/platform_condvar.c": "e595f69194accb3f3460d6fc9a4a9144bd7f495dbeb77f11bf3616dc0e9b03ec", + "src/platform_linux/platform_condvar.h": "a4ee02ae5069637bce4cae07f3ed9869925f17a9e6e1b04d69baedfc148fd493", + "src/platform_linux/platform_hash.h": "f69f5ed6218bfe62c62718b387e1c110e9fca46c07603d4d51ccc4fc782b09ab", + "src/platform_linux/platform_heap.c": "72bb2753f525e56f8c398988a787feb38f02efaa749e5d57cb476f967269c479", + "src/platform_linux/platform_heap.h": "921f3113d20b44c36817c284702e965e01769596ff012edd6ceaa70cbdbbd10a", + "src/platform_linux/platform_io.c": "875a7331f8bfa46e9a6961f50acb40b107d40883839c94def52a289a521c66be", + "src/platform_linux/platform_io.h": "69ae9556daf1c7a69e007abd494bf9c86ec81c08bca1e032663009cef95b2fac", + "src/platform_linux/platform_log.c": "318bd17c858475a3a91c5e9641b52808f7c4194e1c6fc9a7d801392b04c49538", + "src/platform_linux/platform_log.h": "569484386150fcfbf5dde722c5b8e34d67d65be3454e3e009cb9df41f11efea6", + "src/platform_linux/platform_machine.h": "c02745313c7268dbe99efa2b93dd4d37640b5a7aa2e88c78fd5b73742f252c7d", + "src/platform_linux/platform_mutex.c": "7ec1dd6a5397217d28fd85c10648d29a70bf66649f59f76d7387236031b15bf3", + "src/platform_linux/platform_mutex.h": "688991d6a7dc57a7a88f565541561344cdfbb1733ca6073f1655d6c436ed6544", + "src/platform_linux/platform_random.h": "184ac9da9c38a6c10275891be61ccb91beaf2234ebb9ce046d059cb16824d68f", + "src/platform_linux/platform_semaphore.h": "9fdb7cfeaf36c8bf9aa346a16466ed6bc50bea76fdb5722c86001563d55bedfe", + "src/platform_linux/platform_sleep.h": "34aeaea35133bf33e47eb1d9ace429297644e13bc100d90ebbd205bceb58d3ab", + "src/platform_linux/platform_sort.h": "d374788510f94a8c3b86ff6bfa1f6a3ff8ac33168eb26f6f7774984252f6d01e", + "src/platform_linux/platform_spinlock.h": "7b3f0409109f3341f2287fe7cd8fb69faac4a74b009a44c1eb83220f71e94de0", + "src/platform_linux/platform_status.h": "2749285ea1322e5c1639019b728fde4b87b0cae6f71a7fc16e420bd592d38c00", + "src/platform_linux/platform_string.h": "fa41faf9c6661c62ece783740250232709656b0a8677f542e390a5f3b0d834a6", + "src/platform_linux/platform_threads.c": "789465a2c6ac7ac501e5878f429cc0dd9b163145a522e247a4833e3de7af8f2a", + "src/platform_linux/platform_threads.h": "653e070115131756e6aaffc3c2764a6437fb39ff96df4afc8a01e6e751c9d622", + "src/platform_linux/platform_time.h": "f212a08cf8432693711cecfd389f9ed3d0a70e0c056dc062321bd11c4a8cbec7", + "src/platform_linux/platform_trace.c": "4a68e89f214920dd2762d072a0ad8e7c80d9b1733a64e4a7e3dd4bb04b91c352", + "src/platform_linux/platform_trace.h": "345f7283b01e5a9b4d5da7bea66ad44ff61f53155417c97990e23bb8fedadf33", + "src/platform_linux/platform_typed_alloc.h": "42c1d2bbd56c183d11768a5f43d440cf3c1bfe329c4352afa6acd3bc2b191a8e", + "src/platform_linux/platform_units.h": "1cb22a07b33ec8b58f9381438f480f561d12b838f315a117cc1f979e95b1ef65", + "src/platform_linux/platform_util.h": "4fa2702b3919eb1a7efcf29457f5ee9a3d7a7b4c38fed4606264562022fa2638", + "src/platform_linux/poison.h": "a32dfa445439eb08913e519117e7b11f72b2c3550577a74769ed935a792c42c5", + "src/platform_linux/shmalloc.c": "e4631d63a9db1ad58472ad3d034d081f2bb9a97f34c5898f7c848dda923727f8", + "src/platform_linux/shmalloc.h": "081a82473f6021f8ed628e79f8ae5dc7104988981f8c3b25749ea42c8158113d", + "src/prefetch.h": "9d55d9dad64e3795c81856bc38688936e4e74e488dfe2d29a1f5438ad000df42", + "src/rc_allocator.c": "23ef0da6fb2d5114fe403403c8e535bf8ba19ed2c8bef4397212933cedfc8b9e", + "src/rc_allocator.h": "5f1fae7e32207a4e0cd5c4f799c9b802ce116dd381ee5c074c21d64a229dc3ad", + "src/routing_filter.c": "b367f375536ad2119515ee450235ffd27a588a8a73e3495250abd44ac48f453a", + "src/routing_filter.h": "66a6f52a7773857e52b1440f32c46f492210d9dd54c0e3145cbed553fa959f3d", + "src/shard_log.c": "2ce39e31f8c770f60bfdfac354a9af304fbd89ff0e260efbc6b05098a56cd9e5", + "src/shard_log.h": "9d4f1514380d9ede38b08842344eb1c41e93c4565ae36c5741b6d742f4689350", + "src/splinterdb.c": "658a74458e2c07b363e85e78d81313dcad7ca4c705bdceb40b16a78d1c167b01", + "src/splinterdb_tests_private.h": "579031767b8869f49cf1e3fc94caeec13a1362dfd047782538df40b281c93414", + "src/superblock.c": "e3fbe387ac4fef197c11977e35e3aecf0d31c27c9d4932e4ec54b1bfc391620a", + "src/superblock.h": "cec63cb28426e2d23140b3ac310a86ae9635d6b3ec429abe7c469bc0de06aa73", + "src/task.c": "470418c0da14795c4697c51ef7b22e128b691c1c24a704791eea09a10b9373a4", + "src/task.h": "ebcc3bd29cef9ee8718c6ff0186863fff0dad03bcfaa43e5eacaf83c1933d01d", + "src/trunk.c": "013d25adbdc62c98935e8043ce0afba76565ce1971b664d7ce1eec2aab2167c3", + "src/trunk.h": "3c5081230d6fdfcf2e8aa2bbcff093c7694154b465d7e77cb28d48cb0412c855", + "src/util.c": "969df408c4c393f73feb05dfa37ebe1ed8be627cef630061830e4992c4c1fd9c", + "src/util.h": "9fa455f5a6268fa4a6864d444849b0872391af00512932c1587363cfd38304ef", + "src/vector.h": "6855dd0430f1a868d098797cbd4f3453ab542b5f6fbe716c79871124bee200a9", + "src/writeback_set.c": "cb485716f57a3183ce82543848edaf61f6568c9ff0445ea5ff989f95c00848ff", + "src/writeback_set.h": "68d6f589d24719a09e2680b05a1eb7e36c22b1fab978768f5b54f958f667aec9", + "include/splinterdb/data.h": "cbb9c1d63a7ff902cb6b3ef382981e31983331d8423ada510cd9693e5b7b123a", + "include/splinterdb/default_data_config.h": "179386f3e224d322a9d7ac97afd929292994a1d890a3254705f9ebea525bce32", + "include/splinterdb/platform_linux/public_platform.h": "c5ded82c5b5bb5bbcedf06a66951eb98dc8892f7b3c4f8ce07c474db98ac68a0", + "include/splinterdb/public_platform.h": "4ce9da3fea9a54fb7bb613ec1458f11f043525efb7d0bc55182f7183dd4a4f6e", + "include/splinterdb/public_util.h": "4e8f6b30408fb4174894d4ba809acff4e96f559370c7749b65bb3724a853603f", + "include/splinterdb/splinterdb.h": "18ef6fd1d5aa273370aa7483c66bbc5dc87b6880b23fca945e5bd9bd9dd82aeb" + }, + "build_config": { + "build-config.fb6bc8eeb8390429253883c09491f5bd": "BUILD_ROOT=build-main-6105c49f\nMAKEFLAGS= -j6 --jobserver-auth=fifo:/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-build-xn10vunh/GMfifo3 -- BUILD_MODE=release BUILD_ROOT=build-main-6105c49f\nBUILD_MODE=release\nQT_ACCESSIBILITY=1\nCC = cc\nDEPFLAGS = -MMD -MP\nCFLAGS = -D_GNU_SOURCE -ggdb -Wall -pthread -Wfatal-errors -Werror -Wvla -DXXH_STATIC_LINKING_ONLY -fPIC -DSPLINTERDB_PLATFORM_DIR=platform_linux -O3 -ffast-math -flto -DPLATFORM_MEMORY_FAULT_INJECTION=0\nTEST_MEMORY_FAULT_DISABLED_CFLAGS = -DPLATFORM_MEMORY_FAULT_INJECTION_DISABLED_IN_THIS_FILE\nINCLUDE = -I include -I src -I src/platform_linux -I tests\nTARGET_ARCH =\nLD = cc\nLDFLAGS = -ggdb -pthread -O3 -ffast-math -flto\nLIBS = -lm -lpthread -laio -lxxhash\nAR = ar\n" + }, + "harness_build": { + "command": [ + "cc", + "-D_GNU_SOURCE", + "-ggdb", + "-Wall", + "-pthread", + "-Werror", + "-DXXH_STATIC_LINKING_ONLY", + "-fPIC", + "-DSPLINTERDB_PLATFORM_DIR=platform_linux", + "-O3", + "-ffast-math", + "-flto", + "-march=native", + "-DKVBENCH_CLOSE_HAS_FORCE", + "-DKVBENCH_SPACE_MODE", + "-DKVBENCH_PREFIX_SUPPORT", + "-I", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/include", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench.c", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/lib/libsplinterdb.a", + "-laio", + "-lxxhash", + "-lm", + "-lpthread", + "-o", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench" + ], + "source_sha256": "127357ddacf129b1a15d2c8e5d60f928d28a101b2ea414ff6d7fff4c2e386d51", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a" + } + } + }, + "storage": "ext4 /dev/mapper/snafu-root_crypt[/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix]", + "database_directory": "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases", + "io": "O_DIRECT", + "fixture_copy": "cp --reflink=auto --sparse=always, then fsync", + "cpu_affinity": "0-11", + "platform": "Linux-6.12.107+deb13-amd64-x86_64-with-glibc2.41", + "available_cpu_affinity": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19 + ], + "loadavg_start": [ + 6.9853515625, + 7.5205078125, + 5.0498046875 + ], + "environment": { + "PREFIX_PATTERN": "per case", + "PREFIX_DISABLE": "unset except candidate disabled case", + "KVBENCH_STATS_BEFORE_CLOSE": "1 for fixture creation only" + }, + "coordination": "Caller holds exclusive campaign benchmark and machine locks", + "seconds": 8, + "warmup_seconds": 1, + "seed": 42, + "loading_threads": 1, + "background_workers": 0, + "memtable_mib": 4, + "verification": "Every query verifies key/value or ordered range; overwrite validates up to 4096 measured keys per worker after timing", + "runs": [ + { + "label": "resident-common-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008135.2435777, + "log": "writes/resident-common-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008145.1315868, + "log_sha256": "f09b3e1e9d2d6554edfb349576937113473fcb256f7692d2cd562c4bfb8d9245", + "process_cpu_s": 64.55474000000001, + "process_read_bytes": 2787983360, + "process_write_bytes": 3819388928, + "case": "resident-common", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.027447938919067383, + "csv": "writes/resident-common-wal0-00-main.csv", + "csv_sha256": "8882b022747dca641e7228f74ca2e817654cb2980e6c113ade723576d51c2d70", + "allocated_bytes": 3299307520, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008145.2262595, + "log": "writes/resident-common-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008154.560756, + "log_sha256": "f0931c63cf82b382ed5227493a90fdf5746bc7de9f5d65806f3313197518a4b4", + "process_cpu_s": 60.30219699999998, + "process_read_bytes": 1485963264, + "process_write_bytes": 2100105216, + "case": "resident-common", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-common-wal0", + "fixture_sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "copy_fsynced": true, + "copy_seconds": 0.05681300163269043, + "csv": "writes/resident-common-wal0-01-candidate.csv", + "csv_sha256": "dd3fe9c1d144a7da55c5b8ad074b96ed0fe3325c8064c5bce633f643a34387c5", + "allocated_bytes": 1967857664, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008154.6560426, + "log": "writes/resident-common-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008164.5444024, + "log_sha256": "08c5497eb94536a19388c030c2795bc2232089e5ac485b84511072d496dcf32d", + "process_cpu_s": 57.02393700000001, + "process_read_bytes": 1448644608, + "process_write_bytes": 2001268736, + "case": "resident-common", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-common-wal0", + "fixture_sha256": "f4c8713c867c9c3cb90a91315e9d7aa8f227a7a2ed6f95d4b11d5aac53ba70f9", + "copy_fsynced": true, + "copy_seconds": 0.0686185359954834, + "csv": "writes/resident-common-wal0-02-candidate.csv", + "csv_sha256": "988dc3c82721c0e33085e4e2a9bf1820b9e3612148563c976bcdb0e2ec4a28cc", + "allocated_bytes": 1887563776, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008164.6189334, + "log": "writes/resident-common-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008174.9081142, + "log_sha256": "6a677217e04dffa48e6be53b816d8886faa1f9df97506dd6c42396e7be62dea7", + "process_cpu_s": 53.360085, + "process_read_bytes": 2155966464, + "process_write_bytes": 2882187264, + "case": "resident-common", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-common-wal0", + "fixture_sha256": "f8a175cd7fd7799d33e91c5632881a609249e5901518790cf4cd606ed8dd05d7", + "copy_fsynced": true, + "copy_seconds": 0.05270266532897949, + "csv": "writes/resident-common-wal0-03-main.csv", + "csv_sha256": "40267adf5e8fe22864da435620d54cde085ccaf2eb9e5423cf4ed1b44371f682", + "allocated_bytes": 2619596800, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal0-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008175.0090284, + "log": "writes/resident-random-wal0-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008184.8460336, + "log_sha256": "4f5ac2c4699a2eed46c256e1f9d8a0268687c8c614df63121843bfd992a464e4", + "process_cpu_s": 51.47578699999999, + "process_read_bytes": 2065104896, + "process_write_bytes": 2832412672, + "case": "resident-random", + "wal": 0, + "index": 0, + "fixture_key": "main-resident-random-wal0", + "fixture_sha256": "61b6513de7a5bc2bee5ea8de5e4f475dfefa9fe9afd5de49b2353066e11a4b1a", + "copy_fsynced": true, + "copy_seconds": 0.07411026954650879, + "csv": "writes/resident-random-wal0-00-main.csv", + "csv_sha256": "4294f432a65895f8ebca93bdbc81c1561a66c83d53e9a17d155b90b86039bed4", + "allocated_bytes": 2572365824, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal0-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008184.9633715, + "log": "writes/resident-random-wal0-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008194.550738, + "log_sha256": "13a9123e26fa805e02456364abd56ff9e7c7407da3bdf040370c4bf52b581598", + "process_cpu_s": 50.82079599999997, + "process_read_bytes": 1928122368, + "process_write_bytes": 2723835904, + "case": "resident-random", + "wal": 0, + "index": 1, + "fixture_key": "candidate-resident-random-wal0", + "fixture_sha256": "fd1e976b91a26f529f5d3f7a2341b16f0dd61f0166973da8ee0424907081ef84", + "copy_fsynced": true, + "copy_seconds": 0.08821606636047363, + "csv": "writes/resident-random-wal0-01-candidate.csv", + "csv_sha256": "515c3887d2883b3cdd7d6ee2be7aa4ff7bd173652cd20ce28c388bc6d807882e", + "allocated_bytes": 2481422336, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal0-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008194.6460087, + "log": "writes/resident-random-wal0-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008204.1825893, + "log_sha256": "55e0ebe386d8537912bbd1d93d9f20c9841ad5ac4da02e528bde37cb26afc4dd", + "process_cpu_s": 51.98449000000004, + "process_read_bytes": 1857642496, + "process_write_bytes": 2733617152, + "case": "resident-random", + "wal": 0, + "index": 2, + "fixture_key": "candidate-resident-random-wal0", + "fixture_sha256": "fd1e976b91a26f529f5d3f7a2341b16f0dd61f0166973da8ee0424907081ef84", + "copy_fsynced": true, + "copy_seconds": 0.06569981575012207, + "csv": "writes/resident-random-wal0-02-candidate.csv", + "csv_sha256": "e5a399256fa3e587fbd6905dbe6ba65871bc7e990617c6ae7dc7128ba9f71a23", + "allocated_bytes": 2509463552, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal0-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "0", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008204.2622902, + "log": "writes/resident-random-wal0-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008213.8988156, + "log_sha256": "6896ee0363d31e82f91b99d9715fbe245001f77a0292367f880272c2cb62aa34", + "process_cpu_s": 46.99365799999994, + "process_read_bytes": 1922359296, + "process_write_bytes": 2570141696, + "case": "resident-random", + "wal": 0, + "index": 3, + "fixture_key": "main-resident-random-wal0", + "fixture_sha256": "61b6513de7a5bc2bee5ea8de5e4f475dfefa9fe9afd5de49b2353066e11a4b1a", + "copy_fsynced": true, + "copy_seconds": 0.053458213806152344, + "csv": "writes/resident-random-wal0-03-main.csv", + "csv_sha256": "dfa1d0f854e26228da1233253002d50e6452b8bc8624d0b521436858934dd42b", + "allocated_bytes": 2354335744, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "load-main-resident-common-wal1", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal1.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal1.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "load:random@1" + ], + "started": 1792008213.9247308, + "log": "fixtures/load-main-resident-common-wal1.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008214.6912608, + "log_sha256": "0048bd392310c3ede7f901b36d6e846884a51a9cbcaeb16313c9147852264257", + "process_cpu_s": 0.4594000000000591, + "process_read_bytes": 0, + "process_write_bytes": 76374016, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-resident-common-wal1.csv" + }, + { + "label": "space-main-resident-common-wal1", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-common-wal1.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-common-wal1.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "space" + ], + "started": 1792008214.6929772, + "log": "fixtures/space-main-resident-common-wal1.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008214.8579965, + "log_sha256": "05e7995a1cf7767804894edd7ced6c6126e5294d2531ac88f99cbf1e7c78313e", + "process_cpu_s": 0.010649000000022113, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 347 + }, + { + "label": "resident-common-wal1-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008215.3081622, + "log": "writes/resident-common-wal1-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008224.9439561, + "log_sha256": "fb404721b1140afea7331235cc182917f7baf24322c915ab69822b2fe1a01060", + "process_cpu_s": 22.944876000000008, + "process_read_bytes": 951427072, + "process_write_bytes": 2651205632, + "case": "resident-common", + "wal": 1, + "index": 0, + "fixture_key": "main-resident-common-wal1", + "fixture_sha256": "856cb8b26a6a90a57c1a5dd1452889f50403360304aba11e61052b4ce625390a", + "copy_fsynced": true, + "copy_seconds": 0.10549139976501465, + "csv": "writes/resident-common-wal1-00-main.csv", + "csv_sha256": "cca6126514214c030b99b26a5d63cc1223e4fcfc4473a3d389d9c4c10e5cfa03", + "allocated_bytes": 2525745152, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "load-candidate-resident-common-wal1", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal1.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal1.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "load:random@1" + ], + "started": 1792008224.976122, + "log": "fixtures/load-candidate-resident-common-wal1.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008225.6921437, + "log_sha256": "c5eaf969791b324c3a0f707c8a990a7116c7d35e3b47c3c865741d20e6b722b4", + "process_cpu_s": 0.4462900000000545, + "process_read_bytes": 0, + "process_write_bytes": 65093632, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-resident-common-wal1.csv" + }, + { + "label": "space-candidate-resident-common-wal1", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-common-wal1.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-common-wal1.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "space" + ], + "started": 1792008225.6939938, + "log": "fixtures/space-candidate-resident-common-wal1.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008225.8087838, + "log_sha256": "396cc5934ab676fe64361c1b17a4c80ba086f37f9b6a7561d628062b0cac9ea8", + "process_cpu_s": 0.011739000000005717, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 261 + }, + { + "label": "resident-common-wal1-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008226.2106426, + "log": "writes/resident-common-wal1-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008235.745267, + "log_sha256": "8de6d260b9b819b3fd0f4e794ce54aa43b1a9fbead933946aa3bd1af7dbea1e3", + "process_cpu_s": 27.737018000000006, + "process_read_bytes": 643612672, + "process_write_bytes": 2602889216, + "case": "resident-common", + "wal": 1, + "index": 1, + "fixture_key": "candidate-resident-common-wal1", + "fixture_sha256": "30d7a46071ee083cf56fee4dc1a28135ad39412918fb7e51b093f49bddf178aa", + "copy_fsynced": true, + "copy_seconds": 0.07528519630432129, + "csv": "writes/resident-common-wal1-01-candidate.csv", + "csv_sha256": "9237560d45ef9ea4d7f5a8a4d86e26581f6a7092c35f3959fee1ba2a626eee0e", + "allocated_bytes": 2504220672, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal1-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008235.8652184, + "log": "writes/resident-common-wal1-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008245.5494325, + "log_sha256": "2fe14f556187e18a6ea151f8f9ae90d0cca46d3e30ff66eb3728e7c206aa7c8d", + "process_cpu_s": 25.54661699999992, + "process_read_bytes": 609222656, + "process_write_bytes": 2303242240, + "case": "resident-common", + "wal": 1, + "index": 2, + "fixture_key": "candidate-resident-common-wal1", + "fixture_sha256": "30d7a46071ee083cf56fee4dc1a28135ad39412918fb7e51b093f49bddf178aa", + "copy_fsynced": true, + "copy_seconds": 0.09100055694580078, + "csv": "writes/resident-common-wal1-02-candidate.csv", + "csv_sha256": "0a4236ab7bfeb47e356b6baaea2ffe7f9b838d0f325b0adf8685ee69dda91283", + "allocated_bytes": 2256248832, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-common-wal1-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008245.7076378, + "log": "writes/resident-common-wal1-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "common", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008255.7428412, + "log_sha256": "6f14487ead729ae50ecae11b91c9607ed3e6dc89aa4fef673f5313e7851e6383", + "process_cpu_s": 22.266572000000068, + "process_read_bytes": 870674432, + "process_write_bytes": 2352144384, + "case": "resident-common", + "wal": 1, + "index": 3, + "fixture_key": "main-resident-common-wal1", + "fixture_sha256": "856cb8b26a6a90a57c1a5dd1452889f50403360304aba11e61052b4ce625390a", + "copy_fsynced": true, + "copy_seconds": 0.12808966636657715, + "csv": "writes/resident-common-wal1-03-main.csv", + "csv_sha256": "318e61a360a6056fd30981b3e7ff3264cea52fc156e0a9cf8ff47bc90f7db40f", + "allocated_bytes": 2317344768, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "load-main-resident-random-wal1", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal1.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal1.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "load:random@1" + ], + "started": 1792008255.778685, + "log": "fixtures/load-main-resident-random-wal1.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008256.745302, + "log_sha256": "5388431799ac6253569c93c08505e2c6080e1b9a401f12a4677cc20b59f49869", + "process_cpu_s": 0.6445199999999929, + "process_read_bytes": 0, + "process_write_bytes": 76374016, + "errors": 0, + "violations": 0, + "csv": "fixtures/main-resident-random-wal1.csv" + }, + { + "label": "space-main-resident-random-wal1", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-main-resident-random-wal1.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/main-resident-random-wal1.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "space" + ], + "started": 1792008256.7470994, + "log": "fixtures/space-main-resident-random-wal1.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008256.9124455, + "log_sha256": "5483c4eff622bffe1d0de5e3a355aff34e42c853f91d3e1d4a0fbe93de0343fa", + "process_cpu_s": 0.07281899999997421, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 347 + }, + { + "label": "resident-random-wal1-00-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-00-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008257.4168031, + "log": "writes/resident-random-wal1-00-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008267.2533798, + "log_sha256": "6c5933a186a389ab971f65d8723ca660d12f52f66064d2fe6c4ad2f919a819bc", + "process_cpu_s": 22.58386899999995, + "process_read_bytes": 876425216, + "process_write_bytes": 2327093248, + "case": "resident-random", + "wal": 1, + "index": 0, + "fixture_key": "main-resident-random-wal1", + "fixture_sha256": "7ee03b7eebb20d952f90527ff4622769833d9b849d0444ce08d528f3255fdcd1", + "copy_fsynced": true, + "copy_seconds": 0.1327686309814453, + "csv": "writes/resident-random-wal1-00-main.csv", + "csv_sha256": "a55729078990c8b1ace115dded4a8053bdb6e84300e389cf381c855b526634b3", + "allocated_bytes": 2309144576, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "load-candidate-resident-random-wal1", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal1.db", + "--create", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "1", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "1", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal1.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "load:random@1" + ], + "started": 1792008267.2799368, + "log": "fixtures/load-candidate-resident-random-wal1.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008268.0964565, + "log_sha256": "c8918b811c9c8f4ce273a2633dc6e1a4a27117db59da0764624c002d681bab1f", + "process_cpu_s": 0.5231319999999755, + "process_read_bytes": 0, + "process_write_bytes": 76374016, + "errors": 0, + "violations": 0, + "csv": "fixtures/candidate-resident-random-wal1.csv" + }, + { + "label": "space-candidate-resident-random-wal1", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/fixture-candidate-resident-random-wal1.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/fixtures/candidate-resident-random-wal1.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "0", + "--rep", + "0", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "space" + ], + "started": 1792008268.0984495, + "log": "fixtures/space-candidate-resident-random-wal1.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008268.2639968, + "log_sha256": "01f39efed5e205fa7a3fee92f8656a5a92e76414c49a21c4be63675231b17407", + "process_cpu_s": 0.06544499999995423, + "process_read_bytes": 282624, + "process_write_bytes": 327680, + "live_extents": 347 + }, + { + "label": "resident-random-wal1-01-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-01-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "1", + "--rep", + "1", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008268.7194254, + "log": "writes/resident-random-wal1-01-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008278.7064173, + "log_sha256": "c7134994f4e27d5e7ba4437f4f564dfb3218c8e5bedae4840903708d93fd5102", + "process_cpu_s": 27.38142499999998, + "process_read_bytes": 595357696, + "process_write_bytes": 1984651264, + "case": "resident-random", + "wal": 1, + "index": 1, + "fixture_key": "candidate-resident-random-wal1", + "fixture_sha256": "0327d5f0ced6cd12906480fdadec36abb6519d35948adcd8e1edde6411ad5451", + "copy_fsynced": true, + "copy_seconds": 0.09647440910339355, + "csv": "writes/resident-random-wal1-01-candidate.csv", + "csv_sha256": "d98158ad3ef707ccea8927210937f34918eb670e3264508b453a92e6f7b5330c", + "allocated_bytes": 2027864064, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-02-candidate", + "profile": "candidate", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/build-main-6105c49f/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-02-candidate.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.csv", + "--vtag", + "candidate", + "--stag", + "resident", + "--otag", + "2", + "--rep", + "2", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008278.9156673, + "log": "writes/resident-random-wal1-02-candidate.log", + "binary_sha256": "4a2832906a6eb61b2876ae44486b6e5ff066cefb0b3e4b50b2feac6464fe3d1a", + "library_sha256": "88ff40df48b997a907a7fffb617c3dbbffb1f5e215f1d61bfa2b232fe86b2fbf", + "source_commit": "97e5c0e38b818ae43cd3abdcf8d4489b7dbe3789", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008289.4018507, + "log_sha256": "61a7b1c61bda86ca7dbe49f63042fe0353219c43b45253bac38450b63db7b674", + "process_cpu_s": 26.215483999999947, + "process_read_bytes": 780300288, + "process_write_bytes": 2256977920, + "case": "resident-random", + "wal": 1, + "index": 2, + "fixture_key": "candidate-resident-random-wal1", + "fixture_sha256": "0327d5f0ced6cd12906480fdadec36abb6519d35948adcd8e1edde6411ad5451", + "copy_fsynced": true, + "copy_seconds": 0.15073466300964355, + "csv": "writes/resident-random-wal1-02-candidate.csv", + "csv_sha256": "8f03b8cb2c52641eda8fc3e0a15e1221861f47b2c0d089ec9f5454cd1ec7a48a", + "allocated_bytes": 2247405568, + "errors": 0, + "violations": 0, + "phase_count": 2 + }, + { + "label": "resident-random-wal1-03-main", + "profile": "main", + "command": [ + "taskset", + "-c", + "0-11", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/main/build/release/bin/prefix_kvbench", + "--db", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-03-main.db", + "--open", + "--n", + "200000", + "--cache-mib", + "128", + "--disk-gib", + "8", + "--log", + "1", + "--threads", + "8", + "--mt-bg", + "0", + "--normal-bg", + "0", + "--memtable-mib", + "4", + "--secs", + "8", + "--warmup", + "1", + "--csv", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.csv", + "--vtag", + "main", + "--stag", + "resident", + "--otag", + "3", + "--rep", + "3", + "--seed", + "42", + "--hang-secs", + "60", + "--hang-dir", + "/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/benchmarks/results-20261014/prefix-main-6105c49f/writes", + "warm", + "ow:uniform@8" + ], + "started": 1792008289.5184915, + "log": "writes/resident-random-wal1-03-main.log", + "binary_sha256": "809362cdfdcd9258f2dd11d53e4324aa86bb040eea5362480db07860ab98c557", + "library_sha256": "93bb1358bd7c087796b7f44e8eb6cda66f63a107c4854b397edfbff7cc3a5523", + "source_commit": "6105c49f66a24d3006ba0464d9558b52e692e27c", + "pattern": "random", + "compression_disabled": false, + "verified": true, + "returncode": 0, + "finished": 1792008299.6044567, + "log_sha256": "03752930bd4d6efbc748790a766ae8042e26886c24795a02b45fe7208e078751", + "process_cpu_s": 24.593229000000136, + "process_read_bytes": 839225344, + "process_write_bytes": 2337067008, + "case": "resident-random", + "wal": 1, + "index": 3, + "fixture_key": "main-resident-random-wal1", + "fixture_sha256": "7ee03b7eebb20d952f90527ff4622769833d9b849d0444ce08d528f3255fdcd1", + "copy_fsynced": true, + "copy_seconds": 0.08344626426696777, + "csv": "writes/resident-random-wal1-03-main.csv", + "csv_sha256": "05aaf4807eb3e8005922ab4087d790bb381e04ecd0f3317e7fd71c75af22eaec", + "allocated_bytes": 2309431296, + "errors": 0, + "violations": 0, + "phase_count": 2 + } + ], + "finished": 1792008299.6424491, + "loadavg_end": [ + 9.98486328125, + 8.5859375, + 5.85986328125 + ] +} diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.csv new file mode 100644 index 000000000..3c5d77bdf --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.014,14618258.8,nan,nan,nan,0.000,nan,0.059,3406110.6,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,14618258.8,0.014,0.000,0.014,0.000,0,0,nan,0,0,0.005,0,0,0,0,0 +main,resident,0,0,ow:uniform@8,8,0,200000,18254987,8.000,2281818.6,1.584,6.208,51.712,207392.738,3.466,56.696,321982.9,2582802432,3420741632,141.48,187.39,nan,nan,nan,nan,nan,0,0.0,8.000,0.114,8.114,0.027,442368,10694656,1.1462,8589934592,3299307520,0.005,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.log new file mode 100644 index 000000000..621c73536 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-00-main.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=0 sabotage=0 +open took 0.005 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 14618259 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.06s ops/cpu-s=3406111 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.114 s +== ow:uniform@8 T=8 ops=18254987 secs= 8.00 ops/s= 2281819 lat us p50=1.58 p99=6.21 p99.9=51.71 max=207392.7 mean=3.47 + cpu=56.70s ops/cpu-s=321983 rd=141.5 B/op wr=187.4 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.11s total=8.11s drain_cpu=0.03s drain_rd=442368 drain_wr=10694656 wamp=1.146 db_apparent=8589934592 db_alloc=3299307520 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.csv new file mode 100644 index 000000000..f5b8f545f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.012,16519354.0,nan,nan,nan,0.000,nan,0.048,4130524.6,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,16519354.0,0.012,0.000,0.012,0.000,0,0,nan,0,0,0.006,0,0,0,0,0 +candidate,resident,1,0,ow:uniform@8,8,1,200000,16628314,8.000,2078472.6,1.616,6.336,37.376,254673.570,3.805,52.470,316910.9,1435172864,1879560192,86.31,113.03,nan,nan,nan,nan,nan,0,0.0,8.000,0.113,8.113,0.044,94208,42147840,0.7047,8588754944,1967857664,0.006,0,0,1,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.log new file mode 100644 index 000000000..5a9d975b6 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-01-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=1 sabotage=0 +open took 0.006 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 16519354 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.05s ops/cpu-s=4130525 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.113 s +== ow:uniform@8 T=8 ops=16628314 secs= 8.00 ops/s= 2078473 lat us p50=1.62 p99=6.34 p99.9=37.38 max=254673.6 mean=3.81 + cpu=52.47s ops/cpu-s=316911 rd=86.3 B/op wr=113.0 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.11s total=8.11s drain_cpu=0.04s drain_rd=94208 drain_wr=42147840 wamp=0.705 db_apparent=8588754944 db_alloc=1967857664 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.csv new file mode 100644 index 000000000..13961f705 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.027,7367928.7,nan,nan,nan,0.000,nan,0.110,1822240.4,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,7367928.7,0.027,0.000,0.027,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +candidate,resident,2,0,ow:uniform@8,8,2,200000,15612412,8.000,1951505.2,1.584,6.336,36.352,333840.705,4.076,48.899,319278.3,1297068032,1757614080,83.08,112.58,nan,nan,nan,nan,nan,0,0.0,8.000,0.208,8.208,0.083,16961536,22794240,0.6954,8589672448,1887563776,0.010,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.log new file mode 100644 index 000000000..3fc93f6d5 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-02-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=2 sabotage=0 +open took 0.010 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.03 ops/s= 7367929 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.11s ops/cpu-s=1822240 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.208 s +== ow:uniform@8 T=8 ops=15612412 secs= 8.00 ops/s= 1951505 lat us p50=1.58 p99=6.34 p99.9=36.35 max=333840.7 mean=4.08 + cpu=48.90s ops/cpu-s=319278 rd=83.1 B/op wr=112.6 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.21s total=8.21s drain_cpu=0.08s drain_rd=16961536 drain_wr=22794240 wamp=0.695 db_apparent=8589672448 db_alloc=1887563776 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.csv new file mode 100644 index 000000000..724d34d11 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.015,13539913.6,nan,nan,nan,0.000,nan,0.066,3043352.6,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,13539913.6,0.015,0.000,0.015,0.000,0,0,nan,0,0,0.007,0,0,0,0,1 +main,resident,3,0,ow:uniform@8,8,3,200000,13214489,8.000,1651774.3,1.648,6.336,109.568,413355.643,4.841,45.440,290814.6,1869361152,2478436352,141.46,187.55,nan,nan,nan,nan,nan,0,0.0,8.000,0.179,8.179,0.087,26181632,23744512,1.1546,8589934592,2619596800,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.log new file mode 100644 index 000000000..aa350cc93 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal0-03-main.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=3 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.01 ops/s= 13539914 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=3043353 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.179 s +== ow:uniform@8 T=8 ops=13214489 secs= 8.00 ops/s= 1651774 lat us p50=1.65 p99=6.34 p99.9=109.57 max=413355.6 mean=4.84 + cpu=45.44s ops/cpu-s=290815 rd=141.5 B/op wr=187.6 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.18s total=8.18s drain_cpu=0.09s drain_rd=26181632 drain_wr=23744512 wamp=1.155 db_apparent=8589934592 db_alloc=2619596800 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.csv new file mode 100644 index 000000000..26bee7d72 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,1,warm,8,0,200000,200000,0.038,5325021.6,nan,nan,nan,0.000,nan,0.152,1317835.6,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,5325021.6,0.038,0.000,0.038,0.000,0,0,nan,0,0,0.008,0,0,0,0,1 +main,resident,0,1,ow:uniform@8,8,0,200000,5442089,8.000,680238.2,1.264,198.656,1425.408,330912.053,11.718,19.832,274407.7,853258240,2284109824,156.79,419.71,nan,nan,nan,nan,nan,0,0.0,8.000,0.112,8.112,0.038,385024,39395328,2.6034,8589549568,2525745152,0.008,0,0,1,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.log new file mode 100644 index 000000000..0a7d784a9 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-00-main.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=0 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.04 ops/s= 5325022 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.15s ops/cpu-s=1317836 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.112 s +== ow:uniform@8 T=8 ops=5442089 secs= 8.00 ops/s= 680238 lat us p50=1.26 p99=198.66 p99.9=1425.41 max=330912.1 mean=11.72 + cpu=19.83s ops/cpu-s=274408 rd=156.8 B/op wr=419.7 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.11s total=8.11s drain_cpu=0.04s drain_rd=385024 drain_wr=39395328 wamp=2.603 db_apparent=8589549568 db_alloc=2525745152 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.csv new file mode 100644 index 000000000..37eccd964 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,1,warm,8,1,200000,200000,0.027,7526438.6,nan,nan,nan,0.000,nan,0.094,2123683.3,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,7526438.6,0.027,0.000,0.027,0.000,0,0,nan,0,0,0.012,0,0,0,0,0 +candidate,resident,1,1,ow:uniform@8,8,1,200000,6454461,8.000,806782.3,1.360,190.464,925.696,286187.748,9.874,24.365,264907.9,577019904,2277765120,89.40,352.90,nan,nan,nan,nan,nan,0,0.0,8.000,0.152,8.152,0.053,581632,31731712,2.1818,8589934592,2504220672,0.012,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.log new file mode 100644 index 000000000..1e752ae28 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-01-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=1 sabotage=0 +open took 0.012 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.03 ops/s= 7526439 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.09s ops/cpu-s=2123683 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.152 s +== ow:uniform@8 T=8 ops=6454461 secs= 8.00 ops/s= 806782 lat us p50=1.36 p99=190.46 p99.9=925.70 max=286187.7 mean=9.87 + cpu=24.36s ops/cpu-s=264908 rd=89.4 B/op wr=352.9 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.15s total=8.15s drain_cpu=0.05s drain_rd=581632 drain_wr=31731712 wamp=2.182 db_apparent=8589934592 db_alloc=2504220672 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.csv new file mode 100644 index 000000000..e0d19e599 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,1,warm,8,2,200000,200000,0.023,8852416.5,nan,nan,nan,0.000,nan,0.098,2047082.9,24694784,0,123.47,0.00,nan,nan,nan,nan,nan,200000,8852416.5,0.023,0.000,0.023,0.000,0,0,nan,0,0,0.016,0,0,0,0,0 +candidate,resident,2,1,ow:uniform@8,8,2,200000,5532617,8.000,691557.9,1.392,219.136,1163.264,296862.937,11.533,22.228,248907.8,545914880,1957711872,98.67,353.85,nan,nan,nan,nan,nan,0,0.0,8.000,0.152,8.153,0.056,303104,11907072,2.1707,8589672448,2256248832,0.016,0,0,338,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.log new file mode 100644 index 000000000..bbb2a40b7 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-02-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=2 sabotage=0 +open took 0.016 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 8852417 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.10s ops/cpu-s=2047083 rd=123.5 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.152 s +== ow:uniform@8 T=8 ops=5532617 secs= 8.00 ops/s= 691558 lat us p50=1.39 p99=219.14 p99.9=1163.26 max=296862.9 mean=11.53 + cpu=22.23s ops/cpu-s=248908 rd=98.7 B/op wr=353.8 B/op violations=0 errors=0 swapin=338 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.15s total=8.15s drain_cpu=0.06s drain_rd=303104 drain_wr=11907072 wamp=2.171 db_apparent=8589672448 db_alloc=2256248832 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.csv new file mode 100644 index 000000000..f30bb1824 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,1,warm,8,3,200000,200000,0.036,5548991.1,nan,nan,nan,0.000,nan,0.159,1259493.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,5548991.1,0.036,0.000,0.036,0.000,0,0,nan,0,0,0.010,0,0,0,0,0 +main,resident,3,1,ow:uniform@8,8,3,200000,4631720,8.000,578949.9,1.360,235.520,1523.712,323510.005,13.768,19.005,243713.3,739115008,2017091584,159.58,435.50,nan,nan,nan,nan,nan,0,0.0,8.000,0.127,8.127,0.041,471040,24965120,2.6883,8589025280,2317344768,0.010,0,0,2,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.log new file mode 100644 index 000000000..002bef1be --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-common-wal1-03-main.log @@ -0,0 +1,11 @@ +prefix-pattern=common key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-common-wal1-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=3 sabotage=0 +open took 0.010 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.04 ops/s= 5548991 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.16s ops/cpu-s=1259493 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.127 s +== ow:uniform@8 T=8 ops=4631720 secs= 8.00 ops/s= 578950 lat us p50=1.36 p99=235.52 p99.9=1523.71 max=323510.0 mean=13.77 + cpu=19.00s ops/cpu-s=243713 rd=159.6 B/op wr=435.5 B/op violations=0 errors=0 swapin=2 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.13s total=8.13s drain_cpu=0.04s drain_rd=471040 drain_wr=24965120 wamp=2.688 db_apparent=8589025280 db_alloc=2317344768 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.csv new file mode 100644 index 000000000..0f132d5c0 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,0,warm,8,0,200000,200000,0.016,12879440.4,nan,nan,nan,0.000,nan,0.076,2626981.7,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12879440.4,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.007,0,0,0,0,0 +main,resident,0,0,ow:uniform@8,8,0,200000,13174571,8.000,1646774.8,1.520,6.080,103.424,476890.627,4.726,43.796,300814.2,1861791744,2467561472,141.32,187.30,nan,nan,nan,nan,nan,0,0.0,8.000,0.149,8.149,0.081,25501696,29188096,1.1556,8589811712,2572365824,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.log new file mode 100644 index 000000000..fd4b7ca5f --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-00-main.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=0 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12879440 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.08s ops/cpu-s=2626982 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.149 s +== ow:uniform@8 T=8 ops=13174571 secs= 8.00 ops/s= 1646775 lat us p50=1.52 p99=6.08 p99.9=103.42 max=476890.6 mean=4.73 + cpu=43.80s ops/cpu-s=300814 rd=141.3 B/op wr=187.3 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.15s total=8.15s drain_cpu=0.08s drain_rd=25501696 drain_wr=29188096 wamp=1.156 db_apparent=8589811712 db_alloc=2572365824 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.csv new file mode 100644 index 000000000..8133ee83a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,0,warm,8,1,200000,200000,0.016,12562477.9,nan,nan,nan,0.000,nan,0.073,2758126.1,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12562477.9,0.016,0.000,0.016,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +candidate,resident,1,0,ow:uniform@8,8,1,200000,12670382,8.000,1583743.5,1.520,5.952,111.616,443823.120,4.900,43.436,291701.9,1814925312,2389409792,143.24,188.58,nan,nan,nan,nan,nan,0,0.0,8.000,0.129,8.130,0.052,147456,45113344,1.1716,8589418496,2481422336,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.log new file mode 100644 index 000000000..1cfa1bb22 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-01-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=1 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12562478 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2758126 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.129 s +== ow:uniform@8 T=8 ops=12670382 secs= 8.00 ops/s= 1583743 lat us p50=1.52 p99=5.95 p99.9=111.62 max=443823.1 mean=4.90 + cpu=43.44s ops/cpu-s=291702 rd=143.2 B/op wr=188.6 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.13s total=8.13s drain_cpu=0.05s drain_rd=147456 drain_wr=45113344 wamp=1.172 db_apparent=8589418496 db_alloc=2481422336 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.csv new file mode 100644 index 000000000..2655d92ab --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,0,warm,8,2,200000,200000,0.017,12110074.5,nan,nan,nan,0.000,nan,0.074,2694437.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12110074.5,0.017,0.000,0.017,0.000,0,0,nan,0,0,0.007,0,0,0,0,1 +candidate,resident,2,0,ow:uniform@8,8,2,200000,13163212,8.000,1645339.0,1.552,6.208,74.752,459459.423,4.707,44.685,294581.0,1748275200,2407337984,132.82,182.88,nan,nan,nan,nan,nan,0,0.0,8.000,0.136,8.136,0.062,348160,47198208,1.1370,8589934592,2509463552,0.007,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.log new file mode 100644 index 000000000..ac9184638 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-02-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=2 sabotage=0 +open took 0.007 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12110075 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.07s ops/cpu-s=2694437 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.136 s +== ow:uniform@8 T=8 ops=13163212 secs= 8.00 ops/s= 1645339 lat us p50=1.55 p99=6.21 p99.9=74.75 max=459459.4 mean=4.71 + cpu=44.68s ops/cpu-s=294581 rd=132.8 B/op wr=182.9 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.14s total=8.14s drain_cpu=0.06s drain_rd=348160 drain_wr=47198208 wamp=1.137 db_apparent=8589934592 db_alloc=2509463552 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.csv new file mode 100644 index 000000000..9c98fe198 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,0,warm,8,3,200000,200000,0.032,6276742.7,nan,nan,nan,0.000,nan,0.146,1371469.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,6276742.7,0.032,0.000,0.032,0.000,0,0,nan,0,0,0.008,0,0,0,0,1 +main,resident,3,0,ow:uniform@8,8,3,200000,11342682,8.000,1417795.4,1.488,5.952,141.312,564980.420,5.493,39.296,288644.5,1811705856,2224594944,159.72,196.13,nan,nan,nan,nan,nan,0,0.0,8.000,0.219,8.219,0.113,995328,46493696,1.2209,8589684736,2354335744,0.008,0,0,0,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.log new file mode 100644 index 000000000..cd1ff798c --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal0-03-main.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal0-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=0 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=3 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.03 ops/s= 6276743 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.15s ops/cpu-s=1371469 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.219 s +== ow:uniform@8 T=8 ops=11342682 secs= 8.00 ops/s= 1417795 lat us p50=1.49 p99=5.95 p99.9=141.31 max=564980.4 mean=5.49 + cpu=39.30s ops/cpu-s=288645 rd=159.7 B/op wr=196.1 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.22s total=8.22s drain_cpu=0.11s drain_rd=995328 drain_wr=46493696 wamp=1.221 db_apparent=8589684736 db_alloc=2354335744 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.csv new file mode 100644 index 000000000..70fd7fc85 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,0,1,warm,8,0,200000,200000,0.017,11906985.3,nan,nan,nan,0.000,nan,0.084,2386663.3,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,11906985.3,0.017,0.000,0.017,0.000,0,0,nan,0,0,0.010,0,0,0,0,1 +main,resident,0,1,ow:uniform@8,8,0,200000,4650645,8.000,581315.3,1.296,227.328,1523.712,375066.442,13.626,19.392,239820.2,733708288,2037219328,157.76,438.05,nan,nan,nan,nan,nan,0,0.0,8.000,0.122,8.123,0.035,946176,22536192,2.7006,8589803520,2309144576,0.010,0,0,103,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.log new file mode 100644 index 000000000..859a34f4a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-00-main.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-00-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=0 sabotage=0 +open took 0.010 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 11906985 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.08s ops/cpu-s=2386663 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.122 s +== ow:uniform@8 T=8 ops=4650645 secs= 8.00 ops/s= 581315 lat us p50=1.30 p99=227.33 p99.9=1523.71 max=375066.4 mean=13.63 + cpu=19.39s ops/cpu-s=239820 rd=157.8 B/op wr=438.1 B/op violations=0 errors=0 swapin=103 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.12s total=8.12s drain_cpu=0.04s drain_rd=946176 drain_wr=22536192 wamp=2.701 db_apparent=8589803520 db_alloc=2309144576 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.csv new file mode 100644 index 000000000..fb2a75957 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,1,1,warm,8,1,200000,200000,0.035,5703255.3,nan,nan,nan,0.000,nan,0.156,1285594.9,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,5703255.3,0.035,0.000,0.035,0.000,0,0,nan,0,0,0.027,0,0,0,0,2 +candidate,resident,1,1,ow:uniform@8,8,1,200000,3877563,8.000,484679.1,1.584,266.240,1589.248,359525.583,16.300,23.795,162959.0,495284224,1637535744,127.73,422.31,nan,nan,nan,nan,nan,0,0.0,8.000,0.195,8.195,0.095,901120,39387136,2.6370,8101040128,2027864064,0.027,0,0,15,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.log new file mode 100644 index 000000000..bc481c710 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-01-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-01-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=1 sabotage=0 +open took 0.027 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.04 ops/s= 5703255 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.16s ops/cpu-s=1285595 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=2 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.195 s +== ow:uniform@8 T=8 ops=3877563 secs= 8.00 ops/s= 484679 lat us p50=1.58 p99=266.24 p99.9=1589.25 max=359525.6 mean=16.30 + cpu=23.79s ops/cpu-s=162959 rd=127.7 B/op wr=422.3 B/op violations=0 errors=0 swapin=15 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.20s total=8.20s drain_cpu=0.10s drain_rd=901120 drain_wr=39387136 wamp=2.637 db_apparent=8101040128 db_alloc=2027864064 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.csv new file mode 100644 index 000000000..60978a1f6 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +candidate,resident,2,1,warm,8,2,200000,200000,0.018,11333749.4,nan,nan,nan,0.000,nan,0.095,2113070.4,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,11333749.4,0.018,0.000,0.018,0.000,0,0,nan,0,0,0.010,0,0,0,0,1 +candidate,resident,2,1,ow:uniform@8,8,2,200000,4523941,8.000,565478.7,1.552,251.904,1327.104,298930.680,13.963,22.328,202615.7,610103296,1964118016,134.86,434.16,nan,nan,nan,nan,nan,0,0.0,8.000,0.262,8.262,0.133,25706496,26333184,2.6828,8589807616,2247405568,0.010,0,0,1,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.log new file mode 100644 index 000000000..d190ae29d --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-02-candidate.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=candidate splinter=splinterdb_build_version 97e5c0e3-dirty db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-02-candidate.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=2 sabotage=0 +open took 0.010 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 11333749 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.09s ops/cpu-s=2113070 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=1 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.262 s +== ow:uniform@8 T=8 ops=4523941 secs= 8.00 ops/s= 565479 lat us p50=1.55 p99=251.90 p99.9=1327.10 max=298930.7 mean=13.96 + cpu=22.33s ops/cpu-s=202616 rd=134.9 B/op wr=434.2 B/op violations=0 errors=0 swapin=1 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.26s total=8.26s drain_cpu=0.13s drain_rd=25706496 drain_wr=26333184 wamp=2.683 db_apparent=8589807616 db_alloc=2247405568 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.csv b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.csv new file mode 100644 index 000000000..919fdf445 --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.csv @@ -0,0 +1,3 @@ +version,size,order,log,phase,threads,rep,n,ops,secs,ops_s,p50_us,p99_us,p999_us,max_us,mean_us,cpu_s,ops_per_cpu_s,rd_bytes,wr_bytes,rd_B_op,wr_B_op,startup_p50_us,startup_p99_us,startup_mean_us,per_tuple_ns,deinit_mean_us,tuples,tuples_s,insert_s,drain_s,total_s,drain_cpu_s,drain_rd,drain_wr,wamp,db_apparent,db_alloc,open_s,violations,errors,swapin,swapout,majflt +main,resident,3,1,warm,8,3,200000,200000,0.017,12069977.6,nan,nan,nan,0.000,nan,0.084,2367172.1,35729408,0,178.65,0.00,nan,nan,nan,nan,nan,200000,12069977.6,0.017,0.000,0.017,0.000,0,0,nan,0,0,0.008,0,0,0,0,0 +main,resident,3,1,ow:uniform@8,8,3,200000,4568095,8.000,570998.2,1.424,243.712,1327.104,303815.355,13.847,21.094,216555.9,683556864,2000048128,149.64,437.83,nan,nan,nan,nan,nan,0,0.0,8.000,0.139,8.139,0.037,409600,19451904,2.6957,8589934592,2309431296,0.008,0,0,11,0,0 diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.log b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.log new file mode 100644 index 000000000..660a7d97a --- /dev/null +++ b/benchmarks/results-20261014/prefix-main-6105c49f/writes/resident-random-wal1-03-main.log @@ -0,0 +1,11 @@ +prefix-pattern=random key_bytes=64 compression_disabled=false +kvbench version=main splinter=splinterdb_build_version 6105c49f db=/home/rob/projects/splinterdb/.cache/projects-20261011/worktrees/branch-prefix/.cache/prefix-main-6105c49f/databases/writes-resident-random-wal1-03-main.db mode=open n=200000 cache_mib=128 disk_gib=8 log=1 threads=8 mt_bg=0 normal_bg=0 memtable_mib=4 secs=8.0 warmup=1.0 rep=3 sabotage=0 +open took 0.008 s +phase warm: T=8 dist=uniform (fixed count) +== warm T=8 ops=200000 secs= 0.02 ops/s= 12069978 lat us p50=nan p99=nan p99.9=nan max=0.0 mean=nan + cpu=0.08s ops/cpu-s=2367172 rd=178.6 B/op wr=0.0 B/op violations=0 errors=0 swapin=0 swapout=0 majflt=0 +phase ow:uniform@8: T=8 dist=uniform (fixed duration) +close took 0.139 s +== ow:uniform@8 T=8 ops=4568095 secs= 8.00 ops/s= 570998 lat us p50=1.42 p99=243.71 p99.9=1327.10 max=303815.4 mean=13.85 + cpu=21.09s ops/cpu-s=216556 rd=149.6 B/op wr=437.8 B/op violations=0 errors=0 swapin=11 swapout=0 majflt=0 + insert/run=8.00s drain(close)=0.14s total=8.14s drain_cpu=0.04s drain_rd=409600 drain_wr=19451904 wamp=2.696 db_apparent=8589934592 db_alloc=2309431296 diff --git a/docs/branch-prefix-experiment.md b/docs/branch-prefix-experiment.md index 4879e242a..c709833db 100644 --- a/docs/branch-prefix-experiment.md +++ b/docs/branch-prefix-experiment.md @@ -57,6 +57,12 @@ leaf bytes can trade off against rebuilding and key reconstruction. # Measurements +The latest integration and merge-readiness assessment is in +[the 2026-10-14 archive](../benchmarks/results-20261014/prefix-main-6105c49f/README.md). +Its comparison with main `6105c49f` confirms shared-prefix disk benefits but +retains a reproducible nonlexical short-scan regression that blocks a +performance-ready merge. The following earlier measurements remain historical. + All runs used O_DIRECT files on ext4, CPU affinity 0–11, 64-byte keys, 100-byte values and WAL disabled. Loading used one thread and zero background workers for reproducible construction within each format. Baseline and candidate @@ -194,3 +200,34 @@ The [integration evidence](../benchmarks/results-20261013/prefix-main-fc0bc8f7/R records exact commands and source/binary hashes. Prior benchmark evidence is preserved under `benchmarks/branch-prefix-history`; it does not establish performance on this new main. + +# Current-main integration and performance review, 2026-10-14 + +Merged `origin/main` at `6105c49f` (bounded automatic log groups) without +conflicts, as merge commit `97e5c0e3`. The custom IPv4 comparator example now +clears the lexical flag. Debug and release each passed 141 unit cases plus the +functional log test. The benchmark libraries exactly match the recorded main +and merge runtime sources. + +The refreshed comparison completed 28 read, 16 overwrite and 24 targeted repeat +runs, all with zero errors/violations, on real ext4 storage with O_DIRECT, +serialized execution, identical harness source and fsynced fixture copies. +Shared-prefix disk point/short/long scans improved 10.45% / 10.86% / 20.29%, +and file allocation fell 34.73%. + +Performance remains a merge blocker. Resident nonlexical short scans were +5.36% slower initially and 5.73% slower in three longer paired repetitions, +with nonoverlapping sample ranges in both. Common-prefix resident long scans +averaged 12.10% slower in the repeat, although their sample ranges overlap. +The initial 20.10% disabled-compression long-scan loss did not repeat; that +repeat averaged -2.38% with overlapping ranges. Logged random overwrites +including close/drain averaged -6.09% in the repeat, also with overlapping +ranges. These short writes do not establish steady-state insertion performance. + +Each public iterator is also 38 KiB larger (94,592 -> 133,504 bytes on this +build), even when compression is disabled. This is an object-size comparison, +not an RSS measurement. The unchanged-cache benchmark does not impose a total +memory cap. This branch is suitable for review as a PR, but the nonlexical +regression and remaining resident scan costs should be addressed before merging +the default-enabled feature. Full results, limitations, hashes, commands and +validation are in [the current archive](../benchmarks/results-20261014/prefix-main-6105c49f/README.md). diff --git a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c index 7a251f1cc..8855fc0ce 100644 --- a/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c +++ b/examples/splinterdb_custom_ipv4_addr_sortcmp_example.c @@ -140,6 +140,8 @@ main() // up-front. Every insert will invoke this method to insert the new key // in custom-sorted order. splinter_data_cfg.key_compare = custom_key_compare; + // IP address order differs from bytewise lexical order. + splinter_data_cfg.key_compare_is_lexical = FALSE; // Basic configuration of a SplinterDB instance splinterdb_config splinterdb_cfg; From b9cc3ea4ecfd523d799116798285fb2d7fe0bfaa Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Thu, 15 Oct 2026 22:10:20 -0700 Subject: [PATCH 08/11] further optimizations Signed-off-by: Rob Johnson --- .../prefix-main-6105c49f/README.md | 11 + .../prefix-main-6105c49f/sha256.json | 2 +- docs/branch-prefix-experiment.md | 191 +++++- src/btree.c | 230 +++++-- src/btree.h | 6 +- tests/unit/splinterdb_quick_test.c | 606 +++++++++++++++++- 6 files changed, 953 insertions(+), 93 deletions(-) diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/README.md b/benchmarks/results-20261014/prefix-main-6105c49f/README.md index dd5f1a2c0..2d5251ca9 100644 --- a/benchmarks/results-20261014/prefix-main-6105c49f/README.md +++ b/benchmarks/results-20261014/prefix-main-6105c49f/README.md @@ -49,6 +49,17 @@ layout and allocation changes are candidates for the nonlexical overhead; key reconstruction cannot explain a comparator with compression disabled. No causal attribution or performance repair was established in this update. +The subsequent [nonlexical diagnosis](../prefix-nonlexical-diagnosis/README.md) +confirmed the uncompressed key path already skips reconstruction and measured +avoidable iterator setup/state costs. Its lazy-state prototype reduced a later +batch's throughput gap from 1.96% to 0.46%, with compressed-path validation still +outstanding. The original results above remain unchanged. + +The lazy-state fix has since been applied and tested, including compressed +pages, allocation failures and leak detection. See the +[fix validation archive](../prefix-lazy-6105c49f/README.md) for its measurements +and updated merge assessment. This archive describes the pre-fix implementation. + ## Validation and measurement scope Debug and release each passed 141 unit cases: B-tree 12, superblock 17, merge diff --git a/benchmarks/results-20261014/prefix-main-6105c49f/sha256.json b/benchmarks/results-20261014/prefix-main-6105c49f/sha256.json index 215b0f170..fedd15ee8 100644 --- a/benchmarks/results-20261014/prefix-main-6105c49f/sha256.json +++ b/benchmarks/results-20261014/prefix-main-6105c49f/sha256.json @@ -1,7 +1,7 @@ { ".gitattributes": "59adc7ceefcd4a76b6455550e9529c05fd89f388e35e201fff983dba3c777bea", ".gitignore": "32dae3052f331ee34d628ef535709b301259a45df7c7522c4d35dcf49873f00b", - "README.md": "ff9732beb4ac7bbfe1b827beffd19fd814f8ea23099627181f034beb9c7c2fe5", + "README.md": "6ae8715ced92972969f2c247529f987682272df87518453cbc032f1cfe46ed72", "audit.json": "16c7a8561597e692405bab762a4dc12fb6622330d1ad7c30219b01c31d6d4e0f", "audit.py": "999cb08eb224445dc166414212169773c20000cc6a5171e6688eecdb4dfafe03", "build.json": "7bed995652687ea945106e764423ed445b4573d79dc5973b77f05c3cfda0051b", diff --git a/docs/branch-prefix-experiment.md b/docs/branch-prefix-experiment.md index c709833db..0c20ea4c7 100644 --- a/docs/branch-prefix-experiment.md +++ b/docs/branch-prefix-experiment.md @@ -8,26 +8,42 @@ the flag unless their replacement preserves this contract. When a branch leaf first fills, packing extracts the longest common prefix of its first and last keys, rebuilds entries as suffixes, and continues filling the -page. A later key outside that prefix starts another leaf. Prefix bytes occupy +page only if that prefix is at least four bytes long. This decision is per leaf; +readers still accept previously written shorter prefixes. A later key outside +that prefix starts another leaf. Prefix bytes occupy the page tail, so offset-table growth never moves them. A final partially full leaf is left uncompressed. Index pivots and mutable memtable keys stay complete. Point reads compare the prefix once, then binary-search suffixes. A mismatch -can place the query on either side of the leaf. Range iterators reconstruct -full keys into owned buffers, copying the prefix only when changing leaves. -Equal-length successive keys retain the existing buffer, and suffix copies of -at most 16 bytes use bounded inline copies. +can place the query on either side of the leaf. On compressed leaves, range +iterators reconstruct full keys into owned buffers, copying the prefix only +when changing leaves. Uncompressed leaves return keys directly from the page, +including nonlexical scans; they skip prefix reconstruction. +Prefix scratch state is allocated only after encountering a compressed leaf, +reused across positioning operations, and released during teardown. Iterators +that visit only uncompressed pages do not initialize or allocate these buffers. +The decode buffer retains its largest logical length, so shorter subsequent +keys do not trigger resizing; the returned key still has its exact length. +Allocation, growth and replacement of the per-leaf prefix stay outside the +ordinary per-key path, and suffix copies of at most 16 bytes use bounded inline +copies. Uncompressed branch-leaf iterators borrow keys from pinned pages; +mutable memtable iterators retain their existing copied-page behavior. Positioning operations perform any allocation before returning; observing the current tuple stays infallible. Bounds, seeks, asynchronous lookup, diagnostics, parent pivots and logical key-byte accounting use the full key semantics. +Iterator boundary and seek probes compare checked prefix/suffix representations +directly, without reconstructing a separate boundary key. Uncompressed leaves +can use direct lexical comparison during checked binary search when the lexical +contract permits it. Nonlexical comparisons, infinity targets on uncompressed +leaves, boundary comparisons and index pivots use the configured comparator. This prototype now uses branch format version `2` within main's superblock format `8`. Branch readers reject format `1` before interpreting its different page header. Earlier standalone prefix images used superblock `0x8007` and are -rejected. The lexical opt-in controls construction only; existing compressed -leaves remain readable after changing that setting on reopen. +rejected. Page encoding is determined from the page itself; existing compressed +leaves remain readable after changing the construction opt-in on reopen. -Debug validation passed all 48 public quick tests. The new regression checks +Initial prototype validation passed all 48 public quick tests. The regression checks compression enabled/disabled, actual compressed pages, close/reopen, point hits and misses, asynchronous lookup, zero-length suffixes, forward/reverse ranges, repeated seeks, full-key-only lexical callbacks, and prefix mismatches on both @@ -57,11 +73,82 @@ leaf bytes can trade off against rebuilding and key reconstruction. # Measurements -The latest integration and merge-readiness assessment is in -[the 2026-10-14 archive](../benchmarks/results-20261014/prefix-main-6105c49f/README.md). -Its comparison with main `6105c49f` confirms shared-prefix disk benefits but -retains a reproducible nonlexical short-scan regression that blocks a -performance-ready merge. The following earlier measurements remain historical. +The latest [performance confirmation](../benchmarks/results-20261015/prefix-confirmation/README.md) +records the applied decode-buffer and validation optimizations, longer paired +experiments, and the completed write-stall investigation. All planned controls +are complete, and origin/main remains `6105c49f`, already included in this branch. +On the exact adopted highwater source, shared-prefix disk long scans improve +27.53% [14.16%, 42.46%], with 29.06% fewer storage read bytes per query. +Resident shared-prefix long scans improve 2.29%, and one-key ranges improve +3.65%. Uncompressed resident long scans retain roughly 1.6–2.2% losses; all +eight targeted final-source read intervals exclude a loss above 3%. The +nonlexical one-key range estimate is +0.35% [-0.61%, +1.33%]. These are +nominal paired intervals, not universal bounds or point-lookup measurements. + +Fresh random insertion remains indeterminate: exact highwater/main throughput +including close is -4.10% [-16.57%, +10.24%] with WAL, and -0.08% +[-11.02%, +12.20%] without WAL. Identical-main controls vary substantially in +both executed work and blocking time despite unchanged initialized file +extents. A review PR is reasonable, but insertion performance remains a merge +concern under a strict 3% no-harm requirement. The final confirmation is +targeted; point lookups and the remaining workload matrix retain their earlier +version labels. The historical results below do not describe the newly applied +implementation unless explicitly identified as highwater. + +The [2026-10-15 slowdown diagnosis](../benchmarks/results-20261015/prefix-slowdown-diagnosis/README.md) +adds phase-scoped hardware counters and profiles for the then-remaining resident +scan and logged-overwrite concerns. That older min4lex implementation executed about 28 extra +instructions per returned key; with statistics disabled it used 1.70% +more user cycles/key with one worker and 2.56% more with eight. Keys are borrowed, +not copied. Prefix-aware validation and loss of compiler inlining explain part +of the cost. The earlier timing harness also enabled statistics, whose per-key +locking substantially reduces multithreaded throughput and introduces a +false-sharing risk. Logged-overwrite losses remain inconclusive amid changing +filesystem/direct-I/O waits and host conditions. Neither of two isolated code +probes was adopted at that stage; runtime source then matched the candidate below. + +The earlier complete evaluation is the +[2026-10-15 optimization and read/write matrix](../benchmarks/results-20261015/prefix-evaluation/README.md). +It compares main `6105c49f`, the frozen branch after boundary-key removal, and +the retained four-byte per-leaf cutoff with direct lexical comparison. It covers +resident/disk point, short and long reads for long-prefix lexical, tiny-prefix +lexical and nonlexical keys; fresh insertions and overwrites with WAL off/on; +space, CPU and physical I/O; and isolated tests of the proposed optimizations. +The branch-flag investigation was an uncompressed-only upper-bound probe; +it did not implement a persisted branch flag. + +The frozen min4lex candidate improved shared-prefix disk long scans by 15.27%, with +29.18% less read I/O and 24.28% less live space. The prepared-fixture random-key +disk repeat improves point/short/long throughput by 7.65% / 8.72% / 5.51%. +Single-worker resident long scans were 2.18–3.06% below main across the three +key patterns. Nonlexical multithreaded scans and logged overwrites retained +inconclusive negative averages. Short insertion results varied substantially; +both the larger logged load and a same-size repeat failed to reproduce the +initial candidate slowdown. The archive preserves every round and its limits. +At that stage a review PR was reasonable, but performance neutrality was not +established and the no-harm requirement remained a merge concern. See the +latest confirmation above for the current assessment. + +The fixed-capacity decode buffer did not show a repeatable speedup and reserved +more memory for these 64-byte keys. The branch-flag upper-bound probe did not +justify persisted metadata changes. Plain runtime-sized `memcpy` still calls +libc in this build and was about 1–2% slower on single-worker compressed scans; +the bounded suffix helper remains. The frozen min4lex source and mixed-prefix +regression passed 142 test cases in each of debug and release, plus functional +log replay. The current highwater source instead has the 320 unit-test executions, +two functional log replays and four fresh production-build checks recorded in +the latest confirmation. See the archives for hashes and raw evidence. + +The following measurements are historical and predate that retained policy. + +The lazy-state fix is now applied. It removes unconditional prefix-buffer +initialization on uncompressed leaves and reduces additional fixed iterator +storage from 38 KiB to 2 KiB. The +[fix validation archive](../benchmarks/results-20261014/prefix-lazy-6105c49f/README.md) +contains the correctness and performance evidence for that stage. The earlier +[nonlexical diagnosis](../benchmarks/results-20261014/prefix-nonlexical-diagnosis/README.md) +and [pre-fix integration comparison](../benchmarks/results-20261014/prefix-main-6105c49f/README.md) +remain as historical evidence, along with the measurements below. All runs used O_DIRECT files on ext4, CPU affinity 0–11, 64-byte keys, 100-byte values and WAL disabled. Loading used one thread and zero background @@ -201,7 +288,7 @@ records exact commands and source/binary hashes. Prior benchmark evidence is preserved under `benchmarks/branch-prefix-history`; it does not establish performance on this new main. -# Current-main integration and performance review, 2026-10-14 +# Current-main integration and performance review, 2026-10-14 (before the lazy-state fix) Merged `origin/main` at `6105c49f` (bounded automatic log groups) without conflicts, as merge commit `97e5c0e3`. The custom IPv4 comparator example now @@ -231,3 +318,79 @@ memory cap. This branch is suitable for review as a PR, but the nonlexical regression and remaining resident scan costs should be addressed before merging the default-enabled feature. Full results, limitations, hashes, commands and validation are in [the current archive](../benchmarks/results-20261014/prefix-main-6105c49f/README.md). + +# Lazy prefix state and performance validation, 2026-10-14 + +Prefix buffers and the cached prefix-page address now live in a lazily allocated +state object. An iterator creates it only when it encounters a compressed +leaf; uncompressed and nonlexical scans continue borrowing keys from the pinned +page. Selection depends on the actual page prefix, preserving reads of +compressed images reopened with construction-time compression disabled. + +| Iterator object | Main | Before fix | After fix | +| --- | ---: | ---: | ---: | +| B-tree iterator | 336 B | 488 B | 344 B | +| Core range iterator | 94,592 B | 133,504 B | 96,640 B | + +This removes 36 KiB of unconditional storage per public iterator and leaves +2 KiB over main. Each compressed child also allocates a 152-byte state object, +before allocator rounding/metadata and full-key buffers. Object sizes do not +establish RSS savings or constant memory savings for compressed workloads. + +Debug and release each passed 141 unit cases plus functional replay of 500,000 +log records. The prefix regression checks lazy allocation and reuse, unchanged +zero-copy behavior for uncompressed leaves, allocation-failure cleanup, and +compressed/uncompressed traversal and reopen. The fault-injection build and +AddressSanitizer with leak detection both passed. + +The direct before/after comparison on identical images measured a 4.00% gain +for resident nonlexical short scans and 4.17% for common-prefix long scans, both +with overlapping sample ranges. Against main, the longer nonlexical short-scan +repeat is now -0.22%, also with overlap; the earlier 5.73% deficit did not persist. + +The feature remains suitable for a review PR but is not performance-ready to +merge: common-prefix resident long scans were 14.71% slower than main in the +longer repeat, with nonoverlapping ranges, 14.69% lower CPU efficiency and +15.88% higher mean p99. Shared-prefix disk points, short scans and long scans +improved 16.21%, 20.13% and 26.71%; file allocation fell 34.51%. Logged random +overwrites including close/drain averaged -5.56% with overlapping ranges; +unlogged random overwrites lost 8.56% in the initial screen. These bounded +writes do not establish steady-state insertion performance. + +An observed 400 MHz host-clock episode confounded the first longer nonlexical +disk comparison. Its data are retained, and the entire three-version group +was repeated with host-clock observations. The recheck avoided that episode +but retained substantial control drift: fixed-version means were 9.63%, 9.72% +and 5.36% lower than main for points, short scans and long scans, with overlapping +sample ranges. Nonlexical disk overhead remains unresolved. All 98 query/write +invocations and 17 fixture load/space pairs passed, with zero errors or +correctness violations. A final fetch still found main at `6105c49f`. The +[fix validation archive](../benchmarks/results-20261014/prefix-lazy-6105c49f/README.md) +records all results, caveats, source/binary hashes and the updated assessment. + +## Boundary-key buffer removal + +The subsequent boundary-comparison optimization removes `bound_key` and its +allocation, copying and teardown. The compressed iterator's scratch state is +now 80 bytes rather than 152, before allocator rounding and decoded-key storage. +The B-tree and core range iterator object sizes remain 344 and 96,640 bytes. +All branch entry validation and comparison directions are preserved. + +The expanded prefix regression covers nearby and cross-leaf seeks, an aliased +current-key seek target, prefix mismatches, and finite inclusive/exclusive +bounds with present and absent endpoints in both directions. Debug and release +each passed all 79 B-tree, merge and public API test cases. The prefix regression +also passed fault injection and AddressSanitizer with leak detection. Commands, +logs and source hashes are retained in `.cache/prefix-bound-key/`. +The direct before/after comparison is now recorded in the +[boundary-key validation archive](../benchmarks/results-20261014/prefix-bound-key/README.md). +All 18 timed invocations and four harness smoke checks passed with zero errors +or correctness violations. A pinned single-worker check averaged +1.26% for +common-prefix forward long scans and +1.74% for reverse long scans, both with +overlapping sample ranges. Eight-worker results were mixed and varied widely; +the apparent +16.66% reverse-scan gain did not persist in every pair. Thermal +throttling and clock variation limit these measurements. The memory reduction +is definite, but a repeatable throughput improvement or regression is not +established. This targeted resident-scan comparison uses the frozen pre-removal +implementation as its baseline and does not clear the earlier regression +against origin/main. diff --git a/src/btree.c b/src/btree.c index fba220fd7..3a67d9f0d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1306,8 +1306,10 @@ btree_read_entry_bounds(const btree_config *cfg, } uint64 offset = hdr->offsets[idx]; uint64 page_size = btree_page_size(cfg) - hdr->prefix_length; - if (offset < hdr->next_entry || page_size <= offset - || page_size - offset < min_size) + /* The offset is uint16, and the only callers pass sizeof(leaf_entry) or + * sizeof(index_entry). Their positive sizes cannot overflow this uint64 + * sum. Checking the header endpoint also rejects offsets at/past the end. */ + if (offset < hdr->next_entry || page_size < offset + min_size) { return STATUS_INVALID_STATE; } @@ -1408,6 +1410,10 @@ btree_read_leaf_message(cache *cc, return STATUS_OK; } +_Static_assert(MAX_INLINE_KEY_SIZE(MAX_PAGE_SIZE) + < ONDISK_KEY_POSITIVE_INFINITY, + "Inline keys must exclude both infinity length encodings"); + static inline platform_status btree_read_leaf_entry(cache *cc, const btree_config *cfg, @@ -1415,8 +1421,30 @@ btree_read_leaf_entry(cache *cc, table_index idx, const leaf_entry **entry_out) { - platform_status rc = btree_read_leaf_key(cfg, hdr, idx, entry_out); - return SUCCESS(rc) ? btree_read_leaf_message(cc, cfg, hdr, *entry_out) : rc; + uint64 offset; + uint64 remaining; + platform_status rc = btree_read_entry_bounds( + cfg, hdr, idx, sizeof(leaf_entry), &offset, &remaining); + if (!SUCCESS(rc)) { + return rc; + } + const leaf_entry *entry = (const leaf_entry *)((const char *)hdr + offset); + /* Checking the full key plus message below also checks the key's byte + * range. Keep key-only reads separate because they do not inspect messages. + */ + /* Supported pages are at most MAX_PAGE_SIZE bytes. The widened full-key + * bound therefore rejects both infinity length encodings as well. */ + if (entry->key_flags != ONDISK_KEY_DEFAULT_FLAGS + || (uint64)entry->key_length + hdr->prefix_length + > MAX_INLINE_KEY_SIZE(btree_page_size(cfg))) + { + return STATUS_INVALID_STATE; + } + rc = btree_read_leaf_message(cc, cfg, hdr, entry); + if (SUCCESS(rc)) { + *entry_out = entry; + } + return rc; } static platform_status @@ -1484,6 +1512,10 @@ btree_find_tuple_checked(const btree_config *cfg, key_length(target) - hdr->prefix_length, (const char *)key_data(target) + hdr->prefix_length); } + bool32 lexical = compressed + || (cfg->data_cfg->key_compare_is_lexical + && !key_is_negative_infinity(target) + && !key_is_positive_infinity(target)); while (lo < hi) { int64 mid = (lo + hi) / 2; const leaf_entry *entry; @@ -1492,11 +1524,10 @@ btree_find_tuple_checked(const btree_config *cfg, return rc; } int cmp = - compressed - ? slice_lex_cmp(key_slice(target), - key_slice(leaf_entry_key((leaf_entry *)entry))) - : btree_key_compare( - cfg, target, leaf_entry_key((leaf_entry *)entry)); + lexical ? slice_lex_cmp(key_slice(target), + key_slice(leaf_entry_key((leaf_entry *)entry))) + : btree_key_compare( + cfg, target, leaf_entry_key((leaf_entry *)entry)); if (cmp == 0) { *found = TRUE; *idx_out = mid; @@ -3362,23 +3393,75 @@ find_key_in_node(btree_iterator *itor, } -/* - * For copied leaves, end_addr is zero while the range continues into another - * leaf. Only a terminating copy sets end_addr to curr.addr and caches its - * exclusive upper bound in end_idx. Interior leaves thus retain the cheap - * address-only bounds check. Copies always have valid bounds; no live-tree - * endpoint lookup is needed. A split after copying may move max_key to a new - * leaf that the copy's old next pointer deliberately skips. +/* Uncompressed leaves return keys directly from the pinned page. Keep their + * iterators small and avoid initializing buffers they will never use. */ +typedef struct btree_iterator_prefix_state { + key_buffer decoded_key; + uint64 prefix_page_addr; + // Cache the buffer's logical high-water length, not its allocation size. + // Keeping that length above the prefix preserves it when the buffer grows. + char *decoded_data; + uint64 decoded_capacity; +} btree_iterator_prefix_state; + +static platform_status +btree_iterator_ensure_prefix_state(btree_iterator *itor) +{ + // Use the page's prefix, not the construction policy, to choose this path: + // compressed leaves can be reopened with compression disabled. + if (itor->prefix_state == NULL) { + itor->prefix_state = + TYPED_ZALLOC(PROCESS_PRIVATE_HEAP_ID, itor->prefix_state); + if (itor->prefix_state == NULL) { + return STATUS_NO_MEMORY; + } + key_buffer_init(&itor->prefix_state->decoded_key, + PROCESS_PRIVATE_HEAP_ID); + } + return STATUS_OK; +} + +/* Keep allocation, buffer growth and prefix replacement off the ordinary + * per-key path. The suffix copy stays inline, including on compressed leaves. */ +static __attribute__((noinline)) platform_status +btree_iterator_prepare_decode(btree_iterator *itor, uint64 key_length) +{ + platform_status rc = btree_iterator_ensure_prefix_state(itor); + if (!SUCCESS(rc)) { + return rc; + } + btree_iterator_prefix_state *state = itor->prefix_state; + if (key_buffer_length(&state->decoded_key) < key_length) { + rc = key_buffer_resize(&state->decoded_key, key_length); + if (!SUCCESS(rc)) { + return rc; + } + } + state->decoded_data = key_buffer_data(&state->decoded_key); + state->decoded_capacity = key_buffer_length(&state->decoded_key); + if (state->prefix_page_addr != itor->curr.addr) { + memcpy(state->decoded_data, + btree_leaf_prefix(itor->cfg, itor->curr.hdr), + itor->curr.hdr->prefix_length); + state->prefix_page_addr = itor->curr.addr; + } + return STATUS_OK; +} + +/* Compare target with a node key without reconstructing compressed keys. + * Branch entries retain the same validation as reads of full keys. */ static inline platform_status -btree_iterator_read_node_key(btree_iterator *itor, - btree_hdr *hdr, - uint64 idx, - key *result) +btree_iterator_compare_node_key(btree_iterator *itor, + btree_hdr *hdr, + uint64 idx, + key target, + int *result) { if (itor->page_type != PAGE_TYPE_BRANCH) { - *result = itor->height ? btree_get_pivot(itor->cfg, hdr, idx) - : btree_get_tuple_key(itor->cfg, hdr, idx); + key node_key = itor->height ? btree_get_pivot(itor->cfg, hdr, idx) + : btree_get_tuple_key(itor->cfg, hdr, idx); + *result = btree_key_compare(itor->cfg, target, node_key); return STATUS_OK; } @@ -3386,7 +3469,7 @@ btree_iterator_read_node_key(btree_iterator *itor, const index_entry *entry; platform_status rc = btree_read_index_key(itor->cfg, hdr, idx, &entry); if (SUCCESS(rc)) { - *result = index_entry_key(entry); + *result = btree_key_compare(itor->cfg, target, index_entry_key(entry)); } return rc; } @@ -3394,11 +3477,19 @@ btree_iterator_read_node_key(btree_iterator *itor, const leaf_entry *entry; platform_status rc = btree_read_leaf_key(itor->cfg, hdr, idx, &entry); if (SUCCESS(rc)) { - rc = btree_leaf_full_key(itor->cfg, hdr, entry, &itor->bound_key, result); + *result = btree_compare_leaf_key(itor->cfg, hdr, target, entry); } return rc; } +/* + * For copied leaves, end_addr is zero while the range continues into another + * leaf. Only a terminating copy sets end_addr to curr.addr and caches its + * exclusive upper bound in end_idx. Interior leaves thus retain the cheap + * address-only bounds check. Copies always have valid bounds; no live-tree + * endpoint lookup is needed. A split after copying may move max_key to a new + * leaf that the copy's old next pointer deliberately skips. + */ static inline platform_status btree_iterator_set_copy_bounds(btree_iterator *itor) { @@ -3413,14 +3504,14 @@ btree_iterator_set_copy_bounds(btree_iterator *itor) return STATUS_OK; } - key last_key; - platform_status rc = btree_iterator_read_node_key( - itor, itor->curr.hdr, num_entries - 1, &last_key); + int cmp; + platform_status rc = btree_iterator_compare_node_key( + itor, itor->curr.hdr, num_entries - 1, itor->max_key, &cmp); if (!SUCCESS(rc)) { itor->validation_status = rc; return rc; } - if (btree_key_compare(itor->cfg, itor->max_key, last_key) > 0) { + if (cmp > 0) { itor->end_addr = has_next ? 0 : itor->curr.addr; itor->end_idx = num_entries; } else { @@ -3538,15 +3629,15 @@ btree_iterator_end_key_beyond_curr(btree_iterator *itor, bool32 *result) return STATUS_OK; } - key last_key; - platform_status rc = btree_iterator_read_node_key( - itor, itor->curr.hdr, num_entries - 1, &last_key); + int cmp; + platform_status rc = btree_iterator_compare_node_key( + itor, itor->curr.hdr, num_entries - 1, itor->max_key, &cmp); if (!SUCCESS(rc)) { itor->validation_status = rc; return rc; } *result = - btree_key_compare(itor->cfg, itor->max_key, last_key) > 0 + cmp > 0 && btree_node_next_addr(itor->cfg, &itor->curr, itor->page_type) != 0; return STATUS_OK; } @@ -3694,18 +3785,15 @@ btree_iterator_check_current(btree_iterator *itor) uint64 prefix_length = itor->curr.hdr->prefix_length; if (prefix_length != 0) { uint64 key_length = prefix_length + entry->key_length; - if (key_buffer_length(&itor->decoded_key) != key_length) { - rc = key_buffer_resize(&itor->decoded_key, key_length); + btree_iterator_prefix_state *state = itor->prefix_state; + if (state == NULL || state->decoded_capacity < key_length + || state->prefix_page_addr != itor->curr.addr) + { + rc = btree_iterator_prepare_decode(itor, key_length); + state = itor->prefix_state; } if (SUCCESS(rc)) { - if (itor->prefix_page_addr != itor->curr.addr) { - memcpy(key_buffer_data(&itor->decoded_key), - btree_leaf_prefix(itor->cfg, itor->curr.hdr), - prefix_length); - itor->prefix_page_addr = itor->curr.addr; - } - btree_copy_key_suffix((char *)key_buffer_data(&itor->decoded_key) - + prefix_length, + btree_copy_key_suffix(state->decoded_data + prefix_length, entry->key_and_message, entry->key_length); } @@ -3757,7 +3845,10 @@ btree_iterator_curr(iterator *base_itor, key *curr_key, message *data) } *curr_key = itor->curr.hdr->prefix_length == 0 ? leaf_entry_key(entry) - : key_buffer_key(&itor->decoded_key); + : key_create(FALSE, + (uint64)itor->curr.hdr->prefix_length + + entry->key_length, + itor->prefix_state->decoded_data); *data = leaf_entry_message(itor->cc, entry); log_trace_key(*curr_key, "btree_iterator_get_curr"); } else { @@ -4354,13 +4445,14 @@ btree_iterator_prev_leaf(btree_iterator *itor) itor->idx = btree_num_entries(itor->curr.hdr) - 1; /* Do a quick check whether this entire leaf is within the range. */ - key first_key; - rc = btree_iterator_read_node_key(itor, itor->curr.hdr, 0, &first_key); + int cmp; + rc = btree_iterator_compare_node_key( + itor, itor->curr.hdr, 0, itor->min_key, &cmp); if (!SUCCESS(rc)) { itor->validation_status = rc; return rc; } - if (btree_key_compare(cfg, itor->min_key, first_key) < 0) { + if (cmp < 0) { itor->curr_min_idx = -1; } else { rc = find_key_in_node(itor, @@ -4555,16 +4647,14 @@ btree_iterator_prev_leaf_async(btree_iterator_async_state *state, uint64 depth) state->itor->idx = btree_num_entries(state->itor->curr.hdr) - 1; /* Do a quick check whether this entire leaf is within the range. */ - rc = btree_iterator_read_node_key( - state->itor, state->itor->curr.hdr, 0, &state->first_key); + int cmp; + rc = btree_iterator_compare_node_key( + state->itor, state->itor->curr.hdr, 0, state->itor->min_key, &cmp); if (!SUCCESS(rc)) { state->itor->validation_status = rc; async_return(state, rc); } - if (btree_key_compare( - state->itor->cfg, state->itor->min_key, state->first_key) - < 0) - { + if (cmp < 0) { state->itor->curr_min_idx = -1; } else { rc = find_key_in_node(state->itor, @@ -4917,27 +5007,21 @@ btree_iterator_seek(iterator *base_itor, comparison seek_type, key seek_key) uint64 num_entries = btree_num_entries(itor->curr.hdr); bool32 seek_current_node = FALSE; if (num_entries != 0) { - key first_key; - key last_key; - platform_status rc = - btree_iterator_read_node_key(itor, itor->curr.hdr, 0, &first_key); + int first_cmp; + int last_cmp; + platform_status rc = btree_iterator_compare_node_key( + itor, itor->curr.hdr, 0, seek_key, &first_cmp); if (!SUCCESS(rc)) { itor->validation_status = rc; return rc; } - /* read_node_key reuses bound_key for compressed leaves. Consume the - * first result before reconstructing the last key into that buffer. */ - bool32 at_or_after_first = - btree_key_compare(itor->cfg, seek_key, first_key) >= 0; - rc = btree_iterator_read_node_key( - itor, itor->curr.hdr, num_entries - 1, &last_key); + rc = btree_iterator_compare_node_key( + itor, itor->curr.hdr, num_entries - 1, seek_key, &last_cmp); if (!SUCCESS(rc)) { itor->validation_status = rc; return rc; } - seek_current_node = - at_or_after_first - && btree_key_compare(itor->cfg, seek_key, last_key) <= 0; + seek_current_node = first_cmp >= 0 && last_cmp <= 0; } if (seek_current_node) { @@ -5032,8 +5116,6 @@ btree_iterator_init_common(cache *cc, key *normalized_start_key) { ZERO_CONTENTS(itor); - key_buffer_init(&itor->decoded_key, PROCESS_PRIVATE_HEAP_ID); - key_buffer_init(&itor->bound_key, PROCESS_PRIVATE_HEAP_ID); platform_status version_rc = btree_validate_root(root_addr, format_version, page_type); if (!SUCCESS(version_rc)) { @@ -5187,8 +5269,11 @@ btree_iterator_deinit(btree_iterator *itor) debug_assert(itor != NULL); btree_prefetch_cursor_deinit(itor); btree_iterator_release_curr(itor); - key_buffer_deinit(&itor->decoded_key); - key_buffer_deinit(&itor->bound_key); + if (itor->prefix_state != NULL) { + key_buffer_deinit(&itor->prefix_state->decoded_key); + platform_free(PROCESS_PRIVATE_HEAP_ID, itor->prefix_state); + itor->prefix_state = NULL; + } if (itor->node_copy != NULL) { platform_free(PROCESS_PRIVATE_HEAP_ID, itor->node_copy); itor->node_copy = NULL; @@ -5421,6 +5506,11 @@ btree_pack_create_next_node(btree_pack_req *req, return STATUS_OK; } +/* Tiny prefixes can impose reconstruction work without improving page + * occupancy. This construction policy is per leaf; readers still accept + * previously written leaves with shorter prefixes. */ +#define BTREE_MIN_LEAF_PREFIX_LENGTH (4) + /* Pull a common prefix out only when the uncompressed leaf first fills. * The prefix lives at the page tail so appending offsets never moves it. */ static bool32 @@ -5441,7 +5531,7 @@ btree_pack_compress_leaf(btree_pack_req *req, btree_hdr *hdr) { prefix++; } - if (prefix == 0) { + if (prefix < BTREE_MIN_LEAF_PREFIX_LENGTH) { return FALSE; } char scratch[MAX_PAGE_SIZE]; diff --git a/src/btree.h b/src/btree.h index 8fb65afb9..40db334be 100644 --- a/src/btree.h +++ b/src/btree.h @@ -218,9 +218,8 @@ typedef struct btree_iterator { // Entry checked by the last successful positioning operation. Branch-tree // curr() reuses it so it does not decode the offset table again. const void *validated_entry; - key_buffer decoded_key; - key_buffer bound_key; - uint64 prefix_page_addr; + // Owned scratch space, allocated only after encountering a compressed leaf. + struct btree_iterator_prefix_state *prefix_state; btree_prefetch_cursor prefetch; btree_pivot_data pivot_data; @@ -483,7 +482,6 @@ DEFINE_ASYNC_STATE(btree_iterator_async_state, 6, local, uint64, next_addr, local, uint64, prev_addr, local, uint64, expected_page_no, - local, key, first_key, local, key, last_key) // clang-format on diff --git a/tests/unit/splinterdb_quick_test.c b/tests/unit/splinterdb_quick_test.c index b62e76caa..1cc2dae71 100644 --- a/tests/unit/splinterdb_quick_test.c +++ b/tests/unit/splinterdb_quick_test.c @@ -1316,6 +1316,511 @@ prefix_test_predicate(void *context, slice k) return slice_lex_cmp(k, predicate->expected) == 0; } +#if PLATFORM_MEMORY_FAULT_INJECTION +static void +prefix_test_init_failure(core_handle *core, + trunk_branch_info *branch, + key start_key) +{ + platform_memory_fault_config saved; + platform_memory_fault_config_get(&saved); + // Fail the lazy state allocation and then the first full-key allocation. + for (uint64 fail_at = 1; fail_at <= 2; fail_at++) { + platform_memory_fault_config fault = saved; + fault.mode = PLATFORM_MEMORY_FAULT_RANGE; + fault.range_start = fail_at; + fault.range_count = 1; + fault.max_failures = 1; + platform_memory_fault_config_set(&fault); + platform_memory_fault_reset_counters(); + platform_memory_fault_enable(); + btree_iterator itor; + platform_status rc = btree_iterator_init(core->cc, + core->cfg.btree_cfg, + &itor, + branch->addr, + branch->format_version, + PAGE_TYPE_BRANCH, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + start_key, + FALSE, + 0, + 0); + platform_memory_fault_counters counters = + platform_memory_fault_get_counters(); + platform_memory_fault_disable(); + platform_memory_fault_config_set(&saved); + if (SUCCESS(rc)) { + btree_iterator_deinit(&itor); + } + ASSERT_EQUAL(1, counters.failure_count); + ASSERT_TRUE(STATUS_IS_EQ(rc, STATUS_NO_MEMORY)); + ASSERT_TRUE(itor.prefix_state == NULL); + } +} +#endif + +static slice +prefix_minimum_test_key(char buffer[64], uint64 ordinal) +{ + const uint8 lengths[] = {1, 3, 4, 7}; + uint64 group = ordinal / 512; + uint64 rank = ordinal % 512; + memset(buffer, 'p', 64); + buffer[0] = 'A' + group; + buffer[lengths[group]] = rank / 2; + buffer[lengths[group] + 1] = rank % 2; + return slice_create(64, buffer); +} + +CTEST2(splinterdb_quick, test_branch_prefix_minimum) +{ + char keybuf[64], value[100]; + memset(value, 'v', sizeof(value)); + for (uint64 i = 0; i < 2048; i++) { + ASSERT_EQUAL(0, + splinterdb_insert(data->kvsb, + prefix_minimum_test_key(keybuf, i), + slice_create(sizeof(value), value), + NULL)); + } + core_handle *core = (core_handle *)splinterdb_get_trunk_handle(data->kvsb); + ASSERT_TRUE(SUCCESS(core_checkpoint(core, 0))); + core_range_iterator scan; + ASSERT_TRUE(SUCCESS(core_range_iterator_init(core, + &scan, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY))); + uint64 ordinal = 0; + uint32 compressed_groups = 0, uncompressed_groups = 0; + while (iterator_can_curr(&scan.super)) { + key found; + message msg; + iterator_curr(&scan.super, &found, &msg); + ASSERT_TRUE(ordinal < 2048); + ASSERT_EQUAL(0, + slice_lex_cmp(key_slice(found), + prefix_minimum_test_key(keybuf, ordinal))); + ASSERT_EQUAL(sizeof(value), message_length(msg)); + ASSERT_STREQN(value, message_data(msg), sizeof(value)); + for (uint64 i = 0; i < scan.num_branches; i++) { + btree_iterator *child = &scan.btree_itor[i]; + if (!scan.btree_itor_initialized[i] || child->curr.hdr == NULL + || child->page_type != PAGE_TYPE_BRANCH + || child->curr.hdr->height != 0 + || !iterator_can_curr(&child->super)) + { + continue; + } + key child_key; + message child_msg; + iterator_curr(&child->super, &child_key, &child_msg); + uint32 group = *(const uint8 *)key_data(child_key) - 'A'; + ASSERT_TRUE(group < 4); + if (child->curr.hdr->prefix_length != 0) { + ASSERT_TRUE(child->curr.hdr->prefix_length >= 4); + compressed_groups |= 1U << group; + } else { + uncompressed_groups |= 1U << group; + } + } + ordinal++; + ASSERT_TRUE(SUCCESS(iterator_next(&scan.super))); + } + core_range_iterator_deinit(&scan); + ASSERT_EQUAL(2048, ordinal); + ASSERT_EQUAL((1U << 2) | (1U << 3), compressed_groups); + ASSERT_EQUAL(3, uncompressed_groups & 3); +} + +/* Cross both the builtin-buffer boundary and subsequent allocation growth. + * The rank precedes the variable tail, so lexical order is independent of + * length. Repeating the lengths also shrinks keys within compressed leaves. */ +static const uint16 prefix_variable_lengths[] = { + 47, + 48, + 49, + 95, + 96, + 97, + 255, + 256, + 257, + 511, + 512, +}; + +static slice +prefix_variable_test_key(char buffer[512], uint64 ordinal) +{ + uint64 length = + prefix_variable_lengths[ordinal % ARRAY_SIZE(prefix_variable_lengths)]; + memset(buffer, 'p', 4); + for (uint64 i = 0; i < sizeof(ordinal); i++) { + buffer[4 + i] = ordinal >> (8 * (sizeof(ordinal) - i - 1)); + } + for (uint64 i = 12; i < length; i++) { + buffer[i] = (ordinal * 17 + i * 13) & 0xff; + } + return slice_create(length, buffer); +} + +static key +prefix_variable_check_current(iterator *itor, uint64 ordinal) +{ + char expected[512]; + key found; + message value; + ASSERT_TRUE(iterator_can_curr(itor)); + iterator_curr(itor, &found, &value); + ASSERT_EQUAL(0, + slice_lex_cmp(key_slice(found), + prefix_variable_test_key(expected, ordinal))); + ASSERT_EQUAL(sizeof(ordinal), message_length(value)); + ASSERT_EQUAL(0, memcmp(message_data(value), &ordinal, sizeof(ordinal))); + return found; +} + +#if PLATFORM_MEMORY_FAULT_INJECTION +static void +prefix_variable_test_growth_failure(core_handle *core, + trunk_branch_info *branch, + uint64 ordinal) +{ + char keybuf[512]; + btree_iterator itor; + ASSERT_TRUE(SUCCESS(btree_iterator_init( + core->cc, + core->cfg.btree_cfg, + &itor, + branch->addr, + branch->format_version, + PAGE_TYPE_BRANCH, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + key_create_from_slice(TRUE, prefix_variable_test_key(keybuf, ordinal)), + FALSE, + 0, + 0))); + prefix_variable_check_current(&itor.super, ordinal); + ASSERT_TRUE(itor.curr.hdr->prefix_length != 0); + ASSERT_TRUE(itor.idx + 1 < itor.curr.hdr->num_entries); + + platform_memory_fault_config saved; + platform_memory_fault_config_get(&saved); + platform_memory_fault_config fault = saved; + fault.mode = PLATFORM_MEMORY_FAULT_RANGE; + fault.range_start = 1; + fault.range_count = 1; + fault.max_failures = 1; + platform_memory_fault_config_set(&fault); + platform_memory_fault_reset_counters(); + platform_memory_fault_enable(); + platform_status rc = iterator_next(&itor.super); + platform_memory_fault_counters counters = + platform_memory_fault_get_counters(); + platform_memory_fault_disable(); + platform_memory_fault_config_set(&saved); + + ASSERT_EQUAL(1, counters.failure_count); + ASSERT_TRUE(STATUS_IS_EQ(rc, STATUS_NO_MEMORY)); + ASSERT_FALSE(iterator_can_curr(&itor.super)); + ASSERT_TRUE(itor.validated_entry == NULL); + btree_iterator_deinit(&itor); +} +#endif + +CTEST2(splinterdb_quick, test_branch_prefix_variable_iterator) +{ + const uint64 count = 512; + char keybuf[512]; + for (uint64 i = 0; i < count; i++) { + ASSERT_EQUAL(0, + splinterdb_insert(data->kvsb, + prefix_variable_test_key(keybuf, i), + slice_create(sizeof(i), &i), + NULL)); + } + core_handle *core = (core_handle *)splinterdb_get_trunk_handle(data->kvsb); + ASSERT_TRUE(SUCCESS(core_checkpoint(core, 0))); + core_range_iterator probe; + ASSERT_TRUE(SUCCESS(core_range_iterator_init(core, + &probe, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY))); + + uint64 total = 0, grows = 0, shrinks = 0, leaf_changes = 0; + uint64 compressed_lengths = 0; + for (uint64 b = 0; b < probe.num_branches; b++) { + btree_iterator *child = &probe.btree_itor[b]; + if (!probe.btree_itor_initialized[b] + || child->page_type != PAGE_TYPE_BRANCH + || !iterator_can_curr(&child->super)) + { + continue; + } + iterator *itor = &child->super; + key first_key; + message first_value; + iterator_curr(itor, &first_key, &first_value); + ASSERT_EQUAL(sizeof(uint64), message_length(first_value)); + uint64 first; + memcpy(&first, message_data(first_value), sizeof(first)); + + /* Do this before the full traversal grows the decode buffer: strict + * seeks using its own current key exercise aliased targets during growth. + */ + uint64 first_leaf_addr = child->curr.addr; + for (uint64 i = first; i < first + ARRAY_SIZE(prefix_variable_lengths); + i++) + { + if (i < first + 6) { + ASSERT_EQUAL(first_leaf_addr, child->curr.addr); + ASSERT_TRUE(child->curr.hdr->prefix_length != 0); + } + key current = prefix_variable_check_current(itor, i); + ASSERT_TRUE( + SUCCESS(iterator_seek(itor, greater_than_or_equal, current))); + current = prefix_variable_check_current(itor, i); + ASSERT_TRUE(SUCCESS(iterator_seek(itor, greater_than, current))); + } + ASSERT_TRUE(SUCCESS( + iterator_seek(itor, + greater_than_or_equal, + key_create_from_slice( + TRUE, prefix_variable_test_key(keybuf, first))))); + + uint64 rows = 0, previous_addr = 0, previous_length = 0; + bool32 previous_compressed = FALSE; + while (iterator_can_curr(itor)) { + uint64 ordinal = first + rows; + ASSERT_TRUE(ordinal < count); + key found = prefix_variable_check_current(itor, ordinal); + uint64 length = key_length(found); + bool32 compressed = child->curr.hdr->prefix_length != 0; + if (compressed) { + ASSERT_TRUE(child->prefix_state != NULL); + compressed_lengths |= + 1ULL << (ordinal % ARRAY_SIZE(prefix_variable_lengths)); + if (previous_compressed) { + if (child->curr.addr == previous_addr) { + grows += length > previous_length; + shrinks += length < previous_length; + } else { + leaf_changes++; + } + } + } + previous_addr = child->curr.addr; + previous_length = length; + previous_compressed = compressed; + rows++; + ASSERT_TRUE(SUCCESS(iterator_next(itor))); + } + + ASSERT_TRUE(SUCCESS(iterator_seek( + itor, + less_than_or_equal, + key_create_from_slice( + TRUE, prefix_variable_test_key(keybuf, first + rows - 1))))); + for (uint64 i = rows; i-- > 0;) { + key current = prefix_variable_check_current(itor, first + i); + ASSERT_TRUE(SUCCESS(iterator_seek(itor, less_than_or_equal, current))); + prefix_variable_check_current(itor, first + i); + ASSERT_TRUE(SUCCESS(iterator_prev(itor))); + } + ASSERT_FALSE(iterator_can_curr(itor)); + total += rows; +#if PLATFORM_MEMORY_FAULT_INJECTION + if (first == 0) { + // Fresh decode buffers: builtin 48 -> allocated 49, and 96 -> 97. + prefix_variable_test_growth_failure(core, &probe.branch[b], 1); + prefix_variable_test_growth_failure(core, &probe.branch[b], 4); + } +#endif + } + core_range_iterator_deinit(&probe); + ASSERT_EQUAL(count, total); + ASSERT_EQUAL((1ULL << ARRAY_SIZE(prefix_variable_lengths)) - 1, + compressed_lengths); + ASSERT_TRUE(grows != 0); + ASSERT_TRUE(shrinks != 0); + ASSERT_TRUE(leaf_changes != 0); +} + +static void +prefix_test_malformed_leaf_entries(core_handle *core, trunk_branch_info *branch) +{ + enum { + BELOW_NEXT_ENTRY, + AT_PHYSICAL_PAGE_END, + AT_PREFIX_RESERVATION, + TRUNCATED_HEADER, + INVALID_KEY_FLAGS, + EXCESSIVE_FULL_KEY, + NEGATIVE_INFINITY_LENGTH, + POSITIVE_INFINITY_LENGTH, + MESSAGE_PAST_PAGE_END, + KEY_MESSAGE_SUM_EXCEEDS_UINT16, + KEY_PAST_PAGE_END, + NUM_FAULTS, + }; + uint64 page_size = btree_page_size(core->cfg.btree_cfg); + char saved_page[IO_DEFAULT_PAGE_SIZE]; + ASSERT_EQUAL(sizeof(saved_page), page_size); + for (uint64 fault = 0; fault < NUM_FAULTS; fault++) { + btree_iterator itor; + ASSERT_TRUE(SUCCESS(btree_iterator_init(core->cc, + core->cfg.btree_cfg, + &itor, + branch->addr, + branch->format_version, + PAGE_TYPE_BRANCH, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + FALSE, + 0, + 0))); + btree_hdr *hdr = itor.curr.hdr; + uint64 next = itor.idx + 1; + ASSERT_TRUE(next < hdr->num_entries); + ASSERT_TRUE(hdr->prefix_length != 0); + uint64 payload_end = page_size - hdr->prefix_length; + leaf_entry *entry = btree_get_leaf_entry(itor.cfg, hdr, next); + memcpy(saved_page, hdr, page_size); + + /* Checkpointing has quiesced the single-threaded fixture. Keep the leaf + * pinned throughout this deliberate corruption, and restore every byte + * before releasing it or allowing any other operation to inspect it. */ + switch (fault) { + case BELOW_NEXT_ENTRY: + hdr->offsets[next] = hdr->next_entry - 1; + break; + case AT_PHYSICAL_PAGE_END: + hdr->offsets[next] = page_size; + break; + case AT_PREFIX_RESERVATION: + hdr->offsets[next] = payload_end; + break; + case TRUNCATED_HEADER: + hdr->offsets[next] = payload_end - sizeof(*entry) + 1; + break; + case INVALID_KEY_FLAGS: + entry->key_flags = ONDISK_KEY_DEFAULT_FLAGS ^ 0x80; + break; + case EXCESSIVE_FULL_KEY: + entry->key_length = + MAX_INLINE_KEY_SIZE(page_size) - hdr->prefix_length + 1; + break; + case NEGATIVE_INFINITY_LENGTH: + entry->key_length = ONDISK_KEY_NEGATIVE_INFINITY; + break; + case POSITIVE_INFINITY_LENGTH: + entry->key_length = ONDISK_KEY_POSITIVE_INFINITY; + break; + case MESSAGE_PAST_PAGE_END: + entry->message_length = payload_end - hdr->offsets[next] + - sizeof(*entry) - entry->key_length + 1; + break; + case KEY_MESSAGE_SUM_EXCEEDS_UINT16: + entry->key_length = 16; + entry->message_length = UINT16_MAX - entry->key_length + 2; + break; + case KEY_PAST_PAGE_END: + { + leaf_entry saved_entry = *entry; + hdr->offsets[next] = payload_end - sizeof(*entry); + entry = (leaf_entry *)((char *)hdr + hdr->offsets[next]); + *entry = saved_entry; + entry->key_length = 1; + entry->message_length = 0; + break; + } + default: + platform_assert(FALSE); + } + platform_status rc = iterator_next(&itor.super); + bool32 exposed = iterator_can_curr(&itor.super); + bool32 retained_entry = itor.validated_entry != NULL; + memcpy(hdr, saved_page, page_size); + btree_iterator_deinit(&itor); + ASSERT_TRUE(STATUS_IS_EQ(rc, STATUS_INVALID_STATE), + "malformed leaf case %lu returned %s", + fault, + platform_status_to_string(rc)); + ASSERT_FALSE(exposed); + ASSERT_FALSE(retained_entry); + } +} + +CTEST2(splinterdb_quick, test_branch_prefix_malformed_leaf_entries) +{ + char keybuf[64]; + for (uint64 i = 0; i < 128; i++) { + ASSERT_EQUAL(0, + splinterdb_insert(data->kvsb, + prefix_test_key(keybuf, i), + slice_create(sizeof(i), &i), + NULL)); + } + core_handle *core = (core_handle *)splinterdb_get_trunk_handle(data->kvsb); + ASSERT_TRUE(SUCCESS(core_checkpoint(core, 0))); + core_range_iterator probe; + ASSERT_TRUE(SUCCESS(core_range_iterator_init(core, + &probe, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY))); + bool32 tested = FALSE; + for (uint64 b = 0; b < probe.num_branches; b++) { + if (probe.btree_itor_initialized[b] + && probe.btree_itor[b].page_type == PAGE_TYPE_BRANCH + && iterator_can_curr(&probe.btree_itor[b].super)) + { + prefix_test_malformed_leaf_entries(core, &probe.branch[b]); + tested = TRUE; + break; + } + } + ASSERT_TRUE(tested); + /* Restoring the pinned page must leave the ordinary merged scan intact. */ + for (uint64 i = 0; i < 128; i++) { + key found; + message value; + ASSERT_TRUE(iterator_can_curr(&probe.super)); + iterator_curr(&probe.super, &found, &value); + ASSERT_EQUAL(0, + slice_lex_cmp(key_slice(found), prefix_test_key(keybuf, i))); + ASSERT_EQUAL(sizeof(i), message_length(value)); + ASSERT_EQUAL(0, memcmp(message_data(value), &i, sizeof(i))); + ASSERT_TRUE(SUCCESS(iterator_next(&probe.super))); + } + ASSERT_FALSE(iterator_can_curr(&probe.super)); + core_range_iterator_deinit(&probe); +} + CTEST2(splinterdb_quick, test_branch_prefix_roundtrip) { const uint64 count = 4096; @@ -1358,10 +1863,15 @@ CTEST2(splinterdb_quick, test_branch_prefix_roundtrip) && probe.btree_itor[i].curr.hdr != NULL) { compressed |= probe.btree_itor[i].curr.hdr->prefix_length != 0; + if (!enabled) { + ASSERT_TRUE(probe.btree_itor[i].prefix_state == NULL); + } else if (probe.btree_itor[i].curr.hdr->prefix_length != 0) { + ASSERT_TRUE(probe.btree_itor[i].prefix_state != NULL); + } } } ASSERT_EQUAL(enabled, compressed); - /* Repeated seeks reuse the first/last-bound reconstruction buffer. */ + /* Exercise boundary comparisons for nearby and cross-leaf seeks. */ for (uint64 branch = 0; branch < probe.num_branches; branch++) { if (!probe.btree_itor_initialized[branch] || probe.btree_itor[branch].curr.hdr == NULL @@ -1373,9 +1883,10 @@ CTEST2(splinterdb_quick, test_branch_prefix_roundtrip) core->cfg.btree_cfg, probe.btree_itor[branch].root_addr, PAGE_TYPE_BRANCH)); - iterator *branch_it = (iterator *)&probe.btree_itor[branch]; - for (uint64 i = 0; i < 64; i++) { - uint64 logical = (i * 19) % 64; + iterator *branch_it = (iterator *)&probe.btree_itor[branch]; + void *prefix_state = probe.btree_itor[branch].prefix_state; + for (uint64 i = 0; i < 128; i++) { + uint64 logical = (i * 7919) % (i < 64 ? 64 : count - 1); slice target = prefix_test_key(keybuf, logical * 2 + 1); ASSERT_TRUE( SUCCESS(iterator_seek(branch_it, @@ -1388,7 +1899,50 @@ CTEST2(splinterdb_quick, test_branch_prefix_roundtrip) 0, slice_lex_cmp(key_slice(found), prefix_test_key(keybuf, (logical + 1) * 2))); + /* Boundary probes must not overwrite an aliased seek target. */ + ASSERT_TRUE( + SUCCESS(iterator_seek(branch_it, greater_than_or_equal, found))); + iterator_curr(branch_it, &found, &value); + ASSERT_EQUAL( + 0, + slice_lex_cmp(key_slice(found), + prefix_test_key(keybuf, (logical + 1) * 2))); + if (prefix_state != NULL) { + ASSERT_TRUE(prefix_state + == probe.btree_itor[branch].prefix_state); + } + prefix_state = probe.btree_itor[branch].prefix_state; + if (!enabled) { + ASSERT_TRUE(prefix_state == NULL); + } + } + for (uint64 side = 0; side < 2; side++) { + memset(keybuf, side ? 'z' : 'a', sizeof(keybuf)); + ASSERT_TRUE(SUCCESS( + iterator_seek(branch_it, + side ? less_than_or_equal : greater_than_or_equal, + key_create_from_slice( + TRUE, slice_create(sizeof(keybuf), keybuf))))); + key found; + message value; + iterator_curr(branch_it, &found, &value); + if (side) { + ASSERT_EQUAL( + 0, + slice_lex_cmp(key_slice(found), + prefix_test_key(keybuf, (count - 1) * 2))); + } else { + ASSERT_EQUAL(48, key_length(found)); + } } +#if PLATFORM_MEMORY_FAULT_INJECTION + if (enabled && prefix_state != NULL) { + prefix_test_init_failure( + core, + &probe.branch[branch], + key_create_from_slice(TRUE, prefix_test_key(keybuf, 0))); + } +#endif } core_range_iterator_deinit(&probe); @@ -1462,6 +2016,50 @@ CTEST2(splinterdb_quick, test_branch_prefix_roundtrip) ASSERT_EQUAL(0, splinterdb_iterator_status(it)); splinterdb_iterator_deinit(it); + /* Finite bounds cross compressed leaves, including absent endpoints and + * all inclusive/exclusive combinations after changing the create policy. + */ + for (uint64 missing = 0; missing < 2; missing++) { + for (uint64 bounds = 0; bounds < 4; bounds++) { + bool32 min_inclusive = (bounds & 1) != 0; + bool32 max_inclusive = (bounds & 2) != 0; + char minbuf[64]; + char maxbuf[64]; + slice min = prefix_test_key(minbuf, 2 * (count / 3) + missing); + slice max = prefix_test_key(maxbuf, 2 * (2 * count / 3) + missing); + uint64 first = count / 3 + (missing || !min_inclusive); + uint64 last = 2 * count / 3 - (!missing && !max_inclusive); + for (uint64 reverse = 0; reverse < 2; reverse++) { + ASSERT_EQUAL( + 0, + splinterdb_iterator_init_with_bounds( + data->kvsb, + &it, + min_inclusive ? greater_than_or_equal : greater_than, + min, + max_inclusive ? less_than_or_equal : less_than, + max, + reverse ? less_than_or_equal : greater_than_or_equal, + NULL_SLICE)); + for (uint64 i = first; i <= last; i++) { + uint64 logical = reverse ? last - (i - first) : i; + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + ASSERT_EQUAL( + 0, slice_lex_cmp(k, prefix_test_key(keybuf, logical * 2))); + if (reverse) { + splinterdb_iterator_prev(it); + } else { + splinterdb_iterator_next(it); + } + } + ASSERT_FALSE(splinterdb_iterator_valid(it)); + ASSERT_EQUAL(0, splinterdb_iterator_status(it)); + splinterdb_iterator_deinit(it); + } + } + } + /* Exercise both predicate-only and routing-pruned scans over compressed * leaves, in either direction, after reopening with a different policy. */ From 5fc43c310099ce06d72a7f2351ee7fbd600caa86 Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Fri, 16 Oct 2026 17:19:29 -0700 Subject: [PATCH 09/11] optimize nonlexical btree operations Signed-off-by: Rob Johnson --- src/btree.c | 121 ++++++++++--- src/platform_linux/laio.c | 2 + src/platform_linux/platform_io.h | 5 +- tests/unit/splinterdb_quick_test.c | 269 +++++++++++++++++++++++++++++ 4 files changed, 369 insertions(+), 28 deletions(-) diff --git a/src/btree.c b/src/btree.c index 3a67d9f0d..48aafed24 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1309,8 +1309,7 @@ btree_read_entry_bounds(const btree_config *cfg, /* The offset is uint16, and the only callers pass sizeof(leaf_entry) or * sizeof(index_entry). Their positive sizes cannot overflow this uint64 * sum. Checking the header endpoint also rejects offsets at/past the end. */ - if (offset < hdr->next_entry || page_size < offset + min_size) - { + if (offset < hdr->next_entry || page_size < offset + min_size) { return STATUS_INVALID_STATE; } *offset_out = offset; @@ -1380,6 +1379,25 @@ btree_read_leaf_key(const btree_config *cfg, return STATUS_OK; } +/* Every nonzero value representable by the type bits is a valid user type. + * Together with the allowed-flags check below, rejecting zero therefore + * rejects exactly the same bytes as the full user-type interval check. */ +_Static_assert(MESSAGE_TYPE_INVALID == 0, + "Leaf message validation requires zero to be invalid"); +_Static_assert(MESSAGE_TYPE_MAX_VALID_USER_TYPE == ONDISK_MESSAGE_TYPE_MASK, + "All nonzero on-disk message type values must be valid"); + +/* Descriptor scratch is needed only for blob messages. Keep that stack frame + * out of the ordinary inline-message validation path. */ +static __attribute__((noinline)) platform_status +btree_read_leaf_blob(cache *cc, const leaf_entry *entry) +{ + parsed_blob pblob; + slice descriptor = slice_create(entry->message_length, + entry->key_and_message + entry->key_length); + return blob_parse_descriptor(cc, descriptor, &pblob); +} + static inline platform_status btree_read_leaf_message(cache *cc, const btree_config *cfg, @@ -1392,17 +1410,13 @@ btree_read_leaf_message(cache *cc, if ((entry->flags & ~(ONDISK_MESSAGE_TYPE_MASK | ONDISK_MESSAGE_IS_BLOB)) != 0 || message_class == MESSAGE_TYPE_INVALID - || message_class > MESSAGE_TYPE_MAX_VALID_USER_TYPE || (uint64)entry->key_length + entry->message_length > remaining - sizeof(*entry)) { return STATUS_INVALID_STATE; } if (ondisk_tuple_message_is_blob(entry)) { - parsed_blob pblob; - slice descriptor = slice_create( - entry->message_length, entry->key_and_message + entry->key_length); - platform_status rc = blob_parse_descriptor(cc, descriptor, &pblob); + platform_status rc = btree_read_leaf_blob(cc, entry); if (!SUCCESS(rc)) { return rc; } @@ -1488,6 +1502,47 @@ btree_find_pivot_checked(const btree_config *cfg, return STATUS_OK; } +/* The caller initializes *found and selects callback semantics once for the + * leaf. Keep all checked-key reads before invoking the user's comparator. */ +static inline platform_status +btree_find_tuple_callback_checked(const btree_config *cfg, + const btree_hdr *hdr, + key target, + bool32 *found, + int64 *idx_out, + const leaf_entry **entry_out) +{ + int64 lo = 0, hi = btree_num_entries(hdr); + while (lo < hi) { + int64 mid = (lo + hi) / 2; + const leaf_entry *entry; + platform_status rc = btree_read_leaf_key(cfg, hdr, mid, &entry); + if (!SUCCESS(rc)) { + return rc; + } + int cmp = + btree_key_compare(cfg, target, leaf_entry_key((leaf_entry *)entry)); + if (cmp == 0) { + *found = TRUE; + *idx_out = mid; + if (entry_out != NULL) { + *entry_out = entry; + } + return STATUS_OK; + } + if (cmp > 0) { + lo = mid + 1; + } else { + hi = mid; + } + } + *idx_out = lo - 1; + if (entry_out != NULL) { + *entry_out = NULL; + } + return STATUS_OK; +} + static platform_status btree_find_tuple_checked(const btree_config *cfg, const btree_hdr *hdr, @@ -1516,6 +1571,10 @@ btree_find_tuple_checked(const btree_config *cfg, || (cfg->data_cfg->key_compare_is_lexical && !key_is_negative_infinity(target) && !key_is_positive_infinity(target)); + if (!lexical) { + return btree_find_tuple_callback_checked( + cfg, hdr, target, found, idx_out, entry_out); + } while (lo < hi) { int64 mid = (lo + hi) / 2; const leaf_entry *entry; @@ -1523,11 +1582,8 @@ btree_find_tuple_checked(const btree_config *cfg, if (!SUCCESS(rc)) { return rc; } - int cmp = - lexical ? slice_lex_cmp(key_slice(target), - key_slice(leaf_entry_key((leaf_entry *)entry))) - : btree_key_compare( - cfg, target, leaf_entry_key((leaf_entry *)entry)); + int cmp = slice_lex_cmp(key_slice(target), + key_slice(leaf_entry_key((leaf_entry *)entry))); if (cmp == 0) { *found = TRUE; *idx_out = mid; @@ -3760,6 +3816,30 @@ btree_iterator_can_next(iterator *base_itor) || (itor->idx < itor->end_idx && itor->curr_min_idx != itor->end_idx); } +/* Keep the uncompressed entry-validation path small. Compressed leaves pay + * this call after validation; their decode algorithm and buffer ownership are + * unchanged. */ +static __attribute__((noinline)) platform_status +btree_iterator_decode_current(btree_iterator *itor, const leaf_entry *entry) +{ + uint64 prefix_length = itor->curr.hdr->prefix_length; + uint64 key_length = prefix_length + entry->key_length; + btree_iterator_prefix_state *state = itor->prefix_state; + platform_status rc = STATUS_OK; + if (state == NULL || state->decoded_capacity < key_length + || state->prefix_page_addr != itor->curr.addr) + { + rc = btree_iterator_prepare_decode(itor, key_length); + state = itor->prefix_state; + } + if (SUCCESS(rc)) { + btree_copy_key_suffix(state->decoded_data + prefix_length, + entry->key_and_message, + entry->key_length); + } + return rc; +} + /* * curr() cannot report errors. Every positioning operation therefore reads * and checks the entry it is about to expose before returning success. @@ -3782,21 +3862,8 @@ btree_iterator_check_current(btree_iterator *itor) itor->cc, itor->cfg, itor->curr.hdr, itor->idx, &entry); if (SUCCESS(rc)) { itor->validated_entry = entry; - uint64 prefix_length = itor->curr.hdr->prefix_length; - if (prefix_length != 0) { - uint64 key_length = prefix_length + entry->key_length; - btree_iterator_prefix_state *state = itor->prefix_state; - if (state == NULL || state->decoded_capacity < key_length - || state->prefix_page_addr != itor->curr.addr) - { - rc = btree_iterator_prepare_decode(itor, key_length); - state = itor->prefix_state; - } - if (SUCCESS(rc)) { - btree_copy_key_suffix(state->decoded_data + prefix_length, - entry->key_and_message, - entry->key_length); - } + if (itor->curr.hdr->prefix_length != 0) { + rc = btree_iterator_decode_current(itor, entry); } } } else { diff --git a/src/platform_linux/laio.c b/src/platform_linux/laio.c index c275ce781..72c1ee565 100644 --- a/src/platform_linux/laio.c +++ b/src/platform_linux/laio.c @@ -513,6 +513,8 @@ typedef struct laio_async_state { _Static_assert( sizeof(laio_async_state) <= IO_ASYNC_STATE_BUFFER_SIZE, "laio_async_read_state is to large for IO_ASYNC_STATE_BUFFER_SIZE"); +_Static_assert(_Alignof(laio_async_state) <= _Alignof(io_async_state_buffer), + "io_async_state_buffer has insufficient alignment"); static void laio_async_state_deinit(io_async_state *ios) diff --git a/src/platform_linux/platform_io.h b/src/platform_linux/platform_io.h index 463d75813..f279e34a0 100644 --- a/src/platform_linux/platform_io.h +++ b/src/platform_linux/platform_io.h @@ -71,7 +71,10 @@ typedef platform_status (*io_range_is_readable_fn)(io_handle *io, bool32 *readable); #define IO_ASYNC_STATE_BUFFER_SIZE (1024) -typedef uint8 io_async_state_buffer[IO_ASYNC_STATE_BUFFER_SIZE]; +/* Backends store their native async state in this opaque byte buffer. Its + * alignment must hold when embedded after a smaller field in another state. */ +typedef uint8 io_async_state_buffer[IO_ASYNC_STATE_BUFFER_SIZE] + __attribute__((aligned(_Alignof(max_align_t)))); typedef enum { io_async_preadv, io_async_pwritev } io_async_cmd; typedef platform_status (*io_async_state_init_fn)(io_async_state *state, io_handle *io, diff --git a/tests/unit/splinterdb_quick_test.c b/tests/unit/splinterdb_quick_test.c index 1cc2dae71..bbbdf2498 100644 --- a/tests/unit/splinterdb_quick_test.c +++ b/tests/unit/splinterdb_quick_test.c @@ -1672,6 +1672,8 @@ prefix_test_malformed_leaf_entries(core_handle *core, trunk_branch_info *branch) AT_PREFIX_RESERVATION, TRUNCATED_HEADER, INVALID_KEY_FLAGS, + INVALID_MESSAGE_TYPE, + INVALID_MESSAGE_FLAGS, EXCESSIVE_FULL_KEY, NEGATIVE_INFINITY_LENGTH, POSITIVE_INFINITY_LENGTH, @@ -1727,6 +1729,12 @@ prefix_test_malformed_leaf_entries(core_handle *core, trunk_branch_info *branch) case INVALID_KEY_FLAGS: entry->key_flags = ONDISK_KEY_DEFAULT_FLAGS ^ 0x80; break; + case INVALID_MESSAGE_TYPE: + entry->flags &= ~ONDISK_MESSAGE_TYPE_MASK; + break; + case INVALID_MESSAGE_FLAGS: + entry->flags |= 0x80; + break; case EXCESSIVE_FULL_KEY: entry->key_length = MAX_INLINE_KEY_SIZE(page_size) - hdr->prefix_length + 1; @@ -3269,6 +3277,267 @@ CTEST2(splinterdb_quick, test_write_api_old_result_respects_trunk_delete_shadow) splinterdb_lookup_result_deinit(&old_result); } +static slice +nonlexical_branch_test_key(char buffer[16], uint64 ordinal) +{ + memset(buffer, 0, 16); + buffer[0] = (uint8)(255 - (ordinal & 255)); + for (uint64 i = 0; i < 8; i++) { + buffer[8 + i] = (uint8)(ordinal >> (56 - 8 * i)); + } + return slice_create(16, buffer); +} + +static int +nonlexical_branch_test_compare(const data_config *cfg, + user_key first, + user_key second) +{ + platform_assert(slice_length(first.key) == 16); + platform_assert(slice_length(second.key) == 16); + /* Ignore the reversed leading byte and order by the encoded ordinal. */ + return slice_lex_cmp( + slice_create(8, (const char *)slice_data(first.key) + 8), + slice_create(8, (const char *)slice_data(second.key) + 8)); +} + +static void +nonlexical_branch_check_result(lookup_result *result, uint64 expected) +{ + ASSERT_TRUE(lookup_result_found(result)); + message value = + merge_accumulator_to_message(lookup_result_accumulator(result)); + ASSERT_EQUAL(sizeof(expected), message_length(value)); + ASSERT_EQUAL(0, memcmp(message_data(value), &expected, sizeof(expected))); +} + +static uint32 +nonlexical_branch_test_hash(const data_config *cfg, user_key k, uint32 seed) +{ + platform_assert(slice_length(k.key) == 16); + return platform_hash32((const char *)slice_data(k.key) + 8, 8, seed); +} + +/* Check real packed branches with a comparator whose order differs from byte + * order. Direct B-tree misses deliberately bypass core routing filters, so + * both lookup APIs must actually search and reject an absent leaf key. */ +CTEST2(splinterdb_quick, test_immutable_branch_custom_comparator) +{ + enum { COUNT = 1024 }; + ASSERT_EQUAL(0, splinterdb_close(&data->kvsb, FALSE)); + data->default_data_cfg.super.key_compare = nonlexical_branch_test_compare; + data->default_data_cfg.super.key_hash = nonlexical_branch_test_hash; + data->default_data_cfg.super.key_compare_is_lexical = FALSE; + ASSERT_EQUAL(0, splinterdb_create(&data->cfg, &data->kvsb)); + + char keybuf[16], otherbuf[16]; + slice first = nonlexical_branch_test_key(keybuf, 0); + slice second = nonlexical_branch_test_key(otherbuf, 2); + ASSERT_TRUE(slice_lex_cmp(first, second) > 0); + ASSERT_TRUE(nonlexical_branch_test_compare(&data->default_data_cfg.super, + (user_key){.key = first}, + (user_key){.key = second}) + < 0); + for (uint64 i = 0; i < COUNT; i++) { + uint64 ordinal = (i * 419) % COUNT; + ASSERT_EQUAL( + 0, + splinterdb_insert(data->kvsb, + nonlexical_branch_test_key(keybuf, 2 * ordinal), + slice_create(sizeof(ordinal), &ordinal), + NULL)); + } + core_handle *core = (core_handle *)splinterdb_get_trunk_handle(data->kvsb); + ASSERT_TRUE(SUCCESS(core_checkpoint(core, 0))); + ASSERT_EQUAL(0, splinterdb_close(&data->kvsb, FALSE)); + ASSERT_EQUAL(0, splinterdb_open(&data->cfg, &data->kvsb)); + core = (core_handle *)splinterdb_get_trunk_handle(data->kvsb); + + core_range_iterator probe; + ASSERT_TRUE(SUCCESS(core_range_iterator_init(core, + &probe, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY, + less_than, + POSITIVE_INFINITY_KEY, + greater_than_or_equal, + NEGATIVE_INFINITY_KEY))); + bool32 visited[COUNT] = {0}; + lookup_result result; + lookup_result_init( + &result, core->cfg.data_cfg, SPLINTERDB_LOOKUP_VALUE, 0, NULL); + for (uint64 branch = 0; branch < probe.num_branches; branch++) { + if (!probe.btree_itor_initialized[branch] + || probe.btree_itor[branch].page_type != PAGE_TYPE_BRANCH) + { + continue; + } + btree_iterator *bt = &probe.btree_itor[branch]; + iterator *it = &bt->super; + ASSERT_TRUE(SUCCESS( + iterator_seek(it, greater_than_or_equal, NEGATIVE_INFINITY_KEY))); + uint64 previous = 0; + bool32 initial = TRUE; + while (iterator_can_curr(it)) { + key stored; + message value; + iterator_curr(it, &stored, &value); + ASSERT_EQUAL(16, key_length(stored)); + uint64 ordinal = 0; + for (uint64 i = 8; i < 16; i++) { + ordinal = (ordinal << 8) | ((const uint8 *)key_data(stored))[i]; + } + ASSERT_EQUAL(0, ordinal % 2); + ASSERT_TRUE(ordinal / 2 < COUNT); + ASSERT_TRUE(initial || previous < ordinal); + initial = FALSE; + previous = ordinal; + visited[ordinal / 2] = TRUE; + slice target = nonlexical_branch_test_key(keybuf, ordinal); + ASSERT_EQUAL(0, slice_lex_cmp(key_slice(stored), target)); + ASSERT_TRUE(SUCCESS(btree_lookup(core->cc, + core->cfg.btree_cfg, + bt->root_addr, + probe.branch[branch].format_version, + PAGE_TYPE_BRANCH, + key_create_from_slice(TRUE, target), + &result))); + nonlexical_branch_check_result(&result, ordinal / 2); + ASSERT_TRUE(SUCCESS( + async_call_sync_callback(cache_cleanup(core->cc), + btree_lookup_async, + core->cc, + core->cfg.btree_cfg, + bt->root_addr, + probe.branch[branch].format_version, + PAGE_TYPE_BRANCH, + key_create_from_slice(TRUE, target), + &result))); + nonlexical_branch_check_result(&result, ordinal / 2); + + target = nonlexical_branch_test_key(keybuf, ordinal + 1); + ASSERT_TRUE(SUCCESS(btree_lookup(core->cc, + core->cfg.btree_cfg, + bt->root_addr, + probe.branch[branch].format_version, + PAGE_TYPE_BRANCH, + key_create_from_slice(TRUE, target), + &result))); + ASSERT_FALSE(lookup_result_found(&result)); + ASSERT_TRUE(SUCCESS( + async_call_sync_callback(cache_cleanup(core->cc), + btree_lookup_async, + core->cc, + core->cfg.btree_cfg, + bt->root_addr, + probe.branch[branch].format_version, + PAGE_TYPE_BRANCH, + key_create_from_slice(TRUE, target), + &result))); + ASSERT_FALSE(lookup_result_found(&result)); + ASSERT_TRUE(SUCCESS(iterator_next(it))); + } + + /* A corrupt first-probe key extent must be rejected before passing its + * invalid length to the custom comparator. Restore before assertions + * and normal tree destruction. The fixture is single-threaded. */ + ASSERT_TRUE(SUCCESS( + iterator_seek(it, greater_than_or_equal, NEGATIVE_INFINITY_KEY))); + ASSERT_TRUE(iterator_can_curr(it)); + leaf_entry *entry = btree_get_leaf_entry( + core->cfg.btree_cfg, bt->curr.hdr, bt->curr.hdr->num_entries / 2); + ASSERT_EQUAL(sizeof(keybuf), entry->key_length); + memcpy(keybuf, entry->key_and_message, sizeof(keybuf)); + key query = + key_create_from_slice(TRUE, slice_create(sizeof(keybuf), keybuf)); + uint16 saved_length = entry->key_length; + entry->key_length = UINT16_MAX; + platform_status sync_rc = + btree_lookup(core->cc, + core->cfg.btree_cfg, + bt->root_addr, + probe.branch[branch].format_version, + PAGE_TYPE_BRANCH, + query, + &result); + bool32 sync_found = lookup_result_found(&result); + platform_status async_rc = + async_call_sync_callback(cache_cleanup(core->cc), + btree_lookup_async, + core->cc, + core->cfg.btree_cfg, + bt->root_addr, + probe.branch[branch].format_version, + PAGE_TYPE_BRANCH, + query, + &result); + bool32 async_found = lookup_result_found(&result); + entry->key_length = saved_length; + ASSERT_TRUE(STATUS_IS_EQ(sync_rc, STATUS_INVALID_STATE)); + ASSERT_TRUE(STATUS_IS_EQ(async_rc, STATUS_INVALID_STATE)); + ASSERT_FALSE(sync_found); + ASSERT_FALSE(async_found); + } + lookup_result_deinit(&result); + core_range_iterator_deinit(&probe); + for (uint64 i = 0; i < COUNT; i++) { + ASSERT_TRUE( + visited[i], "key %lu was not checked in an immutable branch", i); + } + + for (bool32 reverse = FALSE; reverse <= TRUE; reverse++) { + splinterdb_iterator *it; + ASSERT_EQUAL(0, + splinterdb_iterator_init(data->kvsb, + &it, + reverse ? less_than_or_equal + : greater_than_or_equal, + NULL_SLICE)); + for (uint64 i = 0; i < COUNT; i++) { + uint64 expected = reverse ? COUNT - 1 - i : i; + slice k, v; + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + ASSERT_EQUAL( + 0, + slice_lex_cmp(k, nonlexical_branch_test_key(keybuf, 2 * expected))); + ASSERT_EQUAL(sizeof(expected), slice_length(v)); + ASSERT_EQUAL(0, memcmp(slice_data(v), &expected, sizeof(expected))); + if (reverse) { + splinterdb_iterator_prev(it); + } else { + splinterdb_iterator_next(it); + } + } + ASSERT_FALSE(splinterdb_iterator_valid(it)); + ASSERT_EQUAL(0, splinterdb_iterator_status(it)); + splinterdb_iterator_deinit(it); + + for (uint64 i = 0; i < COUNT; i += 31) { + uint64 expected = i + !reverse; + ASSERT_EQUAL(0, + splinterdb_iterator_init( + data->kvsb, + &it, + reverse ? less_than_or_equal : greater_than_or_equal, + nonlexical_branch_test_key(keybuf, 2 * i + 1))); + if (expected < COUNT) { + slice k, v; + ASSERT_TRUE(splinterdb_iterator_valid(it)); + splinterdb_iterator_get_current(it, &k, &v); + ASSERT_EQUAL( + 0, + slice_lex_cmp(k, + nonlexical_branch_test_key(keybuf, 2 * expected))); + } else { + ASSERT_FALSE(splinterdb_iterator_valid(it)); + } + ASSERT_EQUAL(0, splinterdb_iterator_status(it)); + splinterdb_iterator_deinit(it); + } + } +} + CTEST2(splinterdb_quick, test_iterator_custom_comparator) { // We need to reconfigure Splinter with user-specified key comparator fn. From 8c19283999ecfc792ca2ac0e263e24e8f9a9f934 Mon Sep 17 00:00:00 2001 From: Rob Johnson Date: Fri, 16 Oct 2026 17:31:34 -0700 Subject: [PATCH 10/11] Prepare branch prefix compression for review Signed-off-by: Rob Johnson --- benchmarks/branch-prefix-evaluation/README.md | 160 + .../evidence-manifest.json | 4467 +++++++++++++++++ .../branch-prefix-evaluation/evidence.tar.gz | Bin 0 -> 12290329 bytes .../final-results.csv | 10 + .../final-results.json | 116 + .../merge-validation-manifest.json | 204 + .../merge-validation.tar.gz | Bin 0 -> 34954 bytes .../preparation-checks.json | 38 + .../version-rejection.json | 32 + benchmarks/btree_prefix_bench.c | 1250 +++++ benchmarks/build_btree_prefix_bench.py | 164 + docs/branch-prefix-experiment.md | 23 +- format-check.sh | 18 +- tests/unit/splinter_test.c | 139 + 14 files changed, 6615 insertions(+), 6 deletions(-) create mode 100644 benchmarks/branch-prefix-evaluation/README.md create mode 100644 benchmarks/branch-prefix-evaluation/evidence-manifest.json create mode 100644 benchmarks/branch-prefix-evaluation/evidence.tar.gz create mode 100644 benchmarks/branch-prefix-evaluation/final-results.csv create mode 100644 benchmarks/branch-prefix-evaluation/final-results.json create mode 100644 benchmarks/branch-prefix-evaluation/merge-validation-manifest.json create mode 100644 benchmarks/branch-prefix-evaluation/merge-validation.tar.gz create mode 100644 benchmarks/branch-prefix-evaluation/preparation-checks.json create mode 100644 benchmarks/branch-prefix-evaluation/version-rejection.json create mode 100644 benchmarks/btree_prefix_bench.c create mode 100644 benchmarks/build_btree_prefix_bench.py diff --git a/benchmarks/branch-prefix-evaluation/README.md b/benchmarks/branch-prefix-evaluation/README.md new file mode 100644 index 000000000..2419352ce --- /dev/null +++ b/benchmarks/branch-prefix-evaluation/README.md @@ -0,0 +1,160 @@ +# Branch prefix compression: final evaluation + +The final implementation has no apparent nonlexical throughput regression +above the requested 2-3% range in the measured resident B-tree workloads. +All nine estimates are within 0.9% of main, and all nominal 95% intervals have +their lower endpoint above -2.1%. This supports merging on performance grounds +under the chosen scope. It is a single-machine exploratory evaluation, not a +universal or simultaneous equivalence guarantee. + +The implementation is commit `5fc43c310099ce06d72a7f2351ee7fbd600caa86`. +The reference is main `6105c49f66a24d3006ba0464d9558b52e692e27c`, also the remote +main tip checked on 2026-10-16. The final frozen variant is +`selected-io-alignment`, built from the original candidate `b9cc3ea4` plus the +selected read changes and I/O alignment repair. Applied runtime sources match +that build except for a recorded brace-formatting correction in `btree.c`. +Subsequent merge preparation adds tests, documentation and formatter handling; +it does not change runtime code. + +## Nonlexical results + +Positive values mean higher throughput. Random insertion uses a separate fixed +18-pair follow-up; the other rows use six pairs. The earlier, less precise +insertion result is retained in the evidence. No samples were discarded or +pooled between campaigns. [CSV](final-results.csv) and [JSON](final-results.json) +include absolute rates and instruction counts. + +| Operation | Throughput vs main | Nominal 95% interval | Pairs | +| --- | ---: | ---: | ---: | +| Random insert | -0.26% | [-0.84%, +0.33%] | 18 | +| Sorted insert | +0.74% | [-2.07%, +3.64%] | 6 | +| Overwrite | -0.38% | [-1.82%, +1.08%] | 6 | +| Pack from array | -0.89% | [-1.83%, +0.06%] | 6 | +| Point hit | +0.30% | [-0.88%, +1.50%] | 6 | +| Point miss | -0.31% | [-1.14%, +0.54%] | 6 | +| One-key scan | -0.70% | [-1.85%, +0.46%] | 6 | +| 10,000-key scan | +0.90% | [-0.90%, +2.73%] | 6 | +| Full 200,000-key scan | +0.40% | [-0.73%, +1.54%] | 6 | + +The selected read changes improved nonlexical 10,000-key and full scans by +4.25% and 4.93% relative to the original candidate. Compressed-key decoding and +blob-descriptor scratch are moved out of ordinary validation, allowing the +common validator to inline. Leaf search selects callback or lexical comparison +once before binary search, and message-type checking removes a redundant bound +protected by static assertions. Nonlexical keys still reference the page +directly; these paths add no decoded-key allocation. + +Residual instructions relative to main are about +1.52% for packing, ++3.47-3.64% for point queries and one-key scans, and +2.34% for long scans. +Insert/overwrite instruction counts are essentially unchanged. The remaining +instruction differences did not produce a resolved throughput regression. + +## Lexical tradeoffs and space + +Users opting into lexical ordering retain the space/CPU tradeoff. In the +read-optimization confirmation before the alignment repair, common-prefix +packing was 7.53% slower than main and 10,000-key scans were 5.49% slower. +Point hits, misses and one-key scans were respectively 2.00%, 6.20% and 4.26% +faster. These comparisons use six paired repetitions; the complete intervals +are in the archived nonlexical investigation's lexical-control table. + +The final aligned candidate's compressed full-scan control was -0.99% +[-2.74%, +0.80%] versus main. Other lexical operations were not retimed after +the alignment repair. The earlier complete on/off/main matrix is retained +separately, so its results are not attributed to the final binary. + +Common-prefix packed allocation fell from 35.129 MiB to 25.379 MiB (27.75%), +with 6,261 leaves instead of 8,696. Nonlexical packed allocation and leaf count +were identical to main: 36,835,328 bytes and 8,696 leaves. Compression adds no +new I/O operation; the header grows by two bytes. Different packing boundaries +can still affect individual queries. This resident campaign makes no new +on-disk throughput claim. + +## Scope and controls + +Measurements use one worker on CPU 2 of an Intel i7-12800H, GCC 14.2 release +builds with `-O3 -flto -march=native`, 200,000 64-byte keys, 100-byte inline +values and a 512 MiB cache. The cache size is not a whole-process memory cap. +Scratch databases use real disk, while timed phases are resident: storage I/O, +asynchronous-I/O counters and major faults remain zero. Hardware counters +report full coverage. Shared locks serialize builds and benchmark workloads. + +Writes target a mutable B-tree; point queries and scans use packed trees. +Packing reads from a prepared tuple array, excluding source-iterator tree +work, input generation/sorting, request setup and output reclamation. Scan +timing includes iterator initialization and teardown. Timed consumers +accumulate checksums; checksum comparisons and full correctness oracles run +outside timed phases. This is not a disk, concurrent, or blob-heavy performance +evaluation. + +## Correctness and format compatibility + +The read changes passed 87 release, 87 debug and 36 fault-injection test +executions. Sanitizers then exposed a preexisting asynchronous-I/O state +alignment defect, reproduced on the original candidate. The repair aligns the +opaque state buffer to `max_align_t` and checks backend alignment statically. +It passed 36 focused ASan/UBSan executions plus the cold custom-comparator +regression in release, debug and fault-injection builds. Original failure logs +and the repair evidence are preserved. LeakSanitizer was disabled; ASan and +UBSan remained enabled, without alignment suppression. + +The [persisted-version verification](version-rejection.json) adds 42 passing +executions across release, debug and ASan/UBSan: all 12 B-tree tests plus the +invalid-reference and persisted-old-version tests in each build. Version 1 is +rejected before branch-page interpretation. Clean reopen is lazy; synchronous +and asynchronous point reads and range initialization reject an affected old +branch. Recovery rejects during mount when rebuilding allocation state. +Restoring version 2 permits cold remount and correct tuple retrieval. Existing +NULL-cache tests independently prove early rejection before branch-page +access. No migration or eager whole-tree validation is introduced. + +`data_config.key_compare_is_lexical` promises exact unsigned-byte lexical order, +including shorter equal prefixes sorting first, for stored and query keys. +The default comparator opts in; applications installing a different ordering +must clear the flag. Compression is chosen per leaf with a four-byte minimum +common prefix. Uncompressed and mutable keys remain complete. + +The repository formatter checks maintained source roots, including the new +benchmark harness, and excludes immutable benchmark snapshots and generated +build trees. The full maintained-source format check passes. Hosted PR CI is +separate from these recorded local checks. + +## Evidence and reproduction + +[evidence.tar.gz](evidence.tar.gz) contains the complete, unchanged +`benchmarks/results-20261015/btree-prefix` and +`benchmarks/results-20261016/btree-nonlexical` directories: 4,425 files, +including raw samples, compiler commands, source/artifact hashes, analysis +scripts, audits, and historical failures. Its +[manifest](evidence-manifest.json) records every member's SHA256. +The later investigation contains 1,206 samples across 19 campaigns; the earlier +matrix contains 516 comparison samples plus separately recorded pilot/smoke +work. The archives retain their original dated status statements. + +[merge-validation.tar.gz](merge-validation.tar.gz) and its +[manifest](merge-validation-manifest.json) preserve both the initial test +fixture failure and the corrected, independently reviewed version test's +complete validation. [version-rejection.json](version-rejection.json) is a +direct copy of the final verification record. + +Extract into a fresh directory to avoid touching existing campaign files: + +```sh +mkdir -p /tmp/branch-prefix-evidence +tar -xzf benchmarks/branch-prefix-evaluation/evidence.tar.gz -C /tmp/branch-prefix-evidence +tar -xzf benchmarks/branch-prefix-evaluation/merge-validation.tar.gz -C /tmp/branch-prefix-evidence +``` + +The final analysis is under the extracted +`benchmarks/results-20261016/btree-nonlexical/README.md`; the complete earlier +on/off/main matrix is under `benchmarks/results-20261015/btree-prefix/README.md`. +Each includes measurement commands and provenance. Absolute build/database +paths in the records describe the measurement machine; another machine must +rebuild the frozen commits/patches and supply fresh paths. + +The maintained [B-tree harness](../btree_prefix_bench.c) supports insert, +overwrite, lookup, scan and array-fed pack operations. The +[build helper](../build_btree_prefix_bench.py) links it against verified frozen +libraries using the recorded profile metadata. The harness exposes separate +construction and read-lexical switches for controlled comparisons and rejects +lexical flags for the nonlexical comparator. diff --git a/benchmarks/branch-prefix-evaluation/evidence-manifest.json b/benchmarks/branch-prefix-evaluation/evidence-manifest.json new file mode 100644 index 000000000..925f0f094 --- /dev/null +++ b/benchmarks/branch-prefix-evaluation/evidence-manifest.json @@ -0,0 +1,4467 @@ +{ + "archive": "evidence.tar.gz", + "archive_bytes": 12290329, + "archive_format": "POSIX pax tar, sorted repository-relative regular-file paths, gzip level 9", + "archive_sha256": "e4f66c530ae2c667004c6732bae1de2b4b2d7ca7ac4e1292d9be20d07563a579", + "deterministic_metadata": { + "gid": 0, + "gname": "", + "gzip_filename": "", + "gzip_mtime": 0, + "mode": "0755 for executable inputs; otherwise 0644", + "mtime": 0, + "uid": 0, + "uname": "" + }, + "file_count": 4425, + "files_sha256": { + "benchmarks/results-20261015/btree-prefix/FULL-SWITCH.md": "f22966d0cc2f9afe72a54438ab9f43b17c0f876b117158f923b00202bf908f94", + "benchmarks/results-20261015/btree-prefix/METHODS.md": "6159f2ec6c578f3689190354b791d40d9035e108744313bcce2cdbc0723e0389", + "benchmarks/results-20261015/btree-prefix/README.md": "1da289a43ae17823d26b6c9df3ba74e200b1a4bde3b8ad94ba0071982133d46a", + "benchmarks/results-20261015/btree-prefix/TABLES.md": "6380ee05600be88719590d958649f1ccfc1879dccca8ac09741978a29835a85c", + "benchmarks/results-20261015/btree-prefix/__pycache__/render_tables.cpython-313.pyc": "ba5e58f3cc8d4665c610d609ad274cc2fb9fafa340760bb9476a4073214c04ee", + "benchmarks/results-20261015/btree-prefix/__pycache__/runner.cpython-313.pyc": "87c5d315602513ae23988d237a99ad78a64f2f76f98522db1a20c42a329c4f25", + "benchmarks/results-20261015/btree-prefix/analysis-complete.py": "4f73510153adfac5144c33c7ae56cdca465b42c79ef59f077b2267647961bfb3", + "benchmarks/results-20261015/btree-prefix/analyze.py": "12d48d0d31a49abd3950d5bb00b56372e858b8f6b361bdb51963e164c57048d8", + "benchmarks/results-20261015/btree-prefix/archive-sha256.json": "b59578e4c1d2bbed591c25d10b2ceea8e1475e0a66099bb0e92dfddd2da471fa", + "benchmarks/results-20261015/btree-prefix/audit.json": "fb28a586650fbc333165abb11660c3ac0c43d27db380657c7a8537c6c9004afc", + "benchmarks/results-20261015/btree-prefix/audit.py": "3c33736f8f88fdb4cfd25a3605551129c47b9fc1bdaea2bc0fb321b3b797acbe", + "benchmarks/results-20261015/btree-prefix/build-failed-readonly-lock-01/btree_prefix_bench.c": "bb43b343ad4a6f66d17fc1cdd32ff72991b91d0c5bdf0c43c438bc124475ee89", + "benchmarks/results-20261015/btree-prefix/build-failed-readonly-lock-01/build_btree_prefix_bench.py": "79ae7665cf6ba3b47c210991d3267ef28d69710a5020ce9ac77d0aa71dd2fcd5", + "benchmarks/results-20261015/btree-prefix/build-failed-readonly-lock-01/failure.json": "af6ac16cb62a736cbe090404f77d507ddbf9ee36aee24c00f5a6c4546b17fe19", + "benchmarks/results-20261015/btree-prefix/build-v2/build.json": "ee8996799e96284e5343a942b83c8f29433109b34d62dd31d7cb115a4e0353dd", + "benchmarks/results-20261015/btree-prefix/build-v2/build/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261015/btree-prefix/build-v2/build/build_btree_prefix_bench.py": "44bac2ae15a0377b470dc0a9fd8b68f8549af373df378394ae2005646c8f7052", + "benchmarks/results-20261015/btree-prefix/build-v2/build/current-compile.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261015/btree-prefix/build-v2/build/main-compile.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261015/btree-prefix/build.json": "40fb32ee7423ea6de8ac24bc6209bac3ff78642575fabdc62da4085162e5c737", + "benchmarks/results-20261015/btree-prefix/build/btree_prefix_bench.c": "bb43b343ad4a6f66d17fc1cdd32ff72991b91d0c5bdf0c43c438bc124475ee89", + "benchmarks/results-20261015/btree-prefix/build/build_btree_prefix_bench.py": "44bac2ae15a0377b470dc0a9fd8b68f8549af373df378394ae2005646c8f7052", + "benchmarks/results-20261015/btree-prefix/build/current-compile.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261015/btree-prefix/build/main-compile.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261015/btree-prefix/calibrate.py": "4753198e7be457bae9beb514acafe3af3a4e38ae6ede55ceb218dba0d12285ce", + "benchmarks/results-20261015/btree-prefix/failedprotocol01.json": "ec6a3d598ed87a4ab3bc1ce6d222ac0bbcb94d072423df08bf2ba47dc0528de2", + "benchmarks/results-20261015/btree-prefix/final-source-state.json": "6a663f72c9948f70b77b92b5717311b766306e3197216f95d48e492107d3265e", + "benchmarks/results-20261015/btree-prefix/perf-ack-probe.json": "ccf917c71fe9f0137588624d2d6f8a235f82218ab4b16603c6458e1e1790a153", + "benchmarks/results-20261015/btree-prefix/perf-ack-probe.log": "c061e5e9de6d1c1b207ca45fb3573ed89cfcbda2ef7aaf10c99ae95d3735ac19", + "benchmarks/results-20261015/btree-prefix/perf-ack-probe.py": "20ef77974846faaaaca4705a73e3a83a4d53411b7556bc4353d3a74e55aa14b7", + "benchmarks/results-20261015/btree-prefix/pilot-plan.json": "49e032eea4ac596eec158f636b530fc07152a80f537b18c8a182a46512066e6f", + "benchmarks/results-20261015/btree-prefix/pilot/0001-r0-common-insert-random-main.log": "fd8390da2646d4b590c220f9df63d9b7a3a632e75b18cd5263b751fa500b5e51", + "benchmarks/results-20261015/btree-prefix/pilot/0001-r0-common-insert-random-main.stat": "e7bab5578b950293ed666cb418440979302d1e8787ef25931efd05bf2be1c5a9", + "benchmarks/results-20261015/btree-prefix/pilot/0002-r0-common-insert-random-current.log": "a11ba224189a5b20da13fde53d5f47abba7f64466c9b288e78450fb5e62ba788", + "benchmarks/results-20261015/btree-prefix/pilot/0002-r0-common-insert-random-current.stat": "51581ae2fcb35b9cff76f96614febadefaf228c39e5d65c271554721b379169e", + "benchmarks/results-20261015/btree-prefix/pilot/0003-r0-common-insert-sorted-main.log": "37affae1d5f11c50e866fab99ca78375d13a38e56660e671c06fc6eef2031c1e", + "benchmarks/results-20261015/btree-prefix/pilot/0003-r0-common-insert-sorted-main.stat": "d09b2ec6a943f8122f149798383b13da45e9c08a1b7fec991c8f61ba5148bc0b", + "benchmarks/results-20261015/btree-prefix/pilot/0004-r0-common-insert-sorted-current.log": "ccee3f8afeec7a81f625838a14c50f671c976ce0232542e4477346595084ce8c", + "benchmarks/results-20261015/btree-prefix/pilot/0004-r0-common-insert-sorted-current.stat": "ea8bde69d4482b7bebc48dce5ee21d66dd23dbdfbd14c5d0eb565ddb53a85b91", + "benchmarks/results-20261015/btree-prefix/pilot/0005-r0-common-overwrite-main.log": "9ef0a64024c308166fe6fa873b7b5f1304f377d6071f716e28a5d86808df3ae6", + "benchmarks/results-20261015/btree-prefix/pilot/0005-r0-common-overwrite-main.stat": "c61fc6c81d6eeb66ccd84b4adf7576e8ecd9ff363edf2a49d60daf32e9a4647b", + "benchmarks/results-20261015/btree-prefix/pilot/0006-r0-common-overwrite-current.log": "d78f913867089cfd7a8c7233eb5591c408e904569bfc7da69a27bc823ed51e5d", + "benchmarks/results-20261015/btree-prefix/pilot/0006-r0-common-overwrite-current.stat": "400da5783fb751654ef588a3225e83fec505d3f282fd9cead48d4d07d32e5479", + "benchmarks/results-20261015/btree-prefix/pilot/0007-r0-common-pack-main.log": "cd4621de00fc73998f10d970670b630ddd2841fb7c696f7d6086ec2bd5920e24", + "benchmarks/results-20261015/btree-prefix/pilot/0007-r0-common-pack-main.stat": "beb55132bf859f3f46ca7d1a5e1a63966bd7ff602522dc99f026bf2e5b158ec8", + "benchmarks/results-20261015/btree-prefix/pilot/0008-r0-common-pack-off.log": "c57ac595427f5f74103ca3a23819ebdb3f04b4a23acb9eb2fe191acc27770162", + "benchmarks/results-20261015/btree-prefix/pilot/0008-r0-common-pack-off.stat": "62a964c75573cdce9a3f972ac59f454228a255c64f2910871013158e55426893", + "benchmarks/results-20261015/btree-prefix/pilot/0009-r0-common-pack-on.log": "133d7eb7dd67b3feed8626e7d08bce3556835cbc7b746afc386f95438199511a", + "benchmarks/results-20261015/btree-prefix/pilot/0009-r0-common-pack-on.stat": "89f47e5583f4282c8e1cd3117435234aa925ea7292f155dd762a71d9cad91f16", + "benchmarks/results-20261015/btree-prefix/pilot/0010-r0-common-hit-main.log": "f916014f974da79fe1fefd2398b09dd847f145cb28186cf30d31468ae106d188", + "benchmarks/results-20261015/btree-prefix/pilot/0010-r0-common-hit-main.stat": "44e9247e1577cf37d636cc2b429ee94cd6541507cb2828cf54bd7150303b6b63", + "benchmarks/results-20261015/btree-prefix/pilot/0011-r0-common-hit-off.log": "26b78491b730498bb85072f7e1621f2d1fd69a4511b9e66c200e54187a9a6414", + "benchmarks/results-20261015/btree-prefix/pilot/0011-r0-common-hit-off.stat": "86d7042789404bd1088a0683b5d01037043bf5bf42d9ff6cd2b2a6756fdae112", + "benchmarks/results-20261015/btree-prefix/pilot/0012-r0-common-hit-on.log": "733db061e1c5a7436633824648058e45c7a40d1321aad941d5aec83abbd8d072", + "benchmarks/results-20261015/btree-prefix/pilot/0012-r0-common-hit-on.stat": "05446aa11363a23e4c56d46e2fb06453f22a5503fa7c675565293df5d4bd1fdc", + "benchmarks/results-20261015/btree-prefix/pilot/0013-r0-common-miss-main.log": "07091bffa21fae94e39ac5c5c9f528f3adb56c993bb91517cc6bb78dff1dd286", + "benchmarks/results-20261015/btree-prefix/pilot/0013-r0-common-miss-main.stat": "13df8c6a000db58c5160a0b4551552f61a4f7dd962d0ba30a329f09f2e9ba75f", + "benchmarks/results-20261015/btree-prefix/pilot/0014-r0-common-miss-off.log": "88ebce1731542c5127e01907fbdd440ffe2f764e2475ba1eb3f8c22c6c531ade", + "benchmarks/results-20261015/btree-prefix/pilot/0014-r0-common-miss-off.stat": "cadd8b4e6b58096b5969e17c2b6887abbbe5517c640db6ff6fb88b321d4844aa", + "benchmarks/results-20261015/btree-prefix/pilot/0015-r0-common-miss-on.log": "3d2f2ca86015cd580cce2d9ed986986482c1cc3ad38477652c388fdf6af010fc", + "benchmarks/results-20261015/btree-prefix/pilot/0015-r0-common-miss-on.stat": "45c2ee2443456da5d5bb70ca2dde5e5f5665622fba112d142f1d7de9aece22d9", + "benchmarks/results-20261015/btree-prefix/pilot/0016-r0-common-scan1-main.log": "284d5b0ae4cbbc48fd15312fcd224137313c3f922d41117d9c9afdd8964bcaa2", + "benchmarks/results-20261015/btree-prefix/pilot/0016-r0-common-scan1-main.stat": "3f43261e798ed32656b340a1475188c795921df92b574bc5c0e4c6a0ceb05d29", + "benchmarks/results-20261015/btree-prefix/pilot/0017-r0-common-scan1-off.log": "5729306dfb9d5891998c4e1db9a61f60a21e48583a28909db41bf722f55ea82a", + "benchmarks/results-20261015/btree-prefix/pilot/0017-r0-common-scan1-off.stat": "2b31f80bc8020ab2bd64a5856387cedd59cdf2af765c0ec23202cc7d24790831", + "benchmarks/results-20261015/btree-prefix/pilot/0018-r0-common-scan1-on.log": "2c8f254fe04c3a8a3bd6a8c44304176e0f74010a1c5a266212f849d2adf0e72b", + "benchmarks/results-20261015/btree-prefix/pilot/0018-r0-common-scan1-on.stat": "42105cc3d673726a2342f74ba0ca476f5ed2167d870db305d52aae6191f8863c", + "benchmarks/results-20261015/btree-prefix/pilot/0019-r0-common-scan10000-main.log": "a72cebd8ef8374eaf213af84083a3dc0e225d39a455233b21c58020dbda4fb16", + "benchmarks/results-20261015/btree-prefix/pilot/0019-r0-common-scan10000-main.stat": "cd8ee37ce0996a5be2e06ea6dec78867144a4016ebfa18de797324a063c04d5e", + "benchmarks/results-20261015/btree-prefix/pilot/0020-r0-common-scan10000-off.log": "4e5449d8cc50162269ac66f8b937c5ada2247eb5ba65ef7aaf9cd18f38b05cf1", + "benchmarks/results-20261015/btree-prefix/pilot/0020-r0-common-scan10000-off.stat": "af6433d89f66494fc5605c16eb584d5b5eab82f42d869513a4ee51826669313c", + "benchmarks/results-20261015/btree-prefix/pilot/0021-r0-common-scan10000-on.log": "555afdf533414c7120cbd3eeb3e7e32dc6f98d2060bf2bc2a4f209a4d1ee1b91", + "benchmarks/results-20261015/btree-prefix/pilot/0021-r0-common-scan10000-on.stat": "a643cf767c7c0e50b7ff3595657ee1d0b4fa2d1f2e612cd84396f8b97f7ff566", + "benchmarks/results-20261015/btree-prefix/pilot/0022-r0-common-scanfull-main.log": "2ba6dfd120b83ade582414ff651c53a051666a05ad9edb110ec869ed05f0ca7d", + "benchmarks/results-20261015/btree-prefix/pilot/0022-r0-common-scanfull-main.stat": "5939aecaf1a663f178b7f54857e86a4ef07771ffe358934f7b8d501fdf6b9487", + "benchmarks/results-20261015/btree-prefix/pilot/0023-r0-common-scanfull-off.log": "ba18a56fe28cd7af3ace6758d27fa93b71613ca4551b1f38ee74f07aebb13800", + "benchmarks/results-20261015/btree-prefix/pilot/0023-r0-common-scanfull-off.stat": "1144213c8eb79d1cfa987cb40738e09c8f3dbd6f6590dc5a0f4d5396a2510a77", + "benchmarks/results-20261015/btree-prefix/pilot/0024-r0-common-scanfull-on.log": "c38cb30f687e1dc4c2ba4125dafab097f96998bf46e31cb4e9aaecc6de821e0a", + "benchmarks/results-20261015/btree-prefix/pilot/0024-r0-common-scanfull-on.stat": "3fa311eac01b59a9824ac05e9cc6b4b9c5a0e7c06d05877a349184f83411fdc0", + "benchmarks/results-20261015/btree-prefix/pilot/0025-r0-random-insert-random-main.log": "d7ebfe59b5f704b5d5277533b144d626166c92c0a6e9e2dc1be8506f1cead299", + "benchmarks/results-20261015/btree-prefix/pilot/0025-r0-random-insert-random-main.stat": "7f80b9c392d3a93eafcd1d9c1d97e128382fb9f9404584cb0975a0fa18b31e24", + "benchmarks/results-20261015/btree-prefix/pilot/0026-r0-random-insert-random-current.log": "768194884be3c8f3e05c6e8bafe9a5e2c561403bbc46e7c5358856f2f4cb9b1b", + "benchmarks/results-20261015/btree-prefix/pilot/0026-r0-random-insert-random-current.stat": "8ce284209f4f065b474c16140e1acb72595cb4ab45f16ef194322ae847d3ecd1", + "benchmarks/results-20261015/btree-prefix/pilot/0027-r0-random-insert-sorted-main.log": "a359a355438a01c7e01ea2cf256ab8dd639629124f4a7f9a0d9e0938f27eef9e", + "benchmarks/results-20261015/btree-prefix/pilot/0027-r0-random-insert-sorted-main.stat": "71154bd587621df636b1782f9267cff3387f71e1eeec184e6cc645346c1801f7", + "benchmarks/results-20261015/btree-prefix/pilot/0028-r0-random-insert-sorted-current.log": "e4f3f66fa9205151025ba16e3680b1343309e2b9d84d5bc238d5ed1ecf4380b6", + "benchmarks/results-20261015/btree-prefix/pilot/0028-r0-random-insert-sorted-current.stat": "da04701abe11c00e71b40f7b9826b2de1f4af740486f3bea3d950c5bcd61ca0b", + "benchmarks/results-20261015/btree-prefix/pilot/0029-r0-random-overwrite-main.log": "69d77f91cbd8144d2db6fd595c337cbb5b3493caa15c7dbd623d1b18e62dec4a", + "benchmarks/results-20261015/btree-prefix/pilot/0029-r0-random-overwrite-main.stat": "529f4ddd0dd1b3de3a39e7b8515a6f674efca1e55f788422097e41813e3a1e12", + "benchmarks/results-20261015/btree-prefix/pilot/0030-r0-random-overwrite-current.log": "60b588a2984ce0f3cd0616e417017299055579483e58c0a06859141b5fea5b52", + "benchmarks/results-20261015/btree-prefix/pilot/0030-r0-random-overwrite-current.stat": "d85fed09a19337a7f9ddb74d01b729d28494ce8a22de9fef386b49e1dc75eef9", + "benchmarks/results-20261015/btree-prefix/pilot/0031-r0-random-pack-main.log": "8a4abdc9ba08b42bfca5bae6117d4b92865411e0abd0a8d02540b240d776dace", + "benchmarks/results-20261015/btree-prefix/pilot/0031-r0-random-pack-main.stat": "fa44fc263c242fa79104d13a6cea5c90d15dbfb8a35afb20eef4d45a0803b4e0", + "benchmarks/results-20261015/btree-prefix/pilot/0032-r0-random-pack-off.log": "e9e4742543fd687a59e433075193abd9fdd068c7d763e0da7ad2a3e472480077", + "benchmarks/results-20261015/btree-prefix/pilot/0032-r0-random-pack-off.stat": "d4c811ef6b479e193e04bd86a7ee7a930aa38a08bed078c02694b31b2a9e3067", + "benchmarks/results-20261015/btree-prefix/pilot/0033-r0-random-pack-on.log": "8f2e39d66ef49326f6a1587cca4652036046b66820af63c96d3fe0f2098e254a", + "benchmarks/results-20261015/btree-prefix/pilot/0033-r0-random-pack-on.stat": "6323e39acd35913950bfd920817b0269463dd482fd30a602dd82a34b5d0f5c0f", + "benchmarks/results-20261015/btree-prefix/pilot/0034-r0-random-hit-main.log": "0acceadb10425dceb77c178ab2f94b40420eb52f7008592a138867e7e4dbf745", + "benchmarks/results-20261015/btree-prefix/pilot/0034-r0-random-hit-main.stat": "73020343895043190a640eb516ceb42171ad5843f5b903c6d98199f29721a67a", + "benchmarks/results-20261015/btree-prefix/pilot/0035-r0-random-hit-off.log": "a5cf4254f317cae3bd7d0b5f96df253deb5d81dd357a5846a76ed69883b51611", + "benchmarks/results-20261015/btree-prefix/pilot/0035-r0-random-hit-off.stat": "888368950087f6ecd9cc0a9797e1975252d1af6448a98b930b96a53e271e9e66", + "benchmarks/results-20261015/btree-prefix/pilot/0036-r0-random-hit-on.log": "b5b71d4cda376b72acce5131b6ea55be50453673cfe20352677a7173cfef7099", + "benchmarks/results-20261015/btree-prefix/pilot/0036-r0-random-hit-on.stat": "310d105eb20834555c9acff780112799f0f566dbfe50a4f6858fb219d51f2008", + "benchmarks/results-20261015/btree-prefix/pilot/0037-r0-random-miss-main.log": "4784ada838a672197329b2a00fea20d6191c50dc1de49231d9e4b31c12dcb509", + "benchmarks/results-20261015/btree-prefix/pilot/0037-r0-random-miss-main.stat": "a9033267f121c179f08e9e44c2b5d839884ec02a11a5c739388139035d8b8646", + "benchmarks/results-20261015/btree-prefix/pilot/0038-r0-random-miss-off.log": "849d22ff1a8bf3acd3409b3104fe5ac34c27f4ae6d66e8c0a9f2eccfcbf04cb5", + "benchmarks/results-20261015/btree-prefix/pilot/0038-r0-random-miss-off.stat": "7ed47ed1c2c67f7de2c0561ba1e34436e653dbfcb14dddf0c57d965367b7dc1a", + "benchmarks/results-20261015/btree-prefix/pilot/0039-r0-random-miss-on.log": "afc8abab4a10fa2ed2799c880a0958af7549ca04f2490ed3576ff4603689d66a", + "benchmarks/results-20261015/btree-prefix/pilot/0039-r0-random-miss-on.stat": "a2c80dcf5b56f8cbbb569251c5b2a0ed6a846ddc7996d477a2020d7dac70588d", + "benchmarks/results-20261015/btree-prefix/pilot/0040-r0-random-scan1-main.log": "18f2de262790abb6ee18c244e0ace6b2c6fd9a76662ed4f50cb241cb67ca9519", + "benchmarks/results-20261015/btree-prefix/pilot/0040-r0-random-scan1-main.stat": "6cec82b06505a2c78d61a2aa6fa3575785ba7215667debfc0c5db398de3fc318", + "benchmarks/results-20261015/btree-prefix/pilot/0041-r0-random-scan1-off.log": "52937105ad5497cad7e51531d9a353fd932fcddf125604b358efd1f151fa19a8", + "benchmarks/results-20261015/btree-prefix/pilot/0041-r0-random-scan1-off.stat": "54fe1d327969a55b3824e348eac1d021819a0020acd863f41e0708673c4442ff", + "benchmarks/results-20261015/btree-prefix/pilot/0042-r0-random-scan1-on.log": "4587608da474f41200eb47f30160949cbba47c0cf088b8210bb88fb27103c61a", + "benchmarks/results-20261015/btree-prefix/pilot/0042-r0-random-scan1-on.stat": "9c329355a37afea14390e7e4167e6d77a224bbc09c72b86ca0a8a647dc0fe6c7", + "benchmarks/results-20261015/btree-prefix/pilot/0043-r0-random-scan10000-main.log": "d1bf26e0515e89fb0e7a4e1ff0382f2014ce4be9045e49410722d2c1704b612c", + "benchmarks/results-20261015/btree-prefix/pilot/0043-r0-random-scan10000-main.stat": "8a9a0296d900ee80bb07ed58d282ac1ff456636acae45ad0d4dd9b2e54a04b85", + "benchmarks/results-20261015/btree-prefix/pilot/0044-r0-random-scan10000-off.log": "814f95ca0545a4dd6ea0f028c6e7781d1581c39021a77e82911c8bd25ea2fd03", + "benchmarks/results-20261015/btree-prefix/pilot/0044-r0-random-scan10000-off.stat": "18c5fbe9a5b87e759e25d2998a5cf24021b66cf3d7c570f8a8e3228668d95122", + "benchmarks/results-20261015/btree-prefix/pilot/0045-r0-random-scan10000-on.log": "6ee5f129a1201aeae00d5137265e36e1584ac75323cfdae7520ff1b96a3ac91b", + "benchmarks/results-20261015/btree-prefix/pilot/0045-r0-random-scan10000-on.stat": "bbae07b6f4cd2f1b66d51475de3883c2504fce77973a40a322dd620ba4663e1f", + "benchmarks/results-20261015/btree-prefix/pilot/0046-r0-random-scanfull-main.log": "145e5d18538997bc554169a7d293c2e55b7cbd3488ea4c88f724c11186380016", + "benchmarks/results-20261015/btree-prefix/pilot/0046-r0-random-scanfull-main.stat": "4a6a0438d1bebc78e90cfc93793f0e83face4cf230906ebdd4aa1b59fcdb0c71", + "benchmarks/results-20261015/btree-prefix/pilot/0047-r0-random-scanfull-off.log": "53af02d45ab1c6581fe3d55a839e348928c40eec2a7d8c0fce4f3026cc81de52", + "benchmarks/results-20261015/btree-prefix/pilot/0047-r0-random-scanfull-off.stat": "7f7d4add71f3a347fa79ddcca8ca8c5fb3c957951a2512548c58337e47b951a3", + "benchmarks/results-20261015/btree-prefix/pilot/0048-r0-random-scanfull-on.log": "0f8d8a368b2424f19855b4a5ac7054faaf3f802cad0165237d307f240ca9f3c1", + "benchmarks/results-20261015/btree-prefix/pilot/0048-r0-random-scanfull-on.stat": "b173f990016e56efcb7509b48497f973509d081e149605b4c8c1a6b30c81f47e", + "benchmarks/results-20261015/btree-prefix/pilot/0049-r0-nonlexical-insert-random-main.log": "3d5e2d630b56e31b2588a458048d8d452e6a390dbb6111a94fb494c09be00e84", + "benchmarks/results-20261015/btree-prefix/pilot/0049-r0-nonlexical-insert-random-main.stat": "6e98048e0b4fa65c685c0d72294ad4bd43041298e125f3d9433b286594b5fcbc", + "benchmarks/results-20261015/btree-prefix/pilot/0050-r0-nonlexical-insert-random-current.log": "5d260b8fba599cb1ac6d21f18f69aa0a96f401324b8eed89bc63dc0137ec2e1f", + "benchmarks/results-20261015/btree-prefix/pilot/0050-r0-nonlexical-insert-random-current.stat": "b07d1a57227105ae3a2c01787d18116a3a2bf7d805f91576343afee7a89e4be9", + "benchmarks/results-20261015/btree-prefix/pilot/0051-r0-nonlexical-insert-sorted-main.log": "082c8cf5b9d31cf82705e22436f49d148e58b883e348702033e550a9c7711386", + "benchmarks/results-20261015/btree-prefix/pilot/0051-r0-nonlexical-insert-sorted-main.stat": "e131083bde721ab2ab2985709b572c5d7c36298a51981e842cbace6afbaa7783", + "benchmarks/results-20261015/btree-prefix/pilot/0052-r0-nonlexical-insert-sorted-current.log": "6f9d6b079970843e74b92136326ceac7588cd905f499410c0de69e9681097232", + "benchmarks/results-20261015/btree-prefix/pilot/0052-r0-nonlexical-insert-sorted-current.stat": "620e1db30976266d3271fd4dba80a5c9e3b0db32eb157998b21efc3d1d3bcbb4", + "benchmarks/results-20261015/btree-prefix/pilot/0053-r0-nonlexical-overwrite-main.log": "920768f8d88e2243ec49c85bbab9ecc1b5b5c943773269036f9fbba66547b401", + "benchmarks/results-20261015/btree-prefix/pilot/0053-r0-nonlexical-overwrite-main.stat": "15397343956750441347139fc227789233c0c6b07bd92dbf3cf1e5428a2af311", + "benchmarks/results-20261015/btree-prefix/pilot/0054-r0-nonlexical-overwrite-current.log": "264ab4ec16c6c71bdd3ce0d699ee5311a96744205ba29c5dbce59215428ca8d5", + "benchmarks/results-20261015/btree-prefix/pilot/0054-r0-nonlexical-overwrite-current.stat": "7ec48b404b40298babc667b416c2239a125701178f67efda8ad65811e8bd0bf4", + "benchmarks/results-20261015/btree-prefix/pilot/0055-r0-nonlexical-pack-main.log": "d0fb233855b24e8a27caa28a16cf902f1dad2d94c000f04199339d42e78c1170", + "benchmarks/results-20261015/btree-prefix/pilot/0055-r0-nonlexical-pack-main.stat": "96a1866a44a0113418fcd78c4981dbefa2b14b9fd98c8f647bb0f9942d78f4d6", + "benchmarks/results-20261015/btree-prefix/pilot/0056-r0-nonlexical-pack-current.log": "b9705e8aa8f6af68114e548295acf687446e7a9761c2f7cc4f639b85e6637997", + "benchmarks/results-20261015/btree-prefix/pilot/0056-r0-nonlexical-pack-current.stat": "bedb154abb6a28fa710668453748ea5d66302587ff33708a267f9c8675fb810a", + "benchmarks/results-20261015/btree-prefix/pilot/0057-r0-nonlexical-hit-main.log": "2a098e33fe9face47dbb1ae3b73270be3044136113f187e71555732e9ef9020b", + "benchmarks/results-20261015/btree-prefix/pilot/0057-r0-nonlexical-hit-main.stat": "d51e6971ba07b708eb165464db4301349ce1f2010fe26b607c72fec2e53b81c5", + "benchmarks/results-20261015/btree-prefix/pilot/0058-r0-nonlexical-hit-current.log": "32430258fb707c508c5fd0877857b2f14d7f0b23beccaee10219d05e9262390e", + "benchmarks/results-20261015/btree-prefix/pilot/0058-r0-nonlexical-hit-current.stat": "8ab5a1fbcd7d2ca62e2f38afa51e367122cf35c256139afad6b7aa04576cb4cb", + "benchmarks/results-20261015/btree-prefix/pilot/0059-r0-nonlexical-miss-main.log": "839526497b86f5a2df1a44cea772663bbc38d284b1f4d1f522e98e489672f0de", + "benchmarks/results-20261015/btree-prefix/pilot/0059-r0-nonlexical-miss-main.stat": "a4ae543a3111ca65861a42e0dc1607dd8bdd19764b3b46c1b4a1fc08f8b82360", + "benchmarks/results-20261015/btree-prefix/pilot/0060-r0-nonlexical-miss-current.log": "9cc38f398f979e173ca5d140357c63ad1453c188374a7ee95b95cc52b24bd98d", + "benchmarks/results-20261015/btree-prefix/pilot/0060-r0-nonlexical-miss-current.stat": "552d0adb0ed4862ea4f5db2b7d6e1cf16a6fe02aa6ca5555ad389a9078a9d7b0", + "benchmarks/results-20261015/btree-prefix/pilot/0061-r0-nonlexical-scan1-main.log": "f7d75cf84ac857ea70aaf9100e627ca02a948ed20edb6891cabeb3b5c235c9db", + "benchmarks/results-20261015/btree-prefix/pilot/0061-r0-nonlexical-scan1-main.stat": "d6098eac99958a7943eb4f103e5bd93fbb0309db419fd9234b4248244de12502", + "benchmarks/results-20261015/btree-prefix/pilot/0062-r0-nonlexical-scan1-current.log": "a2d42674abcea3045d20db87b3c4923b2354141345302593886f4b8f05fc40d6", + "benchmarks/results-20261015/btree-prefix/pilot/0062-r0-nonlexical-scan1-current.stat": "1783f2261310de60d42ff80f08a32cca634f93ed533473d2e2ea8fa368cc077a", + "benchmarks/results-20261015/btree-prefix/pilot/0063-r0-nonlexical-scan10000-main.log": "01157a06158c4ef2450f7a1ad6a5ece502df557d0e24e60ae1f4b3b9334d6be6", + "benchmarks/results-20261015/btree-prefix/pilot/0063-r0-nonlexical-scan10000-main.stat": "c54a62111a25363c68624b70c40fc4c30c1f1250600d5784e993ba06c5139229", + "benchmarks/results-20261015/btree-prefix/pilot/0064-r0-nonlexical-scan10000-current.log": "c9feeaeea314cfc460efa9fcba7d6c3b7d7070f8301e2eb85ccff138b3120a67", + "benchmarks/results-20261015/btree-prefix/pilot/0064-r0-nonlexical-scan10000-current.stat": "5437b03a9bb8447da6ac636bd5bdd36ef07101b96aba47ff4d46f7ec3c317a87", + "benchmarks/results-20261015/btree-prefix/pilot/0065-r0-nonlexical-scanfull-main.log": "d490b8c7371f8a0efc39c8d58c16655782037af9a49f06f9c9625d2b5ad249c1", + "benchmarks/results-20261015/btree-prefix/pilot/0065-r0-nonlexical-scanfull-main.stat": "fda8ad80fdd53e5f06a6bc3913bfa49e3d88f0a6d7b8a658236cb4064a43065a", + "benchmarks/results-20261015/btree-prefix/pilot/0066-r0-nonlexical-scanfull-current.log": "4a23418055c4ae57ca1073c40e5f49163f71bfa003b3676463e889931961ff4a", + "benchmarks/results-20261015/btree-prefix/pilot/0066-r0-nonlexical-scanfull-current.stat": "a699567260ff8710fb09ad22c1a14b37fa5fe7563535e07862d0eb7f8531b3ca", + "benchmarks/results-20261015/btree-prefix/pilot/build.json": "ee8996799e96284e5343a942b83c8f29433109b34d62dd31d7cb115a4e0353dd", + "benchmarks/results-20261015/btree-prefix/pilot/manifest.json": "f4eae124ee216ab837bf825b90ab3d570a16738f692b9869e1e4bfd3eb27aa53", + "benchmarks/results-20261015/btree-prefix/pilot/plan.json": "49e032eea4ac596eec158f636b530fc07152a80f537b18c8a182a46512066e6f", + "benchmarks/results-20261015/btree-prefix/pilot/runner.py": "4d6f3ad634afc1a1035ed3b77ca73fa5a304e4fc69a287bb7d2b47347617e3c1", + "benchmarks/results-20261015/btree-prefix/pilot/summary.json": "8e321a716887b2ce421196e68d7d1db3b3fd3f606a837457ff523bbb2e22bcb9", + "benchmarks/results-20261015/btree-prefix/primary-plan.json": "b91771185453f04cb5b75feb35c1d5fa27f4481120d0ecc71da85c5a5f64249d", + "benchmarks/results-20261015/btree-prefix/primary/0001-r0-common-insert-random-main.log": "495dfc420a78f75e8e5aca3ced353c0969bd65068e2fab4ebb73df9991e2c1dd", + "benchmarks/results-20261015/btree-prefix/primary/0001-r0-common-insert-random-main.stat": "b9aafdb82cf5a7e17e902f5cc318410b595b5747bb8fae6bb8fc75fc48d32cf4", + "benchmarks/results-20261015/btree-prefix/primary/0002-r0-common-insert-random-current.log": "afcca8030eb945b1479eeb96a94d82708fe125b276257de8fdea0568c4018ed4", + "benchmarks/results-20261015/btree-prefix/primary/0002-r0-common-insert-random-current.stat": "f89dc343888a11ba3ccbae2bdee5b238ac894ffef9ecef523751d050ebd6f0e8", + "benchmarks/results-20261015/btree-prefix/primary/0003-r0-common-insert-sorted-main.log": "923bb4c67cec02758bd6a01bd0dfe985a0cb96e13f46a6f644d1f25b7b534280", + "benchmarks/results-20261015/btree-prefix/primary/0003-r0-common-insert-sorted-main.stat": "3036680c37071d51b9362d1d8c85983f8d2559419af76183cce6401c1b325931", + "benchmarks/results-20261015/btree-prefix/primary/0004-r0-common-insert-sorted-current.log": "0f49c275e6c24b5c4f242bbd9ea4dc6ffa75f715405244c326b03c5671c2fb59", + "benchmarks/results-20261015/btree-prefix/primary/0004-r0-common-insert-sorted-current.stat": "a066bcd170452b30fd2f627910504dc74a3714a3b80542c7bc2a691a61918b28", + "benchmarks/results-20261015/btree-prefix/primary/0005-r0-common-overwrite-main.log": "293f3bedffc2eea739e8e4b31774f071fbb6f4ddfab0b75f0945184e5079767d", + "benchmarks/results-20261015/btree-prefix/primary/0005-r0-common-overwrite-main.stat": "4e2505e36133477337a0194bc4cf18cc036bb1fd62a31e271ac3d7ce5aca18ed", + "benchmarks/results-20261015/btree-prefix/primary/0006-r0-common-overwrite-current.log": "65aa47d063e808cf6a453aca45203ed1b7cffbeb7b84aaa00f529f5554e6b08d", + "benchmarks/results-20261015/btree-prefix/primary/0006-r0-common-overwrite-current.stat": "51adce24b694b7435241fe6516493e5a169af23b45d191fd06e4cb256a7697fc", + "benchmarks/results-20261015/btree-prefix/primary/0007-r0-common-pack-main.log": "342e1ab16eb5ed38e75e43f2c0a18c9127d4bb76ee7eee9c59691ba74158724f", + "benchmarks/results-20261015/btree-prefix/primary/0007-r0-common-pack-main.stat": "e9918e9ae3c59ffd16d59a65449b59f3b3016ef6fa23686483a34c22c79840ff", + "benchmarks/results-20261015/btree-prefix/primary/0008-r0-common-pack-off.log": "c8a0bd8f059d416e632813c0a72e5749a9d71c51942050d49b7fecfa01c0c439", + "benchmarks/results-20261015/btree-prefix/primary/0008-r0-common-pack-off.stat": "4d4d9cf931002b3defb3065c5ea9594d6eeaa9dff293b21edd375e60acf915ae", + "benchmarks/results-20261015/btree-prefix/primary/0009-r0-common-pack-on.log": "d03103935dc277e9e170c636e1db872b8d2626ba402abab8a2219e6de4eda8dc", + "benchmarks/results-20261015/btree-prefix/primary/0009-r0-common-pack-on.stat": "2db7bc01cfc7ad1ce2265dc2f7671b0062abd8b883481355c34dd4fb9cafa426", + "benchmarks/results-20261015/btree-prefix/primary/0010-r0-common-hit-main.log": "b0032cb9f40a8517258134bdd1399d0c222ff5606ed052795e89528bc83bdd98", + "benchmarks/results-20261015/btree-prefix/primary/0010-r0-common-hit-main.stat": "5fd1613f691ac033430d7487c137fac93e51c8622802d7f0055f66e9c0373cea", + "benchmarks/results-20261015/btree-prefix/primary/0011-r0-common-hit-off.log": "2338b7bb2d0f405345e2880b2695c3c2d0995f7b59aeef4ed32384a02a96e9ca", + "benchmarks/results-20261015/btree-prefix/primary/0011-r0-common-hit-off.stat": "0f101f338e9c49481968e8d638fa551595cb586b75fa5bec9af039cfff354078", + "benchmarks/results-20261015/btree-prefix/primary/0012-r0-common-hit-on.log": "d277ca9caa87c26cdc0acbe97960249977a207166c930a3923a1e210de5b3696", + "benchmarks/results-20261015/btree-prefix/primary/0012-r0-common-hit-on.stat": "ec16f40b016858b53c9ff46312c6a149c57a9dd34546789309e49a78b5dab54f", + "benchmarks/results-20261015/btree-prefix/primary/0013-r0-common-miss-main.log": "3336ee80a41eeb036bccd54271e151b4f7a5a2fe894394883e91dee94e8cb8ee", + "benchmarks/results-20261015/btree-prefix/primary/0013-r0-common-miss-main.stat": "e060ef284bf4ca3655d022554c86f9e83f802252077a6273bb3524774904bb68", + "benchmarks/results-20261015/btree-prefix/primary/0014-r0-common-miss-off.log": "dc540d6df70759fe16d85a8523bede8fa1d531843412b537ac8821386e51dcbc", + "benchmarks/results-20261015/btree-prefix/primary/0014-r0-common-miss-off.stat": "06fa03dbf2469eb452bc478722f90309d918bbae9f82cc43b6763a8b377697bf", + "benchmarks/results-20261015/btree-prefix/primary/0015-r0-common-miss-on.log": "27d3d9a683220636b4570ab8a36700e2be6a49551212a195932f225c723634ef", + "benchmarks/results-20261015/btree-prefix/primary/0015-r0-common-miss-on.stat": "04033a22afe25965267bf8260b27dbd59caf570294be4fdd4b48941e2e1228b0", + "benchmarks/results-20261015/btree-prefix/primary/0016-r0-common-scan1-main.log": "35dd88a978a05b2f35a9543efdcd85a7a2efa051c2c3a829d3f042ec46629e2d", + "benchmarks/results-20261015/btree-prefix/primary/0016-r0-common-scan1-main.stat": "5b56c6e77a042727f106327691b4542149c4aea1608b862ca448dc2887fb29cb", + "benchmarks/results-20261015/btree-prefix/primary/0017-r0-common-scan1-off.log": "e71e5f1d29d79b23ae9e5a1efedd813914ca7f9fcf3472c5adb727cb2cc87105", + "benchmarks/results-20261015/btree-prefix/primary/0017-r0-common-scan1-off.stat": "0ceb62d13118d0819ce6754cb504b2b959e9a5e7a630252b91b91744ca97bfdb", + "benchmarks/results-20261015/btree-prefix/primary/0018-r0-common-scan1-on.log": "623710e73b0dc2ab9c273a2c7e1c471e569673f08e4d83a93aa7a2c4fc4ab924", + "benchmarks/results-20261015/btree-prefix/primary/0018-r0-common-scan1-on.stat": "23a8c42e5165759946f0e1255df4faab2f782c81fa73400dc6839ac52f7daf92", + "benchmarks/results-20261015/btree-prefix/primary/0019-r0-common-scan10000-main.log": "732df0a5c4ce035e56b04436aa1b5fa698e239146190c83ddb0f8232c7d848c6", + "benchmarks/results-20261015/btree-prefix/primary/0019-r0-common-scan10000-main.stat": "08957dd5c6924089139e98fa690eb084955d30d0d8441adf0b7dd0ae357de2ce", + "benchmarks/results-20261015/btree-prefix/primary/0020-r0-common-scan10000-off.log": "429a19226f673414cf504ccfe0a8c15c60a489933d159dd0c816955c59d1bcb3", + "benchmarks/results-20261015/btree-prefix/primary/0020-r0-common-scan10000-off.stat": "2bd7910ede4659bf1e96c1030301283f4abc2dfb0b4e7b7a1055821ed02c7133", + "benchmarks/results-20261015/btree-prefix/primary/0021-r0-common-scan10000-on.log": "a669935f63c22fcaf07052faa2aa6767e7565a6ef5fdc87dfb92a037b368a4dd", + "benchmarks/results-20261015/btree-prefix/primary/0021-r0-common-scan10000-on.stat": "25a2f50d0f6ab7352db5071282d289573c830b074df574ed4057d5bcf5f7db6b", + "benchmarks/results-20261015/btree-prefix/primary/0022-r0-common-scanfull-main.log": "60a73c615df09b3103895953ac26267ce878a3d28b5089d7b08e6b99fb33a01f", + "benchmarks/results-20261015/btree-prefix/primary/0022-r0-common-scanfull-main.stat": "5bbbb7b56bb2956e7769956454ab0d4db1b83add8c613f3ec9426b2eee183f61", + "benchmarks/results-20261015/btree-prefix/primary/0023-r0-common-scanfull-off.log": "be7e10fd0685091a53f2eaead8713e0f5898816d2713bc48cd0333a1b0cea08e", + "benchmarks/results-20261015/btree-prefix/primary/0023-r0-common-scanfull-off.stat": "f413e4b225fb6da6de1471b68e334641678c8b92c43b956b74d0f12efece72be", + "benchmarks/results-20261015/btree-prefix/primary/0024-r0-common-scanfull-on.log": "35eb47649e70eda63b2fe9f585a2ff3ba3bf841c2c86ac11658c391e85853377", + "benchmarks/results-20261015/btree-prefix/primary/0024-r0-common-scanfull-on.stat": "3810c1bc55b1c916ecd4d9e1468b101b9f54bf00214a2544da740bd58229f8da", + "benchmarks/results-20261015/btree-prefix/primary/0025-r0-random-insert-random-main.log": "b66ec3b5fba633a8fdd0882f6e047fd62958070a68cb5750cb51b2bd99eef4b7", + "benchmarks/results-20261015/btree-prefix/primary/0025-r0-random-insert-random-main.stat": "9598898be266b98fbb38a3b0c9c3cff285e2dbc212d3660e162b239020e7869e", + "benchmarks/results-20261015/btree-prefix/primary/0026-r0-random-insert-random-current.log": "430e73759d13f7a422222e6dcb3e3b63939721d8f0e5853f313e75ab7ea61f13", + "benchmarks/results-20261015/btree-prefix/primary/0026-r0-random-insert-random-current.stat": "befb8f1a250600af0f1d93d5227f473d4d1dde361deb09318f7a0db4c1965f1b", + "benchmarks/results-20261015/btree-prefix/primary/0027-r0-random-insert-sorted-main.log": "105420d34ab4c351e408dfa25ccad8129d71b95609962b700a2d1e3582b9a572", + "benchmarks/results-20261015/btree-prefix/primary/0027-r0-random-insert-sorted-main.stat": "afc287737a71e22ed803dbb5865f81e2cda38e9463139a1509216827bfd6a7ed", + "benchmarks/results-20261015/btree-prefix/primary/0028-r0-random-insert-sorted-current.log": "d822c90f6ba111698c18441f5028c44e74cefb531dfb10148d33ec0099de3843", + "benchmarks/results-20261015/btree-prefix/primary/0028-r0-random-insert-sorted-current.stat": "5e4ce2c886b3e92dfb6b2eacb980d66bb1307b058747dbf16658fa04baf22722", + "benchmarks/results-20261015/btree-prefix/primary/0029-r0-random-overwrite-main.log": "6cd4fa03322a43f790fc2ac95e07d95fc6cee95357849fffda23377e1483c887", + "benchmarks/results-20261015/btree-prefix/primary/0029-r0-random-overwrite-main.stat": "a930c11e8da808d276a13b8b51ff7fd68d495926e8e63857a4671cc3a2650f33", + "benchmarks/results-20261015/btree-prefix/primary/0030-r0-random-overwrite-current.log": "231c1660086d733836daf401f23eb10d2ce07316fbc818e37dec897561884f17", + "benchmarks/results-20261015/btree-prefix/primary/0030-r0-random-overwrite-current.stat": "cae4ff417d176b7373102e0e0943a025b229a72880f7a524735e7014506beb64", + "benchmarks/results-20261015/btree-prefix/primary/0031-r0-random-pack-main.log": "7442dd1f2948d2fa5ae053071542ef898917e9815404708ea19de45c670f96cd", + "benchmarks/results-20261015/btree-prefix/primary/0031-r0-random-pack-main.stat": "34f3ccacb4fff09fbfd43cbb4e6a342d487f0909bb36f30eae032066d308db99", + "benchmarks/results-20261015/btree-prefix/primary/0032-r0-random-pack-off.log": "9ed5eeb5d171cd5badded6af4382523ae6a706a4fd3d64183a0d079c1da97b70", + "benchmarks/results-20261015/btree-prefix/primary/0032-r0-random-pack-off.stat": "374dcfb4d4eefaf5eaef07d48c1bf91543da1c5b61c4a2410ba3ad48ad5a8916", + "benchmarks/results-20261015/btree-prefix/primary/0033-r0-random-pack-on.log": "1ce803295bfc7b068e3cb15619bf279cc2a6dd186cb911c15be5887eaaf5a43d", + "benchmarks/results-20261015/btree-prefix/primary/0033-r0-random-pack-on.stat": "bfe5e6c9fe432dadfed94e06af14a14e3e6a4fdf355d0361b66616cda65e7841", + "benchmarks/results-20261015/btree-prefix/primary/0034-r0-random-hit-main.log": "5a13d1c5d3495cd7acfae7269a6021691af74446826a3bd97afccd8ba5ebe7d6", + "benchmarks/results-20261015/btree-prefix/primary/0034-r0-random-hit-main.stat": "126995e0ca41e4834d134a8d03d1a1ab65aa012a9245077d8b761a4b98bfe247", + "benchmarks/results-20261015/btree-prefix/primary/0035-r0-random-hit-off.log": "66c471d465adbe4395af6b13bc8de46d287137842f32482cf6280cdcba6c3f5c", + "benchmarks/results-20261015/btree-prefix/primary/0035-r0-random-hit-off.stat": "6134a7c2982c2f0fb8efc463e743f551e9ea4286727233e0cfa0195efc069cbb", + "benchmarks/results-20261015/btree-prefix/primary/0036-r0-random-hit-on.log": "bca19cc3002d69780832a09460b06092c0e4ab20de84a4df11b52d17716e6712", + "benchmarks/results-20261015/btree-prefix/primary/0036-r0-random-hit-on.stat": "edaa6f5836b3165db53135612b12b204868a8561d8ccd60b38155b0f7881a03a", + "benchmarks/results-20261015/btree-prefix/primary/0037-r0-random-miss-main.log": "4fd7d200921171b347fe49f97d61a76a5e7f6e829262139027e2657855d46c0d", + "benchmarks/results-20261015/btree-prefix/primary/0037-r0-random-miss-main.stat": "26a6da2908684feae41a7f9991b7288d2334eec8780215a6d77adef0cf1d49a9", + "benchmarks/results-20261015/btree-prefix/primary/0038-r0-random-miss-off.log": "7ba3feba8b1ce9064d56eb31e399ef802c6d89d39df56e05fe360f7d1bc7b6dd", + "benchmarks/results-20261015/btree-prefix/primary/0038-r0-random-miss-off.stat": "29c4244fdfb18a779e5a80c886af5e8cf78384f636a22890056c07e13bd13dff", + "benchmarks/results-20261015/btree-prefix/primary/0039-r0-random-miss-on.log": "f6cd932bf556f2bb03a2adf46bc5d48e414f01fafcf6566f13bf0a9b0abd0c1e", + "benchmarks/results-20261015/btree-prefix/primary/0039-r0-random-miss-on.stat": "8aecd5c4a50d9504913ea43f8d6ce9d5215b276d6f9dba5f679f674cbb8a1f82", + "benchmarks/results-20261015/btree-prefix/primary/0040-r0-random-scan1-main.log": "75fdb3aed53784f79f1a646b690dbd270cf9be45ed24ca911f12d4c8ba0baf14", + "benchmarks/results-20261015/btree-prefix/primary/0040-r0-random-scan1-main.stat": "a2b838ebab36bab92ded2055feccc3e0296d5fa5f3676dabbfeb4c1927045cb6", + "benchmarks/results-20261015/btree-prefix/primary/0041-r0-random-scan1-off.log": "10374c9c145c0a791214f558bf4a2e09cd647bb9efc56b927173182c96698424", + "benchmarks/results-20261015/btree-prefix/primary/0041-r0-random-scan1-off.stat": "b92d567dadcfcb217958869863bd2f5d70ef9b6c2ca8a096cec3bf89d3fadadd", + "benchmarks/results-20261015/btree-prefix/primary/0042-r0-random-scan1-on.log": "3c0306f3060df86194005c351b9ad14a2523c8f45b76b5a0e2b2530027664b5d", + "benchmarks/results-20261015/btree-prefix/primary/0042-r0-random-scan1-on.stat": "afba69a3db9fbdd762a24e0e729d7584352488bf9cf60a073ecf90bf5adc41c0", + "benchmarks/results-20261015/btree-prefix/primary/0043-r0-random-scan10000-main.log": "3068015a941bff74eab26c7a8877e176d1d795218f25bbe0b085ebe662e50968", + "benchmarks/results-20261015/btree-prefix/primary/0043-r0-random-scan10000-main.stat": "976dbebd5d214c1377bb039ec9c5400499bb0bad158d64e497b47862710f2294", + "benchmarks/results-20261015/btree-prefix/primary/0044-r0-random-scan10000-off.log": "0b1ef27ab8cccf9c67dec2d02a95f33abc972ed20918f61685b7e90ca07b561e", + "benchmarks/results-20261015/btree-prefix/primary/0044-r0-random-scan10000-off.stat": "db9c11a6c5477b092c9968e4685998671c627e55b068180e8257d88575e1352f", + "benchmarks/results-20261015/btree-prefix/primary/0045-r0-random-scan10000-on.log": "48c622db3f003de1e77bf6d85c3a98a7e1f64e8536fb95afbac46e40c921ae75", + "benchmarks/results-20261015/btree-prefix/primary/0045-r0-random-scan10000-on.stat": "9e6e621b48b5cb7386012a388adf907fc01d275c18194cf48e99e683bb1de82c", + "benchmarks/results-20261015/btree-prefix/primary/0046-r0-random-scanfull-main.log": "c36d4639743ff7c525e3589d0981da1d0ca656f12eff775d69cdbdd1aed6284e", + "benchmarks/results-20261015/btree-prefix/primary/0046-r0-random-scanfull-main.stat": "2ee06686ba7793c31b0da8e20f1333bca017b3a0e557f530c65c359e211e3bbe", + "benchmarks/results-20261015/btree-prefix/primary/0047-r0-random-scanfull-off.log": "7f9459265a0945bb976cb2e318906ff14607a6053c3f2f3fe5bb35ba4415ff2c", + "benchmarks/results-20261015/btree-prefix/primary/0047-r0-random-scanfull-off.stat": "0f7bbcda4503de8b0de1db30ca84c4184a704d8bf186ca77e340cc0521b03ca0", + "benchmarks/results-20261015/btree-prefix/primary/0048-r0-random-scanfull-on.log": "e3db12d549cc6f254cf3508e9a9da7031ae81ae2027612fd4b0b79b5f8288032", + "benchmarks/results-20261015/btree-prefix/primary/0048-r0-random-scanfull-on.stat": "9327b3982dc0855741c8e54b3fe1f6c0da35647bc872c00fd59d5c8e1ebf8700", + "benchmarks/results-20261015/btree-prefix/primary/0049-r0-nonlexical-insert-random-main.log": "a54d41b024caa79e24f7002c3eb50b0181abd1ff18c84ccab8a56e0665f5c8f9", + "benchmarks/results-20261015/btree-prefix/primary/0049-r0-nonlexical-insert-random-main.stat": "ae25f831773909ec7cccbbdec3627eabb74331a792d6894240158005a60a32f6", + "benchmarks/results-20261015/btree-prefix/primary/0050-r0-nonlexical-insert-random-current.log": "1fc5c9ea86648bb687d9f6bb7b8d3e036f65fcf7e1e10843285024276772d63b", + "benchmarks/results-20261015/btree-prefix/primary/0050-r0-nonlexical-insert-random-current.stat": "5e22d81510a6ade6c7424c14d01c40b3ad8ff931178df995acf1ebe13616e404", + "benchmarks/results-20261015/btree-prefix/primary/0051-r0-nonlexical-insert-sorted-main.log": "a97a0fce9de09e971b6bb5c753dadf737e140ea2684b6db630c7190b0caca061", + "benchmarks/results-20261015/btree-prefix/primary/0051-r0-nonlexical-insert-sorted-main.stat": "f9ab983dce1812de1d64fdde1d959221ecf7fa6aebbf54ffb6f165f9acb3c6e6", + "benchmarks/results-20261015/btree-prefix/primary/0052-r0-nonlexical-insert-sorted-current.log": "b18bd7511054aeef578c1f93e708fe4a754ea3cb72bfcec82a84e9929cc26823", + "benchmarks/results-20261015/btree-prefix/primary/0052-r0-nonlexical-insert-sorted-current.stat": "2028696b68dabcce4a31d12a1e937e11b440353a29eaf367c27bde0893ee9599", + "benchmarks/results-20261015/btree-prefix/primary/0053-r0-nonlexical-overwrite-main.log": "268c5be865f885afc46e57c336129f1a6b64f0df48f8af0a71100fc5bfac5106", + "benchmarks/results-20261015/btree-prefix/primary/0053-r0-nonlexical-overwrite-main.stat": "223ad71822c922ef2ee813aa3dfcd31194849d36e8552559d030f4811e62c5b0", + "benchmarks/results-20261015/btree-prefix/primary/0054-r0-nonlexical-overwrite-current.log": "24d97432172aa6f2b9700242960c7c641d6680f4bec4a3511ed2431153eb4032", + "benchmarks/results-20261015/btree-prefix/primary/0054-r0-nonlexical-overwrite-current.stat": "32c62ded740d5743e05f199a33b0934b296b931e1f3e431e34fabd029b574955", + "benchmarks/results-20261015/btree-prefix/primary/0055-r0-nonlexical-pack-main.log": "0fc0af8b460a801d82d05014ce4ff508f0230928b9c34bf348156541218b6ddf", + "benchmarks/results-20261015/btree-prefix/primary/0055-r0-nonlexical-pack-main.stat": "f8ea58c538d7f7ad400e6aeb29116d6826d9355f5ebe1677eb73b3e9b0e53e36", + "benchmarks/results-20261015/btree-prefix/primary/0056-r0-nonlexical-pack-current.log": "0fcdf7b604698a0649b9605c16166243d0e1184c78092d111a073bca0c47edfe", + "benchmarks/results-20261015/btree-prefix/primary/0056-r0-nonlexical-pack-current.stat": "0dccebb84653ab30ee93f7260282e35bdaa1cbcecacda39765e942bf11d4565e", + "benchmarks/results-20261015/btree-prefix/primary/0057-r0-nonlexical-hit-main.log": "7e8ee6446e245c338c1d1495b255e57c343bbc9afa71e77184c0884bc0d6dbf6", + "benchmarks/results-20261015/btree-prefix/primary/0057-r0-nonlexical-hit-main.stat": "06165e0f612ed69cf50de4cf4e1be8fb91b861984fedd48637afd52b4640b683", + "benchmarks/results-20261015/btree-prefix/primary/0058-r0-nonlexical-hit-current.log": "254f504e05d133f7e376c7b9ca19a2321738a1ceba320936cdaab3b6aa2a09ee", + "benchmarks/results-20261015/btree-prefix/primary/0058-r0-nonlexical-hit-current.stat": "97e454dcc9652a8d7604d6b4f4c3cd2685b6d561b7c9907ba97342d8631ec351", + "benchmarks/results-20261015/btree-prefix/primary/0059-r0-nonlexical-miss-main.log": "a80e9161ab0e3239d0ad4e7c7016cf2d32a2360581ca84325fd37506c0d95539", + "benchmarks/results-20261015/btree-prefix/primary/0059-r0-nonlexical-miss-main.stat": "b8a9e40522bf2b3bd8828870da9961d690764e557a12489e871b772ea14a571c", + "benchmarks/results-20261015/btree-prefix/primary/0060-r0-nonlexical-miss-current.log": "a61edc56aae9b9180d6b5e523c52a94e2b89398018a0fec0548ae951005d6670", + "benchmarks/results-20261015/btree-prefix/primary/0060-r0-nonlexical-miss-current.stat": "7c006c7dbee33eee4427540c2a3d81416a2b5ed1168040eecfa21967c69a12d0", + "benchmarks/results-20261015/btree-prefix/primary/0061-r0-nonlexical-scan1-main.log": "89671fd538127dd61171d8ebdfb6928bc25c6b818be68bfcbcc74426a9408879", + "benchmarks/results-20261015/btree-prefix/primary/0061-r0-nonlexical-scan1-main.stat": "e12cc7bc3d3558587eb8804474ff0f72fc1de90e34b48afff8ca2ddfc63fc6b9", + "benchmarks/results-20261015/btree-prefix/primary/0062-r0-nonlexical-scan1-current.log": "a9c953a5df124705de654ad62a28581ed0cca0ef4db32f1edd77e8c012eda2b2", + "benchmarks/results-20261015/btree-prefix/primary/0062-r0-nonlexical-scan1-current.stat": "cda29b21d305999ba5285a44c73259f48177eac1968289b76f37fa9327a3420c", + "benchmarks/results-20261015/btree-prefix/primary/0063-r0-nonlexical-scan10000-main.log": "f51dff3a390254ef05a4fa540aa282986f248948a60f478bc83402f4b3b0d5b5", + "benchmarks/results-20261015/btree-prefix/primary/0063-r0-nonlexical-scan10000-main.stat": "1dea5e14d80e1df4e82da752092ce12de859ab1b0cd3d0bba7b8052022da2b0e", + "benchmarks/results-20261015/btree-prefix/primary/0064-r0-nonlexical-scan10000-current.log": "f8fd36d14e096657061f3d73b26094241d3bd8582430dbabfc940637d6e14947", + "benchmarks/results-20261015/btree-prefix/primary/0064-r0-nonlexical-scan10000-current.stat": "b94b6c184c210b08ce56c1c3e3703d5370a778cc448cad00e77f8023db1e399f", + "benchmarks/results-20261015/btree-prefix/primary/0065-r0-nonlexical-scanfull-main.log": "3f47f093fd6d67860824ecb87264da610e749144693db4ce95360d74760c6440", + "benchmarks/results-20261015/btree-prefix/primary/0065-r0-nonlexical-scanfull-main.stat": "0e0df3c61eee66915582331968fff38d59542564c4c4521f7a870d26e2ae9547", + "benchmarks/results-20261015/btree-prefix/primary/0066-r0-nonlexical-scanfull-current.log": "56437acc2fadb4b2679f9a1361b902c4d0ee753807a145b3d1ab926bb31a1548", + "benchmarks/results-20261015/btree-prefix/primary/0066-r0-nonlexical-scanfull-current.stat": "e4169e791dc41a91de3d325d8a43f787eafa986cd67c7a6f8d38b0a5b41eda24", + "benchmarks/results-20261015/btree-prefix/primary/0067-r1-common-insert-sorted-current.log": "eea4421d5ffe729afbfc41e2a13e9a39ff742341cff4a3870510bf7e4819fc0c", + "benchmarks/results-20261015/btree-prefix/primary/0067-r1-common-insert-sorted-current.stat": "170ca3614a28ac0416f0838783bb8cffce59295b01ddefda38e54219b2540bd0", + "benchmarks/results-20261015/btree-prefix/primary/0068-r1-common-insert-sorted-main.log": "bbeecb22a35dbffa1bb2fa4ac288649b0d621eb9de2e05ee048fda067b9ce3d3", + "benchmarks/results-20261015/btree-prefix/primary/0068-r1-common-insert-sorted-main.stat": "98c3bf77f83afa703daebcaa5c66fd512aa330fdd858712749ca34393b15712c", + "benchmarks/results-20261015/btree-prefix/primary/0069-r1-common-overwrite-current.log": "bd8fc727a8733fb9d9a80b8b454dcee286ae1957f8c7958c23095330070898ce", + "benchmarks/results-20261015/btree-prefix/primary/0069-r1-common-overwrite-current.stat": "ea56bbb8f49b2f00279ebca0d01b389c681b27f7e3fd36d6dc14ce5b6bf84c38", + "benchmarks/results-20261015/btree-prefix/primary/0070-r1-common-overwrite-main.log": "ec68661dddd4e572e7e46ae76e7d41374a6d4d04a27edf82156364be4f231fd8", + "benchmarks/results-20261015/btree-prefix/primary/0070-r1-common-overwrite-main.stat": "bc7b0b7de865dbbf4ae78bb6d32110de665a0efc1c442dffe20d05385422038c", + "benchmarks/results-20261015/btree-prefix/primary/0071-r1-common-pack-main.log": "652355b6669c486ea6fba579961d76254a5b5eb7af7085f146e9ea0c0541750e", + "benchmarks/results-20261015/btree-prefix/primary/0071-r1-common-pack-main.stat": "ea4c013ceda3653a97aa191486ad4647b3dd9d121445bfaaaabb7ce5316e2d38", + "benchmarks/results-20261015/btree-prefix/primary/0072-r1-common-pack-on.log": "1ed83e9947f211b9eb2559a01ed6a5e2583442c6ff48ed5dd1ddf9684340f8cb", + "benchmarks/results-20261015/btree-prefix/primary/0072-r1-common-pack-on.stat": "3d9f6b3d799b1dd7e9b30fea61292cd7f609002b1aafce8d514f98299b3638e4", + "benchmarks/results-20261015/btree-prefix/primary/0073-r1-common-pack-off.log": "afdd7567c4a1ca9606b4394a773a9fadbdcb2c42685a6d2a1ee4fb037f63b842", + "benchmarks/results-20261015/btree-prefix/primary/0073-r1-common-pack-off.stat": "0ae62b51cff4db8fc2c44b13832297f69c646f05146181ab984fe1e08814173b", + "benchmarks/results-20261015/btree-prefix/primary/0074-r1-common-hit-main.log": "949202fb5c6d90515c10189c22b2440942e575ab306128a6041e495772d38f6b", + "benchmarks/results-20261015/btree-prefix/primary/0074-r1-common-hit-main.stat": "78f087e49c2f15e47866f39606fa6fdbcf20c106f4343eca7606fa87649b1e29", + "benchmarks/results-20261015/btree-prefix/primary/0075-r1-common-hit-on.log": "5d695847fde09dc306fc0544ac70dc47c6ac0d2beed81356326d08094625bbb6", + "benchmarks/results-20261015/btree-prefix/primary/0075-r1-common-hit-on.stat": "d0e38a972e723c13a26dc457256c6f33d0c21b4bcce43232b979368b96b62d54", + "benchmarks/results-20261015/btree-prefix/primary/0076-r1-common-hit-off.log": "dc3a618718fb54d66cb8599fae85887f0e6e57a5ae5681ecc4ed2f66a5a18ee6", + "benchmarks/results-20261015/btree-prefix/primary/0076-r1-common-hit-off.stat": "2f2a62aa4cf07305535c149f23d8fe8f76cdc6d1c04f9da00e8c732775f2cd55", + "benchmarks/results-20261015/btree-prefix/primary/0077-r1-common-miss-main.log": "6bd12547bda269bfb8cd8f609d170191504a8006b65eabb48ec2ab7f0cf92ac1", + "benchmarks/results-20261015/btree-prefix/primary/0077-r1-common-miss-main.stat": "112ff290499630540fdb1126cf62eedfe4fba20c2899b8d5df0e8c17c8e22a5d", + "benchmarks/results-20261015/btree-prefix/primary/0078-r1-common-miss-on.log": "2592e7563061aeecbb36fa109871dbe424ec7a149c12b10f4c61818b618413aa", + "benchmarks/results-20261015/btree-prefix/primary/0078-r1-common-miss-on.stat": "e8e165c00f3178a3e9e9e65db19c3630981cb925faeb1eed773062ca645a7d13", + "benchmarks/results-20261015/btree-prefix/primary/0079-r1-common-miss-off.log": "cbd103269072e66be9e9d0ab361dc3586c9e6c45c1cf59fcf90b9f3da29098b6", + "benchmarks/results-20261015/btree-prefix/primary/0079-r1-common-miss-off.stat": "19afa2b9753c3deead8127bb6cec5ddc40e0ddad52ecc72b9723f5492eb71f7a", + "benchmarks/results-20261015/btree-prefix/primary/0080-r1-common-scan1-main.log": "e5a04dcc8391c2f9c81d812a731f2195bbc0d5dcbde33dbd83b893c1e879fc2b", + "benchmarks/results-20261015/btree-prefix/primary/0080-r1-common-scan1-main.stat": "240943bb10fb6a836287278782d698fdfe07b752458615bbbdc9e8c046efb63c", + "benchmarks/results-20261015/btree-prefix/primary/0081-r1-common-scan1-on.log": "1faa748ee70c763918f98e4bcd9a7c29fcc3c4e66c7f9e1c3162fa8ac9b87ff4", + "benchmarks/results-20261015/btree-prefix/primary/0081-r1-common-scan1-on.stat": "e4001f395010778d80c2c15e5716c1d9b553d69f1a3d0ef29bac5636a78dbddf", + "benchmarks/results-20261015/btree-prefix/primary/0082-r1-common-scan1-off.log": "0fd409dc04a9fe487f99d31c9ddb4bf250399ac48e937ac2f05cf99188f8fc48", + "benchmarks/results-20261015/btree-prefix/primary/0082-r1-common-scan1-off.stat": "387f2bd2fc56eb88c84cce889778ea1b535e8d6d19f6948d754fc3a9ba55b1b4", + "benchmarks/results-20261015/btree-prefix/primary/0083-r1-common-scan10000-main.log": "f32978382e7ef53095e90189136df32f735b57488b5bb39ed389fc33ef3c8014", + "benchmarks/results-20261015/btree-prefix/primary/0083-r1-common-scan10000-main.stat": "7b49fd89b6086a0edf157d2adae4e68e6aada282e0bfc9ff4060ab07c017809d", + "benchmarks/results-20261015/btree-prefix/primary/0084-r1-common-scan10000-on.log": "5b3a67e644ab4b5b6d3032b0b4b21d95929198f3d5c35469907b711aebe71ffb", + "benchmarks/results-20261015/btree-prefix/primary/0084-r1-common-scan10000-on.stat": "f504ddcaaf6efd193aa73e31ee888f5171ff02b3b5d937cec4f479df44ea3b6b", + "benchmarks/results-20261015/btree-prefix/primary/0085-r1-common-scan10000-off.log": "c3ae7e69e3edc39fbe0b732194d5a691b55ae709b036919a9fcf1c5679133311", + "benchmarks/results-20261015/btree-prefix/primary/0085-r1-common-scan10000-off.stat": "efe9adcd150fd2601c9c80a87f20518a706d7e0ae56f7a552da6fabd969a6150", + "benchmarks/results-20261015/btree-prefix/primary/0086-r1-common-scanfull-main.log": "48e68090c56cda026726cbf42dd34baaf7fee4d7c8079a81ee258340bacde4b8", + "benchmarks/results-20261015/btree-prefix/primary/0086-r1-common-scanfull-main.stat": "f99364c38140f0fa25e31f70d552eab29cd119b6dfed0cdeaeb45a31d67e0a31", + "benchmarks/results-20261015/btree-prefix/primary/0087-r1-common-scanfull-on.log": "5215d58ee7019846076d67133a097076d11b5b364a6f34b22a7743ca23996883", + "benchmarks/results-20261015/btree-prefix/primary/0087-r1-common-scanfull-on.stat": "48ace1daf3140393728c3f72b72c4e0883da3bfe201b746ffa27a22b7ee415ea", + "benchmarks/results-20261015/btree-prefix/primary/0088-r1-common-scanfull-off.log": "3585f752fd9e61ac6290fa691bb8b2f983e1caf5c5fe063d1e38e924d58197a8", + "benchmarks/results-20261015/btree-prefix/primary/0088-r1-common-scanfull-off.stat": "f75aa211c0bec806e2f5994e2f9de4a64eb0b0be6650a0a6fc37a1aa3343c03c", + "benchmarks/results-20261015/btree-prefix/primary/0089-r1-random-insert-random-current.log": "c7adc7a9216ac89c685dc6ee85e7e742c322d5b591719c542b0ca56d5c6ec421", + "benchmarks/results-20261015/btree-prefix/primary/0089-r1-random-insert-random-current.stat": "68794703cd11a37cff43bd573ea7c519c3ab3ce54cdaf9f6e5c06edcb5723434", + "benchmarks/results-20261015/btree-prefix/primary/0090-r1-random-insert-random-main.log": "4b24a2dfd912786b606a254f07809d2be0a29ad4752bc6394704313460aa12af", + "benchmarks/results-20261015/btree-prefix/primary/0090-r1-random-insert-random-main.stat": "8f4de85ee00f4f6f3e16cc48bec265a7f91a3d3d855c26eb10cb81d4163b86c7", + "benchmarks/results-20261015/btree-prefix/primary/0091-r1-random-insert-sorted-current.log": "cb8c5967e081584cc8e68dcf8a702a2cf1b1a996bc06d3a9920204599304f0ac", + "benchmarks/results-20261015/btree-prefix/primary/0091-r1-random-insert-sorted-current.stat": "e77d9c946ded005f9a27b4304f4f6c2b1d5f78571ee5fdfa41897b881a10e734", + "benchmarks/results-20261015/btree-prefix/primary/0092-r1-random-insert-sorted-main.log": "befba85e277111f54e227cfa849b2f438f5e6de0138043fad68b3bd3e56c192b", + "benchmarks/results-20261015/btree-prefix/primary/0092-r1-random-insert-sorted-main.stat": "9f06e06295b1790c46c01a686255ffe83850a42e7f3790fd511f0a926c3ca46c", + "benchmarks/results-20261015/btree-prefix/primary/0093-r1-random-overwrite-current.log": "e9541e00d0112f8310d09eccfd5b6555336cf89628bb63560cea928d3fe0fbae", + "benchmarks/results-20261015/btree-prefix/primary/0093-r1-random-overwrite-current.stat": "cfc9b43a83c437c3cfd7c7eb7e1874089338d1d2c95737c9e532ceb9eb68574c", + "benchmarks/results-20261015/btree-prefix/primary/0094-r1-random-overwrite-main.log": "bab07a04c28d08fe57161bd039385066ea26dcd1a2dc5ff403dac9b6cb42c553", + "benchmarks/results-20261015/btree-prefix/primary/0094-r1-random-overwrite-main.stat": "260091c6c4e4b6fe8d377d958dece134fa89466752e236627e704a66f9a4d1a8", + "benchmarks/results-20261015/btree-prefix/primary/0095-r1-random-pack-main.log": "1f0076cbabadb6f9ba12635a166c1a3ba306bc81c75d549cdaadcd5a6bcc10dc", + "benchmarks/results-20261015/btree-prefix/primary/0095-r1-random-pack-main.stat": "2cf13695f4e68c62738afbe5f1d69ad17b483013c868aae599015fae055e0e7d", + "benchmarks/results-20261015/btree-prefix/primary/0096-r1-random-pack-on.log": "3a9a7ca37bbdae2f933f2faf5050d0df51ea85bc2678f72d91aca0ba450b4216", + "benchmarks/results-20261015/btree-prefix/primary/0096-r1-random-pack-on.stat": "90fe5014ed3d8facdbf54e43dd46756d65e21f1382104aee0a53074f4d605be1", + "benchmarks/results-20261015/btree-prefix/primary/0097-r1-random-pack-off.log": "fa5bd30996978e9c542638620a1a2f3c9ce25ff9c75f59f3f379b93dda5b0cc8", + "benchmarks/results-20261015/btree-prefix/primary/0097-r1-random-pack-off.stat": "d98cc03c1bfb4f7bd1ff0d220474976fd6234ff5e924f3f6479ece0c93b0543d", + "benchmarks/results-20261015/btree-prefix/primary/0098-r1-random-hit-main.log": "b0e18f080f5d539874a0ce9a6a32b33539ec30cc3fcd759d11bdbecf0ec076e4", + "benchmarks/results-20261015/btree-prefix/primary/0098-r1-random-hit-main.stat": "9460414681a00b2e256dbc6dd24f322b4d175704392c1b188331a92f4129469a", + "benchmarks/results-20261015/btree-prefix/primary/0099-r1-random-hit-on.log": "ae4767336d306ea1b4b64b34597675e357b14cb7af1f285a05420b9365514c5b", + "benchmarks/results-20261015/btree-prefix/primary/0099-r1-random-hit-on.stat": "2bb45dc7ea84c9e170b30d872fa99a40dff12ee7061819476392407595c10e2f", + "benchmarks/results-20261015/btree-prefix/primary/0100-r1-random-hit-off.log": "d12e2d14efbf7251557e14ee333f00c7bf78443883ccc01b254ae9cbfca69b80", + "benchmarks/results-20261015/btree-prefix/primary/0100-r1-random-hit-off.stat": "95ba42d726bdcf696446397c05b1a7bfbbc3bebdd1bbf225a60b0098c4a86820", + "benchmarks/results-20261015/btree-prefix/primary/0101-r1-random-miss-main.log": "7460261e0118b61ec2096760ff8012f954cbf1d68b0a50e85b051465a7de7849", + "benchmarks/results-20261015/btree-prefix/primary/0101-r1-random-miss-main.stat": "fccc66d1b212467dfaa1e6c36f4d9b4c03bf04cc7a4d98f8ad66cdac7e9f44be", + "benchmarks/results-20261015/btree-prefix/primary/0102-r1-random-miss-on.log": "79d4d9d67eab038b43e7270e5a3f9f5cbaa1b9493db0f7a7a86e31235c42961d", + "benchmarks/results-20261015/btree-prefix/primary/0102-r1-random-miss-on.stat": "0d706538fd8ae191fc0b1b636240678151081630aa7a10efe0c16bb642a838f2", + "benchmarks/results-20261015/btree-prefix/primary/0103-r1-random-miss-off.log": "17e87e27dcc7cfdd9bef7d7426e9201982b77dd60b2dc0b43c8f954acdc90469", + "benchmarks/results-20261015/btree-prefix/primary/0103-r1-random-miss-off.stat": "a1b794b82b74487320bec84309f59f5798e47a57fe64876855357bd3aea1f64e", + "benchmarks/results-20261015/btree-prefix/primary/0104-r1-random-scan1-main.log": "f6646a1dab3b214d9c5f771bf5b3243412f1bd191684d6ee1e5e32b813e17c3b", + "benchmarks/results-20261015/btree-prefix/primary/0104-r1-random-scan1-main.stat": "816b2c1b8753bcfa46929cd5fad9adef3a98e7a3afdcbf82f4b7cbded03447eb", + "benchmarks/results-20261015/btree-prefix/primary/0105-r1-random-scan1-on.log": "19fc20792c81e892a4a9729acb3f153244bb640f4c04b6149995944b81cce424", + "benchmarks/results-20261015/btree-prefix/primary/0105-r1-random-scan1-on.stat": "bed74b97ea50b702d3eb77fdd0cfbe0e120d85e728e9acf11bb9b9e264b72ad4", + "benchmarks/results-20261015/btree-prefix/primary/0106-r1-random-scan1-off.log": "f312744abb13de90224dbcab4c2ea8f4c8527c204ee1f307e8f08e9d85804439", + "benchmarks/results-20261015/btree-prefix/primary/0106-r1-random-scan1-off.stat": "fa4ac2914b942f902e79719ababf5ef5a3750c26a0664c0dd41bd13291089927", + "benchmarks/results-20261015/btree-prefix/primary/0107-r1-random-scan10000-main.log": "55d47ee4d6ea23d547c2b9e0ae5164f6bdab017ac94253e42d9bf1340e02a5b3", + "benchmarks/results-20261015/btree-prefix/primary/0107-r1-random-scan10000-main.stat": "31f358c52034eb8d6bc7869e7818101c436c6ceedb46b31f5459c281fcc9c449", + "benchmarks/results-20261015/btree-prefix/primary/0108-r1-random-scan10000-on.log": "9096e3459cd2cf23ecd6834810be29e6207b91d2eb8a699d2a57ca8c005d6023", + "benchmarks/results-20261015/btree-prefix/primary/0108-r1-random-scan10000-on.stat": "fb34037f5fe2b93262bf21e69f12518e5b2bae34dfc7a83a70d0e35c9024e961", + "benchmarks/results-20261015/btree-prefix/primary/0109-r1-random-scan10000-off.log": "b6f985c73b06db32491e872f08b19eaedf8923a0f3be5054a4879f8a6ea2f846", + "benchmarks/results-20261015/btree-prefix/primary/0109-r1-random-scan10000-off.stat": "b94bfc6504858828ab2955ee0ced7e9cbef7097aa34dbf9c6252a390447741ab", + "benchmarks/results-20261015/btree-prefix/primary/0110-r1-random-scanfull-main.log": "10e5a019ae4db74fa1e20ae65d349d88ccf4e55dddc439e0887a34e69392884b", + "benchmarks/results-20261015/btree-prefix/primary/0110-r1-random-scanfull-main.stat": "538607900bbf2bcb2ad02386213749b008cae1b957788289498e74500b15404c", + "benchmarks/results-20261015/btree-prefix/primary/0111-r1-random-scanfull-on.log": "63f2eeaf5a44bd18e5830d1253b45fb79ecc4db00a0028f8c9e2a5740776f966", + "benchmarks/results-20261015/btree-prefix/primary/0111-r1-random-scanfull-on.stat": "96c368edfa6ec2fa7cdb3ead721ed21384de00178af698fbb8fb9929d9bbac22", + "benchmarks/results-20261015/btree-prefix/primary/0112-r1-random-scanfull-off.log": "bda641bfbaa1a6abca9705f2e1605bca1e31c5ddc4889e0fa01e2dd92e6ff430", + "benchmarks/results-20261015/btree-prefix/primary/0112-r1-random-scanfull-off.stat": "083408c90b9cbd0913b10f4f0b19110d01a37475b154c5234c608e62f6b014cf", + "benchmarks/results-20261015/btree-prefix/primary/0113-r1-nonlexical-insert-random-current.log": "8ee3a51cb29b7d9b35f2481072cdc5969ea997c56b6fd87cc1c349f8eefbb4a6", + "benchmarks/results-20261015/btree-prefix/primary/0113-r1-nonlexical-insert-random-current.stat": "56e7bd63c0d1b7d19170c300dd27c00a44892fe4f6ed01f82aa648e73bc21d98", + "benchmarks/results-20261015/btree-prefix/primary/0114-r1-nonlexical-insert-random-main.log": "0f40dc770c2a1ec9121d6440a3657921144e0cbc98b1718f17013436f68675f6", + "benchmarks/results-20261015/btree-prefix/primary/0114-r1-nonlexical-insert-random-main.stat": "67f1b689adccbb6580c207c9b7d025d9569d64452196fbcdffc9d476fed77373", + "benchmarks/results-20261015/btree-prefix/primary/0115-r1-nonlexical-insert-sorted-current.log": "aa7f08ff79a96cb62716bcdda211b61aec66872a4187fad7ee8e7f6c08391d6d", + "benchmarks/results-20261015/btree-prefix/primary/0115-r1-nonlexical-insert-sorted-current.stat": "8f11c660fa293543303bddf8dff6a29231707756ddccb45dec7f8732166da608", + "benchmarks/results-20261015/btree-prefix/primary/0116-r1-nonlexical-insert-sorted-main.log": "3149aa37d86eebbcf3a11dbc19410aacc31aed2a66b8e869f0d6d2c686a0690f", + "benchmarks/results-20261015/btree-prefix/primary/0116-r1-nonlexical-insert-sorted-main.stat": "ab9ad8a74bfb9bcfeb254455073d85037a45a57f45b469001f0ac07340e24286", + "benchmarks/results-20261015/btree-prefix/primary/0117-r1-nonlexical-overwrite-current.log": "b0441f4e55421b92413df605a7fd3edbf4ce3f3b67c31fd0432c36693cd28b96", + "benchmarks/results-20261015/btree-prefix/primary/0117-r1-nonlexical-overwrite-current.stat": "2b073a186390440b5f2e322f274959187a60bed1f4aafc9675ef7dbebca831f6", + "benchmarks/results-20261015/btree-prefix/primary/0118-r1-nonlexical-overwrite-main.log": "b4584d5436bbdf8038396811f835defd8cdb28968b165f7dd3b8a49dbc421d52", + "benchmarks/results-20261015/btree-prefix/primary/0118-r1-nonlexical-overwrite-main.stat": "af4222df3b2754a369ecf3bfdc185ad388d2005cab6935ac7ddd0c9659ca9076", + "benchmarks/results-20261015/btree-prefix/primary/0119-r1-nonlexical-pack-current.log": "f2c8e4e26c9380613660cd465ae494cf59c9dfe7f0899fd6f11290dd2231f6db", + "benchmarks/results-20261015/btree-prefix/primary/0119-r1-nonlexical-pack-current.stat": "76042e3c3079e1c604ecdd29f1ec10bd65ab5275bef2203111f087ce13ada777", + "benchmarks/results-20261015/btree-prefix/primary/0120-r1-nonlexical-pack-main.log": "55284633fac61e5befceb61d9ae0c6d2166becf4128e123e60e459851006c064", + "benchmarks/results-20261015/btree-prefix/primary/0120-r1-nonlexical-pack-main.stat": "c20b1e06d582d4df7f0a1fd4011ebfaaf4d7e404944bf0062a6aeca6fde343e4", + "benchmarks/results-20261015/btree-prefix/primary/0121-r1-nonlexical-hit-current.log": "d72cdd349d53f26c43c9f8a384d83541b938e7a42d616335c6594319c56ed5c6", + "benchmarks/results-20261015/btree-prefix/primary/0121-r1-nonlexical-hit-current.stat": "b5731d5fed8a202d4332d686b0ca4faaffbd6537ac4a6b404a4b885bf182c7a4", + "benchmarks/results-20261015/btree-prefix/primary/0122-r1-nonlexical-hit-main.log": "dc7cfd89b3a6d2c20544e14a051cb15ffe8a5f568a1b2e91fb5fa119a647c216", + "benchmarks/results-20261015/btree-prefix/primary/0122-r1-nonlexical-hit-main.stat": "2213f54ac230987ded04de7bbc0769e43137f78f2b67bb51c9fb48b1715f6577", + "benchmarks/results-20261015/btree-prefix/primary/0123-r1-nonlexical-miss-current.log": "d56fcc3276fcba1a5156e15d3bfa5d0a683b08606493c7a7fa4509c7962154a0", + "benchmarks/results-20261015/btree-prefix/primary/0123-r1-nonlexical-miss-current.stat": "ae237ac2fe2072191d9947960e1465b5dc6b00bab0099bc5f26e6de9529ccb9c", + "benchmarks/results-20261015/btree-prefix/primary/0124-r1-nonlexical-miss-main.log": "ffd830bec98edbfb1bf1b272382cf1995d6ad764cd7fb689c3fd8b5e36f9abf7", + "benchmarks/results-20261015/btree-prefix/primary/0124-r1-nonlexical-miss-main.stat": "957411aaedf1a880f05dba302d6cf675bcac5a001899622182ed51580aa89c39", + "benchmarks/results-20261015/btree-prefix/primary/0125-r1-nonlexical-scan1-current.log": "5a45aba0bac1a7d7398914f408e20c07f3f3eb33bd0619b109c7bf74323e0c45", + "benchmarks/results-20261015/btree-prefix/primary/0125-r1-nonlexical-scan1-current.stat": "f3ff4953e8680144c71dae80ba7b191cdbb008323569a28680fc794d526eb9b5", + "benchmarks/results-20261015/btree-prefix/primary/0126-r1-nonlexical-scan1-main.log": "97dfc84cb1ddb57f1fd5cc33581e52fb34fa854b69f2d452483d491a1a2a4d13", + "benchmarks/results-20261015/btree-prefix/primary/0126-r1-nonlexical-scan1-main.stat": "287983abce3d23bef38372d2d1cf36a7356aeb790d2bb26835e14ee5d92ac61a", + "benchmarks/results-20261015/btree-prefix/primary/0127-r1-nonlexical-scan10000-current.log": "00aaf0d3aaf94457ab8a6b05b6b23b333f6f0915d84e2b47ae6480457d5817cb", + "benchmarks/results-20261015/btree-prefix/primary/0127-r1-nonlexical-scan10000-current.stat": "100ea976a0af3af917b2181efa5e7629d6b45d1301cc75e641af9e0bc4dfdf66", + "benchmarks/results-20261015/btree-prefix/primary/0128-r1-nonlexical-scan10000-main.log": "e46fc8dd2722ab790724c12cfcbaaf1bb9fd74b26457ed1ca336550b20d9b13c", + "benchmarks/results-20261015/btree-prefix/primary/0128-r1-nonlexical-scan10000-main.stat": "5de2999358a525b5c890792f90e389a21808af77f14c055b374f6765a5db27b7", + "benchmarks/results-20261015/btree-prefix/primary/0129-r1-nonlexical-scanfull-current.log": "508da250cfb7d4cdfec0048b9aec426f6c8543a300be7eceb292bff193342046", + "benchmarks/results-20261015/btree-prefix/primary/0129-r1-nonlexical-scanfull-current.stat": "2dfcfb2f4be6022a613469f4e49fd20988929a150e739c8fb824dcf5038db4be", + "benchmarks/results-20261015/btree-prefix/primary/0130-r1-nonlexical-scanfull-main.log": "28b0b9bd4a86740b385f1aee4233443c40a366991ac72a8775cd463a1a2acca8", + "benchmarks/results-20261015/btree-prefix/primary/0130-r1-nonlexical-scanfull-main.stat": "c38c07ece5b2cfb32178e882f55211425d24e0490142eb2bdb3c1e789fa12ceb", + "benchmarks/results-20261015/btree-prefix/primary/0131-r1-common-insert-random-current.log": "623b5d8a0693ebb1e89d610d6491d09995d68e48027eb33514d14e2ecbbea51c", + "benchmarks/results-20261015/btree-prefix/primary/0131-r1-common-insert-random-current.stat": "a5dfec8b83c15694d3cb599924ba30b67c233a670e43d91d2efc17dbfe3ed55d", + "benchmarks/results-20261015/btree-prefix/primary/0132-r1-common-insert-random-main.log": "f9399c5df8161ac27170fdda8a4514183c66573d9ef0ea993a9f48a9e86399e6", + "benchmarks/results-20261015/btree-prefix/primary/0132-r1-common-insert-random-main.stat": "fdffcbf6973bba4ccf74f0ecb258da155717275b95cb72f10f65a0c2d2793f8d", + "benchmarks/results-20261015/btree-prefix/primary/0133-r2-common-overwrite-main.log": "4f99d2a158430fc97c01b5905ccb14110d0c20d6bab1a3c63d33173a3c8f276c", + "benchmarks/results-20261015/btree-prefix/primary/0133-r2-common-overwrite-main.stat": "2371ef5b7ed35888e0da3cd6b018eda08196ef8eba946816d35b6954ff7f4688", + "benchmarks/results-20261015/btree-prefix/primary/0134-r2-common-overwrite-current.log": "34ea3e99253b9ee423c308199d7948dbf7fac0da54901e71048542cbd4cf8055", + "benchmarks/results-20261015/btree-prefix/primary/0134-r2-common-overwrite-current.stat": "2de74e10ce5d39fcba5d38c86545a7ca5e019b3fb669ef59e988df53e6995630", + "benchmarks/results-20261015/btree-prefix/primary/0135-r2-common-pack-off.log": "d11677cd40f8f184c2c6f4d2e9e0f91947b38355a1ba83e63c10b95156b07222", + "benchmarks/results-20261015/btree-prefix/primary/0135-r2-common-pack-off.stat": "1934eab5979eaa361e52a6d2fa3b1c4e96156586982f03bb2e3b31d58a30a205", + "benchmarks/results-20261015/btree-prefix/primary/0136-r2-common-pack-main.log": "c091d6ddc2710db0e559428cf8bfe0fdc244ce731e81015a5bf9022da00950c2", + "benchmarks/results-20261015/btree-prefix/primary/0136-r2-common-pack-main.stat": "11fd4d6b3245098784082c332f37d95838263bc5e2ef8eda89a7b02311ea1e8a", + "benchmarks/results-20261015/btree-prefix/primary/0137-r2-common-pack-on.log": "f3992d64ef35fcfbdeb875073e86005f381c14ebf0cc3c45f68ae2b55f352ff7", + "benchmarks/results-20261015/btree-prefix/primary/0137-r2-common-pack-on.stat": "e4cf312eacf4de26f3d925ecc559000bc8c27f99df4518e257675fcb309194d1", + "benchmarks/results-20261015/btree-prefix/primary/0138-r2-common-hit-off.log": "fd8b8b7b67ab99d51d5f6530288a0471feafaee45a7252868eaf90f605cbc7c1", + "benchmarks/results-20261015/btree-prefix/primary/0138-r2-common-hit-off.stat": "25e76e888a6cd3412676442baf710c03be68eca5e84ce8d5c4e153ab1e73ffd3", + "benchmarks/results-20261015/btree-prefix/primary/0139-r2-common-hit-main.log": "59589e8f04f9e879dae50a5f303111776683aa67f3f60c12f81f7a7a5cdf7ea4", + "benchmarks/results-20261015/btree-prefix/primary/0139-r2-common-hit-main.stat": "47a90753893d2390fbff6146ce898c29d1a9fb78e28c66414e7289acbd42d1f9", + "benchmarks/results-20261015/btree-prefix/primary/0140-r2-common-hit-on.log": "0fdf33b111d56d56a10a3ad4a65fa208381e68ad1349166a7cfbd9d9f18fca13", + "benchmarks/results-20261015/btree-prefix/primary/0140-r2-common-hit-on.stat": "f0a9762654e40a39eaa924a0232ea7d1c49f2ba9260767642edf3b30e81535ff", + "benchmarks/results-20261015/btree-prefix/primary/0141-r2-common-miss-off.log": "40f9be91757fcea99e502066b47d627d083d21ce501f6939bf855569a5a50f38", + "benchmarks/results-20261015/btree-prefix/primary/0141-r2-common-miss-off.stat": "15492a7588f6c3e3f3d9dfa1bd0882b88934928dcf7e4e1d9c567beba2c50836", + "benchmarks/results-20261015/btree-prefix/primary/0142-r2-common-miss-main.log": "ca8a31bcf6c558395855615c796a0a8d43f688d06d342599d8e87008e333953d", + "benchmarks/results-20261015/btree-prefix/primary/0142-r2-common-miss-main.stat": "96fb0ac435078ba84ed764d30984518570a3f39ac1bc7066165a003b54fb451a", + "benchmarks/results-20261015/btree-prefix/primary/0143-r2-common-miss-on.log": "948ea8ddc4da416bb2a4bcc9269da934dbc20a1b3d1176366afde7e7f8d447dc", + "benchmarks/results-20261015/btree-prefix/primary/0143-r2-common-miss-on.stat": "258ffc2a2bcdd2d44a95efc885737fa01b29a20eda179fd3aed30455f4f4c982", + "benchmarks/results-20261015/btree-prefix/primary/0144-r2-common-scan1-off.log": "b8f78a1f4f6ec06cc3eba7c232f495d3de2601c1326a16d21f6c641818e33efa", + "benchmarks/results-20261015/btree-prefix/primary/0144-r2-common-scan1-off.stat": "ba4940f62de940406a16408b78108aa3c722cafd11e4fc539681eb19e7fa5bae", + "benchmarks/results-20261015/btree-prefix/primary/0145-r2-common-scan1-main.log": "1b3e9d26d50d623b462836864c481a57d638ea2f21438709dd95a738825130ba", + "benchmarks/results-20261015/btree-prefix/primary/0145-r2-common-scan1-main.stat": "40fcd6aabdaed65b387facf995df06389f879df6dac5c21dda208db503a74b5d", + "benchmarks/results-20261015/btree-prefix/primary/0146-r2-common-scan1-on.log": "6f446fc29a658f2da7b6ee3774eda3e72d5b491c5c48e83ca56f9b5623415504", + "benchmarks/results-20261015/btree-prefix/primary/0146-r2-common-scan1-on.stat": "37c88c6de2eb3a73ca4b287c5f512555703eb1b189fc2e0c574a5eeccfce69cf", + "benchmarks/results-20261015/btree-prefix/primary/0147-r2-common-scan10000-off.log": "b4d666658f72afc6eb9e1db44d3e884c0bdd21c62660e2913700305a5afdb9fc", + "benchmarks/results-20261015/btree-prefix/primary/0147-r2-common-scan10000-off.stat": "af8164101305b8ccc59adfd8bddd0fcfac661ddf3aaae3af99c27a1b678efec0", + "benchmarks/results-20261015/btree-prefix/primary/0148-r2-common-scan10000-main.log": "c1410bb543e5c247ce9712ab52312c90c07ac1f3d26cbf1a64d147e90505e6c1", + "benchmarks/results-20261015/btree-prefix/primary/0148-r2-common-scan10000-main.stat": "9e3b096ae463a093b4e2c02a0d7af71e155ebf34d84bce1dbadb3a003e847125", + "benchmarks/results-20261015/btree-prefix/primary/0149-r2-common-scan10000-on.log": "5444425a566ff11246e657afb1af1d1b30d26c28167f26034cad73a6c2122b20", + "benchmarks/results-20261015/btree-prefix/primary/0149-r2-common-scan10000-on.stat": "7f04918d7abfc988fb7b0cdc55160824a650c6fc3f25a1ae7f1a78344752071b", + "benchmarks/results-20261015/btree-prefix/primary/0150-r2-common-scanfull-off.log": "819ae179ff33e1f6b931d150dea0e2b19ba1609e3a1cbb768a224edd03c1e405", + "benchmarks/results-20261015/btree-prefix/primary/0150-r2-common-scanfull-off.stat": "e2c32ab8d804a04e8195a952970102f677ebf773284e47cc96146f7ce0ebfd49", + "benchmarks/results-20261015/btree-prefix/primary/0151-r2-common-scanfull-main.log": "e2834f542c24b963bc178ddcdf9226912087e32b1c6f58fbf78fdf452dbd4b54", + "benchmarks/results-20261015/btree-prefix/primary/0151-r2-common-scanfull-main.stat": "602b7c463d65b289ad53773344470b5a0f2a2ae6b00bcc32402192f5ef803bcf", + "benchmarks/results-20261015/btree-prefix/primary/0152-r2-common-scanfull-on.log": "b92325a4cab1dc544a852ee86ed8502414a48f4f5dac58ce9167ba0aae0f72bf", + "benchmarks/results-20261015/btree-prefix/primary/0152-r2-common-scanfull-on.stat": "23c5db6ae13f2522860d59a97d20bb26ddb0e58d34a1f3fbac6a1d36527a1c6d", + "benchmarks/results-20261015/btree-prefix/primary/0153-r2-random-insert-random-main.log": "632c8d4dd9fbc4786551e429a37d6a0baa4836d70445f3a2a199730cd733f5a5", + "benchmarks/results-20261015/btree-prefix/primary/0153-r2-random-insert-random-main.stat": "194e145d6564a88a7696e47b478c4449b958a77f5dbcecfe1eb9f6974fe50795", + "benchmarks/results-20261015/btree-prefix/primary/0154-r2-random-insert-random-current.log": "69a0de3b99a48211f5168a62d0680e2e39075d81425b46597342f6a4c0ae9216", + "benchmarks/results-20261015/btree-prefix/primary/0154-r2-random-insert-random-current.stat": "a7f39fd4738cd01b26f2c28906e4c4fde4669034679e22006adb1d3e4b6d434a", + "benchmarks/results-20261015/btree-prefix/primary/0155-r2-random-insert-sorted-main.log": "bf73ee5b6c1cdfb6c6169fede51d39e606431897dd4debf6118fab8c5a6773ef", + "benchmarks/results-20261015/btree-prefix/primary/0155-r2-random-insert-sorted-main.stat": "47a219914e3059735d25f59a5115876d7896f68aa53499a69f26bfd1255f560d", + "benchmarks/results-20261015/btree-prefix/primary/0156-r2-random-insert-sorted-current.log": "ed8ee674be40ece0e0480a55e26dbcd6524b9962ed58b3c94c5b65241a3748b5", + "benchmarks/results-20261015/btree-prefix/primary/0156-r2-random-insert-sorted-current.stat": "13ff14bce3b0e6f9841349bc288482a132619127cef6e818d4d981697277b162", + "benchmarks/results-20261015/btree-prefix/primary/0157-r2-random-overwrite-main.log": "7cfbf038ffa00c14c8e45986586a156ef2d252fe24d27e6cf99d74f189b4ed7b", + "benchmarks/results-20261015/btree-prefix/primary/0157-r2-random-overwrite-main.stat": "21ef9dba75488aa0ede4dda69a0c217f1f4e37dc4dd6f1056c1bdac62daca4c6", + "benchmarks/results-20261015/btree-prefix/primary/0158-r2-random-overwrite-current.log": "8e1154ce2fbe16b1692da11715640718a77872109a545820a09e8983be0fd196", + "benchmarks/results-20261015/btree-prefix/primary/0158-r2-random-overwrite-current.stat": "14b027b4a08cbed908e5d8112df5f731051e9ca09af60b7964398c4721eadfd2", + "benchmarks/results-20261015/btree-prefix/primary/0159-r2-random-pack-off.log": "7ce5393575d5deaebdb9a01b676498ff25011a9c1f9ceec22b7b912017a4a1a1", + "benchmarks/results-20261015/btree-prefix/primary/0159-r2-random-pack-off.stat": "b0f726f8d8a4652ceace834cc733276aee00c0d08a441bd7a6b0dbb80a150559", + "benchmarks/results-20261015/btree-prefix/primary/0160-r2-random-pack-main.log": "5e5acf9622ba0826971a3369c0557b04372cbc6256b6c29221c7db33b8df3678", + "benchmarks/results-20261015/btree-prefix/primary/0160-r2-random-pack-main.stat": "27e9bf21a68cd74ff351ac8c5a4d5249ef05ec2adcee6dd5edb7b4b992f3f426", + "benchmarks/results-20261015/btree-prefix/primary/0161-r2-random-pack-on.log": "407776796b81279d48ca276285949f59a9f8daaf301d9f1ce27e53b7f9d89328", + "benchmarks/results-20261015/btree-prefix/primary/0161-r2-random-pack-on.stat": "cc984cf91cf755cf9ba253e9f46673673cf828c52b42029c676125ef626cf58e", + "benchmarks/results-20261015/btree-prefix/primary/0162-r2-random-hit-off.log": "15fd828f7ca2569cb311d83217e63cae004a6fab5600107c6085f00407488c49", + "benchmarks/results-20261015/btree-prefix/primary/0162-r2-random-hit-off.stat": "f09c37fe66cb6418a05c3d96fc5bc97c1f5caa1ef1de62d626660ff1767429c4", + "benchmarks/results-20261015/btree-prefix/primary/0163-r2-random-hit-main.log": "78be9901266541813f395db6c4f5148f5f02e6a0c6e7a8c65d90ca51b3a4cb8c", + "benchmarks/results-20261015/btree-prefix/primary/0163-r2-random-hit-main.stat": "88d19df4ba6703379b9c07f71dfd46b395f577663c72ddd9a5b6cbb02d55f8b0", + "benchmarks/results-20261015/btree-prefix/primary/0164-r2-random-hit-on.log": "bb8c275e46e653734b9382053c72399cd39cfe57a6fca81d9f3e82124f4b0c05", + "benchmarks/results-20261015/btree-prefix/primary/0164-r2-random-hit-on.stat": "1b39ae5af60ba97e4c809204442c87147e86f50fed7e629715ba00600585d09b", + "benchmarks/results-20261015/btree-prefix/primary/0165-r2-random-miss-off.log": "15b5224ce59262741184957735f05f225a8b650eeea03611634c2057e7b43f9f", + "benchmarks/results-20261015/btree-prefix/primary/0165-r2-random-miss-off.stat": "e31f8d12bc47843241cf64385c7be2c514e2e1dbd3cc178d1cb7a9201cd99477", + "benchmarks/results-20261015/btree-prefix/primary/0166-r2-random-miss-main.log": "696b7503e3887df4f29eb5c12af7d9d353397e545ead489f43925740a7f78135", + "benchmarks/results-20261015/btree-prefix/primary/0166-r2-random-miss-main.stat": "85520652e83e34f7d26ea6c6c132f66eb26115440af83fd3eefa9d04e0407f08", + "benchmarks/results-20261015/btree-prefix/primary/0167-r2-random-miss-on.log": "8b926e9ae3b6539515768ca6cbc2f4db7948f51c909de68b1cd287e2a473e629", + "benchmarks/results-20261015/btree-prefix/primary/0167-r2-random-miss-on.stat": "190249f00925e9fa97896418be250003572da2ddc05ee42c5d611da1f9b456bd", + "benchmarks/results-20261015/btree-prefix/primary/0168-r2-random-scan1-off.log": "347b9ee02e21176a82a0b98c794c62730e191b4ab6f41331ad8e9492c9c90264", + "benchmarks/results-20261015/btree-prefix/primary/0168-r2-random-scan1-off.stat": "e71556ff0bc5aa1bb3cd1482a747c0a656140f0f2633e7af28b4e8144565bd21", + "benchmarks/results-20261015/btree-prefix/primary/0169-r2-random-scan1-main.log": "218964172655f4e2c373f434ee3fa972cde61ba1274f35e77231d996999f7ef9", + "benchmarks/results-20261015/btree-prefix/primary/0169-r2-random-scan1-main.stat": "1fbfb0129c6b7d085173debef94b6cebe95d68e3e0cb31457340c7cb715aa284", + "benchmarks/results-20261015/btree-prefix/primary/0170-r2-random-scan1-on.log": "c529b49631241e2a2f06aaa889485bbf6a1c5601afc8c52e7e510895c9231403", + "benchmarks/results-20261015/btree-prefix/primary/0170-r2-random-scan1-on.stat": "172e4461f89b3944d28897ba8bd5894693b8e55038f6d9ea261aad42890dfb72", + "benchmarks/results-20261015/btree-prefix/primary/0171-r2-random-scan10000-off.log": "84f8ead7c2156c40a6addb490a8eb12545ab96d08fd225783232e4f3ecf70d53", + "benchmarks/results-20261015/btree-prefix/primary/0171-r2-random-scan10000-off.stat": "e815efb9a65d8ac4f80e2720bb95152cab1357c479456768de56f90fe7de512e", + "benchmarks/results-20261015/btree-prefix/primary/0172-r2-random-scan10000-main.log": "d1c20f75baaa605e49615804adc7a4a3db66393c2e960d81529c68f15e01284c", + "benchmarks/results-20261015/btree-prefix/primary/0172-r2-random-scan10000-main.stat": "f125bb8f74bc8a1dced02dc0b52166ea94f2698de1ba3404657d343e9246c213", + "benchmarks/results-20261015/btree-prefix/primary/0173-r2-random-scan10000-on.log": "ccacd9cf6a2dd665938d420054f7bdb32debc765bab52bb6888dd9df11396cc2", + "benchmarks/results-20261015/btree-prefix/primary/0173-r2-random-scan10000-on.stat": "5719f329ed94397ac7884ec5f1030c0ac89d3b8f0cb0f33c62d3bb8d07d91396", + "benchmarks/results-20261015/btree-prefix/primary/0174-r2-random-scanfull-off.log": "d32ef13f7da13e13b236ef526791e95d83dd16e7772b1beecac02d14ad92a248", + "benchmarks/results-20261015/btree-prefix/primary/0174-r2-random-scanfull-off.stat": "645e3740d243408d5c1f4422db38577f8f7598cf1d1423e01f6ce9b7b75524b7", + "benchmarks/results-20261015/btree-prefix/primary/0175-r2-random-scanfull-main.log": "bcf41e598f4b78d324b407dae31defca3e4b59a99d152e5af1e9c8e17e751136", + "benchmarks/results-20261015/btree-prefix/primary/0175-r2-random-scanfull-main.stat": "20b76db204ed799bdc679f94049cb655605ba9fe350e107437ab8240d65347e5", + "benchmarks/results-20261015/btree-prefix/primary/0176-r2-random-scanfull-on.log": "acecce12413759f6184eaa30d8590321e83d49e3035b0f6206d6ed20e8ef4e73", + "benchmarks/results-20261015/btree-prefix/primary/0176-r2-random-scanfull-on.stat": "7aaa2f5569242a6445e7de3d144dec7d8d29d6b87a6f5afdbc81a07b17c1c75e", + "benchmarks/results-20261015/btree-prefix/primary/0177-r2-nonlexical-insert-random-main.log": "79d8077402a0443bed56d5c71e66f4be1969d46aaa42af0d5843e2c4d51ace73", + "benchmarks/results-20261015/btree-prefix/primary/0177-r2-nonlexical-insert-random-main.stat": "96c6dc228441908a4c5c5193473f4faafc2f8833c3f68e1fc46f1c30d6972889", + "benchmarks/results-20261015/btree-prefix/primary/0178-r2-nonlexical-insert-random-current.log": "36058ee98cabcdca14b478f2b10c79e88e834f285a29d840d3f8d9c14f1ac5fa", + "benchmarks/results-20261015/btree-prefix/primary/0178-r2-nonlexical-insert-random-current.stat": "190549fc5dacc473c09ec67c312377be74ba4dd03aa9392650f14c990cc7bbd4", + "benchmarks/results-20261015/btree-prefix/primary/0179-r2-nonlexical-insert-sorted-main.log": "350be768a50d79c88990e1a8bd45d0f2bb7a8cda8ca13514a1ea861f90084747", + "benchmarks/results-20261015/btree-prefix/primary/0179-r2-nonlexical-insert-sorted-main.stat": "a3e898739d6816009f543a01e813f93df25d8d677b6e211693798e7ab0a2ee28", + "benchmarks/results-20261015/btree-prefix/primary/0180-r2-nonlexical-insert-sorted-current.log": "e4b72dca40343fedd7c22acd69a684387a0243d7d91140b53b236144c33c8b1a", + "benchmarks/results-20261015/btree-prefix/primary/0180-r2-nonlexical-insert-sorted-current.stat": "199328b8c9dc45894cc09e598c2d085c0ebb5ba59967934dae2b3ea4be8e2ce9", + "benchmarks/results-20261015/btree-prefix/primary/0181-r2-nonlexical-overwrite-main.log": "daba699ff6e0d4b95a14080716c38d6e1e26a0e6286850486fba6db1e5aceec5", + "benchmarks/results-20261015/btree-prefix/primary/0181-r2-nonlexical-overwrite-main.stat": "223c803885e7d285cb3094e58ea6d2e811ba37ebf76c0b3ded00e44f61a64f22", + "benchmarks/results-20261015/btree-prefix/primary/0182-r2-nonlexical-overwrite-current.log": "2755d50c6de55797b23b3db7788f4414bb862fe9a30dd75bb7c8ae6587a48e0d", + "benchmarks/results-20261015/btree-prefix/primary/0182-r2-nonlexical-overwrite-current.stat": "e5852ccf391b43859edd4172b587860b8226ea3be3c77b3c1fc20a2aa7c0159e", + "benchmarks/results-20261015/btree-prefix/primary/0183-r2-nonlexical-pack-main.log": "b3073f3fc2a9f35618da8a7c8f2916bf457a8e0878e54c38c648e81369f4a536", + "benchmarks/results-20261015/btree-prefix/primary/0183-r2-nonlexical-pack-main.stat": "fafcbbc7766700b3754557047901db53407667f47d9123cb29524824fea4205e", + "benchmarks/results-20261015/btree-prefix/primary/0184-r2-nonlexical-pack-current.log": "356059052ccc6ba9cf87e3aaf20a8b3e6f6d6275a34d2bb68174225a01288b70", + "benchmarks/results-20261015/btree-prefix/primary/0184-r2-nonlexical-pack-current.stat": "400d0576ac57a57f8985852620cd818cba6e5a1f7fa64b1ec25e5a9a77c5dd85", + "benchmarks/results-20261015/btree-prefix/primary/0185-r2-nonlexical-hit-main.log": "038dab100da820a38f28c302f2d0b88e260dd528212a5cc5931466776e568d29", + "benchmarks/results-20261015/btree-prefix/primary/0185-r2-nonlexical-hit-main.stat": "c8cfa16eb04bfb5dbf4f56f2df4b65e6207166a5f0dde72dce097d4c3628df92", + "benchmarks/results-20261015/btree-prefix/primary/0186-r2-nonlexical-hit-current.log": "589eaf0dedb5aca8087b1c677be045bcec42933fc18716e9f72ae38aa90292a2", + "benchmarks/results-20261015/btree-prefix/primary/0186-r2-nonlexical-hit-current.stat": "ce82fbfc515df3122710fb4d40c60f415afa1f7c40b25866c9e76956309d8057", + "benchmarks/results-20261015/btree-prefix/primary/0187-r2-nonlexical-miss-main.log": "372db4de957f6d53e741ceb8219da58ec5eb6909fee6dc93b200da3d34797919", + "benchmarks/results-20261015/btree-prefix/primary/0187-r2-nonlexical-miss-main.stat": "01ea0587432b0bce11cd5c699e856e5c5523cfa54692bc9e94100dacb489b404", + "benchmarks/results-20261015/btree-prefix/primary/0188-r2-nonlexical-miss-current.log": "d107909eaef2177af7453d285f5b48b16bd952cd72c36b14ce0aa547d0e2ef62", + "benchmarks/results-20261015/btree-prefix/primary/0188-r2-nonlexical-miss-current.stat": "6049a04e1092d5bc67b8cf0a835d68d43fc922a04d9f50deecd31bbebae5dec0", + "benchmarks/results-20261015/btree-prefix/primary/0189-r2-nonlexical-scan1-main.log": "10cd8ca8985656ab71fd2d50eabf12dc217635011f06e6ddd25c4cea5c67743c", + "benchmarks/results-20261015/btree-prefix/primary/0189-r2-nonlexical-scan1-main.stat": "c481eaafcd971bac291620db13e96fae6864b18eb3747ba73c75cc35f3b26fed", + "benchmarks/results-20261015/btree-prefix/primary/0190-r2-nonlexical-scan1-current.log": "909db3fde4730c78c41b7202507261ca6919ef642aaa58984594bffe59e88d1a", + "benchmarks/results-20261015/btree-prefix/primary/0190-r2-nonlexical-scan1-current.stat": "1d5e7deb21213795ac14f841f6fedb9c3e36f1ea181e6a0915832f8a0ba20288", + "benchmarks/results-20261015/btree-prefix/primary/0191-r2-nonlexical-scan10000-main.log": "a1b18dc2ea127b7c7b87b405c5d71adf096349c6f69c742e7dae30995c9a9553", + "benchmarks/results-20261015/btree-prefix/primary/0191-r2-nonlexical-scan10000-main.stat": "e376e2cd4ef1cb52f5dae5d7739f81f5b1abd3b1c8151a3d1ac86a85f6cbebb4", + "benchmarks/results-20261015/btree-prefix/primary/0192-r2-nonlexical-scan10000-current.log": "6404237f7635361ab96300b76716645c8221894e4f4273e99e30b3dfeac214b9", + "benchmarks/results-20261015/btree-prefix/primary/0192-r2-nonlexical-scan10000-current.stat": "1c1310fe04b1299c4e4fc9b14848ecf413b4160dc9f32b15ae9e55a7eefb7fc3", + "benchmarks/results-20261015/btree-prefix/primary/0193-r2-nonlexical-scanfull-main.log": "9a6fa88058d7a20073539fb5f8490787068369dfe32addd4c6a7053b50991c7a", + "benchmarks/results-20261015/btree-prefix/primary/0193-r2-nonlexical-scanfull-main.stat": "1ac4f625b30a8a24cbc603f80b1e3c832baed62c4973a63d90f1c83444410c9a", + "benchmarks/results-20261015/btree-prefix/primary/0194-r2-nonlexical-scanfull-current.log": "f3d4c76ec87e770bc87ce1019343bc2694eaa26524f37b78bc52482d91520c23", + "benchmarks/results-20261015/btree-prefix/primary/0194-r2-nonlexical-scanfull-current.stat": "0e77fdd45b970ac4efdb1d0354dec34be0061f9878a5b4365df769b21114b055", + "benchmarks/results-20261015/btree-prefix/primary/0195-r2-common-insert-random-main.log": "558122dda9eb9f393ccdeca6806ccd42b2cbde993e4eb78d320ef0e2e2aaf927", + "benchmarks/results-20261015/btree-prefix/primary/0195-r2-common-insert-random-main.stat": "d651a1bfd0849d337c50e184cdf7026816f16fd08100c02446c50532c678908a", + "benchmarks/results-20261015/btree-prefix/primary/0196-r2-common-insert-random-current.log": "3584e4f4e5294aa87967910446ffc4564241a488da897c5c6e33cf8b3bd4428d", + "benchmarks/results-20261015/btree-prefix/primary/0196-r2-common-insert-random-current.stat": "cf3132481fd5fdf4b7e734bfd0604fde8a219fa5536e7f4a6df0087b859ba97d", + "benchmarks/results-20261015/btree-prefix/primary/0197-r2-common-insert-sorted-main.log": "0c7db012a79b3edc236174dffaed1db53d5adf7c0d2d2ffe400621739cabf35a", + "benchmarks/results-20261015/btree-prefix/primary/0197-r2-common-insert-sorted-main.stat": "583c045c286d1ce3f9b2e2c9fe1764eb31b557c39fa546917acbdec406759f60", + "benchmarks/results-20261015/btree-prefix/primary/0198-r2-common-insert-sorted-current.log": "3f40555577906b62d43588f13904584bde2b3da3add4d616dd80db2a5e8f334d", + "benchmarks/results-20261015/btree-prefix/primary/0198-r2-common-insert-sorted-current.stat": "15b8d300889e2a983070273c03a91b35e2d8f56691fd575720bbba1115a78d1f", + "benchmarks/results-20261015/btree-prefix/primary/0199-r3-common-pack-off.log": "02b1c2071882baa747374ebd7a4914ff8b632e79f46cf25d467c451542caad39", + "benchmarks/results-20261015/btree-prefix/primary/0199-r3-common-pack-off.stat": "88f2c260ec78da852b88e0f4d49e89326b97085ad9d08fa9c255df878c9c082d", + "benchmarks/results-20261015/btree-prefix/primary/0200-r3-common-pack-on.log": "795ee891fb9902a52df869a4f792f7990fba2c3ccee1e32a3e062dade27a9e01", + "benchmarks/results-20261015/btree-prefix/primary/0200-r3-common-pack-on.stat": "04ce494d545da9d012f8cb25909c1c8a4e453cc2eabcb34681254ea9465e6bd1", + "benchmarks/results-20261015/btree-prefix/primary/0201-r3-common-pack-main.log": "d0a18405c815dd9a79867da324a6e9a1c8c494376550da2fb663507c8c7b83e6", + "benchmarks/results-20261015/btree-prefix/primary/0201-r3-common-pack-main.stat": "a74107b0cb0011d726d18e2a58c0c07fc77ea1767618533b762192b393d2be09", + "benchmarks/results-20261015/btree-prefix/primary/0202-r3-common-hit-off.log": "7ee7e04eff001a175e1f7e0d77bb13196e52d56aa6f53a5aeab2bd7bf842fe8b", + "benchmarks/results-20261015/btree-prefix/primary/0202-r3-common-hit-off.stat": "d7014e39b67e0adb60612fc7f507a724d61558719a9e5ddedd65c7dafa9f42f0", + "benchmarks/results-20261015/btree-prefix/primary/0203-r3-common-hit-on.log": "6c6bda36fcc4b3826ac1d435064427885a33556d5d9fb1ae09cccbe2b2831d38", + "benchmarks/results-20261015/btree-prefix/primary/0203-r3-common-hit-on.stat": "65eaa58106b3b63aea48dc46c9d4ed67b33b8490f332754b49fa81100d960f2b", + "benchmarks/results-20261015/btree-prefix/primary/0204-r3-common-hit-main.log": "210e3ee4b68f8881fe5b79b78acf13ab4c6716fe179ca2610fb52c07d69bd56e", + "benchmarks/results-20261015/btree-prefix/primary/0204-r3-common-hit-main.stat": "1d97524d3c41faf1eefeac4d52ce24ca8d3715051736f254b5263e49cc9760ed", + "benchmarks/results-20261015/btree-prefix/primary/0205-r3-common-miss-off.log": "9b43f22c0540e2bce99efac360fff73d09c0b39a699edb28eb2cfae2f58257bd", + "benchmarks/results-20261015/btree-prefix/primary/0205-r3-common-miss-off.stat": "e1cdfe83448b7def3241e7d0ebe690af6f6f716508307eca5333e42e0f431581", + "benchmarks/results-20261015/btree-prefix/primary/0206-r3-common-miss-on.log": "ab54aee544d41dbe065474e8eb3ab728cab7dc6dfe0c21a0276a4c4a9424c918", + "benchmarks/results-20261015/btree-prefix/primary/0206-r3-common-miss-on.stat": "5617f573184a8b7c1ff6ad0804156dcae4c5374ccb2dfaa278be513596b6ed53", + "benchmarks/results-20261015/btree-prefix/primary/0207-r3-common-miss-main.log": "84db2b070a0681d94cedd14c6d6093994c4df345a9869cac95cb58e8bac21455", + "benchmarks/results-20261015/btree-prefix/primary/0207-r3-common-miss-main.stat": "7d864889faddc517fd72f7444337189c5164b7ac9255770c987d14c31affd947", + "benchmarks/results-20261015/btree-prefix/primary/0208-r3-common-scan1-off.log": "34fb1324c488dd05ade358483fef59b80666fb15245e89695c8280bf62e40337", + "benchmarks/results-20261015/btree-prefix/primary/0208-r3-common-scan1-off.stat": "83f55d4dc47cc984a2d18a6e0d2e538959fbe0a58178b2a830c78fe28dc0efff", + "benchmarks/results-20261015/btree-prefix/primary/0209-r3-common-scan1-on.log": "bd989c904ac359a427e939850a7b7e4245e0769f41ee6a859112ba6de672aaa4", + "benchmarks/results-20261015/btree-prefix/primary/0209-r3-common-scan1-on.stat": "bf6f9eed38e92fcf85d6bcdf4d1b8aead65e4666ea616ccd7ed4f60b0810c3bc", + "benchmarks/results-20261015/btree-prefix/primary/0210-r3-common-scan1-main.log": "c7e2be99c4827c52c86292c44eec315024e82ea0021793bfd40c7be1315172dd", + "benchmarks/results-20261015/btree-prefix/primary/0210-r3-common-scan1-main.stat": "cc9190aa8ab9e8306445aecabf7c5940fdb35852bc5a5de5ca0f4309f820c06a", + "benchmarks/results-20261015/btree-prefix/primary/0211-r3-common-scan10000-off.log": "1b73e31b88b35f88a63296c5f82f0f077622d209f6180dfe81a1147fc08886d7", + "benchmarks/results-20261015/btree-prefix/primary/0211-r3-common-scan10000-off.stat": "2a14ec83babd6311d9c87b6d4cc3e86b33291e927627e6acbab3742b12d967f1", + "benchmarks/results-20261015/btree-prefix/primary/0212-r3-common-scan10000-on.log": "0722ac2bdff0d0eeb270623e9bfae4a08cf2b3d7e964e9bc09c31220aa06b681", + "benchmarks/results-20261015/btree-prefix/primary/0212-r3-common-scan10000-on.stat": "2081b92ffd26d537b040ec41f25761f83d1ef5a21fcd9ea40b3c6c67942e3668", + "benchmarks/results-20261015/btree-prefix/primary/0213-r3-common-scan10000-main.log": "f722c6c93f7bc0baedab2f5081cafcc177fe70ef26219d7b712aefc908c061cc", + "benchmarks/results-20261015/btree-prefix/primary/0213-r3-common-scan10000-main.stat": "ed48b2d162b36f3895513338a6aa53fba4c9eff9189c8aee6c6f735e60ad902c", + "benchmarks/results-20261015/btree-prefix/primary/0214-r3-common-scanfull-off.log": "f0c6b4b5402b0638f4d88edca569a94663baa620e640609dc21d772588fd695a", + "benchmarks/results-20261015/btree-prefix/primary/0214-r3-common-scanfull-off.stat": "b8bce0292795cd02baa3bb2e3385499b4e4b6f5cba0776ea6d5ffa8e6da8c124", + "benchmarks/results-20261015/btree-prefix/primary/0215-r3-common-scanfull-on.log": "55871f2914584a4a4b678b4bf58f1b444dc9262c3355ffbe4f9ad9edd3df412f", + "benchmarks/results-20261015/btree-prefix/primary/0215-r3-common-scanfull-on.stat": "0853e0e18ff5f7fb5e69ee250cbfc4310b33f1da2e7fb0e7a7038ac8fc376900", + "benchmarks/results-20261015/btree-prefix/primary/0216-r3-common-scanfull-main.log": "a170d2857afd550125fbdedd585fc7750cfc479ba58f83887629de04e7aa2991", + "benchmarks/results-20261015/btree-prefix/primary/0216-r3-common-scanfull-main.stat": "87b041dc2e6e28b9bd20beb845ce8d0fe8bac2df9303d3b25c8905ab476f6885", + "benchmarks/results-20261015/btree-prefix/primary/0217-r3-random-insert-random-current.log": "101cd550a5002636a09da3ca539c39511bb72cf2944edf25e0c4e804294de5d5", + "benchmarks/results-20261015/btree-prefix/primary/0217-r3-random-insert-random-current.stat": "518d017a935524aae1eafefa9ef218f01a2503bd3812359bdd4b95470bd77ee0", + "benchmarks/results-20261015/btree-prefix/primary/0218-r3-random-insert-random-main.log": "44730a937ebeae389f5b7a179041cb79610b6852a583f1bdbf3afa84cb08b6d8", + "benchmarks/results-20261015/btree-prefix/primary/0218-r3-random-insert-random-main.stat": "da3a5ed1b674282c2876d49b4a24510513bf4d59d40f11783acd1feaf774179a", + "benchmarks/results-20261015/btree-prefix/primary/0219-r3-random-insert-sorted-current.log": "184e89b1a54d8fb6e73126b9ce46ee8f28e0b6b4a2145bae4c88021a93778d7a", + "benchmarks/results-20261015/btree-prefix/primary/0219-r3-random-insert-sorted-current.stat": "3c022034c930274caa2fde3dfba574a8d9286fcc98a7a056cd8555937aa01f99", + "benchmarks/results-20261015/btree-prefix/primary/0220-r3-random-insert-sorted-main.log": "ade431523e44c99cb6cd36100bc1793b450c6eaac827e56c2873adfacacc8e4b", + "benchmarks/results-20261015/btree-prefix/primary/0220-r3-random-insert-sorted-main.stat": "ae02c10d3cfdac589f021344aa9a23eb005ecdc055bb76bed408a9552a873d7d", + "benchmarks/results-20261015/btree-prefix/primary/0221-r3-random-overwrite-current.log": "2a22e9bd9d82cc167910e4565ffdedfa30eb32780ef4d732450ae109aaa2294a", + "benchmarks/results-20261015/btree-prefix/primary/0221-r3-random-overwrite-current.stat": "a6f95baa9fbe982bd9e59eac2441d2ebce7194b1401a916f3ca7f9e16a80bc15", + "benchmarks/results-20261015/btree-prefix/primary/0222-r3-random-overwrite-main.log": "aca30a38365b3d2412772aade0b04af159b016f805584e60a478819a4edfaa50", + "benchmarks/results-20261015/btree-prefix/primary/0222-r3-random-overwrite-main.stat": "ec09fab15db7e21a57e2cbf81be6c7c87e1ecc4b1f105ed491b791c543d251a6", + "benchmarks/results-20261015/btree-prefix/primary/0223-r3-random-pack-off.log": "13e72177891cb179a3cffadc60eda3a9a40f6d8b6cf329cf6540af156f7ed892", + "benchmarks/results-20261015/btree-prefix/primary/0223-r3-random-pack-off.stat": "edbdb562da16f9661207d4d3d3c692a0a95e5b50942daa3fc88d623fef286c62", + "benchmarks/results-20261015/btree-prefix/primary/0224-r3-random-pack-on.log": "b10af9abcc01ef6b1f663c9f9e8002abdfc3b1eda81114c76e2b9317d6c61565", + "benchmarks/results-20261015/btree-prefix/primary/0224-r3-random-pack-on.stat": "41f8ef3cfc0d1e35a9b8a9f47605d0eb351cfc13e938f0a332f0c675e3c776d6", + "benchmarks/results-20261015/btree-prefix/primary/0225-r3-random-pack-main.log": "311f1e82c5554bbc11829e8acbe16f4ca717be683da57a7b1f170e0779313158", + "benchmarks/results-20261015/btree-prefix/primary/0225-r3-random-pack-main.stat": "ff0fa1c8f213cfde14ccc60c6c110a6357bc7ad0908d6ceb9ba2a1e6fa4cacf3", + "benchmarks/results-20261015/btree-prefix/primary/0226-r3-random-hit-off.log": "3a9a4f5b29acb570b9dd6f7fcaafbf28f72511d3498b8885c995e86b3b6b642c", + "benchmarks/results-20261015/btree-prefix/primary/0226-r3-random-hit-off.stat": "81535702dd4cf1718fd140ed5213cb0636fcc89dbde67e2dd2646ae3af137a3c", + "benchmarks/results-20261015/btree-prefix/primary/0227-r3-random-hit-on.log": "a7b93fa9d33903741d6a7c5d2bd35fcdfcd19fe98e3a8d977cce96e4e8f5cfdd", + "benchmarks/results-20261015/btree-prefix/primary/0227-r3-random-hit-on.stat": "7fc85e3bb6ad38763f0e23a0efd2c9d4959178840c8b1bc246d0799a6f410f19", + "benchmarks/results-20261015/btree-prefix/primary/0228-r3-random-hit-main.log": "8eaf622c3346bc20e81885108739e5f3fa5f67060c0673a28504c915a7b83ea3", + "benchmarks/results-20261015/btree-prefix/primary/0228-r3-random-hit-main.stat": "a7ab69a42b105ed01528a395905a150a9d8e49daf7dfc2c36ae83e526c86bd19", + "benchmarks/results-20261015/btree-prefix/primary/0229-r3-random-miss-off.log": "9d9d58beaa6db17d62fbf5fc806d01b89eec891928b068554996f1413d8b82d8", + "benchmarks/results-20261015/btree-prefix/primary/0229-r3-random-miss-off.stat": "79465d084e9bba9f1e68f0b0b77a2767a656632569fea5016c775030306cc02b", + "benchmarks/results-20261015/btree-prefix/primary/0230-r3-random-miss-on.log": "ddb929aee07326a149659d29792c161d6bcee321e6a6a9b88cbc41e7443adfe1", + "benchmarks/results-20261015/btree-prefix/primary/0230-r3-random-miss-on.stat": "01ad88a2f4aade20d1f8f9428c57e7064131f9cc3c0c6e34ebf486245a1abb6c", + "benchmarks/results-20261015/btree-prefix/primary/0231-r3-random-miss-main.log": "df273feebf27c1006d80928e55e2bcc05fa3173a75d39514b0edecfdbbef5786", + "benchmarks/results-20261015/btree-prefix/primary/0231-r3-random-miss-main.stat": "c019d9b52d8d65b5a49d46fdcb2e8612c9bdd2123b7980b3f640a075d68c5466", + "benchmarks/results-20261015/btree-prefix/primary/0232-r3-random-scan1-off.log": "34f65a4404f3de2e82b37d446b6241b1cdf888d6460e80bda50893371e6088b7", + "benchmarks/results-20261015/btree-prefix/primary/0232-r3-random-scan1-off.stat": "10452a3ed97d29672f9f02e81977199d2a01ff8e8b010f6c3ad2339c995680c4", + "benchmarks/results-20261015/btree-prefix/primary/0233-r3-random-scan1-on.log": "6b5f9bf2c903e858c003d51f38d80a4f418262132de4bd4b8a47cce079ff1ba0", + "benchmarks/results-20261015/btree-prefix/primary/0233-r3-random-scan1-on.stat": "dfba765bb2bb4f7c31f0edd4320942be4cdd4981d1a8d99c2593edfed98bab6b", + "benchmarks/results-20261015/btree-prefix/primary/0234-r3-random-scan1-main.log": "7f122aa456a382bee5dd156d49d0e9866dd7ef4f2a6994a8e132e429856b921d", + "benchmarks/results-20261015/btree-prefix/primary/0234-r3-random-scan1-main.stat": "784aa9080cefe9460c5d53277d4c3855dbeee5db7b811bc19fd94d9414238e47", + "benchmarks/results-20261015/btree-prefix/primary/0235-r3-random-scan10000-off.log": "f1ca97a7a7fc6fdb5e6e41ba411916590d574e1208a97d59b9a1b19ea0e5b4ca", + "benchmarks/results-20261015/btree-prefix/primary/0235-r3-random-scan10000-off.stat": "a371c1abd4e3b78bb94b325d1d787bdb3b31ac5a606af91e05f39dc10a6fbcd3", + "benchmarks/results-20261015/btree-prefix/primary/0236-r3-random-scan10000-on.log": "5fcdd7713fd806282f52ebceca2df44c0fde7d7b0eed8c49b939088c8bbba134", + "benchmarks/results-20261015/btree-prefix/primary/0236-r3-random-scan10000-on.stat": "6fee3d296fb15fc6fea8d7fca634614f279b978c8f83ff295eb103a29f207818", + "benchmarks/results-20261015/btree-prefix/primary/0237-r3-random-scan10000-main.log": "49dc22c3a6a0170ccc594906070843c166f973dfe8d8cba9018951c3d010397e", + "benchmarks/results-20261015/btree-prefix/primary/0237-r3-random-scan10000-main.stat": "1d1d32875e88f9de86c1f9ce29ce48a5082b17ad8921b5bf0ca02e5d2671695d", + "benchmarks/results-20261015/btree-prefix/primary/0238-r3-random-scanfull-off.log": "dc6f62594f90d3d7dadf306f4a9ad8538d3bb654290c58c24f65032cfa7885d2", + "benchmarks/results-20261015/btree-prefix/primary/0238-r3-random-scanfull-off.stat": "44d9b61104e11a1decf8e25e648ce1a5b7759fc8b2cac91afa81eebd40d2db6e", + "benchmarks/results-20261015/btree-prefix/primary/0239-r3-random-scanfull-on.log": "e4bc89812cdfd9888aa872809b097f9b4ebb933c95bd912fecf86cc959e1d0a9", + "benchmarks/results-20261015/btree-prefix/primary/0239-r3-random-scanfull-on.stat": "89ba2db02e34a1b9783fff0f2b2788da4fc21ef3edda44447da8c49193edeb90", + "benchmarks/results-20261015/btree-prefix/primary/0240-r3-random-scanfull-main.log": "1c935fcb94b842ed1f014c006ada83a91ba91f9095d07c48d67bb1f887273e84", + "benchmarks/results-20261015/btree-prefix/primary/0240-r3-random-scanfull-main.stat": "7bcec5e504e64ce1d7dbf42dd04937e6fa24c98cc072d7d80e45d6485d712a43", + "benchmarks/results-20261015/btree-prefix/primary/0241-r3-nonlexical-insert-random-current.log": "0f572ec63cf56e9d688db4f2e03dff79cdc4020a95365c1a0bf6cd09d861eeed", + "benchmarks/results-20261015/btree-prefix/primary/0241-r3-nonlexical-insert-random-current.stat": "683fa860f142045c6f9680cfa45aeb781f74cfaa51be41488c90bd0bf4b97680", + "benchmarks/results-20261015/btree-prefix/primary/0242-r3-nonlexical-insert-random-main.log": "03679208cd65a53c90e90799d156c7c0ae594aeb6f2564bca1c63519b5d82453", + "benchmarks/results-20261015/btree-prefix/primary/0242-r3-nonlexical-insert-random-main.stat": "e56f9fcd2c05e6bf1e425376032e898e8d482f7d61544762c0f471bbd70b42b3", + "benchmarks/results-20261015/btree-prefix/primary/0243-r3-nonlexical-insert-sorted-current.log": "6cebd6731651a6a5440af258d607ebe2bf7fa9e42d15f8bd9f78eb9d7ef888d7", + "benchmarks/results-20261015/btree-prefix/primary/0243-r3-nonlexical-insert-sorted-current.stat": "5c2c0820c6ccdc754c69829f268ac313d304da8c619b4c8db5fb64f8e91ba99f", + "benchmarks/results-20261015/btree-prefix/primary/0244-r3-nonlexical-insert-sorted-main.log": "e4d7b531146bc214ce79dca671e6c3d51ea37c350b9a410ccadc07008e10a521", + "benchmarks/results-20261015/btree-prefix/primary/0244-r3-nonlexical-insert-sorted-main.stat": "c827ca0f59262253576a720bf64b2931d94bce0451b41b9a0a0aa782d518f903", + "benchmarks/results-20261015/btree-prefix/primary/0245-r3-nonlexical-overwrite-current.log": "ad4362236f73ee7b6627daa2c68deef9431b78d62254a7ea2dccfc6713995b72", + "benchmarks/results-20261015/btree-prefix/primary/0245-r3-nonlexical-overwrite-current.stat": "f02324d335112b78dfe900ff78705689a811c7b3f6362d597277a61eeaebc8f0", + "benchmarks/results-20261015/btree-prefix/primary/0246-r3-nonlexical-overwrite-main.log": "15c0418be5dd6502f5cd104b7267a5241a8abb82711a58f3118ac1595bfd310b", + "benchmarks/results-20261015/btree-prefix/primary/0246-r3-nonlexical-overwrite-main.stat": "11ca6eeb22b42c17f8eec0b2edb81587726d0003cb3649f46c1ff6ad5cd78d94", + "benchmarks/results-20261015/btree-prefix/primary/0247-r3-nonlexical-pack-current.log": "bfeee20567a7a6438ab0917a25d312824eb691c2b28437299f08a66ae8dbf4c0", + "benchmarks/results-20261015/btree-prefix/primary/0247-r3-nonlexical-pack-current.stat": "b6dbd2b81ac96ef737430cc9e62d04b83dc49687f08bc2f2e7f5e0e31f9d1a55", + "benchmarks/results-20261015/btree-prefix/primary/0248-r3-nonlexical-pack-main.log": "2d5f29dbd4d1b3495c67a98d3459f7f8f270bc22f72a64d983cdd5492b2b8923", + "benchmarks/results-20261015/btree-prefix/primary/0248-r3-nonlexical-pack-main.stat": "84814ccac5c7b6bda14b0173f602ab8c2e39b6fb41cc709945382f45396c0bde", + "benchmarks/results-20261015/btree-prefix/primary/0249-r3-nonlexical-hit-current.log": "cc1eb53419ffa6d7c5a57406c88d71481cfc8dfa1509b01e675632bd8b09a88e", + "benchmarks/results-20261015/btree-prefix/primary/0249-r3-nonlexical-hit-current.stat": "37ee988b80336ba1345d3885ab07ff4acd5f7079b0448345b7887ef002f70f13", + "benchmarks/results-20261015/btree-prefix/primary/0250-r3-nonlexical-hit-main.log": "aae2a9891f960cfc29021fbce87847216caacc78170e989e96137eb39570b673", + "benchmarks/results-20261015/btree-prefix/primary/0250-r3-nonlexical-hit-main.stat": "05a9d6e40069628f612747d91cc605ce6294303065371ce2d2cc37101f43651c", + "benchmarks/results-20261015/btree-prefix/primary/0251-r3-nonlexical-miss-current.log": "22d8455c0ec54d2a4d9e35ed0df0069c8913a168823f00cae8feead1ff2c70e2", + "benchmarks/results-20261015/btree-prefix/primary/0251-r3-nonlexical-miss-current.stat": "00bb3129de27568a3d60b68b758287940a5e5a1031ed54b0d7d6935a29987b63", + "benchmarks/results-20261015/btree-prefix/primary/0252-r3-nonlexical-miss-main.log": "27a6ece30eb8819653b40b2e10cf3fbd0bb1cf1a53c3e6dc696926d5e3929a0a", + "benchmarks/results-20261015/btree-prefix/primary/0252-r3-nonlexical-miss-main.stat": "c9d26813a144c67150c95f4c479de9cdc9c15b8cbb9e4c7587b0a0be34028666", + "benchmarks/results-20261015/btree-prefix/primary/0253-r3-nonlexical-scan1-current.log": "277c64bf103f14cfc0388d55ebc4db44d9938e6c27592814c992bfb8769dfa3f", + "benchmarks/results-20261015/btree-prefix/primary/0253-r3-nonlexical-scan1-current.stat": "371498b55c46883bbbc01c024a85cd8282a2569ce883b018ee993bd890214a5f", + "benchmarks/results-20261015/btree-prefix/primary/0254-r3-nonlexical-scan1-main.log": "e61400f80778053579ddb52824755b51e16518efa6256e0656749802da39497c", + "benchmarks/results-20261015/btree-prefix/primary/0254-r3-nonlexical-scan1-main.stat": "36754b66027ff477e85339a67337f039b6898b557d932ecfe4680360bb8976a0", + "benchmarks/results-20261015/btree-prefix/primary/0255-r3-nonlexical-scan10000-current.log": "26bc01367336879c7acaef580b9b4d63bcf47c6331b12ca6665668b392fc73ad", + "benchmarks/results-20261015/btree-prefix/primary/0255-r3-nonlexical-scan10000-current.stat": "47211a6870f0bebded5452ee3a9336b3ecbbcd2fde48a08c5676bcb742cf20a4", + "benchmarks/results-20261015/btree-prefix/primary/0256-r3-nonlexical-scan10000-main.log": "526d2b9751415395c35b7fb13e40f57de5b51a422da7d228f376571ef06a6e5a", + "benchmarks/results-20261015/btree-prefix/primary/0256-r3-nonlexical-scan10000-main.stat": "2683472d9283464a265f861299945b75f3a1643fed534de430ceb1541f3fc2d8", + "benchmarks/results-20261015/btree-prefix/primary/0257-r3-nonlexical-scanfull-current.log": "d90a87b8265b09bfbc6ebe3f324851f7a0b798345a9417201cf935766a883c88", + "benchmarks/results-20261015/btree-prefix/primary/0257-r3-nonlexical-scanfull-current.stat": "3a4c4b121c273ca7a4bf1993a1e4dda0b718eaff56ed4b7c689c7c8f33ceee35", + "benchmarks/results-20261015/btree-prefix/primary/0258-r3-nonlexical-scanfull-main.log": "d138086793a38d7d4c9b8e384132e4ba295b3e8b29ac9f0f7af45329f11cf501", + "benchmarks/results-20261015/btree-prefix/primary/0258-r3-nonlexical-scanfull-main.stat": "d78aaaadff8feb4302ca5262a29052d1a29dfc0842d2767c154b6e40e379d45c", + "benchmarks/results-20261015/btree-prefix/primary/0259-r3-common-insert-random-current.log": "a52162513caf20bcd1ecd308b6ff3c8597f607941ed7efcc075192326c0ddfb8", + "benchmarks/results-20261015/btree-prefix/primary/0259-r3-common-insert-random-current.stat": "41c9d6018101d8df8a2bd9d1c6ca5865bbcd5d959126ff58b4b55f07f6ef82cd", + "benchmarks/results-20261015/btree-prefix/primary/0260-r3-common-insert-random-main.log": "00fa4e8145f3fe47567f5a495d5db6e713d38ddacf7dd39a14ff40a6563e3998", + "benchmarks/results-20261015/btree-prefix/primary/0260-r3-common-insert-random-main.stat": "e41ca7e4365b0c7255adc53ad6667c720445f833f41d25fdd6b662c89803c7f9", + "benchmarks/results-20261015/btree-prefix/primary/0261-r3-common-insert-sorted-current.log": "a82b244e177b8754f42508d24696298b92ed535fdef74710230cb883ad70808b", + "benchmarks/results-20261015/btree-prefix/primary/0261-r3-common-insert-sorted-current.stat": "c2ff7d50a76664e7041598619b9c87c200e2c7e6e7a956d01ec33fedffdf37bf", + "benchmarks/results-20261015/btree-prefix/primary/0262-r3-common-insert-sorted-main.log": "9a98991a797a8a4ab9e6d48b6be1f8b85339add2311c04472ab47f987867daa7", + "benchmarks/results-20261015/btree-prefix/primary/0262-r3-common-insert-sorted-main.stat": "b45f08eee78aa309c89b6f677c12e4397020ceafdcdf1c9e51ae6c3c3c6a3b32", + "benchmarks/results-20261015/btree-prefix/primary/0263-r3-common-overwrite-current.log": "f5df51c76a73a5731e2beac60c3d612c1ca505a29af14dae14b4962435fb5eb8", + "benchmarks/results-20261015/btree-prefix/primary/0263-r3-common-overwrite-current.stat": "c60fc57ca1975c9aa4fddd4ed548dae4a1d06e37fb4f9038cf2e5b259019c5da", + "benchmarks/results-20261015/btree-prefix/primary/0264-r3-common-overwrite-main.log": "2b463c390c25e4a81ba21d8d499224f762de8d4eef5c051d8e04f43b7428dd62", + "benchmarks/results-20261015/btree-prefix/primary/0264-r3-common-overwrite-main.stat": "81223feab714bb99c7b334f89d74fb67bfeb6ceaf3ac5866f92d995033f390c2", + "benchmarks/results-20261015/btree-prefix/primary/0265-r4-common-hit-on.log": "a0c3e4beda00c8ade62b14f944dcd1c4b98ede44331a05640de7fd94e27c7c13", + "benchmarks/results-20261015/btree-prefix/primary/0265-r4-common-hit-on.stat": "69b29cbe86b705830e64d87e64e9e682697884d229a141290c1ece354b4a166c", + "benchmarks/results-20261015/btree-prefix/primary/0266-r4-common-hit-main.log": "7a08a355c133dbab9b8a837c815cfb9e563b2959e2da0bea6798d602b080884e", + "benchmarks/results-20261015/btree-prefix/primary/0266-r4-common-hit-main.stat": "f6cf0f58da47dba82beaa123fd5ce3efc42ad340293d5fa3a59d581f9e2dee69", + "benchmarks/results-20261015/btree-prefix/primary/0267-r4-common-hit-off.log": "02b1b68eeec4471b6b493fd6ccfd9f880f91f88b5a9dec149b9d9312ce5c363d", + "benchmarks/results-20261015/btree-prefix/primary/0267-r4-common-hit-off.stat": "8923936332ac29d0c3c730eeefea23da878f2501c6aaf20dd06e8a4ff80e1bca", + "benchmarks/results-20261015/btree-prefix/primary/0268-r4-common-miss-on.log": "12a6548b72797bb94bbed76800d55a8a5967942f1952c1dbff682d9b30b78259", + "benchmarks/results-20261015/btree-prefix/primary/0268-r4-common-miss-on.stat": "3a603712716f57d35f231fe4100edba8fe0a64b5510c947aad7aa360dba98cba", + "benchmarks/results-20261015/btree-prefix/primary/0269-r4-common-miss-main.log": "f6a514e2f8f8d7590a1b7d3f0131ecf9a66d0726dcccef94b3b20945cf69c299", + "benchmarks/results-20261015/btree-prefix/primary/0269-r4-common-miss-main.stat": "ca504d19d0d13dccbe14f3b6b33a057edf697d32514bb2c268db5eaf1ff665c2", + "benchmarks/results-20261015/btree-prefix/primary/0270-r4-common-miss-off.log": "cdd4af7dccd49c065129ba475ba7f0b712588255c8cb124efd141b7dd932f5f7", + "benchmarks/results-20261015/btree-prefix/primary/0270-r4-common-miss-off.stat": "a2d5573a1b83015220e810d116549b48e2752818a755299f15e596b395beb305", + "benchmarks/results-20261015/btree-prefix/primary/0271-r4-common-scan1-on.log": "3d4c948b9c40ed42cb9291a554d5e153c5be3f68e47fd71faaf3c1376c4453ba", + "benchmarks/results-20261015/btree-prefix/primary/0271-r4-common-scan1-on.stat": "35e5c41e4ae8ace173a71557980224ce763dcf9290d78052a54eb82d9ddca9c4", + "benchmarks/results-20261015/btree-prefix/primary/0272-r4-common-scan1-main.log": "a41ffad96f6f9533a7f7151ff8a34ac7259a0016ab59a4cfda570677d9765f16", + "benchmarks/results-20261015/btree-prefix/primary/0272-r4-common-scan1-main.stat": "123215558b7c7f0ea26f691a789786bd8c3d5fb527d19b94bf198842d6dd8b06", + "benchmarks/results-20261015/btree-prefix/primary/0273-r4-common-scan1-off.log": "b09b1caf22f686d15b7077d6cc673345c7ad17bd1937159959ab96fb74f06802", + "benchmarks/results-20261015/btree-prefix/primary/0273-r4-common-scan1-off.stat": "dba725f4805dfa8564b0fc6b5a491caaa5639840238f67c3d775949a056b33b9", + "benchmarks/results-20261015/btree-prefix/primary/0274-r4-common-scan10000-on.log": "5da38006a7ae3016a7a624b12cb1b0c3f3c7f6045ebc8161b957fe713430179c", + "benchmarks/results-20261015/btree-prefix/primary/0274-r4-common-scan10000-on.stat": "1bba94b11e6f29c9b485096cc79b55b309f596614b20fe15bc6dbb340a8d85c0", + "benchmarks/results-20261015/btree-prefix/primary/0275-r4-common-scan10000-main.log": "be35f76e4d483c5ee999d32227260ec3eee8c23fd3be42a26d10ff67c3708bed", + "benchmarks/results-20261015/btree-prefix/primary/0275-r4-common-scan10000-main.stat": "5bed8e3ffdf857315c7f307ebb40857e8914fda7f07911564d18064948f6310c", + "benchmarks/results-20261015/btree-prefix/primary/0276-r4-common-scan10000-off.log": "356ec6ea211de93bd1f6e6d473d56b4a6a8b28a2e9d454889217c8fa8a902827", + "benchmarks/results-20261015/btree-prefix/primary/0276-r4-common-scan10000-off.stat": "4abe59bae39be1af5f603eb44e6608692fa5533d0f85406dce24137b2e81a581", + "benchmarks/results-20261015/btree-prefix/primary/0277-r4-common-scanfull-on.log": "b96099b0e7d3211198f93c152dd00890729155156d1a0f0ebe66ff71daa87c92", + "benchmarks/results-20261015/btree-prefix/primary/0277-r4-common-scanfull-on.stat": "024252628435c8249b5d8dd420eeb4afcee56e87dd3a5bbed25bfc348413828f", + "benchmarks/results-20261015/btree-prefix/primary/0278-r4-common-scanfull-main.log": "60e81ac3d6bccf01d09970da9a4c438f439a95b779c214a39320937ab9d76b2c", + "benchmarks/results-20261015/btree-prefix/primary/0278-r4-common-scanfull-main.stat": "052b2023239aaed6f639dc93804b23a2784dfc01094b9aff79a35406801aa0bb", + "benchmarks/results-20261015/btree-prefix/primary/0279-r4-common-scanfull-off.log": "1f595f444af5b179443a5d5baefc68b01c4890364cfc2c7c13f0e5f0b2b6dbe0", + "benchmarks/results-20261015/btree-prefix/primary/0279-r4-common-scanfull-off.stat": "add78634f98c40f3c3dc450f729c0d55144d2802c69393ad7ae782b5afe634b5", + "benchmarks/results-20261015/btree-prefix/primary/0280-r4-random-insert-random-main.log": "02e8fbeb08c13e7ed4e772668f01937a5f851ff497e0752c90716e91c333e0c2", + "benchmarks/results-20261015/btree-prefix/primary/0280-r4-random-insert-random-main.stat": "039bb1d5bef912d0f1a2e2526f95022c69e2e178094345f53d71d492621dc924", + "benchmarks/results-20261015/btree-prefix/primary/0281-r4-random-insert-random-current.log": "ffdf8aa1bd64db810c70e33e52ab88e80896d8c6b1f0df1e0ece437b949d75dd", + "benchmarks/results-20261015/btree-prefix/primary/0281-r4-random-insert-random-current.stat": "fd6186217fefc412bb05628e2e9c80e8a88a51c929bc317314ee5e0270801de5", + "benchmarks/results-20261015/btree-prefix/primary/0282-r4-random-insert-sorted-main.log": "58991cf705f616e9696e50ab320a28d963ea3caf314f91554a19861670eb083c", + "benchmarks/results-20261015/btree-prefix/primary/0282-r4-random-insert-sorted-main.stat": "45f960034fc9bdc9a70ec0e4866be14cf1a5cd028b0307beedb79e707e685e4a", + "benchmarks/results-20261015/btree-prefix/primary/0283-r4-random-insert-sorted-current.log": "068aa858486a9a4fcb6e18fee171dda8f8a176f6d50f266d157f9b224eb2b8e6", + "benchmarks/results-20261015/btree-prefix/primary/0283-r4-random-insert-sorted-current.stat": "54ec165a4e79801ede8ba553d8ebea26677d673037364d153cc9c0e6322fb9ff", + "benchmarks/results-20261015/btree-prefix/primary/0284-r4-random-overwrite-main.log": "6e7df0d8ce0857e5f402f898ef82bb30bb215b950a8034dbbc49e071e11a6dae", + "benchmarks/results-20261015/btree-prefix/primary/0284-r4-random-overwrite-main.stat": "e1530699c7666628faa19dca1c59eec8682e0c2a6429d98ebfed315b57f203ae", + "benchmarks/results-20261015/btree-prefix/primary/0285-r4-random-overwrite-current.log": "cf702eb024f39ad273f4e80f47dc9d0a0c801f787d0bea5ba6f68a8db4cb1060", + "benchmarks/results-20261015/btree-prefix/primary/0285-r4-random-overwrite-current.stat": "4d979c1d1e46bbdf512f0d696c29d18101866323b64489afab76b7ab64146bbb", + "benchmarks/results-20261015/btree-prefix/primary/0286-r4-random-pack-on.log": "a33925a3829c771845b8358118734a9ab79146e087115f6a06f12211c889c531", + "benchmarks/results-20261015/btree-prefix/primary/0286-r4-random-pack-on.stat": "a339d1a39e7533e76cafb5cbe7ab1528276402c98a556d33d0dca9e1b4339238", + "benchmarks/results-20261015/btree-prefix/primary/0287-r4-random-pack-main.log": "71aca15ff1fc79a7561566d27bce287001280ef2af1c2ecca13e6d57149f9ec8", + "benchmarks/results-20261015/btree-prefix/primary/0287-r4-random-pack-main.stat": "e0b56390fe76b83b810344c1dca3739769c2deef6170b48c690f775321b89573", + "benchmarks/results-20261015/btree-prefix/primary/0288-r4-random-pack-off.log": "6458440a54c1d1d08c34d74ac9c3182d0cd1012f252d1a16023c1012fa497b84", + "benchmarks/results-20261015/btree-prefix/primary/0288-r4-random-pack-off.stat": "7a7c045757c44bf0c3e6e129a3d3bd72e737045db9b43720f39005017e99b014", + "benchmarks/results-20261015/btree-prefix/primary/0289-r4-random-hit-on.log": "80d03acdbe1a2ec2327d354b108198cf413418fbc9d710ff393bd52d29431145", + "benchmarks/results-20261015/btree-prefix/primary/0289-r4-random-hit-on.stat": "091b233eef58ae368861cfa465d62ffebe46dce7b24e4c32ef7f12a2810e2f76", + "benchmarks/results-20261015/btree-prefix/primary/0290-r4-random-hit-main.log": "fc5e142c409634ac6028a70f08f18ef9120415db5b12307ca67ba6947e3923ba", + "benchmarks/results-20261015/btree-prefix/primary/0290-r4-random-hit-main.stat": "c3487933d12d9470133a2e595283da574a21e80d91d78da33fd0c76fd9f9e1ad", + "benchmarks/results-20261015/btree-prefix/primary/0291-r4-random-hit-off.log": "bc537d3dc85c302f16ce10287ed96b1e21139700e5b044700d79c8745294df7b", + "benchmarks/results-20261015/btree-prefix/primary/0291-r4-random-hit-off.stat": "4d1b90976dea66e9d398568596aabd9d94f772e405fb960d9638981fd5be2e44", + "benchmarks/results-20261015/btree-prefix/primary/0292-r4-random-miss-on.log": "e305d727438ee450a6f0e8fc545c4fbe0a238493de3c4ae746e8d3f920f26b01", + "benchmarks/results-20261015/btree-prefix/primary/0292-r4-random-miss-on.stat": "b62ed3c91ca8bb9f1112818f27aedab329e0b2650a502589bfcbe1944406d808", + "benchmarks/results-20261015/btree-prefix/primary/0293-r4-random-miss-main.log": "024e8a08e788c1cd40f20089498b5dd7e3951919b6ca3b572c063417f7e57352", + "benchmarks/results-20261015/btree-prefix/primary/0293-r4-random-miss-main.stat": "77f1321a08cd47a34535bfdbffdbd1fd71acf53d2ec32bede99b278101fc467e", + "benchmarks/results-20261015/btree-prefix/primary/0294-r4-random-miss-off.log": "015c3196e45a330fd76a9a815311b967b995a0ebc0a5a1e0efb5b1c8e45c55da", + "benchmarks/results-20261015/btree-prefix/primary/0294-r4-random-miss-off.stat": "bde45a9d7bd6b1b3a58608900e97bbf8658a295b24e2ad4334a2a69bada71b16", + "benchmarks/results-20261015/btree-prefix/primary/0295-r4-random-scan1-on.log": "f86e58d1f7f1ceb4ec8af48feaa535907aa6485482ab8353d506fe9b62dbc694", + "benchmarks/results-20261015/btree-prefix/primary/0295-r4-random-scan1-on.stat": "ec75660517f3a59dc87b42ec412a47c3c347d2ecbd36e4e487b886faadf00a9b", + "benchmarks/results-20261015/btree-prefix/primary/0296-r4-random-scan1-main.log": "5cd72e17bf3ab61908bf5d7235b76100d5725ec26be401c001e09831156a6cd4", + "benchmarks/results-20261015/btree-prefix/primary/0296-r4-random-scan1-main.stat": "ee3b16f58aa1bee729ebb2e800c74227c4c402c3b2040481c64694d7718c6fae", + "benchmarks/results-20261015/btree-prefix/primary/0297-r4-random-scan1-off.log": "4bca1f0683e6319db7955b9e788e26a8e394ce2bc8c5e4bfe9d98d144ec1ab38", + "benchmarks/results-20261015/btree-prefix/primary/0297-r4-random-scan1-off.stat": "ae6cca1abe4adc932962e8c3bf0468e84f08ab55ce8f40530da7949953a6fefa", + "benchmarks/results-20261015/btree-prefix/primary/0298-r4-random-scan10000-on.log": "4b0e696408dfa129d3c231445e4d62c1cc11336a150de6fa61e135bb787ede5c", + "benchmarks/results-20261015/btree-prefix/primary/0298-r4-random-scan10000-on.stat": "a7ef02343a1f288cb90cea8a847a7c3335edf8442b48b30a0eb8c1f07962ca85", + "benchmarks/results-20261015/btree-prefix/primary/0299-r4-random-scan10000-main.log": "ad63e6ac528a49e91b5dc449a27313dce8cd809767c56123b2a092c0b6f996d9", + "benchmarks/results-20261015/btree-prefix/primary/0299-r4-random-scan10000-main.stat": "12f7748b6b8d7f9df896d5546319b15172e271741b8b02fa74cab2e0cddb5ec8", + "benchmarks/results-20261015/btree-prefix/primary/0300-r4-random-scan10000-off.log": "1198e4991622e64a51ed6900a32bef0099cd8309d149ef26f2fabb829c5e6393", + "benchmarks/results-20261015/btree-prefix/primary/0300-r4-random-scan10000-off.stat": "0d10e40c464e4690efa8e47acac4d75c990eb1b02250387fed32552a2c5decf4", + "benchmarks/results-20261015/btree-prefix/primary/0301-r4-random-scanfull-on.log": "ea0e6af5bd3a91fdd8c2abb2f3e4796a8b05c75f828344ca7007fb2b5c83ca63", + "benchmarks/results-20261015/btree-prefix/primary/0301-r4-random-scanfull-on.stat": "7038b5a270b59741d698162a410ee1bf255498a74cf020ad37e2f34437e541b4", + "benchmarks/results-20261015/btree-prefix/primary/0302-r4-random-scanfull-main.log": "4527f362fe5739b90a49f0bdb803d84276831144a7388788334d48af71916aa0", + "benchmarks/results-20261015/btree-prefix/primary/0302-r4-random-scanfull-main.stat": "89237f36f2330fa9417ec5e11cf7b04417bd51671888c37cdb3a084dc8bbc5ba", + "benchmarks/results-20261015/btree-prefix/primary/0303-r4-random-scanfull-off.log": "8331e968042246da6c11a2298553439047f4c9e44e0eae8d2c8c0edfdc2b6f2a", + "benchmarks/results-20261015/btree-prefix/primary/0303-r4-random-scanfull-off.stat": "db8020ce97563064f0b85ea96df768bb3f8cd62c7b1ac220f27163607d4a1096", + "benchmarks/results-20261015/btree-prefix/primary/0304-r4-nonlexical-insert-random-main.log": "310de3a726bcad13c24490b660d3d4b84f27fe5722e54359bb61ffa33ecc6072", + "benchmarks/results-20261015/btree-prefix/primary/0304-r4-nonlexical-insert-random-main.stat": "fe0a158450ae2c01363d12b12a7ef37df2754235b8c246b3391c5600e1f48648", + "benchmarks/results-20261015/btree-prefix/primary/0305-r4-nonlexical-insert-random-current.log": "15a20fccb0d6d88e8d2cc7353fe7bbffec0fd93999ea7a07661a0297ffbb18bf", + "benchmarks/results-20261015/btree-prefix/primary/0305-r4-nonlexical-insert-random-current.stat": "f98ad6d6d1a155b1012629cb06fc23e094f8b57b87223a8f91b8f629cb1779fb", + "benchmarks/results-20261015/btree-prefix/primary/0306-r4-nonlexical-insert-sorted-main.log": "a8b734001894a1b13c719aa8052c172304880789c24e9cdb0fd98c633b8bf403", + "benchmarks/results-20261015/btree-prefix/primary/0306-r4-nonlexical-insert-sorted-main.stat": "d00595ec8527e8fdf63fe8b614ac02a1486206d9370dd3ea7cffe3132d9c006c", + "benchmarks/results-20261015/btree-prefix/primary/0307-r4-nonlexical-insert-sorted-current.log": "5f649f70c20631714ff5ee59d985c07e8c2368c392d6c5b791d9e94225a537c9", + "benchmarks/results-20261015/btree-prefix/primary/0307-r4-nonlexical-insert-sorted-current.stat": "dd04e66a6db066128d9b1c6a281688590c58cbdca5718d584ee901cf48513d13", + "benchmarks/results-20261015/btree-prefix/primary/0308-r4-nonlexical-overwrite-main.log": "348f2b751924ffe3f5cd0601ce217b72ffaf982709ce3e373bcd5700b9b18e79", + "benchmarks/results-20261015/btree-prefix/primary/0308-r4-nonlexical-overwrite-main.stat": "753a6ceeb346132bdb713d517535f2a1a4eea3dc0c9ab274e93e8f5a01ebdeb1", + "benchmarks/results-20261015/btree-prefix/primary/0309-r4-nonlexical-overwrite-current.log": "0ab626a18f5554a7894e861df31504993f4e48fd5577e4f5a8165bab618a361b", + "benchmarks/results-20261015/btree-prefix/primary/0309-r4-nonlexical-overwrite-current.stat": "578892f76548f498aaf147f73de8be25cbe4fac46a22f0eba3179c6a663dde28", + "benchmarks/results-20261015/btree-prefix/primary/0310-r4-nonlexical-pack-main.log": "bf41b445a85f470bad029879245aa7d810ed978862ee45fb14120057baa86683", + "benchmarks/results-20261015/btree-prefix/primary/0310-r4-nonlexical-pack-main.stat": "7d0a557198a2bd4f88552e30d7f9ef753fef55e90c8a7ad3f8cdf5b9ccbd0155", + "benchmarks/results-20261015/btree-prefix/primary/0311-r4-nonlexical-pack-current.log": "d6350339219f057b1721b4a0a2629905e82c4428240fd8e8c4af4be3cbeef5c7", + "benchmarks/results-20261015/btree-prefix/primary/0311-r4-nonlexical-pack-current.stat": "ec96bd571c99a5d5c771596b0e3210acf930f193b7bbae0df30240a9ccf3bbf4", + "benchmarks/results-20261015/btree-prefix/primary/0312-r4-nonlexical-hit-main.log": "64bb7377799f5f279d6462485e94d896d68c59ca42808eb9232fc3264da36a68", + "benchmarks/results-20261015/btree-prefix/primary/0312-r4-nonlexical-hit-main.stat": "8e7a80b1574ca71d538442a0db4ae4ee97cea04cd05c499055d5e2d979505210", + "benchmarks/results-20261015/btree-prefix/primary/0313-r4-nonlexical-hit-current.log": "5f658038fe93671d978f6c2f1ca74612b87dc96d4184249fa6d4f3dd2a0573cc", + "benchmarks/results-20261015/btree-prefix/primary/0313-r4-nonlexical-hit-current.stat": "17e5e285147416923503c0e807e2210f8a512fc1acc0f7ead4c8c5b90a514680", + "benchmarks/results-20261015/btree-prefix/primary/0314-r4-nonlexical-miss-main.log": "959b1ace5b7270ec1c2b6a7311cbf5d14590fd9f243c9e4a2041f28447db024e", + "benchmarks/results-20261015/btree-prefix/primary/0314-r4-nonlexical-miss-main.stat": "01ffdc5bb304f704d44bcb75425e3cf49caf5f873a67c1da9dad16a028504cd3", + "benchmarks/results-20261015/btree-prefix/primary/0315-r4-nonlexical-miss-current.log": "83d483468d9c34cd12a3c08fa313ee82965d8b556885c198c524183ed7d8ceb0", + "benchmarks/results-20261015/btree-prefix/primary/0315-r4-nonlexical-miss-current.stat": "d3505b0ba440d297aeed0aa98ee69a046cd1c93e4a84b10b246347558376d0bf", + "benchmarks/results-20261015/btree-prefix/primary/0316-r4-nonlexical-scan1-main.log": "90cb746100f8ea74334099697a132dbd7b678d06207e7238e35ba5ef7ffde879", + "benchmarks/results-20261015/btree-prefix/primary/0316-r4-nonlexical-scan1-main.stat": "55bf483c61f983069aef20174650d83b339af39c5dd9898b8f5cdb64d48416f3", + "benchmarks/results-20261015/btree-prefix/primary/0317-r4-nonlexical-scan1-current.log": "a768f1eead17ae2bb59a2b8d2c4c5a32183119ac1e163cbf68562c9befff4f91", + "benchmarks/results-20261015/btree-prefix/primary/0317-r4-nonlexical-scan1-current.stat": "9cb95ecf7339bb227a5743951f220e36c9e6bcc8aa71a6f5eb1650dc0933943a", + "benchmarks/results-20261015/btree-prefix/primary/0318-r4-nonlexical-scan10000-main.log": "9a09e089bf5dfc563b5b486bb8ce91e9fd408d3b970f8a5cab4230b99caa5c84", + "benchmarks/results-20261015/btree-prefix/primary/0318-r4-nonlexical-scan10000-main.stat": "64b5836b316c15cc4fe2c4d0e7ca75be9c388f94463297dcd51211b8de65b625", + "benchmarks/results-20261015/btree-prefix/primary/0319-r4-nonlexical-scan10000-current.log": "a5d43b80cde159d32fcca3d20b4078c0bc0cf511ad8cf3c91744bdbabd74fc4e", + "benchmarks/results-20261015/btree-prefix/primary/0319-r4-nonlexical-scan10000-current.stat": "27cea7ae15ebeb2e7e4458ae526b6bd6484b90bcbf42ff078ff7a8cae28820a2", + "benchmarks/results-20261015/btree-prefix/primary/0320-r4-nonlexical-scanfull-main.log": "413f5bae908d68bd597276acecfd8067f84df6fb5dba686d060feedff72afe3d", + "benchmarks/results-20261015/btree-prefix/primary/0320-r4-nonlexical-scanfull-main.stat": "622b02fa84c1b05024588943a46a53ef67982b3b76b1c6c4876cb9ea12f4f39d", + "benchmarks/results-20261015/btree-prefix/primary/0321-r4-nonlexical-scanfull-current.log": "26401d106e33df1725034b072eddd5eccc970aa04addc9be8c86dbca4604a78f", + "benchmarks/results-20261015/btree-prefix/primary/0321-r4-nonlexical-scanfull-current.stat": "b44f662c99e26c3aff087f9980dcdaad8f2de00b02090e9245ba9aaabbe8262f", + "benchmarks/results-20261015/btree-prefix/primary/0322-r4-common-insert-random-main.log": "3e7171f4fc50dd87888330122a96fc5ac00ea37f38c770574948a08220d48644", + "benchmarks/results-20261015/btree-prefix/primary/0322-r4-common-insert-random-main.stat": "74d93f2cad00049b26fe8fe4dc2052b4e77d8fb73458c8d63c7a68c6aac22aff", + "benchmarks/results-20261015/btree-prefix/primary/0323-r4-common-insert-random-current.log": "45f6a8f226b2e54df35267616abd8d244a43b97f6914d5b81cb1a409a91d6026", + "benchmarks/results-20261015/btree-prefix/primary/0323-r4-common-insert-random-current.stat": "ce4e8e302a1a82a5a8e543a16319963c7ed96d702d6d996bf64f1f4b4b91fff8", + "benchmarks/results-20261015/btree-prefix/primary/0324-r4-common-insert-sorted-main.log": "1910b1f8e770071e29e1faea1c89cf879d33702e3807457248d935c982450826", + "benchmarks/results-20261015/btree-prefix/primary/0324-r4-common-insert-sorted-main.stat": "e6ddc10a7e614f64b0b9ebb0933f27115467fd7586751d578cdb720ea2c7c3a7", + "benchmarks/results-20261015/btree-prefix/primary/0325-r4-common-insert-sorted-current.log": "a446d32ff5e8681d11788e29906976256d6068558c0e227f44d84741fde713c2", + "benchmarks/results-20261015/btree-prefix/primary/0325-r4-common-insert-sorted-current.stat": "21001d79c27780b361383a1de7d54840dcbc9c61f3924d63cbcd68f26af40268", + "benchmarks/results-20261015/btree-prefix/primary/0326-r4-common-overwrite-main.log": "0e15d553275afe1eb775f6f03fe6eab88d1a59321d0588b2bffb96ca136c81a4", + "benchmarks/results-20261015/btree-prefix/primary/0326-r4-common-overwrite-main.stat": "2fb3bfb80f4613f6b2f8bb32c09c04d6d186874c9abaa70169fb75ee571e5dae", + "benchmarks/results-20261015/btree-prefix/primary/0327-r4-common-overwrite-current.log": "a7a482fa3d185df1b058c46902976b19783d8b2d08f45b8cf4d42e98173aaae7", + "benchmarks/results-20261015/btree-prefix/primary/0327-r4-common-overwrite-current.stat": "d486e9057ca790769561a166d9c0630030a1361e927475f5b5ec241962c23f9e", + "benchmarks/results-20261015/btree-prefix/primary/0328-r4-common-pack-on.log": "c5e493ae21c26050b42d1f72bfc61b09295346a428b1f9b1a8643e9b935d8579", + "benchmarks/results-20261015/btree-prefix/primary/0328-r4-common-pack-on.stat": "4607e7bcca72199b9c5cd948a91ab5ff8240f0864f479657ceb34df2024b6bde", + "benchmarks/results-20261015/btree-prefix/primary/0329-r4-common-pack-main.log": "2616946c8952bd708679ce4912698a7cdc826afdbcdb8cd66c551fd341be93f1", + "benchmarks/results-20261015/btree-prefix/primary/0329-r4-common-pack-main.stat": "fbee14e51aa2a583c45e5fa0de98bc5976c1e7bc8b2396e3af9ef1720eb2c312", + "benchmarks/results-20261015/btree-prefix/primary/0330-r4-common-pack-off.log": "e6929d5a42ab79c7f58c8d4a4005c816035a36866d3e13ba876fea6148aa3623", + "benchmarks/results-20261015/btree-prefix/primary/0330-r4-common-pack-off.stat": "f0104187b65d7e468356164b8809995a0d22ec8d9b28f0f07d15d7a0456e4a66", + "benchmarks/results-20261015/btree-prefix/primary/0331-r5-common-miss-on.log": "a65521483583abb3d4034f40754bf3bbe6223a250480bc15936e8cfd88c09fe7", + "benchmarks/results-20261015/btree-prefix/primary/0331-r5-common-miss-on.stat": "ed87f37d5ff9258caae92a3bffda71dedf6945a75f0d3bdeebf579c49cf8c358", + "benchmarks/results-20261015/btree-prefix/primary/0332-r5-common-miss-off.log": "e86b1863fdf84034eb950504cddcb8464758187b5fd5e9bdea37b9d0fd9c5a83", + "benchmarks/results-20261015/btree-prefix/primary/0332-r5-common-miss-off.stat": "d4b6cb086dedd05c64772f5a95fe82b15e89aac20e5016e09439508e20abb08e", + "benchmarks/results-20261015/btree-prefix/primary/0333-r5-common-miss-main.log": "8c5bd0d91d44f0b3d1463b0c407cdf97ca97983de4fbd7225b7acd911a09ba25", + "benchmarks/results-20261015/btree-prefix/primary/0333-r5-common-miss-main.stat": "3caed5240383eecaab55519f610a47ca6c9a18a8125a750d1ad929055e1fb2a4", + "benchmarks/results-20261015/btree-prefix/primary/0334-r5-common-scan1-on.log": "3b4121c30c197094f283192d3c345c019cf07838197e069d8a3c4327495629b3", + "benchmarks/results-20261015/btree-prefix/primary/0334-r5-common-scan1-on.stat": "65d8016cf217ecd204b4854f523c32bcce8998896abfbf0d8f6c470433f26e28", + "benchmarks/results-20261015/btree-prefix/primary/0335-r5-common-scan1-off.log": "c876ab7cb934d30db0ef97fb61c5491c01ddb2b6cb716b23bc06e04c3e2725ed", + "benchmarks/results-20261015/btree-prefix/primary/0335-r5-common-scan1-off.stat": "84c6636cfe41916ba0f367819ba6bb544f633ab70e4cfb949fc107ade21e582f", + "benchmarks/results-20261015/btree-prefix/primary/0336-r5-common-scan1-main.log": "6c207dba04ff7fc0c7ba0901e5717bf310349eaa6ab000eb11f070b50edb57bf", + "benchmarks/results-20261015/btree-prefix/primary/0336-r5-common-scan1-main.stat": "95db213b764e4b011e07ec7a3beb10ec06e7a49fb72de633f7c2a935f3b55277", + "benchmarks/results-20261015/btree-prefix/primary/0337-r5-common-scan10000-on.log": "25d4ef111408532bee6c3965ca1c5e502d6e4f63411a3cc3e9c4a9c51cb7168f", + "benchmarks/results-20261015/btree-prefix/primary/0337-r5-common-scan10000-on.stat": "baa94d882f698cfdb337e3f146cb6ea73aef5d7044f501b0e5ea63cc2b45e1f0", + "benchmarks/results-20261015/btree-prefix/primary/0338-r5-common-scan10000-off.log": "3827fceba324fbc47aab6fa8f3d96c5071ef8520e03c751237caf0f67c4d71af", + "benchmarks/results-20261015/btree-prefix/primary/0338-r5-common-scan10000-off.stat": "2e1d6ef947d027d0a358904107ec1df74d525d378bacf8d96bf060e3d6b892ce", + "benchmarks/results-20261015/btree-prefix/primary/0339-r5-common-scan10000-main.log": "ca6530b6771e5a6db5884d06ce1c3b5af3b285b79a50da8321b584c6181c1287", + "benchmarks/results-20261015/btree-prefix/primary/0339-r5-common-scan10000-main.stat": "ae9ef25ef1da3403917061f5e7a3057ad47f750360e30d5001d97eab12e0b291", + "benchmarks/results-20261015/btree-prefix/primary/0340-r5-common-scanfull-on.log": "d44c4653109b5ecb121a9cf21353ce267ba0ba92b2a4db55ebd80d2a5f9ed754", + "benchmarks/results-20261015/btree-prefix/primary/0340-r5-common-scanfull-on.stat": "b9feacb22443133cac7fd25c5cf26da264742ba83a7825b1508eefef0e91d74c", + "benchmarks/results-20261015/btree-prefix/primary/0341-r5-common-scanfull-off.log": "848c0ddaa4aa4d0560b3cd72ce7d2aa216b6308afec701e0fe5bf77d00729e3e", + "benchmarks/results-20261015/btree-prefix/primary/0341-r5-common-scanfull-off.stat": "bbddd7720012521b4c719c21f652e55432a68b9183f403925a0aa66e6417caa1", + "benchmarks/results-20261015/btree-prefix/primary/0342-r5-common-scanfull-main.log": "41c3d40cc96da56b75cefc2bc8235d4b2f84983c548e14eaf51d2a329e2c17cb", + "benchmarks/results-20261015/btree-prefix/primary/0342-r5-common-scanfull-main.stat": "c651f6585f2a6f664628592e8f30400b3723e773537f460796d764759653c582", + "benchmarks/results-20261015/btree-prefix/primary/0343-r5-random-insert-random-current.log": "7a9bed37283c3f33fb0bd16ceb7f94924119e5bbcaaa7d88a6b020e19d902a23", + "benchmarks/results-20261015/btree-prefix/primary/0343-r5-random-insert-random-current.stat": "dfab779b7f5cb1d7e7bbad27fce814cf2f934ed621ed88dcae52c037928a4c42", + "benchmarks/results-20261015/btree-prefix/primary/0344-r5-random-insert-random-main.log": "a8e074f04a84bd5d1422674098031ca8f479cf67b82c0e67cda193d7589a5ef9", + "benchmarks/results-20261015/btree-prefix/primary/0344-r5-random-insert-random-main.stat": "122dcd26725fa5b6a16d52355a3c4bdc8b726caf1e37b511c5b0636975c42875", + "benchmarks/results-20261015/btree-prefix/primary/0345-r5-random-insert-sorted-current.log": "a54305cf113d8a2a6921fa3dca5fa84ff0b0d538caaff8f45e38e017f2cebb79", + "benchmarks/results-20261015/btree-prefix/primary/0345-r5-random-insert-sorted-current.stat": "77c2d81c63ba8e85b746176d429ddaf976b814c568c7789042360a53e2e4c1ea", + "benchmarks/results-20261015/btree-prefix/primary/0346-r5-random-insert-sorted-main.log": "70efecc08305d2adf34ad8187df9df7e1e772ca72b1cecf602ff3bcb44a3f66c", + "benchmarks/results-20261015/btree-prefix/primary/0346-r5-random-insert-sorted-main.stat": "42fd4622e1d5362648bb8ae6a517b19af1f376ffbd77637a011a9f2c3557a059", + "benchmarks/results-20261015/btree-prefix/primary/0347-r5-random-overwrite-current.log": "25bcec162022204d7348f7ec62df5172ce24aced72a20ab78a085a748f856e6d", + "benchmarks/results-20261015/btree-prefix/primary/0347-r5-random-overwrite-current.stat": "0483ebc3f1094670515608a0c42d21e300d2b779c3109cf713f3bce2a969a413", + "benchmarks/results-20261015/btree-prefix/primary/0348-r5-random-overwrite-main.log": "18ac1388629120945e9a77ed89ba5043faff0fd8553fb8a9d89e1f2ac93f17a3", + "benchmarks/results-20261015/btree-prefix/primary/0348-r5-random-overwrite-main.stat": "1d8576f156168306ade4e8532ebd6f653c35062c11c60d5e0252af50c6de3ef9", + "benchmarks/results-20261015/btree-prefix/primary/0349-r5-random-pack-on.log": "e8fedd351834742441abaa977b009c90617eb93151385ab61a957159fd632254", + "benchmarks/results-20261015/btree-prefix/primary/0349-r5-random-pack-on.stat": "573cb4a6c7987064f452c007e3fb3a8623bc59ce842905e45e5c45083e63ca2e", + "benchmarks/results-20261015/btree-prefix/primary/0350-r5-random-pack-off.log": "7cc989f1ad3910b2ca5e189a720622aa9ab522cdbbf6257dc0df430cf1d965a1", + "benchmarks/results-20261015/btree-prefix/primary/0350-r5-random-pack-off.stat": "166e2472a4721270ad1e782a557038d6d01f6adaee22c1b75a10f6b6c8c033be", + "benchmarks/results-20261015/btree-prefix/primary/0351-r5-random-pack-main.log": "f19ec173b144986039e6cd28da48dfdee58309debf6e81fb62e234372a5c6268", + "benchmarks/results-20261015/btree-prefix/primary/0351-r5-random-pack-main.stat": "7d747d5109fd5067e66c7c0d3962aed9bca4b59ef4f34bb387767126b0832775", + "benchmarks/results-20261015/btree-prefix/primary/0352-r5-random-hit-on.log": "e2656d1c57e02b30caf5e2c55bf54c6d41292347afabec87b4566c774ff83fb7", + "benchmarks/results-20261015/btree-prefix/primary/0352-r5-random-hit-on.stat": "9ada00d434cfa13b55f9f02f2821a024be791b68ad5bca427dcde9c258202fed", + "benchmarks/results-20261015/btree-prefix/primary/0353-r5-random-hit-off.log": "f4902610ba3f8cba2a372d9e3ec2cbb7f01899ad0525fbc161d53978b96b5876", + "benchmarks/results-20261015/btree-prefix/primary/0353-r5-random-hit-off.stat": "c85e839e4f75b76462cd4aae7b545a13229a545b0c2dec92193a5e7d9596ecab", + "benchmarks/results-20261015/btree-prefix/primary/0354-r5-random-hit-main.log": "c6483de9833d08d0949919ab792aaeba29d9ab08873428cfd23af8ae12573a55", + "benchmarks/results-20261015/btree-prefix/primary/0354-r5-random-hit-main.stat": "bf26c0796dc0d2387ed75d097b188bacdb956038906480638788aa13516c93b0", + "benchmarks/results-20261015/btree-prefix/primary/0355-r5-random-miss-on.log": "6feb32ffb137fbd87d585d5e9f1caa12d651364c3c844aca0a759fc684095635", + "benchmarks/results-20261015/btree-prefix/primary/0355-r5-random-miss-on.stat": "432622683aa16cd30020bced6e9c7db489f25162fbb190647bf68ec52d291df6", + "benchmarks/results-20261015/btree-prefix/primary/0356-r5-random-miss-off.log": "4d27992c4d05b1dfb858953c01201149e857d79f857354e22bbbf42807066126", + "benchmarks/results-20261015/btree-prefix/primary/0356-r5-random-miss-off.stat": "4bc58352b54577959b0f9fa2ebe499810da2242e6efe2c6db478098f9de85b90", + "benchmarks/results-20261015/btree-prefix/primary/0357-r5-random-miss-main.log": "96bcdfe7e16819afd1a25461de7a349ba4242b0e9f71cb657c9e9a7a75465abb", + "benchmarks/results-20261015/btree-prefix/primary/0357-r5-random-miss-main.stat": "30140a36367ad945b097cd4a61e1d17fa6af05a44c1c096ee4f090777ebdf668", + "benchmarks/results-20261015/btree-prefix/primary/0358-r5-random-scan1-on.log": "184c9f5999a859ebd1d3ccbff9d08dc6863a96db8b7d50de832f2f8b837dbb94", + "benchmarks/results-20261015/btree-prefix/primary/0358-r5-random-scan1-on.stat": "12a00a58284eb04f83a118b658e47c37e85814ce52459f395bd74329f2b38d76", + "benchmarks/results-20261015/btree-prefix/primary/0359-r5-random-scan1-off.log": "dae1d945265fe34e1fed2a86469949e0e56d1c873a457ed4f8a50dd2416c7b77", + "benchmarks/results-20261015/btree-prefix/primary/0359-r5-random-scan1-off.stat": "88509ac2ddaf137082a62bd53aaad36bbbcb328a1c270cd4ad40c982382cf9c4", + "benchmarks/results-20261015/btree-prefix/primary/0360-r5-random-scan1-main.log": "96fc5639bece42fe10973cdeb0cc2f3cdc40f87c25c4199d681072b3638a5e5b", + "benchmarks/results-20261015/btree-prefix/primary/0360-r5-random-scan1-main.stat": "fd98032c2d6371693a1f04cb8a0d200bffeeeb30a5f1e1f20399f5f38ae4aa49", + "benchmarks/results-20261015/btree-prefix/primary/0361-r5-random-scan10000-on.log": "5ccedbc69a74ef57f8bcb2e0d10e65528177e21f16c9fff5e770e848daee39da", + "benchmarks/results-20261015/btree-prefix/primary/0361-r5-random-scan10000-on.stat": "a888c33d898769d7555787211f924a0d1060d87831ff1a31144345c821913028", + "benchmarks/results-20261015/btree-prefix/primary/0362-r5-random-scan10000-off.log": "8e4d39141f722783a7185eb1126ec721a169a6bb08eff637b9cb24934cccb98e", + "benchmarks/results-20261015/btree-prefix/primary/0362-r5-random-scan10000-off.stat": "cd768ca4814e5f45668a29ca10a21af7022336bbdae701c30ff1689cacd013f8", + "benchmarks/results-20261015/btree-prefix/primary/0363-r5-random-scan10000-main.log": "a5117c0c4db3ef80481713e82fd2e886623245708b663c3404d1481578f8f088", + "benchmarks/results-20261015/btree-prefix/primary/0363-r5-random-scan10000-main.stat": "9176cd5e67fab5c86e1ecbecba5016f366652df702375774115372ff956fb68c", + "benchmarks/results-20261015/btree-prefix/primary/0364-r5-random-scanfull-on.log": "b80afe33eac10fb396a7392778c9685404429424b47841c8ece935bc29093f6a", + "benchmarks/results-20261015/btree-prefix/primary/0364-r5-random-scanfull-on.stat": "32ff8c6716576914f57cebfe2469541af13e2ae68c86f102e5bd796ed7c5e851", + "benchmarks/results-20261015/btree-prefix/primary/0365-r5-random-scanfull-off.log": "2ad315996b87733c953792be1cb7eff23af6e39dece5b9be05b19b36bc1cccfe", + "benchmarks/results-20261015/btree-prefix/primary/0365-r5-random-scanfull-off.stat": "80003a4c18be888f89e3ae322839257fcb82bbc824adf361677bc1a1896db1ca", + "benchmarks/results-20261015/btree-prefix/primary/0366-r5-random-scanfull-main.log": "1396c2ba15714f94809f5afe881dab25246b589b327eba499fb7f095e13c3d18", + "benchmarks/results-20261015/btree-prefix/primary/0366-r5-random-scanfull-main.stat": "a5019d653e01112b6b43ba2a53b158afb643d746c01914a9ddd93c7f4760b237", + "benchmarks/results-20261015/btree-prefix/primary/0367-r5-nonlexical-insert-random-current.log": "0564e4ac975ac1dd876d179e4d4f2217c10a894dc43d9a83f97e93cc8b154f53", + "benchmarks/results-20261015/btree-prefix/primary/0367-r5-nonlexical-insert-random-current.stat": "2ae9f93792e1a24d997bc17eeb3b8dfe2121481b9364ab773c27c003007cb10d", + "benchmarks/results-20261015/btree-prefix/primary/0368-r5-nonlexical-insert-random-main.log": "93e78ad169e65ee3c46eab06a56424814cdd65cb7b29b62ae12699e905bced35", + "benchmarks/results-20261015/btree-prefix/primary/0368-r5-nonlexical-insert-random-main.stat": "80abc98964e695243c094e0f4b9c0aa2b6fb4c8c760f381d7564a58dd311cc62", + "benchmarks/results-20261015/btree-prefix/primary/0369-r5-nonlexical-insert-sorted-current.log": "f05a4b5d378eb4931407413b73d7f4c6825d5627dc9c2101a0b97922419113df", + "benchmarks/results-20261015/btree-prefix/primary/0369-r5-nonlexical-insert-sorted-current.stat": "e2f3972a808a633e34da3a2203295f3de72541116f35808b028da8407cf60686", + "benchmarks/results-20261015/btree-prefix/primary/0370-r5-nonlexical-insert-sorted-main.log": "abf9743c3a9c8b81cb1c90673fb0f2101fac6be1502a37d181d03f88dff96f2b", + "benchmarks/results-20261015/btree-prefix/primary/0370-r5-nonlexical-insert-sorted-main.stat": "ea90d601063f231ec617c1d409ce50e70397b3d6525dd422c199af3e08e54dcc", + "benchmarks/results-20261015/btree-prefix/primary/0371-r5-nonlexical-overwrite-current.log": "8deb74a9376192eb55e0c87a1845b8fa3421f407ce6f32ec56b93c3104123abd", + "benchmarks/results-20261015/btree-prefix/primary/0371-r5-nonlexical-overwrite-current.stat": "57f397345afb3d8453e2036665f69f17ddfee985bc6a8acaa800a113a06b4699", + "benchmarks/results-20261015/btree-prefix/primary/0372-r5-nonlexical-overwrite-main.log": "c25b7969f779b4b9033ae2f1e7ec62a891fda90b29ba77c0fcde4fce1655e6de", + "benchmarks/results-20261015/btree-prefix/primary/0372-r5-nonlexical-overwrite-main.stat": "0a4620de2ab771a764e97f7fdc4418fda10f72325a1e8c4c70e8b3f81511f2a5", + "benchmarks/results-20261015/btree-prefix/primary/0373-r5-nonlexical-pack-current.log": "207b7b6d244b78135393d2be5c4130c9b3b1a634f16f5e4ae976b470a1663e2c", + "benchmarks/results-20261015/btree-prefix/primary/0373-r5-nonlexical-pack-current.stat": "49dcaee124c560e3b84a6fe4275f276e3be3b9fd78ef7ff86809673d04032030", + "benchmarks/results-20261015/btree-prefix/primary/0374-r5-nonlexical-pack-main.log": "d79198c13a5cdd4b7afce1e2386cbec8db9049428ac175b8d981003d472494fe", + "benchmarks/results-20261015/btree-prefix/primary/0374-r5-nonlexical-pack-main.stat": "cb520d3c1c8f590b651b28203960ead10f02fa78ad11d4c222b0eaa0957bba80", + "benchmarks/results-20261015/btree-prefix/primary/0375-r5-nonlexical-hit-current.log": "1a3d3ce9d6fdcb5b71596748c292369cc1ae042c4c0410fdba5345d5349f28d4", + "benchmarks/results-20261015/btree-prefix/primary/0375-r5-nonlexical-hit-current.stat": "517522031790d01d360cc6579edcff35711b4c51f27d0feff2d5bf8b3b761d07", + "benchmarks/results-20261015/btree-prefix/primary/0376-r5-nonlexical-hit-main.log": "22d1051d23f52351a3b032592316f6a37dc405a2cf470d0d4c3a9051e71b2b51", + "benchmarks/results-20261015/btree-prefix/primary/0376-r5-nonlexical-hit-main.stat": "f3f38c57dc02480c7a9292e57077efdfd6d10b953663bb99373a634d8502285f", + "benchmarks/results-20261015/btree-prefix/primary/0377-r5-nonlexical-miss-current.log": "dcc8ad6f8838666aee9c4a5014f3364f7fb947030c72d6273e245e0ab5a3c989", + "benchmarks/results-20261015/btree-prefix/primary/0377-r5-nonlexical-miss-current.stat": "a157a6313075625df5e16550e90fa2ed634f9f0b0b95d569be746bb182dca29d", + "benchmarks/results-20261015/btree-prefix/primary/0378-r5-nonlexical-miss-main.log": "42f7ba10b35f71359478822e55b448c502f4a593d90c3297cf120364677809af", + "benchmarks/results-20261015/btree-prefix/primary/0378-r5-nonlexical-miss-main.stat": "c3d1b3ee8cfe198724cd3a555701945dde773f8ebe8eb9e35ee8a3ed59d09dc3", + "benchmarks/results-20261015/btree-prefix/primary/0379-r5-nonlexical-scan1-current.log": "65f0786ae0880c5ca3bc6be9116be7c0e93107d0cedbf5f1401e1d90945a7df7", + "benchmarks/results-20261015/btree-prefix/primary/0379-r5-nonlexical-scan1-current.stat": "e50cce02faf9c73798abf9e05435d994e1a1adfa8b1987a532e0de615e8e500a", + "benchmarks/results-20261015/btree-prefix/primary/0380-r5-nonlexical-scan1-main.log": "de7d83f2a0f2539bdf877d9e675a0fe0f1ff7ec96b05cc36b3c10a322a636b53", + "benchmarks/results-20261015/btree-prefix/primary/0380-r5-nonlexical-scan1-main.stat": "3dbcd26c0088f95dcf7ba524abe88cec4e8c63182074081f2928872b13341158", + "benchmarks/results-20261015/btree-prefix/primary/0381-r5-nonlexical-scan10000-current.log": "6d9b92605bae0e7610db56386426b689b0c39c65fc75f680f44eb9c2120c4220", + "benchmarks/results-20261015/btree-prefix/primary/0381-r5-nonlexical-scan10000-current.stat": "7f2c67c5f4893ee33ed4af49b1761acd8a098f0965d4559f4b27a27e6681a619", + "benchmarks/results-20261015/btree-prefix/primary/0382-r5-nonlexical-scan10000-main.log": "9835d40f981926dc2339260489f0365f36cfd76bc63cba4a2a56d5b99507dee9", + "benchmarks/results-20261015/btree-prefix/primary/0382-r5-nonlexical-scan10000-main.stat": "f96682a285104a2d7aea078911061f5af2fd0a2ddccc002dc5812aeb90df2bb2", + "benchmarks/results-20261015/btree-prefix/primary/0383-r5-nonlexical-scanfull-current.log": "6f6f4feff89ae3768a7399c51093e906616a99ba0fb3b58e3dc904e8a8e02a7f", + "benchmarks/results-20261015/btree-prefix/primary/0383-r5-nonlexical-scanfull-current.stat": "b4afafe07b873d1843bee5e5135116063dc2760a6123fa4ceac9fe1d959c78e5", + "benchmarks/results-20261015/btree-prefix/primary/0384-r5-nonlexical-scanfull-main.log": "2195ebb10afd530f7a34c4d1d945466f03950775871b7002ab8ba974578ccae9", + "benchmarks/results-20261015/btree-prefix/primary/0384-r5-nonlexical-scanfull-main.stat": "dfe793868eff43be687eb78aa68cd9d064323e4959cb9d40dd2cad29c76d8e39", + "benchmarks/results-20261015/btree-prefix/primary/0385-r5-common-insert-random-current.log": "03334df98f10ab99bc366c3aac3e95d9a55f12f1730ca00b4a028bfd406106f2", + "benchmarks/results-20261015/btree-prefix/primary/0385-r5-common-insert-random-current.stat": "7d9ff64005feae5f58d55fb20e99d8dbf5a72e8919392723cf2ddb3c798281e3", + "benchmarks/results-20261015/btree-prefix/primary/0386-r5-common-insert-random-main.log": "cf148238b368938332ba8d4aafe619c0248cc3e25597def6c81d3adc86490669", + "benchmarks/results-20261015/btree-prefix/primary/0386-r5-common-insert-random-main.stat": "519319936adf6d940c590e500b7e50fa702dc253132c73cbd454341dbdc6737d", + "benchmarks/results-20261015/btree-prefix/primary/0387-r5-common-insert-sorted-current.log": "1d116d6bc2617128aa134893f6896cc8ee282e5889b7ee768d6d7073b5302843", + "benchmarks/results-20261015/btree-prefix/primary/0387-r5-common-insert-sorted-current.stat": "20502766fef1cbd62d7c021349c11204760219ac08cfa3555822a36ac55863a8", + "benchmarks/results-20261015/btree-prefix/primary/0388-r5-common-insert-sorted-main.log": "f2f4cf1fe30b76831d1bb00bf561dd0b22e47bbde38ee4b040f300533a475143", + "benchmarks/results-20261015/btree-prefix/primary/0388-r5-common-insert-sorted-main.stat": "4c2031cc4dec76213a43606a2ea53af893f9fbffb9f50ebb58f5d9896a0a4482", + "benchmarks/results-20261015/btree-prefix/primary/0389-r5-common-overwrite-current.log": "9974ee135f3f50c49b342aeeedd01f7853fee334ee2b33156771b9db365c374d", + "benchmarks/results-20261015/btree-prefix/primary/0389-r5-common-overwrite-current.stat": "f1dc1d27e13c58a3127d0fbecf6e3dff71a7aa33cbe701c283a17135e66c2d6a", + "benchmarks/results-20261015/btree-prefix/primary/0390-r5-common-overwrite-main.log": "3596a2df7452e38aca3ef5446906cad0d6822194e900a60360c3da7635483604", + "benchmarks/results-20261015/btree-prefix/primary/0390-r5-common-overwrite-main.stat": "718190b7193c096eccf5682865666c092c909571661312f3cbc01ad63e0c4a41", + "benchmarks/results-20261015/btree-prefix/primary/0391-r5-common-pack-on.log": "517c473708ca50b31f69ff87649fc4853cb683893ebbd0792987c57258fe7c1c", + "benchmarks/results-20261015/btree-prefix/primary/0391-r5-common-pack-on.stat": "9c9e204b2bed333d21990644d3a0173f247a1ae1a363a66af08f2a0d76a82d23", + "benchmarks/results-20261015/btree-prefix/primary/0392-r5-common-pack-off.log": "29aadb037259d81de3e78ef99b49c3709fa97a12cd282adc2d0529c4a55480dd", + "benchmarks/results-20261015/btree-prefix/primary/0392-r5-common-pack-off.stat": "a77af634a125fbb095732e141dd22ec8bff3f160d64b70fcb5286ef97301b229", + "benchmarks/results-20261015/btree-prefix/primary/0393-r5-common-pack-main.log": "81c7da09957ca2d6edec6c8a146f44f1f743bf9de9193493418306e08167f3d2", + "benchmarks/results-20261015/btree-prefix/primary/0393-r5-common-pack-main.stat": "18b32f22b9d3700ea8a36c719727b4bfbce99a6e6b21c8150ebcbb3caa5a471b", + "benchmarks/results-20261015/btree-prefix/primary/0394-r5-common-hit-on.log": "c5056d44f643b2659cb251bf9e1dd080e0c79eda82aa79d49d4f4e6795119751", + "benchmarks/results-20261015/btree-prefix/primary/0394-r5-common-hit-on.stat": "1a4cc38f92fdf127c6c7c0bb7145f9e0d704bfc66b1a68138593383cbecbdea7", + "benchmarks/results-20261015/btree-prefix/primary/0395-r5-common-hit-off.log": "a490f33b3aca6a88a1afa6f7eb84f1bb019bde79c82bd738c17534a7586324f7", + "benchmarks/results-20261015/btree-prefix/primary/0395-r5-common-hit-off.stat": "86db4df27ef521b98e0417c8d18c4115bec9eb8541c6592036951680e960fec2", + "benchmarks/results-20261015/btree-prefix/primary/0396-r5-common-hit-main.log": "8e7950a636ea532fbb0ab965814ee97d4546349b90ca7f7abfe54c5a2118319e", + "benchmarks/results-20261015/btree-prefix/primary/0396-r5-common-hit-main.stat": "8251da95041416332e961d8667bf2590c1c9979dc5f5ad8147aaa2dc5b17db66", + "benchmarks/results-20261015/btree-prefix/primary/build.json": "ee8996799e96284e5343a942b83c8f29433109b34d62dd31d7cb115a4e0353dd", + "benchmarks/results-20261015/btree-prefix/primary/manifest.json": "cdd1b109ca2624245fcf07821ed3eb1cc2e078e6c5dc06e238599808f51b0b4b", + "benchmarks/results-20261015/btree-prefix/primary/plan.json": "b91771185453f04cb5b75feb35c1d5fa27f4481120d0ecc71da85c5a5f64249d", + "benchmarks/results-20261015/btree-prefix/primary/runner.py": "4d6f3ad634afc1a1035ed3b77ca73fa5a304e4fc69a287bb7d2b47347617e3c1", + "benchmarks/results-20261015/btree-prefix/primary/summary.json": "40aa0a7a973c563892494a1886bb398be301588d85632bf90de544ee0b5f8dfd", + "benchmarks/results-20261015/btree-prefix/proposals/README.md": "42b0aa044d1757c6bb49053b9bc39b25a396f1d5623b836f0f3fe6d5636c07f4", + "benchmarks/results-20261015/btree-prefix/proposals/lazy-pivot-buffer.patch": "b906fe918268f1cdaad4fecaae44d61ff243818917460c40b449c6830b77b921", + "benchmarks/results-20261015/btree-prefix/proposals/manifest.json": "5e69e55ba93a7499f7bd7994292f4cd8228fd05dc4a79d581b8b4a1b39608cb4", + "benchmarks/results-20261015/btree-prefix/proposals/prefix-before-scratch.patch": "cac8513cd318b63ff167dee1dbaf5ce0aea92e4d2a10203656628d0c640154ff", + "benchmarks/results-20261015/btree-prefix/proposals/rare-blob-scratch.patch": "bc69deab462c9202f486a2e75a4f7dcb2c55ff7c8ca122dc37f41182ce9a389d", + "benchmarks/results-20261015/btree-prefix/render_switch.py": "74e4b90c13033457b812e33bb32d8172e4c35a6794746afb352a6fe32d951744", + "benchmarks/results-20261015/btree-prefix/render_tables.py": "d4f2b2510947217b324933d57b0ad979469363f85c5d869ae9095fd03b7c29b0", + "benchmarks/results-20261015/btree-prefix/runner.py": "4d6f3ad634afc1a1035ed3b77ca73fa5a304e4fc69a287bb7d2b47347617e3c1", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0001-r0-common-insert-random-main.log": "f94bf6abbaa0aaf608db0f4216f82222e4558d24e400be4aac97e7eef156c4db", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0002-r0-common-insert-random-current.log": "298ebe74e2decbc904a90fd9e34e9bff53f065e3968f05268ef93ecc1c45812b", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0003-r0-common-insert-sorted-main.log": "6047be72cf9d3d2ea2f49a46b1b565d707356485e38782794f11a0ae14e1ffbf", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0004-r0-common-insert-sorted-current.log": "90a5828ddcbac9960a0ddced1337588a15ec840429ab434986ca312e23da63b0", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0005-r0-common-overwrite-main.log": "7e6f4d511a7c29c244c540e78a881574209c5838d899c56e5f93fb71031487cc", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0006-r0-common-overwrite-current.log": "63808894dcd9da52cc8f559792bb54f7155a29a1e49eafbc44b55c85230c19dc", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0007-r0-common-pack-main.log": "ef3df88ee5dbe7336df8e4f85b6a9c267d003a42f190e175dcfb560cad7c8940", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0008-r0-common-pack-off.log": "bda1afc8842a549893d6fb8bcdbba9d1bfb8a60e39376765d93f54536a3f5170", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0009-r0-common-pack-on.log": "b9dfd57daf6656ff93a18cd5137919e2083770f8c840e3bc2cececd4d7529507", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0010-r0-common-hit-main.log": "f31615e55b842f6ec9f806b19bde3ba8790c846679581270b6a90f013cc1f120", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0011-r0-common-hit-off.log": "ca6f724e0d792ade8bd26874cea9f37d3c406c2f561438bc63470f25eff48176", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0012-r0-common-hit-on.log": "28cc7457af392b83a6207f6aa201d9ba298c4df232176f026ebc2a2793bab846", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0013-r0-common-miss-main.log": "411cd84799f4cee0db92bf7cc7b93c8837871b0c516c455a685620df005a5b75", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0014-r0-common-miss-off.log": "c3ccf1fb6cc0f873584a7b15d92cb8a24c418ab72ec2a65dcd34d2b974eb6056", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0015-r0-common-miss-on.log": "38c938993748206ad6e2d759e46b1b38e36577662e06615a1602a77cfcfce017", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0016-r0-common-scan1-main.log": "db220a3a50c81a506b003917cf98ead27f4feb23065e256160e184ad808ec8cc", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0017-r0-common-scan1-off.log": "feecb32cca4b84c57cf9e56b71351b094fcb860b03879e832cbe350fc1867670", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0018-r0-common-scan1-on.log": "a9c170506c749cd3d3bac8eb1656743e4e0af824d5dafe71a21a7f68994255e2", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0019-r0-common-scan10000-main.log": "0bb0c01d8447cab2da9d1910873801ef28bee9b99975e68795f3d994c24cf536", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0020-r0-common-scan10000-off.log": "e2b739dbb1d06418e2fdbff272334d48c145ea0a9d25d763bc66b5ac9f122eb7", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0021-r0-common-scan10000-on.log": "c71dbda4eb7c4d09a0cdf8a119bd05fc51c37155b1467efaffae8135ab4d75a4", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0022-r0-common-scanfull-main.log": "76d0eddda16da7bd667e6d7ff37f7bcbb014fd40dbfc81e0a65aed88b776f829", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0023-r0-common-scanfull-off.log": "3bddf106e3547878dc5377d2f117457db4f462108a842f9cc9f577d0cfefde81", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0024-r0-common-scanfull-on.log": "75810d69057b19704b8b34c8fd8b68473613057b144b4ef8c9897ad53866d7d6", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0025-r0-random-insert-random-main.log": "17a70e80cb2e6ba24142ecef7df2129258e281fc58b0dafd1b146a189c3b2e55", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0026-r0-random-insert-random-current.log": "882a6bc5e2dc633b8ef31bfcd1fa997e7fe8f39f87fc4e6163f72d1b3a3c856b", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0027-r0-random-insert-sorted-main.log": "ff59a5180d9f6cbf2169457123eb1f5741e482bfb8f4808e08968eb43af09425", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0028-r0-random-insert-sorted-current.log": "a982ead9a5e2c115a21fd377b5e4a1b7d44f7ba8738d1f9e0c4faec8f223558b", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0029-r0-random-overwrite-main.log": "878abb1ac4d294354abfaaaf27af531a4862ee7ce8474e2d1eff8291933a8010", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0030-r0-random-overwrite-current.log": "c4b9196e7f5dbe7fedab3e9787a0fe9564dba5b9f3e76e6459cd96ecfd15cc60", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0031-r0-random-pack-main.log": "5b0a138b1416fedbf9eceebf81ca222041b527a70ede38bb76a6c06241a2b1b8", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0032-r0-random-pack-off.log": "c257749c8b40d36351c39202144fd12104acd5d7482af4a72bee396502095a0b", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0033-r0-random-pack-on.log": "9d57dda23e539a2e1a92d3a0f5b09dd1cbebfae3c9b5e2de2b11f4499482fff1", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0034-r0-random-hit-main.log": "a7589ac41e782e62d5c016657b7b5bcfac645db1fceeb5fddab09b5749cff4be", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0035-r0-random-hit-off.log": "eda41508e92de9d1922dfb50a8f81cb77e7578b8a24b8abcc826784cd6ff1257", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0036-r0-random-hit-on.log": "cf04ad9f32685b86ffb883e13bac1f287a44a5e4e30954e2563b75bc2fe2c05c", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0037-r0-random-miss-main.log": "68d94c36f98f72c3736558d77ba714f98f2e458041d1c3eb3650a0992a2fbcfd", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0038-r0-random-miss-off.log": "92d44c5b568971d1e5baab8b6ffceed48677612acfc657b5caa6c402df591c8e", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0039-r0-random-miss-on.log": "ea96f532cf1046e328d9204d5f0763782260ecb29eae825d8b5d64046d9fbb94", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0040-r0-random-scan1-main.log": "daa21129d6694fea31aced6b196b06d8aba4d1e1c0720a2c2340529bb11747ac", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0041-r0-random-scan1-off.log": "25f72852aa27b9f0eaacd97ccabd93d3e5af3a23e19888b52ce463663e4722e3", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0042-r0-random-scan1-on.log": "ab02df9f8f6d9623eb542fe18eb8de286a8926a493a9c0f6028185e38e7c8f3d", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0043-r0-random-scan10000-main.log": "682764fde3dbd234e82a4c2badf898f647df7f4c2d8e78fbd7c0cfadba6c7ebe", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0044-r0-random-scan10000-off.log": "81484405fe5015cff8cba41fba11bddc4233e8d1faaf861435c0d38666cac8aa", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0045-r0-random-scan10000-on.log": "5057b2995158766123793561ca1109f28183973603fc5fe7853ecc72eb366e51", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0046-r0-random-scanfull-main.log": "374758fe0e2da25795ccc323758406cbf0994c58562e0279cababd0eb4208df9", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0047-r0-random-scanfull-off.log": "1f7fb621a80146c582f29508eca074184b9afcdf038f327fae25d8142ad8b37f", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0048-r0-random-scanfull-on.log": "9a7f59f5a9e6e2836c39a8bfddb64c11261bd1525e42bb0ec74c2b0933c6da8f", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0049-r0-nonlexical-insert-random-main.log": "b1b3b8cbbdaf9630e6dd71c77a1f0cd8137964c0c320068221c22a2ce3d1af3e", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0050-r0-nonlexical-insert-random-current.log": "4294998c7b2ab5ae0d4674496c38fd369f194c34f2d0a353bd1a023e2cdf048a", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0051-r0-nonlexical-insert-sorted-main.log": "40c327e8a4031bca410b14114cfcf94f86b730b87730c457e268bd6e2f908a83", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0052-r0-nonlexical-insert-sorted-current.log": "3dcd3b114272ed27b4603518d1cff5f29e0cfb6cfb2ecc407ff254fbb69c76c7", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0053-r0-nonlexical-overwrite-main.log": "6d294bc8a8a21f3042c97c1ae4e8f473ccd4685ccdde4f96b5c1d7cc4257a7c0", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0054-r0-nonlexical-overwrite-current.log": "a03075f167d314fd850138e4c10a97b09f663994ef3f973c6373308c9f1fca1c", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0055-r0-nonlexical-pack-main.log": "97ae1e68de6475efa4cf1dbe90ed4f1989533b0da72e191bad7197cc5333b35b", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0056-r0-nonlexical-pack-current.log": "f68d609baa46014c7eb9ac6e3b4940e217b9b3fdfc37cf5300b19d0a071cdcac", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0057-r0-nonlexical-hit-main.log": "145dab04d07264647ac0679c0f5a0518dba6d83c3e72a22c9564ebe2a9d7d7af", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0058-r0-nonlexical-hit-current.log": "a2609f173033ea9fb77c0ce4aa78d1c54b9fc0b1238cd0108ed3d9de92f00f7a", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0059-r0-nonlexical-miss-main.log": "d487d8120889f615292ce6450a8b0419c7ef75fc0bc433a7f1e6e6f288537f75", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0060-r0-nonlexical-miss-current.log": "357c9e3f08da260f200ecb3b9f2d00007900f9a12168d796628db0f552dfe59b", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0061-r0-nonlexical-scan1-main.log": "8809e2e21b6d47a8c036e9e086478083de3aba1f762fa18de673b6506b31936c", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0062-r0-nonlexical-scan1-current.log": "0c08f9183ad132de360a8f6676ea28509211c9eb83d5e289c27c94d0fc2f51fe", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0063-r0-nonlexical-scan10000-main.log": "8837400446434bf9c33626956c8101ac77bab54cf2084262f8e3b003b09e160b", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0064-r0-nonlexical-scan10000-current.log": "2a12ff27e61ee48c7f2cce238aec54bc58f8c4d41f60c71dd65eac5f8b613275", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0065-r0-nonlexical-scanfull-main.log": "da9d88efc2899d2a231f842c51e83c525339aa2602d7e3d62ec79a9121dd5578", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0066-r0-nonlexical-scanfull-current.log": "f890251f42a718f5dab290a1e16e8dff98fdfd7f6c6c3cdec600a33c2ecc0b7d", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/0067-r0-common-insert-on-on.log": "5cf2a2c8777f7d45a76fffe504cc7f2551464af77b2a74cf9c7a7acb0ea05692", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/build.json": "40fb32ee7423ea6de8ac24bc6209bac3ff78642575fabdc62da4085162e5c737", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/manifest.json": "5a3b54bc387bdee44724849d6557388776693aeb06566140685ec7dc8f08e910", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/plan.json": "3433e161f17f4724dbcb21c986f16e5b8c2491234aabb532918c32b131189a1e", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/runner.py": "4d6f3ad634afc1a1035ed3b77ca73fa5a304e4fc69a287bb7d2b47347617e3c1", + "benchmarks/results-20261015/btree-prefix/smoke-no-perf/summary.json": "219ca3cc5d5eb07b5942523c14317917cacdfada44f949f90bb2cab288a631aa", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0001-r0-common-insert-random-main.log": "dd8c234a4b847507b42682b4879bdedcaab797c3c7764bc29173f0e3d7f64694", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0001-r0-common-insert-random-main.stat": "f25142f93e65844d8390358ed2ca6764aa7f4ab1eb342093da83d30603bc23a5", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0002-r0-common-insert-random-current.log": "834f822aaf1a153b3633e8ace3a58cc66401a1d6d64a4844f942cf124b3c61b7", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0002-r0-common-insert-random-current.stat": "aba286bc4b4fbb5c9b193ed3fc4ea2224f4f34db033a192fc11b97d596c5ef5a", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0003-r0-common-insert-sorted-main.log": "450962c0d1fb548aedadd0c2e3af4638e89e3f201c003e2968b964ce748e1376", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0003-r0-common-insert-sorted-main.stat": "cd3965e0b2a357736f78e7cefd837c06a6595263fcb448210fe4312ccbd0211c", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0004-r0-common-insert-sorted-current.log": "352474fd4c78a516ae637f8974be8b613d2cd4ba45b82a1e2f7e189f803116af", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0004-r0-common-insert-sorted-current.stat": "594a9b91734ee148e451c9d4aaa2564c653930b9e07a6f26a8d1138a2eed84d3", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0005-r0-common-overwrite-main.log": "b4fa7bb36399a58c5fcb406c5db4d95debd2fa44834c53e24330dedaaa7c4c90", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0005-r0-common-overwrite-main.stat": "8a3e8c94bbd04b0d2602eaf00f24a4e1d9fd6ebd268bc82e7235749e03343798", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0006-r0-common-overwrite-current.log": "aa5cee9e2c645d30ecc4f029378cec550849a25f6e532d1564ba5d97c4d1d3fe", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0006-r0-common-overwrite-current.stat": "5d2a9b0d4e3b1619c85af1b09cab49b9fc07809c6b6ec682ec131a75a2125e12", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0007-r0-common-pack-main.log": "2e94bff88527055202236388dee3cc3e275d23685cec5d1a3af491fcb02caca8", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0007-r0-common-pack-main.stat": "a04c9900b6fed33f564568ff1b23db7ff0a17183ec8040bb1cd2eaaf76df900e", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0008-r0-common-pack-off.log": "fbace3d86760558e039f7a3152fd8acfbc5b2729f7e47c8213c35d468bb374d3", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0008-r0-common-pack-off.stat": "0eaa871beaf28b493925d382d439001185f9bd594cbfcd8db7c15bda5641b909", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0009-r0-common-pack-on.log": "ae70e4ff7aff5d95170f742b4a39ba420880cb7c220c6c76112cf326456ecf79", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0009-r0-common-pack-on.stat": "6c2f36edf6ad26f4f036ec8b07e551b80dceda88c3e389c10aea7572283b8ed6", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0010-r0-common-hit-main.log": "e34cb82b08b7ae9906c33a04d303c8886893965e85660e67fc5c3dd52e48b847", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0010-r0-common-hit-main.stat": "f559fbea5f8c3e78de0c3ba45ba8341c33e299ae0e6eaa34f8ff3e1b435987e6", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0011-r0-common-hit-off.log": "8453380fb0bc8d1d29d6d35a2b795da8b16547bbeaf601cac63b6b05df080245", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0011-r0-common-hit-off.stat": "73be70e4cb9efaf9fc622d1712b3e6aaacc4d345b1fc85d2374783d00bc10f97", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0012-r0-common-hit-on.log": "9479d280a4abfb520c55ecc2ae8d9d08acbcbc01262cf7cc7bc1e6f178e984c0", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0012-r0-common-hit-on.stat": "2df38d3947c12eb8a5c794700a2b00bbcaab5d91633615138672b04ae9ba84eb", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0013-r0-common-miss-main.log": "1b2b156db2abcdf472810a02785ecc91028df394e49a1bb19517bdd15cea9432", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0013-r0-common-miss-main.stat": "862faca137b0fffc6e3c832fb0b7f4963e9a258bb39b0d5bd3277d803e0060bb", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0014-r0-common-miss-off.log": "cfba5fec9fa81115baa375853e35cb1c79387f979e1caa08b8085922a001ce43", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0014-r0-common-miss-off.stat": "385961f70a3d3b741fbbcf4c56aa9b4a048b1f00fc13ba5622112ba1f596e3c9", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0015-r0-common-miss-on.log": "ecc7597e6a1cb2a84e146ec5ccdbd42396bc6eac3b324a8b727416361faf4634", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0015-r0-common-miss-on.stat": "ee92d549b44d6c6c4dc1865420acb82374af2771257d427fd4e6d04dc87b31b0", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0016-r0-common-scan1-main.log": "964ca42ed2ab1facba1ecf937bfc258a61aad71a082479f583f89ee8b2a4c441", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0016-r0-common-scan1-main.stat": "99f546e0981a8ecbe54cacfff5982d559962919d16321ab061587d9f25dd68c1", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0017-r0-common-scan1-off.log": "b78ccdb3c147b0d5b88d8e720e07226cdb932b1736a5c63d65f9c7e6c509b081", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0017-r0-common-scan1-off.stat": "c2c52f37b6f676abf8c579d505c76a8e7a515d16eb14bd77adaea6a2e633b79a", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0018-r0-common-scan1-on.log": "e0aae317ccfb2e6ddfad0db373afb20858cf93c4834ce50565d049601f318bb6", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0018-r0-common-scan1-on.stat": "4cb82d48660bd499827b9cf0fe289074bf04a9630975883784ded677a63c7520", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0019-r0-common-scan10000-main.log": "9b81260354df71cb05537041c38afdee8ea65f4806274aa67ec7507b05e1a381", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0019-r0-common-scan10000-main.stat": "b4ac1baefabaa5be8f8d3d8091493ea5c2df0d0e11d952d804c102d5582c09fc", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0020-r0-common-scan10000-off.log": "7cb207a163580b541680c47baf96eca84fa736f6458a1c2f5fd1c3fb76850c4d", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0020-r0-common-scan10000-off.stat": "79a3ae3daed99ce91a93dcd200e47ea15b2b957593d1eb434cc68dd5418d604f", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0021-r0-common-scan10000-on.log": "52a07beb18c180ee28a2ac0199d1323a57931d206cb5fc82f4b4cbf205c73090", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0021-r0-common-scan10000-on.stat": "819479d2f21e1f37192969cf1482bd9bc791af318339af9f49d9e9a0685dacfb", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0022-r0-common-scanfull-main.log": "727fc6b19e3942338d97d4fec203d5688d73800c7f28aca88b661829e82f9eb2", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0022-r0-common-scanfull-main.stat": "49808926db9e247d2a7e68e528c76af1a6e9a3a2748498965502cc0d41c2e907", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0023-r0-common-scanfull-off.log": "32e475f76a074e4a293fd182207e8d8c5479ae162fcd36cebb2a27f5cd8db72c", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0023-r0-common-scanfull-off.stat": "324d7af0ee9a2f0a470f287f43de29dcc8dae06e239b9cf9802d530b6010bf1b", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0024-r0-common-scanfull-on.log": "5080a761cc31b9ba0577f1a47180362beaf1d1965d10366dfed51903c1f7b58b", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0024-r0-common-scanfull-on.stat": "04df31d3a5e274e548b20cf47fa63880f23bc48d7a06310cd2b3d258e27439c2", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0025-r0-random-insert-random-main.log": "b276306bb4af6748688f1f203066ae595ff4be0637d28df8dbe7b2684966429a", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0025-r0-random-insert-random-main.stat": "89190c583f21dd664c5ab62cdccdbfcb79e470ab0ad1dd56a881ffcacadbd868", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0026-r0-random-insert-random-current.log": "4f9abd801c0403222abf575f780cbc9b2ee360876961fcea8cee764e68d48e84", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0026-r0-random-insert-random-current.stat": "3a903baeafb50bb57d0c7056d5acb59e9aaaea81df27fd1ceca12abff785c5e3", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0027-r0-random-insert-sorted-main.log": "dbff1d8b5f8deeeb7e8996bd8305b1c3b5bc45330d0018cadabb2444b2dfa5e2", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0027-r0-random-insert-sorted-main.stat": "4246493ef0534d195ad9e8dbe8bf8e076ea08686429605e41265925a1a06b66a", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0028-r0-random-insert-sorted-current.log": "33dd3f1708384a91ac43258d4e0ef2c09a0214a1eebf7996bff2556e769a23f8", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0028-r0-random-insert-sorted-current.stat": "e27ef50d7763969cc6d8229f944b9fc6ae585703ccaba7cace62a64ce671619c", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0029-r0-random-overwrite-main.log": "484c7a04aff0f05cba4d5440abcd5adeffbb535ffaf8ae179f95ff9023f6d034", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0029-r0-random-overwrite-main.stat": "a9f2da6e5721bcd842790225c53b7010c06288a33bf1444227463612ba6335ff", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0030-r0-random-overwrite-current.log": "0f55529921b8666f880740f5390c2928edc5253672ce347c44c78a212ac6e043", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0030-r0-random-overwrite-current.stat": "11371bca3ebbce5063eb06ad94de18892852d00b73ec6efe235b1b777cc9f114", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0031-r0-random-pack-main.log": "df1ada87bb006674c2881f7633d247a38bc1deb515cf514fd1d848a60c92f1d0", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0031-r0-random-pack-main.stat": "25223b63c41e81abecfab6817be03b4190b612605cfce3012292defa7db00f7d", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0032-r0-random-pack-off.log": "cfeaa1b2d921f5b1d611daa27b7c8c9d29daaed56795aacb2fc6af2f8138a869", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0032-r0-random-pack-off.stat": "2fe57383e405d77311f9d9c482750cafa00c311b482ab45d5745502e0bf8cc7e", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0033-r0-random-pack-on.log": "2091cdd25a3068590f6ea848911becc5f20fbad77f3c9645e8855e054098b510", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0033-r0-random-pack-on.stat": "a105c561107f6c2fbbbfc6baf672020b39b01f20fa94413a30b37a968bac0dad", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0034-r0-random-hit-main.log": "73be139a12b70d4965c384c57f9eadcf7eeb1219b9ff5172f8b844d406687075", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0034-r0-random-hit-main.stat": "611d8ad22d2015c3082706407afccea1669d5171272a6eee003946bf3998143f", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0035-r0-random-hit-off.log": "2c4aeb56e2480443ab01d016366bc49a8b649ccf337c6bb40b1be4dee2a411ba", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0035-r0-random-hit-off.stat": "165bab11f535525295b42f27fce3d533cd9fb9c00d4ff2c9212b33ac5283ca1c", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0036-r0-random-hit-on.log": "4fde9b1658031f4930060de7a693a9e9b280927f91ad231c686d6b829c052b7e", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0036-r0-random-hit-on.stat": "26f1cda47980d225f4c10edc31093ca87c75d0a6f3ea856993611cb31ca1e662", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0037-r0-random-miss-main.log": "da867875f01342e88efd7d5becca2539462d93f440ee43aa8c09a0bc3c96a33f", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0037-r0-random-miss-main.stat": "043ba13d2c17a1de8519a452bd612f585fecb67b75b27a6ace60aa43dc1ffff7", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0038-r0-random-miss-off.log": "55be3669988307b25d6d5faa0d25c999011e051867b02b37f36bb1015b6bab66", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0038-r0-random-miss-off.stat": "354930463d123ba4f04a793f47ad4d87d2fd19fb41fcd1a99d0bfee92c475435", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0039-r0-random-miss-on.log": "0a7900d2700242f1368d886bae69596eb8de6ac467c5451f14314b19acf04a29", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0039-r0-random-miss-on.stat": "f303f5a950c5bef54528e83953afbbad279ded4b53394ac8aee47ab5859471d6", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0040-r0-random-scan1-main.log": "d743ccb82f7ebfbb746807fc3ec0c3ed1d90ae8453de9d6591ab0baabd8f6eca", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0040-r0-random-scan1-main.stat": "93f5ce2cb3a34c4da463d03701afcdf46d782c7be20f79f2439591e66ad0af4a", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0041-r0-random-scan1-off.log": "aca0c71fa819744337689a6e8c06f0e335c19c4a321240b2aa4b5e20fcf09c7f", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0041-r0-random-scan1-off.stat": "b12f986e343a4a4aac1d365c6e2ce54b63c4f6c50ee2c2154a98b64185023b28", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0042-r0-random-scan1-on.log": "b2884a73b56b2f524050ca946dc611a1633d3bc71e06042c890fe90271ab3ee2", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0042-r0-random-scan1-on.stat": "691364f63f737821e09da40a49ccbe49fd2395bcea49644e2c9bfc7a0dac649b", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0043-r0-random-scan10000-main.log": "4a33b1db301feb4cc32c9904d435f7e24bb9649887376b59ef59d13d544088e4", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0043-r0-random-scan10000-main.stat": "9483773176cc88ed02b35670c531b9b2335042600e87f23d99ffbbb6a0a94c4f", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0044-r0-random-scan10000-off.log": "51fdb7c6ce6d33ebe6252a5a09709ff8bb340f57348d7b6f6d429e642f7c2dbe", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0044-r0-random-scan10000-off.stat": "fa7b5730d5e6e298ebe659553d793bc0bad79eee67095722f5bfa806933bff05", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0045-r0-random-scan10000-on.log": "16dd53345968c30c90ae0914f3cfe12a1dda73890b705db131bce44c34174c5d", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0045-r0-random-scan10000-on.stat": "26255dc261536fbf23657fe57d9b4731840d2fa0cbbbc77f172d00cc7b9e6cb2", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0046-r0-random-scanfull-main.log": "5618f96fcc6e1a44d089fc4802aeaa5eb001fc7d4c4ca71dee4188f494570cf7", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0046-r0-random-scanfull-main.stat": "e6e38a8f5b0097daf58c84790181c4a44887469ca72992c7bda1a89ae6635376", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0047-r0-random-scanfull-off.log": "4d29286c41dfe74c6fffa1a1aa51b11692e020785d9422f080d99cc9566bbef1", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0047-r0-random-scanfull-off.stat": "1c9b64de941e7f546f9dc2fd7d5c70cdada3a22d2fb1740f75ac94e73cbe13c6", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0048-r0-random-scanfull-on.log": "df788b8db9ed3455d794b9608e030e249d36d3b04021cc3af1aefec9df250d73", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0048-r0-random-scanfull-on.stat": "75ea56ff6168d53a035ed11668198064d9d6fad2dbbb4d42ac3059e361e21613", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0049-r0-nonlexical-insert-random-main.log": "ae02d0606ca28ee776b7c75a8dbb1ff27870cd407799a5cc14bd0629210843f1", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0049-r0-nonlexical-insert-random-main.stat": "5cb3b88fcc282229e6ed69fa3d3d03e14a92d4b76781bd18acc7997731b615b6", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0050-r0-nonlexical-insert-random-current.log": "98ff37b6d30a1c4f36087f719d7a5d4f8e66ef7233266078b538055db8e28984", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0050-r0-nonlexical-insert-random-current.stat": "59233cc00e95df363f4c6930ad56c4d6e60c8cf97c4faadb3d2e166ee46f6241", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0051-r0-nonlexical-insert-sorted-main.log": "e5badfc32949cc260fb496ffe2c598623e12efe648470717d2fe8719cd5da22c", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0051-r0-nonlexical-insert-sorted-main.stat": "9c5774d44bb1704775eec59c987b6918906edc83850a8dba80284ec2c693b9c1", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0052-r0-nonlexical-insert-sorted-current.log": "a92cce42461f6087e092ea714615f558f7822eaed1f5f405cf309202cf92e0cb", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0052-r0-nonlexical-insert-sorted-current.stat": "83e945f0c3d7dcb3d5d8734ff800a90d1a6715915b77e1fcd5f49be9cbb4d1cb", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0053-r0-nonlexical-overwrite-main.log": "ebbdc0cc81938352541b162b59d7106da90279a1b62ecfed986fc81b9e2755b6", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0053-r0-nonlexical-overwrite-main.stat": "d0c53782ab60376116c468d79c8fe05bb4672b1cb8db15f8c713516ea98ed610", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0054-r0-nonlexical-overwrite-current.log": "184985a279bbd1f88c90b6f6cc8063145c5c4d681dbf45b03cba3235e4e03e00", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0054-r0-nonlexical-overwrite-current.stat": "4a54e32bb4ba4926f56ec318bc648764e82e1126891b563e9d100a49d27725c4", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0055-r0-nonlexical-pack-main.log": "2daddf6e367b8a1c05a0811156d046ff729ffe3d523d106b3cc37c561de29ae4", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0055-r0-nonlexical-pack-main.stat": "4dd592dc82a71dbd3fbcc7f4f3d8c49652c9a3cc3470cc9b1f41138df2afc8d5", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0056-r0-nonlexical-pack-current.log": "a2bcb782ac5b654ccda08206972d51609387d9e2194763975eb4f2e1c6dc47d3", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0056-r0-nonlexical-pack-current.stat": "a4d1be2f2450dff88736380ce75c722afc480633d56ed35272b96fe430f881f4", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0057-r0-nonlexical-hit-main.log": "631154579bebbdf1c60186370dae4c472a4e0f86563d7daf1eefd3702ba21711", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0057-r0-nonlexical-hit-main.stat": "bd4d3343c38517e34f6536aeaf5eee7bf35eca430843d603c5d59db8ff016be1", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0058-r0-nonlexical-hit-current.log": "69a834de9a207264ed92daa9b715944672f6ab3261b63c47824883e3661e077d", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0058-r0-nonlexical-hit-current.stat": "d4057d089a2929de50a6236995bd0a8b2171bb2ed3fe3a9aa70da3e2dc88dba7", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0059-r0-nonlexical-miss-main.log": "7a20bcf4d178929e525c65348c03cc3b02104e6754ce521f3e3e68440780d397", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0059-r0-nonlexical-miss-main.stat": "3faeee0266871c37a7514f071a637ab0ee5efe6658128fcec62dcc3e2085bd3f", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0060-r0-nonlexical-miss-current.log": "0329ab1e921cfad4fe756d4bd0d7ae0e2a4d6ec7afdb1d3feb420fa037907792", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0060-r0-nonlexical-miss-current.stat": "a3ee161bdd9a52a75adbf07247541107ee2248efe7edd5b6e8cca8eadd949136", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0061-r0-nonlexical-scan1-main.log": "5bc40fba47c6fcdb54bb78b50f942de68ed04bab12e7f3645b91c7631228cbf5", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0061-r0-nonlexical-scan1-main.stat": "5347e02d78135cf7dee19adc2e2773fc6b7ea8f0893928b7d1129df42db94d62", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0062-r0-nonlexical-scan1-current.log": "f3c0bb1cd97b48c1b01f71021cea3ce6b848da5a3433feddc2f3ffa7eeef0123", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0062-r0-nonlexical-scan1-current.stat": "a6e664bab2575502cdc593030948598ec4949759ae178edb39288cac4e1a6a4c", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0063-r0-nonlexical-scan10000-main.log": "a093b88d35ed4010a97f6615bbb6d767a0532591fc910a99209db996b38cde84", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0063-r0-nonlexical-scan10000-main.stat": "cec03d40e9169ad0f7a91003d5f5ed4a6ec1f4950e28dd0cc97d77b73079e3a9", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0064-r0-nonlexical-scan10000-current.log": "8813519e1f0492fdd5f0ab8b2e78e0eff1b9cc8639396d7a5e5152f40d3f6fcd", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0064-r0-nonlexical-scan10000-current.stat": "a2ff751dcf9c95b0234bebf018879c7b084afa5782c0f16a56b61513bc3ffdd4", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0065-r0-nonlexical-scanfull-main.log": "bb010f476c286c4621f0e4148555d210d49f271cb280661e212677c3ca374456", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0065-r0-nonlexical-scanfull-main.stat": "05711af3c21270c63c90304bbb8abf268bb8303abb5bd0c65f6c2060ecb4bc04", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0066-r0-nonlexical-scanfull-current.log": "78400f493277070dc3842915aaaa718379a9ef69bf6c5402a5c7bd401796c9ab", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0066-r0-nonlexical-scanfull-current.stat": "529e79a3757a63f0083d20acef733b17724f74e4812a64593944749f82619bed", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0067-r0-common-insert-on-on.log": "68b6d27e4cbe5211801b6d90e2383b65a687749ede2e8ff84afd510fe311f26c", + "benchmarks/results-20261015/btree-prefix/smoke-perf/0067-r0-common-insert-on-on.stat": "29e033cebdfb1b64c8d5b7d5cef01184280e8bd8d5d52bc6d5e8968b785c2208", + "benchmarks/results-20261015/btree-prefix/smoke-perf/build.json": "ee8996799e96284e5343a942b83c8f29433109b34d62dd31d7cb115a4e0353dd", + "benchmarks/results-20261015/btree-prefix/smoke-perf/manifest.json": "cba8682e7668ebc62e2229c7053c470466076daa2c1a29acc7a5dc68b8c88523", + "benchmarks/results-20261015/btree-prefix/smoke-perf/plan.json": "3433e161f17f4724dbcb21c986f16e5b8c2491234aabb532918c32b131189a1e", + "benchmarks/results-20261015/btree-prefix/smoke-perf/runner.py": "4d6f3ad634afc1a1035ed3b77ca73fa5a304e4fc69a287bb7d2b47347617e3c1", + "benchmarks/results-20261015/btree-prefix/smoke-perf/summary.json": "672c115162d094314dd4453631003917b076e6baeaf15d40069232a0e3ee0ee9", + "benchmarks/results-20261015/btree-prefix/smoke-plan.json": "3433e161f17f4724dbcb21c986f16e5b8c2491234aabb532918c32b131189a1e", + "benchmarks/results-20261015/btree-prefix/smoke/0001-r0-common-insert-random-main.log": "ec29b79581628e7eeb0ae2e2be9e73406ea1395442a1d13a2999fd687bb58c9b", + "benchmarks/results-20261015/btree-prefix/smoke/0001-r0-common-insert-random-main.stat": "177f837237c6fff6217df266ac3a2294a2c8ef19ac0f9777a206c69a147647cc", + "benchmarks/results-20261015/btree-prefix/smoke/build.json": "40fb32ee7423ea6de8ac24bc6209bac3ff78642575fabdc62da4085162e5c737", + "benchmarks/results-20261015/btree-prefix/smoke/manifest.json": "578821a740eb160a2c2f581289c701a53b7af25a4f2369c69aebc6b8abd6781b", + "benchmarks/results-20261015/btree-prefix/smoke/plan.json": "3433e161f17f4724dbcb21c986f16e5b8c2491234aabb532918c32b131189a1e", + "benchmarks/results-20261015/btree-prefix/smoke/runner.py": "4d6f3ad634afc1a1035ed3b77ca73fa5a304e4fc69a287bb7d2b47347617e3c1", + "benchmarks/results-20261015/btree-prefix/supplemental-plan.json": "aa35fa827ca07309c13bd0ac5e907eaa588c7466c4bbae4a8638dc689e949737", + "benchmarks/results-20261015/btree-prefix/supplemental/0001-r0-common-hit-callback.log": "3ee31aa0252e48eeeccac5e9bd2d24373debc4a73533894711e67c8c6844d9c0", + "benchmarks/results-20261015/btree-prefix/supplemental/0001-r0-common-hit-callback.stat": "8eb9c26c0797af66b178dac90f3ab8838f53eb83869595389bfcdba4ba88b90d", + "benchmarks/results-20261015/btree-prefix/supplemental/0002-r0-common-hit-on.log": "19dfd1e6bad85379387144925a4605480a2569dd4ef3df3bb511eefc57bd3a7f", + "benchmarks/results-20261015/btree-prefix/supplemental/0002-r0-common-hit-on.stat": "f64347c0e22efc9798923bd26fb3485a128fd73b272754c033a0dad668b2d285", + "benchmarks/results-20261015/btree-prefix/supplemental/0003-r0-common-miss-callback.log": "69696944601525aced0f57cb21d6c9539a4cc7172aa5255ac1aaf394ea06f477", + "benchmarks/results-20261015/btree-prefix/supplemental/0003-r0-common-miss-callback.stat": "1b4537003b338b2fc361e38933d00841fc650852747c3c8a7052930d0c4f4750", + "benchmarks/results-20261015/btree-prefix/supplemental/0004-r0-common-miss-on.log": "71259cf21dd659bde57146441798c5b1edcdc2ea88b73f7745a0a397954223d1", + "benchmarks/results-20261015/btree-prefix/supplemental/0004-r0-common-miss-on.stat": "28176a2a7e13ec6fe91f749776dcfd45fd39db9a3e8bf16f32aa044bc1052322", + "benchmarks/results-20261015/btree-prefix/supplemental/0005-r0-common-scan1-callback.log": "bfbb465b651c6024819595d74715efe4bad9c93c4224c1d51d49d9e8dd26df7b", + "benchmarks/results-20261015/btree-prefix/supplemental/0005-r0-common-scan1-callback.stat": "1c5ac97f26dc51625cf13c3866a81884c8ec1150883fb3c2d623fc01b0b212a3", + "benchmarks/results-20261015/btree-prefix/supplemental/0006-r0-common-scan1-on.log": "167ac70a7171e4226f5212e85ae67a027e82f307b66ed632ccf3078e9e35e760", + "benchmarks/results-20261015/btree-prefix/supplemental/0006-r0-common-scan1-on.stat": "b2e20da36f364d260669ad6dbeeeb88f28055c55159c2cb2ed88a8672fac0cda", + "benchmarks/results-20261015/btree-prefix/supplemental/0007-r0-common-scan10000-callback.log": "bd3814f9854e4389b60453b5bbfb7d206834b851995c782a2857b9782c1eac31", + "benchmarks/results-20261015/btree-prefix/supplemental/0007-r0-common-scan10000-callback.stat": "cb8a679cc499ed9d2bff0a962a882f8adb6e2c7767fac7b2721dffca97860dcd", + "benchmarks/results-20261015/btree-prefix/supplemental/0008-r0-common-scan10000-on.log": "dce7e1bbdb4b5e50eccaad0dcd32011c41ad49588610073c565d7c402475655c", + "benchmarks/results-20261015/btree-prefix/supplemental/0008-r0-common-scan10000-on.stat": "5ea3c5b1083a0af144e1f643c27e356f211603ce2efd907f359dee8fbcfbadd6", + "benchmarks/results-20261015/btree-prefix/supplemental/0009-r0-common-scanfull-callback.log": "03b8ec54f400d9cc5cbb7bc3ecb3a34d78d7ba8980789cc59639bbfad0bc3d74", + "benchmarks/results-20261015/btree-prefix/supplemental/0009-r0-common-scanfull-callback.stat": "1423e3921d242da8ad7a6836d33045f26b9ff882e42b8651bde89a8b0cdb0d9d", + "benchmarks/results-20261015/btree-prefix/supplemental/0010-r0-common-scanfull-on.log": "99c278a1cfb0936d29a62b9917a6890aba80788f7f7a8ed0352d55de1cd2895e", + "benchmarks/results-20261015/btree-prefix/supplemental/0010-r0-common-scanfull-on.stat": "c2ff5e04e15673fa45e4cd0fee868a1fe9b9fe3247ae166bd2c8640300b10cb8", + "benchmarks/results-20261015/btree-prefix/supplemental/0011-r0-random-hit-callback.log": "6aff850db090141f04cdbedbeaf93ff0716fec588dc88af8f4d8de4ae06ea2dd", + "benchmarks/results-20261015/btree-prefix/supplemental/0011-r0-random-hit-callback.stat": "c4e0b086736eaa76df01f0a9246fb0a92091c8c375413241b422674efcd02e57", + "benchmarks/results-20261015/btree-prefix/supplemental/0012-r0-random-hit-on.log": "faede7f79c7a35d61d7c64928cd09c35bb9e97e811b7cd0db71f84e2f86936ba", + "benchmarks/results-20261015/btree-prefix/supplemental/0012-r0-random-hit-on.stat": "7a21aa309fc28dea15a4ec116645bd89566279f54387f39c26d27b90f05a30ab", + "benchmarks/results-20261015/btree-prefix/supplemental/0013-r0-random-miss-callback.log": "a62b2a575c0cdd9f41559bee9399c18a3a51f4037886e5b50f2c57469a983dec", + "benchmarks/results-20261015/btree-prefix/supplemental/0013-r0-random-miss-callback.stat": "f2d53809e6e982b875fe31c1100bfaffa88557eafa57cf7d376dec113c827c28", + "benchmarks/results-20261015/btree-prefix/supplemental/0014-r0-random-miss-on.log": "48a5b5487e8526e897a668261c54274ffbbfb0c7776c0dfb3f64cc49b74fd193", + "benchmarks/results-20261015/btree-prefix/supplemental/0014-r0-random-miss-on.stat": "f42aea999da083d625266524e5a57d9db2b309b340ec13b88e2a849f99001fba", + "benchmarks/results-20261015/btree-prefix/supplemental/0015-r0-random-scan1-callback.log": "e77ff43d2c9adeac4ac44fa03a57234cf5913ada5266d810e7e49db60ebbdd45", + "benchmarks/results-20261015/btree-prefix/supplemental/0015-r0-random-scan1-callback.stat": "4d8933b0f9c7db85dba29118d9bf1e93ce71a46f075defc9b3a4e0304c642a2a", + "benchmarks/results-20261015/btree-prefix/supplemental/0016-r0-random-scan1-on.log": "8f133f276a2e12003c2ba8ce8f1b5f98b234a6a97e952558b250e36f61b19409", + "benchmarks/results-20261015/btree-prefix/supplemental/0016-r0-random-scan1-on.stat": "0f704110b30feed933156228005f66fdb7b15535b27b0d0000fab47372175ad1", + "benchmarks/results-20261015/btree-prefix/supplemental/0017-r0-random-scan10000-callback.log": "b4dbce455012b4f6a8d2a547a5c78d36feb050d3456350594557c4e39da6f342", + "benchmarks/results-20261015/btree-prefix/supplemental/0017-r0-random-scan10000-callback.stat": "8bb122e5ad13aa920da0426c7822c97f556a23dcff10eadeca93d72e0365fe97", + "benchmarks/results-20261015/btree-prefix/supplemental/0018-r0-random-scan10000-on.log": "b359521542cbd9976d682af1f264c281e4bdd51bef121111d5d35a4442ba182f", + "benchmarks/results-20261015/btree-prefix/supplemental/0018-r0-random-scan10000-on.stat": "1f8df8ec3bd1211d77e939adce855036ad0892fda2b6c57e257f052fecef3569", + "benchmarks/results-20261015/btree-prefix/supplemental/0019-r0-random-scanfull-callback.log": "00d5f692c69dd77d60908aedd5833daa8d4c30b06a6b9776178d64e272a0f360", + "benchmarks/results-20261015/btree-prefix/supplemental/0019-r0-random-scanfull-callback.stat": "55c9d12ce67b3b1a72a64aa019a8ec3552960f32b63162e16ba3490c7f5b706a", + "benchmarks/results-20261015/btree-prefix/supplemental/0020-r0-random-scanfull-on.log": "2583bb7df05e7d75e42afdad7834f483bc18b15a73d787046d2572e8822cd7c4", + "benchmarks/results-20261015/btree-prefix/supplemental/0020-r0-random-scanfull-on.stat": "6db90cc36a9f848e48e93d7550dd77817962ba0aee3e93be51b82a8276cb44d3", + "benchmarks/results-20261015/btree-prefix/supplemental/0021-r1-common-miss-on.log": "d2a552633ec809059595b9ebae323a95f978c8264500cedd9348efb18fa503da", + "benchmarks/results-20261015/btree-prefix/supplemental/0021-r1-common-miss-on.stat": "69c38462130c0e0ed487620c8851536ac548f8c76180b686d3ff0312c93284d2", + "benchmarks/results-20261015/btree-prefix/supplemental/0022-r1-common-miss-callback.log": "409e6aacbe5cc646d99f715d1c2deb76fb28cf078cb1b2050a62dc623e709370", + "benchmarks/results-20261015/btree-prefix/supplemental/0022-r1-common-miss-callback.stat": "e58452d0f2683965b5d6618a6631142a373149bf21f968493922b3de70e91035", + "benchmarks/results-20261015/btree-prefix/supplemental/0023-r1-common-scan1-on.log": "cd1ca9edca1de2c5be446e67cc960fa9f43c42ca57b618bbc9ccda8adf105cd8", + "benchmarks/results-20261015/btree-prefix/supplemental/0023-r1-common-scan1-on.stat": "fed2c868b88543281b632ce707247442cb51d724bb7ca06e482d28f0bfde74ee", + "benchmarks/results-20261015/btree-prefix/supplemental/0024-r1-common-scan1-callback.log": "fc3a5241669d9013dcc39fac259ace387856e7aabdab5be0f6796dfcd8cbb06b", + "benchmarks/results-20261015/btree-prefix/supplemental/0024-r1-common-scan1-callback.stat": "05151f820afee45bba20d935cae2fb2f7cbcfde86f93db49b55b8f5c4ba92258", + "benchmarks/results-20261015/btree-prefix/supplemental/0025-r1-common-scan10000-on.log": "33709ac64be245e2119695aa9fd6a87b36b252942cbc89832cf574c5df5bbda4", + "benchmarks/results-20261015/btree-prefix/supplemental/0025-r1-common-scan10000-on.stat": "e44b3018d751084212e2ff9c5cc120ae7f8ccbb65ed2f991992430a796aa59c0", + "benchmarks/results-20261015/btree-prefix/supplemental/0026-r1-common-scan10000-callback.log": "a0a106f0734a4686a22d671d9253c0fd5350d4d5b8b8773ca5785c2d2da04e1e", + "benchmarks/results-20261015/btree-prefix/supplemental/0026-r1-common-scan10000-callback.stat": "82d19a0f6a787e207a8174c555a90e52b072cd9b4a98e071552008b8d050c9bd", + "benchmarks/results-20261015/btree-prefix/supplemental/0027-r1-common-scanfull-on.log": "89d27bacc7abc422cf68491d1f4df724f0884cd172a7edfe0e1171400d3667e0", + "benchmarks/results-20261015/btree-prefix/supplemental/0027-r1-common-scanfull-on.stat": "4a5949fa5dede53bfd26b6ce07d3ddc0cde837e7a0933441dc2ac19cbe645fd0", + "benchmarks/results-20261015/btree-prefix/supplemental/0028-r1-common-scanfull-callback.log": "d3c04a357478025d2de91e21b4a80567f5751201794eea6a97f9ad213a8cea05", + "benchmarks/results-20261015/btree-prefix/supplemental/0028-r1-common-scanfull-callback.stat": "149d6476393d4b36413425f731d41a02469b206869740b52dbc77baeaa81ca6f", + "benchmarks/results-20261015/btree-prefix/supplemental/0029-r1-random-hit-on.log": "6c5ef52d35f998ffc9adb9631527af9a1632c1815e6e4582d42ba0542be1a785", + "benchmarks/results-20261015/btree-prefix/supplemental/0029-r1-random-hit-on.stat": "23ff6e7fa604bcf3131fe8b83652ba2c2387e82dd4cbc9843abb4586fd95547a", + "benchmarks/results-20261015/btree-prefix/supplemental/0030-r1-random-hit-callback.log": "bb1d7d182584708dd48fb8809d56a34b2c2a6c2829888aeab2ea5e1fd8b8c8d1", + "benchmarks/results-20261015/btree-prefix/supplemental/0030-r1-random-hit-callback.stat": "8c2c9defff253f7b08adf328ddee00043678a194397fba45886f3f986cfeeb5b", + "benchmarks/results-20261015/btree-prefix/supplemental/0031-r1-random-miss-on.log": "64c59e0b009561655b0ce69e175c16e3d225fe6f709c6f8bf36746313b8ed5d0", + "benchmarks/results-20261015/btree-prefix/supplemental/0031-r1-random-miss-on.stat": "7563f5cb6665b24256f45193bdd6b42bb51bdb8560369b88cc33a07da9fbaea9", + "benchmarks/results-20261015/btree-prefix/supplemental/0032-r1-random-miss-callback.log": "6455444c845bf4bef248777408e00c08cea3661ddbb66994b0af0234ae432078", + "benchmarks/results-20261015/btree-prefix/supplemental/0032-r1-random-miss-callback.stat": "4d6ea15e46a6bb521d0c3b163cfd07999c045c65e953977fa5eb7819db858ddb", + "benchmarks/results-20261015/btree-prefix/supplemental/0033-r1-random-scan1-on.log": "9f44ac1aa868ea982594ac0d38977c46ea0e3c88d78e694de1dbf8855d013891", + "benchmarks/results-20261015/btree-prefix/supplemental/0033-r1-random-scan1-on.stat": "88ecc19605fbb30688849c7e1277efe7e909f115b24d4aeea17defb323a8f8d4", + "benchmarks/results-20261015/btree-prefix/supplemental/0034-r1-random-scan1-callback.log": "a2ed79040dc434f624f613b10529264c064db2498ad91e9df05abf7cfb56b28b", + "benchmarks/results-20261015/btree-prefix/supplemental/0034-r1-random-scan1-callback.stat": "45d17714112ef779b32ed44cbe0f37bda2cb5706406834402b163ac43f96b43b", + "benchmarks/results-20261015/btree-prefix/supplemental/0035-r1-random-scan10000-on.log": "d8b4abbf07eee98b0d6b89021b451268c5136ee78306c3a79ef080d3ccd3e40f", + "benchmarks/results-20261015/btree-prefix/supplemental/0035-r1-random-scan10000-on.stat": "a39bb019ca325e21f14de134bc3e6a99d230621a0417bba9d43512b6d28a40b9", + "benchmarks/results-20261015/btree-prefix/supplemental/0036-r1-random-scan10000-callback.log": "a564be52cafd4aa5dab7d682cfceee1964ec89af326b35879d8a97a2313d6be1", + "benchmarks/results-20261015/btree-prefix/supplemental/0036-r1-random-scan10000-callback.stat": "ae8f52d101423794788d2a44aa85e41861adddc28ab6d135173dc071eeb51f72", + "benchmarks/results-20261015/btree-prefix/supplemental/0037-r1-random-scanfull-on.log": "915128639a11587ef2d97393778b3ef7d6091d28a9522468b6f6434867b10c15", + "benchmarks/results-20261015/btree-prefix/supplemental/0037-r1-random-scanfull-on.stat": "700f52313e42d6c916d531fc24ac3ddb371d381cb6153f258a852aca945b9f43", + "benchmarks/results-20261015/btree-prefix/supplemental/0038-r1-random-scanfull-callback.log": "e2456094a871e13c319c5fdc04d4f07efe1ba7778ae417ca65c628a355f46146", + "benchmarks/results-20261015/btree-prefix/supplemental/0038-r1-random-scanfull-callback.stat": "54c8c1273918bc6a9908ee2d2343b80fa33c2ccd547464c61a702619db511d39", + "benchmarks/results-20261015/btree-prefix/supplemental/0039-r1-common-hit-on.log": "af930d37cdb13ea7428fc079574200dacbe0567387a27810cf03513f3da92ca1", + "benchmarks/results-20261015/btree-prefix/supplemental/0039-r1-common-hit-on.stat": "d54be434edef4d008130d806e0bcf570ca4f8087462b3791ab31d52241c8ff16", + "benchmarks/results-20261015/btree-prefix/supplemental/0040-r1-common-hit-callback.log": "bcd2ef42e3adc6652d78fa32b25ebd1203e3546ed350598d815104ad3827c026", + "benchmarks/results-20261015/btree-prefix/supplemental/0040-r1-common-hit-callback.stat": "b783726302379e84c798f6dde63ba2cd7b5a5cffe43ee17bd99a532efcf10d15", + "benchmarks/results-20261015/btree-prefix/supplemental/0041-r2-common-scan1-callback.log": "8e5fb8400b5b542fe5344570ccd90f1e47c48b0161d2484547311ea4af2be8bf", + "benchmarks/results-20261015/btree-prefix/supplemental/0041-r2-common-scan1-callback.stat": "df727320562b30ed4fdb34404d0255c2c9c733d77e83d70a8d950f56cdab5e41", + "benchmarks/results-20261015/btree-prefix/supplemental/0042-r2-common-scan1-on.log": "ce30c2ca8831a7dab8c6dfdf03f5117026fbad7db7516c7f63a1a5e7368acc3b", + "benchmarks/results-20261015/btree-prefix/supplemental/0042-r2-common-scan1-on.stat": "95fb63695cc03046e257998cf4867cafa59da41daf509b07e3624d014f84cd50", + "benchmarks/results-20261015/btree-prefix/supplemental/0043-r2-common-scan10000-callback.log": "79bbb19e44ff51b43535fed817b05aaacb4a49546f94a39c533e6e0544fe2fa6", + "benchmarks/results-20261015/btree-prefix/supplemental/0043-r2-common-scan10000-callback.stat": "f766dc6575d2faabf4dcda9cc9ef998b1227121d01cd74fc633ff1f56daf90cb", + "benchmarks/results-20261015/btree-prefix/supplemental/0044-r2-common-scan10000-on.log": "ce0f1df1dd661847fc9f5965bcdc4f89bb96d13c130b475b4bc16d685acab538", + "benchmarks/results-20261015/btree-prefix/supplemental/0044-r2-common-scan10000-on.stat": "dc922aad126b74cc74af8198d23a1554e0e94dbbbf3b723c932a594920db1dd3", + "benchmarks/results-20261015/btree-prefix/supplemental/0045-r2-common-scanfull-callback.log": "8f1b53fe328cf9677be0eea8f5a77edce18d740fd7c3357889ca28791230a3bc", + "benchmarks/results-20261015/btree-prefix/supplemental/0045-r2-common-scanfull-callback.stat": "3e67ea6a33e3a0cfaa9a6fd7263635c53099e6301d2d3cbf45c56cd22355167a", + "benchmarks/results-20261015/btree-prefix/supplemental/0046-r2-common-scanfull-on.log": "c16717db9e2f73ae6c0ddcec08a0b2c74f11599a49033ffab54442dc91454070", + "benchmarks/results-20261015/btree-prefix/supplemental/0046-r2-common-scanfull-on.stat": "d01aaa847c4865556a5f477dcc283b4f3db731b6e7c5a7fd24d1a1d244218bd2", + "benchmarks/results-20261015/btree-prefix/supplemental/0047-r2-random-hit-callback.log": "03d154415ed9f3ef87c5f52f7c7c3eb4e8dfc277dd5835811929b0ee30683104", + "benchmarks/results-20261015/btree-prefix/supplemental/0047-r2-random-hit-callback.stat": "5600089b1861e2f0488bf1b3ede37bd3784727d80ed8efff53fd7f3655fef1d8", + "benchmarks/results-20261015/btree-prefix/supplemental/0048-r2-random-hit-on.log": "13cddcd2d108aff82b346e0b004780d2cdf80239ac9b35b107b336a254422905", + "benchmarks/results-20261015/btree-prefix/supplemental/0048-r2-random-hit-on.stat": "6083c3c0e6e090486074736bb856e91e1ebdd1c7379d3f5d8cfa9400009f008d", + "benchmarks/results-20261015/btree-prefix/supplemental/0049-r2-random-miss-callback.log": "0cdf8ba28b5bf2297bde5116c51fe780aaff16bf0cf5e4fc10f20cabf41009a9", + "benchmarks/results-20261015/btree-prefix/supplemental/0049-r2-random-miss-callback.stat": "651bc654490991b10016e478f6a3bb4430cbfd8e3ba1fd4ec48f3861e349e2e4", + "benchmarks/results-20261015/btree-prefix/supplemental/0050-r2-random-miss-on.log": "4ef39dae52ef8717bfe91ccabf4cb6238cd33615e3215e1b0693044bcb89f345", + "benchmarks/results-20261015/btree-prefix/supplemental/0050-r2-random-miss-on.stat": "66463f541805b7f98f93a625d5639369a09dccccc95198c38ec575b00578bd61", + "benchmarks/results-20261015/btree-prefix/supplemental/0051-r2-random-scan1-callback.log": "33f8b927f0ac58a1aae6fdb7052ee68bf8a2e6c554bc08b923841a69d889d3f9", + "benchmarks/results-20261015/btree-prefix/supplemental/0051-r2-random-scan1-callback.stat": "fcbaf4db04cd201d98d398a393837df92a0afe4264fe71e404c22b3ab3bdfab2", + "benchmarks/results-20261015/btree-prefix/supplemental/0052-r2-random-scan1-on.log": "b519e5d8daf5a0399c65e24b0a0ee36e8968d2a5aac05881429ac164259b46d3", + "benchmarks/results-20261015/btree-prefix/supplemental/0052-r2-random-scan1-on.stat": "727c5fe1539f9347a78ad720f5a688e222f1266ce459280fbd34d54d7efc4a8f", + "benchmarks/results-20261015/btree-prefix/supplemental/0053-r2-random-scan10000-callback.log": "ce037169dbc40cd4d6c0e4ea8cbcd5f1ae2b27ee188b98bd36c61878e7491f0d", + "benchmarks/results-20261015/btree-prefix/supplemental/0053-r2-random-scan10000-callback.stat": "e9c433b2374020287fd333f6fcba604f575cde25d739beb78aa32f5831653bcd", + "benchmarks/results-20261015/btree-prefix/supplemental/0054-r2-random-scan10000-on.log": "73ce461fc78467bff13c13f32f7811d829ea93a5e8be50d56a12999b93673669", + "benchmarks/results-20261015/btree-prefix/supplemental/0054-r2-random-scan10000-on.stat": "b3653789c38c02981bbfaf05e9c11e9d4e721c25bc25a872818580cd23d7b919", + "benchmarks/results-20261015/btree-prefix/supplemental/0055-r2-random-scanfull-callback.log": "aeaeff5e3e887733c635a0179f24472335c210a376d428662b1f608c55dca46d", + "benchmarks/results-20261015/btree-prefix/supplemental/0055-r2-random-scanfull-callback.stat": "ef26f71e7929cab3c796b2ea05d6f220715eba74992c9f941e0383394f93211c", + "benchmarks/results-20261015/btree-prefix/supplemental/0056-r2-random-scanfull-on.log": "7c0e765bd95916ffb19910495245c3f9c922c2db97a0c3eabcafe677f1e0f5ec", + "benchmarks/results-20261015/btree-prefix/supplemental/0056-r2-random-scanfull-on.stat": "a60349b2c43538ee00dfd67af5c26d78730c665895f3cd59bc98557d80e7b242", + "benchmarks/results-20261015/btree-prefix/supplemental/0057-r2-common-hit-callback.log": "5d4c89bad2a99526ade5e54b392a1f22475a94788645479ac9bba1171b2fb382", + "benchmarks/results-20261015/btree-prefix/supplemental/0057-r2-common-hit-callback.stat": "de65b5840d962191d84eb27d5ba5a212907020d14174d0395c1194ebcf017bde", + "benchmarks/results-20261015/btree-prefix/supplemental/0058-r2-common-hit-on.log": "1d9ca7756b01ef1b9b9c2b214f048f885919699e6ba4a091fd04bfe7b67430fe", + "benchmarks/results-20261015/btree-prefix/supplemental/0058-r2-common-hit-on.stat": "4377e0906ee42b91db91760c7c77a1410cb9c2b68093e388a30c7c942970f057", + "benchmarks/results-20261015/btree-prefix/supplemental/0059-r2-common-miss-callback.log": "e0d66ee96f8beb332c2b26be3fb196a4355dea75a0bb97dec6622a5760cc48e2", + "benchmarks/results-20261015/btree-prefix/supplemental/0059-r2-common-miss-callback.stat": "8108cbdf53f9aae9cb0847c26b5bfd276f54b8a80b2daff6f67a98fff477593c", + "benchmarks/results-20261015/btree-prefix/supplemental/0060-r2-common-miss-on.log": "0ab0a520a17a65fb37ecd8f4074c53c9d495c1f044cd92a97d6f87516d19c2de", + "benchmarks/results-20261015/btree-prefix/supplemental/0060-r2-common-miss-on.stat": "7ca87f8e2ad0f38fab16dfd03fce8ff20f767f5b8da69d484ad3bec375d636da", + "benchmarks/results-20261015/btree-prefix/supplemental/0061-r3-common-scan10000-on.log": "504a6262014f740f2534fec9d1d538ed0fdfae85aa4857a0cc254ef4003c089c", + "benchmarks/results-20261015/btree-prefix/supplemental/0061-r3-common-scan10000-on.stat": "410ece45c9754265b7af364477d1c091057707fc76fa96fe061476015c1e8337", + "benchmarks/results-20261015/btree-prefix/supplemental/0062-r3-common-scan10000-callback.log": "32c2ede64162337013fd0b92d2698b7f492be5da014cf14b7d800fee035ee3ec", + "benchmarks/results-20261015/btree-prefix/supplemental/0062-r3-common-scan10000-callback.stat": "24dd74117f2c6bd1a506389aa3c48e5bda51295ed1d30af51ee0cda67996042b", + "benchmarks/results-20261015/btree-prefix/supplemental/0063-r3-common-scanfull-on.log": "6ca3dad1e199a3fb26d6ea0aaf598311f1229043b00d61aae9815a9c7c940627", + "benchmarks/results-20261015/btree-prefix/supplemental/0063-r3-common-scanfull-on.stat": "531149a73a1dd9f4233a5d8d9e97f0cc006dc5fb57649bb917b5c74b0fc1cbd2", + "benchmarks/results-20261015/btree-prefix/supplemental/0064-r3-common-scanfull-callback.log": "8f0704405692bbb47c4c6f6e510977e1d3f9e898ee5801a3052e652d8dbe1064", + "benchmarks/results-20261015/btree-prefix/supplemental/0064-r3-common-scanfull-callback.stat": "f75ae3e5f73df04c572d3209b9a4ef4a00cee65370f2504d48035988d08179b7", + "benchmarks/results-20261015/btree-prefix/supplemental/0065-r3-random-hit-on.log": "ffd6427618ec0ebb80f7a39b71e161f434748061591b0f516f18a8583108d6ec", + "benchmarks/results-20261015/btree-prefix/supplemental/0065-r3-random-hit-on.stat": "22cae6e80722d35ef0ca153c69424b65b8c6fa232d5261852fb394f244b3ac14", + "benchmarks/results-20261015/btree-prefix/supplemental/0066-r3-random-hit-callback.log": "315844308cc6fb42431d86b9d7dff01f4f61b2fe03cfbc31b1a23cfc6d9c004c", + "benchmarks/results-20261015/btree-prefix/supplemental/0066-r3-random-hit-callback.stat": "c95c06240e4b51685100ad73cf70df8acac980e60c3f123a7f418ac49c7448a2", + "benchmarks/results-20261015/btree-prefix/supplemental/0067-r3-random-miss-on.log": "688faf0147122f2ee84896c73f50da4d7ab1a417de73c9d5a61035f65401e64b", + "benchmarks/results-20261015/btree-prefix/supplemental/0067-r3-random-miss-on.stat": "84c29d5ffe9ea536e8bf92f0256c11563bf21561ea1f50b86497ac87442fc871", + "benchmarks/results-20261015/btree-prefix/supplemental/0068-r3-random-miss-callback.log": "8d50f33b5dc8021c8bcce284d1a964a384b47e8f5c2a013824489f2af6c3115b", + "benchmarks/results-20261015/btree-prefix/supplemental/0068-r3-random-miss-callback.stat": "305fb3f256e5338ff069fdeed46f1ca660a337914d0198ca03fdd55b1d08de54", + "benchmarks/results-20261015/btree-prefix/supplemental/0069-r3-random-scan1-on.log": "506163c709b37525c0650b610249f36507ef94ada3c7634f68a2af86e9d3d733", + "benchmarks/results-20261015/btree-prefix/supplemental/0069-r3-random-scan1-on.stat": "2aab891b36377664bc3c88bd594606e7971a7681b38915741c387bb84b5191ff", + "benchmarks/results-20261015/btree-prefix/supplemental/0070-r3-random-scan1-callback.log": "9dfddc7cba94e60cb1c18b6926db726543657a061b540b201b8c4d85adae9d1f", + "benchmarks/results-20261015/btree-prefix/supplemental/0070-r3-random-scan1-callback.stat": "29a50e997e73914162ad84be0b899eed5dc3dcc871547a80d3c9ac1c0a57290a", + "benchmarks/results-20261015/btree-prefix/supplemental/0071-r3-random-scan10000-on.log": "cde5e188190dd818e894c75165699d1f578d14158bc911de3aee592376b53c1c", + "benchmarks/results-20261015/btree-prefix/supplemental/0071-r3-random-scan10000-on.stat": "27273a86709ba7712775a83a2d6f51d01c14d1ba768f002a0038e345e1d069b2", + "benchmarks/results-20261015/btree-prefix/supplemental/0072-r3-random-scan10000-callback.log": "36534c65065dd18a9042bfeccef7a744bfb13b228903499d67629d40aa8c8ba9", + "benchmarks/results-20261015/btree-prefix/supplemental/0072-r3-random-scan10000-callback.stat": "4d26a5bd475877e97d3c5e78d2e2b1bcf9738799f4712495e25536aa84879749", + "benchmarks/results-20261015/btree-prefix/supplemental/0073-r3-random-scanfull-on.log": "86be6558615159dd403b176096469b30f0b52ba245b7f8abe36de65a75aa8d53", + "benchmarks/results-20261015/btree-prefix/supplemental/0073-r3-random-scanfull-on.stat": "31f6e8d96afdb8e89e4c36ad641f7aab143bdb2b99830f651a9860c7b7f87264", + "benchmarks/results-20261015/btree-prefix/supplemental/0074-r3-random-scanfull-callback.log": "97af20c37dcce26f649402bfe75fe1010ed8d991f8946c7d471d5508cf62c3e4", + "benchmarks/results-20261015/btree-prefix/supplemental/0074-r3-random-scanfull-callback.stat": "b7a94e27f555871429464f5a43252b3fc05c4d141f8ec6d6a99fa08fc45e3c1f", + "benchmarks/results-20261015/btree-prefix/supplemental/0075-r3-common-hit-on.log": "3237c76e741d559ad91b8316d76174ab51489a5a6d2d783fa35363ea680252e1", + "benchmarks/results-20261015/btree-prefix/supplemental/0075-r3-common-hit-on.stat": "fc5996f1f5dd9e483bd1b5ad4e9440f83eff2f726c9aca7062862c0bb0c27944", + "benchmarks/results-20261015/btree-prefix/supplemental/0076-r3-common-hit-callback.log": "4206266e4ab94e265f4843c8d0b56cd65ed30e1c533e024d42c3b57898831559", + "benchmarks/results-20261015/btree-prefix/supplemental/0076-r3-common-hit-callback.stat": "08373d7fc141ed2f441320be916f6ee659301099de18de629b91e32b4607cf06", + "benchmarks/results-20261015/btree-prefix/supplemental/0077-r3-common-miss-on.log": "bd54d021e997fa180aa80a0d6728aa6c969b659184ead4a75017d0e92c211753", + "benchmarks/results-20261015/btree-prefix/supplemental/0077-r3-common-miss-on.stat": "f5812da71c6cb008d18a42f93426c79d436e9e756ecc3d92b490173ed2559fa8", + "benchmarks/results-20261015/btree-prefix/supplemental/0078-r3-common-miss-callback.log": "e53b0e3452945972bd200e52139fdf038de80bc9f6577e67db8d43f1318fa2dc", + "benchmarks/results-20261015/btree-prefix/supplemental/0078-r3-common-miss-callback.stat": "5b606988ec26e8ac3ed17208798b2dae93bd4ec6008e51435ef50e553708e080", + "benchmarks/results-20261015/btree-prefix/supplemental/0079-r3-common-scan1-on.log": "8efd13a3c426cef78ffe64a27ae9a0e2271825548188dc329e29b283698cb16f", + "benchmarks/results-20261015/btree-prefix/supplemental/0079-r3-common-scan1-on.stat": "9dfcdec65abe29eb44d226d71ce4d0e4ecaf036b79449c06c9b017e5f6b5454e", + "benchmarks/results-20261015/btree-prefix/supplemental/0080-r3-common-scan1-callback.log": "cab4bbce1c5e09fa5054868896cef8e005f81a8f627b2eae09d842b4223a0f04", + "benchmarks/results-20261015/btree-prefix/supplemental/0080-r3-common-scan1-callback.stat": "4862de8180aefee6801432a89515dae68672f22748b6fabac90574373270a7eb", + "benchmarks/results-20261015/btree-prefix/supplemental/0081-r4-common-scanfull-callback.log": "7f5fd60b507a6a6db3f7e7b652a28314cd7fc11099857429a5e2e976f55f8df8", + "benchmarks/results-20261015/btree-prefix/supplemental/0081-r4-common-scanfull-callback.stat": "fde0f2301b2ff2515710bc8096bbfd11df5958fa161f91bcd0c78bd7c345c477", + "benchmarks/results-20261015/btree-prefix/supplemental/0082-r4-common-scanfull-on.log": "700014992b99a6b4f5987a784fdd6d875a2f31e2e0d446516f0dece87e49f988", + "benchmarks/results-20261015/btree-prefix/supplemental/0082-r4-common-scanfull-on.stat": "13c129cc4daed942f5f486a02aeb66568451db410b743684910c41b3e4d0d798", + "benchmarks/results-20261015/btree-prefix/supplemental/0083-r4-random-hit-callback.log": "42ee2916826af291da9bf68d98db865bafd2507737e4aeb7df28bea308c80604", + "benchmarks/results-20261015/btree-prefix/supplemental/0083-r4-random-hit-callback.stat": "7aff932080a3b003d40f0c81e9b276e82f92e3e114d45472e0af064d82daec79", + "benchmarks/results-20261015/btree-prefix/supplemental/0084-r4-random-hit-on.log": "e9dc2085d2e6df6b3db4da2baa0e537a85701913b15e903e2e7c130102b2ed46", + "benchmarks/results-20261015/btree-prefix/supplemental/0084-r4-random-hit-on.stat": "b4f451c769527a2cce52a8f94b629c07754e9619b52187104136005696cd8e23", + "benchmarks/results-20261015/btree-prefix/supplemental/0085-r4-random-miss-callback.log": "2a6ac168b6e82fba2f29217affa90ead954f2ff2981847da5b849ec7a42f24ce", + "benchmarks/results-20261015/btree-prefix/supplemental/0085-r4-random-miss-callback.stat": "7b3450ac8363f0604c008be4ec75946bf7f76cfc38cffa05f5f7657b7f0cb1c7", + "benchmarks/results-20261015/btree-prefix/supplemental/0086-r4-random-miss-on.log": "b994a7665f286769739f164c0737678cd8178ac4b44b3b2e64262dc4487b7bd4", + "benchmarks/results-20261015/btree-prefix/supplemental/0086-r4-random-miss-on.stat": "3ced61c84055652c0b925f77abd17d80c426b4499202b983ad4bb40313435696", + "benchmarks/results-20261015/btree-prefix/supplemental/0087-r4-random-scan1-callback.log": "58a4786b0c798e3c89db61548260e7ba78e4e8c75a4c2d5229ed3cd35ce29f04", + "benchmarks/results-20261015/btree-prefix/supplemental/0087-r4-random-scan1-callback.stat": "4aa8d8b74117ab3dafacc62c999941a26b07857c2ed5a2f97be8c1e8bb72cb10", + "benchmarks/results-20261015/btree-prefix/supplemental/0088-r4-random-scan1-on.log": "dd3c30fcf5b388af0fc7b039315395099f38096249c7552a0448b7a4f12eccc2", + "benchmarks/results-20261015/btree-prefix/supplemental/0088-r4-random-scan1-on.stat": "4709fea590e830648b4e6a75db0cb251439366e60e8fcb41c574f403d3ef0ce5", + "benchmarks/results-20261015/btree-prefix/supplemental/0089-r4-random-scan10000-callback.log": "18f73dfb935931cc10913dfce05fc378685d90b903e6aa251216c28de377d29f", + "benchmarks/results-20261015/btree-prefix/supplemental/0089-r4-random-scan10000-callback.stat": "fe78a43c42f1cbd1ffcae3904524a918d59f9966262d6a5632eebb6a3ea289b6", + "benchmarks/results-20261015/btree-prefix/supplemental/0090-r4-random-scan10000-on.log": "0c0588087185e1e8a357f220440ff184840700255f69ee603b29fba1870c1485", + "benchmarks/results-20261015/btree-prefix/supplemental/0090-r4-random-scan10000-on.stat": "f3857ed9251fa22dd5110fe370e138e1a85d7dc4a3958a7dec180c3da83e8f6f", + "benchmarks/results-20261015/btree-prefix/supplemental/0091-r4-random-scanfull-callback.log": "5dfcfaab4ec0061fa7bf13efe0c8a93e2809a3639c9f851cfbc84441495f70c4", + "benchmarks/results-20261015/btree-prefix/supplemental/0091-r4-random-scanfull-callback.stat": "37878c53725e4498bd6023cc69a992cb6abadd0ac5d496b74fe8935b510124c4", + "benchmarks/results-20261015/btree-prefix/supplemental/0092-r4-random-scanfull-on.log": "b479e2220b88bed3cb3e9e00d5fdb351501563a8e3857e9356f5eb22348d8828", + "benchmarks/results-20261015/btree-prefix/supplemental/0092-r4-random-scanfull-on.stat": "f4452dfbfa719d643307c447b79dc609ebfe43d9d79de90ad6e9e826e6c88592", + "benchmarks/results-20261015/btree-prefix/supplemental/0093-r4-common-hit-callback.log": "2a618f72b3251815fa71e516263322163c2b6e08cbee7e3152f0044509174a63", + "benchmarks/results-20261015/btree-prefix/supplemental/0093-r4-common-hit-callback.stat": "2689a0e1c8734a12c9c8283e4d19db24b1487879ad12a10779c30428e76c7400", + "benchmarks/results-20261015/btree-prefix/supplemental/0094-r4-common-hit-on.log": "77c16ed0776540df18acf1845a2dacab259fdb6b77d3bbaa7658c30a4c9da137", + "benchmarks/results-20261015/btree-prefix/supplemental/0094-r4-common-hit-on.stat": "108aa089500d4b26627fa92faa6262213e317d6373890ab6debb167b34adfa89", + "benchmarks/results-20261015/btree-prefix/supplemental/0095-r4-common-miss-callback.log": "ffc00e7ce621202de6c41b76e1545eef9113bfbac2e5434c78677ec426e55351", + "benchmarks/results-20261015/btree-prefix/supplemental/0095-r4-common-miss-callback.stat": "ee3c824579197fd93e9ec93e8c7ded80724ac146993b67ac0afb231aa0de8368", + "benchmarks/results-20261015/btree-prefix/supplemental/0096-r4-common-miss-on.log": "b6d7f1d314de2caf4cd3fc313bd38a495e9a503285f04363ddd7c70cf57f5c73", + "benchmarks/results-20261015/btree-prefix/supplemental/0096-r4-common-miss-on.stat": "8dc1679620d15d282b252ae44b85278ec942c26d7002d9ae4bbd3b038128f580", + "benchmarks/results-20261015/btree-prefix/supplemental/0097-r4-common-scan1-callback.log": "0184a9334cab266011e23fa3e630e259f750808d2389771edf016105d869dd3d", + "benchmarks/results-20261015/btree-prefix/supplemental/0097-r4-common-scan1-callback.stat": "eef2b4f57d3b59a2dc2361ac830e8bbd65b4e4cb4cb9a02d1e291d6283addf7c", + "benchmarks/results-20261015/btree-prefix/supplemental/0098-r4-common-scan1-on.log": "982bc0575640c2a686572d93e02fd3e1b88ff8c86c2d0a40c147ec9dfb80e36b", + "benchmarks/results-20261015/btree-prefix/supplemental/0098-r4-common-scan1-on.stat": "115f793dc2995c39cb8182f42aa5704d94eee8602da1b0da1a80664fe39c1644", + "benchmarks/results-20261015/btree-prefix/supplemental/0099-r4-common-scan10000-callback.log": "25b128f84ea53cfd21bd7af203486922a53fff3b4eb3229f0c1dd7014165c83f", + "benchmarks/results-20261015/btree-prefix/supplemental/0099-r4-common-scan10000-callback.stat": "b9076549e14693ec70db6d8c2f80dcd2c3712f5f1cd2a0fff84640add08c27c6", + "benchmarks/results-20261015/btree-prefix/supplemental/0100-r4-common-scan10000-on.log": "6f158d34f3eb1c0e4a336c41324534d1dd311547a6aff271bf321db11aeadb05", + "benchmarks/results-20261015/btree-prefix/supplemental/0100-r4-common-scan10000-on.stat": "ca66a182347a082a5d60d313bee4a77f4a58adf6ed76e78e4eb49c1507843b00", + "benchmarks/results-20261015/btree-prefix/supplemental/0101-r5-random-hit-on.log": "ece75eb1e6b6f046fcf8b02cf4037beea0655344f01ab8854b927fead2d6d7b3", + "benchmarks/results-20261015/btree-prefix/supplemental/0101-r5-random-hit-on.stat": "86e82a1b0ee95ebdd67123ceb8e25c146ac7ea9a24b8f68b7bd4c4039e3a05ae", + "benchmarks/results-20261015/btree-prefix/supplemental/0102-r5-random-hit-callback.log": "50f28b5d491af7039d882e9acf8f10a74aa8456c25ce65b116d848bf672a1d05", + "benchmarks/results-20261015/btree-prefix/supplemental/0102-r5-random-hit-callback.stat": "791c6b7f61c68c335fed241d3301fa7adaed1ec33c101f9fa6e8d0600c5cbd85", + "benchmarks/results-20261015/btree-prefix/supplemental/0103-r5-random-miss-on.log": "814c2dd098d9be87193e17d2b19ca2c12790d364e52c6e2d426625ebe66d435f", + "benchmarks/results-20261015/btree-prefix/supplemental/0103-r5-random-miss-on.stat": "85c7e9e1306d42941c2b974277135c3536726f0d3c01af8b5a2ac310b41a6ee6", + "benchmarks/results-20261015/btree-prefix/supplemental/0104-r5-random-miss-callback.log": "464f0d0936bc49f90160a5b5bf077ccfd8420c9b56a7913a87e33381a119b47b", + "benchmarks/results-20261015/btree-prefix/supplemental/0104-r5-random-miss-callback.stat": "e1e1f80a0e2eab244d50721f27aefcb185ec5d00d93115659ae8176a15a3ca9b", + "benchmarks/results-20261015/btree-prefix/supplemental/0105-r5-random-scan1-on.log": "a50127bb44dfb22ebf04e11f5f86f6b31cd5fcd5334ca59d1b125294ddbe2e71", + "benchmarks/results-20261015/btree-prefix/supplemental/0105-r5-random-scan1-on.stat": "050518965a172196f0344828bf41cf1daadd70374aabe7709a18405bd28c3763", + "benchmarks/results-20261015/btree-prefix/supplemental/0106-r5-random-scan1-callback.log": "78b19beb49355e50b1addf8dedaf3ee10a8a383d5c204ec39afd462165192a28", + "benchmarks/results-20261015/btree-prefix/supplemental/0106-r5-random-scan1-callback.stat": "8d10ee419a919d08024ec57564dcec28f80ddd2d135f74704d8f9ab700c894e5", + "benchmarks/results-20261015/btree-prefix/supplemental/0107-r5-random-scan10000-on.log": "7ff1ad18939a3a293516375d94b2494ade2eb67b3cbc591f55e9c65bbbfca4cf", + "benchmarks/results-20261015/btree-prefix/supplemental/0107-r5-random-scan10000-on.stat": "ec5e2d372614de189bcab40458f6b9e461ecb00034b2f2eb1e2743f2c8b32740", + "benchmarks/results-20261015/btree-prefix/supplemental/0108-r5-random-scan10000-callback.log": "4aa2fa9b88c05116b7c28b3eefd6b7f1c3c991f01629b814532e92d6acdcceb9", + "benchmarks/results-20261015/btree-prefix/supplemental/0108-r5-random-scan10000-callback.stat": "150aca988fce8ea987e65511e8231dd0ef6a6d71f9eca69eddd03840d0cbc25b", + "benchmarks/results-20261015/btree-prefix/supplemental/0109-r5-random-scanfull-on.log": "294f191ed18c01a1d511c55d096993956e9b1d4802f179bbb8aa877188b2905f", + "benchmarks/results-20261015/btree-prefix/supplemental/0109-r5-random-scanfull-on.stat": "f348b1d09d377c8317092b423197350de3477f8a47d91b397e28ccd7ed5a558c", + "benchmarks/results-20261015/btree-prefix/supplemental/0110-r5-random-scanfull-callback.log": "d2e393dbc3af449911df00de878d04115d4b7899a2f3d38b3237f31fc9286e63", + "benchmarks/results-20261015/btree-prefix/supplemental/0110-r5-random-scanfull-callback.stat": "577a03cbba39978d841bd721bff1be6863fdecb9b71762af24bad5433b74c9a8", + "benchmarks/results-20261015/btree-prefix/supplemental/0111-r5-common-hit-on.log": "ff76c59ec36c5c2b7d3d68d10f37676b52618269d298dd6132b441365e8ba3db", + "benchmarks/results-20261015/btree-prefix/supplemental/0111-r5-common-hit-on.stat": "d40154751f2ce2cd5a839516c322674de01e756ffa3f729d87640d5de86006d1", + "benchmarks/results-20261015/btree-prefix/supplemental/0112-r5-common-hit-callback.log": "aefd89f6334b8fbc7e87d75102f5d0065d40128f38909e8ba75d6c5db7f8399f", + "benchmarks/results-20261015/btree-prefix/supplemental/0112-r5-common-hit-callback.stat": "be6a41dddb4b143af86a50d1c74d58192cb50557c2b7126037380c199a7dafd6", + "benchmarks/results-20261015/btree-prefix/supplemental/0113-r5-common-miss-on.log": "836058575be7e9c0c6dea3d818145cda773994494c3f22788b2ec9a6c52cf10b", + "benchmarks/results-20261015/btree-prefix/supplemental/0113-r5-common-miss-on.stat": "ad0b6f435b708404275e7685f3aeea6352eb941ef1f04744252e92a394dec8bb", + "benchmarks/results-20261015/btree-prefix/supplemental/0114-r5-common-miss-callback.log": "da5b7dcf5576ae9f0d2b414085438282f7f2a3ab465d79005760a81b1e9870be", + "benchmarks/results-20261015/btree-prefix/supplemental/0114-r5-common-miss-callback.stat": "292db9de5787dde0e1d9facb308d16b3133ce211e8db97c8b03c803262162acc", + "benchmarks/results-20261015/btree-prefix/supplemental/0115-r5-common-scan1-on.log": "a2b37682c282796921988fae6b6f89c42b4d34074ba6aac496155b16ccfe6fc3", + "benchmarks/results-20261015/btree-prefix/supplemental/0115-r5-common-scan1-on.stat": "c9e1e2b01cec78e958fffeab4f4793afb3f29693c20e7dfcc8eb7c875990d7b0", + "benchmarks/results-20261015/btree-prefix/supplemental/0116-r5-common-scan1-callback.log": "d4e3e09e3e2cf8fa34501a401c5f854f9ac72f59fff142c1ee9dbed8d840ef22", + "benchmarks/results-20261015/btree-prefix/supplemental/0116-r5-common-scan1-callback.stat": "7b181ca813ee585b62cb79ba2dd652593eccc9c16b91087355a03666e7c6b6ee", + "benchmarks/results-20261015/btree-prefix/supplemental/0117-r5-common-scan10000-on.log": "c6d267872dd804467ae252cabc8e5bc9dd2be44982f2f24b618a86a86c78f72e", + "benchmarks/results-20261015/btree-prefix/supplemental/0117-r5-common-scan10000-on.stat": "4ca209e9e3e57161cff2a9ed47599951158a003c115c4508140421d0c778c2ee", + "benchmarks/results-20261015/btree-prefix/supplemental/0118-r5-common-scan10000-callback.log": "9a2469b5e50a5dfaa2a7a463002293415e39d4de2e21c3c1116c021094c28b56", + "benchmarks/results-20261015/btree-prefix/supplemental/0118-r5-common-scan10000-callback.stat": "6d9d33c4ea45596c0d2c4888ffb01c5c6b89dd293b75236d6ff3d241953e44f1", + "benchmarks/results-20261015/btree-prefix/supplemental/0119-r5-common-scanfull-on.log": "2d371a4f8ee960c0ab6414cda99120dec128e5facc971bdf6993e242f9f219e2", + "benchmarks/results-20261015/btree-prefix/supplemental/0119-r5-common-scanfull-on.stat": "a11f6944d88a70e220b6326602cbff4c20c89f413047606ddd7b9869f322561c", + "benchmarks/results-20261015/btree-prefix/supplemental/0120-r5-common-scanfull-callback.log": "1681261ce55c2149e2c51754d949e56565a09b7788a04964bad04a2cbfc11f0e", + "benchmarks/results-20261015/btree-prefix/supplemental/0120-r5-common-scanfull-callback.stat": "225043b282cf06933cf9e4c3ef4e2915d14623d29de227527eedd9ccba73e382", + "benchmarks/results-20261015/btree-prefix/supplemental/build.json": "ee8996799e96284e5343a942b83c8f29433109b34d62dd31d7cb115a4e0353dd", + "benchmarks/results-20261015/btree-prefix/supplemental/manifest.json": "9cdfcfd1379425f9c3ddbccb3055105a7963074cb5a386cfd06c78dfb2b27852", + "benchmarks/results-20261015/btree-prefix/supplemental/plan.json": "aa35fa827ca07309c13bd0ac5e907eaa588c7466c4bbae4a8638dc689e949737", + "benchmarks/results-20261015/btree-prefix/supplemental/runner.py": "4d6f3ad634afc1a1035ed3b77ca73fa5a304e4fc69a287bb7d2b47347617e3c1", + "benchmarks/results-20261015/btree-prefix/supplemental/summary.json": "7bb27c251b833fda225005f83464b3583e5f2e11080a8ef8c4e0c563058a2a84", + "benchmarks/results-20261016/btree-nonlexical/README.md": "fde7781fe6fc3c4f45ee517adc26aa3a9e69e95efcf89b065ec310a8bbc1221b", + "benchmarks/results-20261016/btree-nonlexical/__pycache__/review_focused18.cpython-313.pyc": "9804e63ec78220a22e9cdd83cf4e48dc6ebf9b90c3df3cf175cf61b1fabb4aa6", + "benchmarks/results-20261016/btree-nonlexical/__pycache__/runner.cpython-313.pyc": "1ad6f813b3679848475b5b6d310a1ddacacf633eeff9fef9b8601904c709f961", + "benchmarks/results-20261016/btree-nonlexical/__pycache__/validate_selected.cpython-313.pyc": "f3e3ebdd41045f30e667f4759316880e5878b64680b0702054bee75de682ff0f", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/README.md": "994db9caabe7907c270dc1416fb07cb4ef13aede4a05b5011bd6a15cb29c486f", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/aligned-layout.txt": "82f1a58465cc9cdc1ebba88a46e090e8174930b3c196cab64ca4c55d908cf018", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/async-io-alignment-from-selected.patch": "0902a4601b2200f73ebfe92337c0d4ced059ee82fae4a7ae26b32cbcc3ed05f4", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/baseline-layout.txt": "2387078c0d2a8863a8b6ab9d3a42aebe278b73669b10f8ca6201016629199b91", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-runtime-sources.json": "3f630b5d586210fa170ea014992ac304c918bd91e521374ec074dfe2cd5321f2", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/debug-build-files.json": "f5b4d4119648be137f1a0b605805b9a974d01f1039d38598ae8cedacf0f73cea", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/debug-build.log": "201c7d62af7bea1574f787f7b3cc8eb2afeefdceed484af3d862d320f3e45cce", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/debug-splinterdb_quick-test_immutable_branch_custom_comparator.log": "b6c259947ae51c2273aadb382b50e44cc87a2c33d2722e6b17b8122eeea8e531", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/fault-build-files.json": "030230260a04937708d7d9316ee702440cb1f31296fb141062fae8f0caf76767", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/fault-build.log": "771528c1205754d9dc1b6314492215a4b1898a94f5b250a01b70ed47700cb325", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/fault-splinterdb_quick-test_immutable_branch_custom_comparator.log": "2be123137dc91701e48d6d33e89ad9eb065356b762c228c708496eef51a47299", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/invocation.json": "4edb7544084a44443ca3274897e458136125a5c69497127c3eac5cce7a7c86a0", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/parent-sources-after.json": "28e50dcf2def0e92ff1fbc91db77bb3e0a0221577cb944bcf7a895ab87b94713", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/parent-sources-before.json": "28e50dcf2def0e92ff1fbc91db77bb3e0a0221577cb944bcf7a895ab87b94713", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/parent-timed-after.json": "90a7c1258ad3c57a8320e74d8eefd98e89e777f98f7095f1149c47925cdfd7b2", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/parent-timed-before.json": "90a7c1258ad3c57a8320e74d8eefd98e89e777f98f7095f1149c47925cdfd7b2", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/release-build-files.json": "c5ec465095913b7b25b4b31c2d9773708bc908ccb0875172417cc19d568bdd98", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/release-build.log": "ff9c68f180fdf59b0799342dac221bdd018ddab398a030b0e8398aac82ea9db4", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/release-splinterdb_quick-test_immutable_branch_custom_comparator.log": "0360ee5f90ab47f7d9d3f073821daf43149c150093a774ccac806e9b88390abd", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/repair-sources-after.json": "3f630b5d586210fa170ea014992ac304c918bd91e521374ec074dfe2cd5321f2", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/results.json": "3d807ec5729919b5f21a1d7292f94d426fe21fc72f447fb33a5b51726c9046c8", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/run_repair.py": "5f7683a23d01f609b7ecbda7acbff90b7d9dad40e9ba485664190e3aba4a83f5", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizer-capability-build.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizer-capability-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-btree.log": "60f0317c167fc429ffceb57738e6c160fbbf6908f4914b3dba224ce514444f05", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-btree_stress-copied_iterator_bounds.log": "6188bdcb87a63dde1376da49b1980a14f316bad2fbc96c0455b477728529b9f2", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-btree_stress-copied_iterator_prefetch.log": "2dfb1044a78aa464958cf9e40df94c2e5bf45a079d53439952928284e1e97ece", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-btree_stress-copied_iterator_split_on_release.log": "0e6adbd13d6eafc7fddf4d30a8aed52ffd6a01f5cdb788f66560c78d43721757", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-btree_stress-count_in_range_returns_lookup_error.log": "d93068c642b2c2da235bbffcdcb276b702370ed9aa6acd868cee77208a150684", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-btree_stress-iterator_endpoint_error_is_returned_by_init.log": "9737a05d5304481bf66364625a69f9ef9b1a9e724b91163c570e527cde5712d1", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-build-files.json": "9b627713f160678ec3ec46016393d60bf54a2cce403c459844eff609cec13108", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-build.log": "9e1dcefc51d9df8507431bc024c8990cd372af4c1d4a858bff01e7605995dcd0", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_blob_checksums.log": "aee6b8b22013c35149026bab75ef77820b07cc6757d74091a941a4de167774af", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_blob_descriptor_sizes.log": "6418f80fb950aa5d20464f59620009a7f805040fb24ce775a7eb3d62513a174a", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_btree_pack_abort_releases_reserved_extents.log": "0a9a73ca057c56d8beeb16d6aa624e51a1c0d67530681889ca1b109e477948a9", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_btree_pack_rejects_counter_overflow.log": "b43e95c3415d3a29ac21086af8fa23bbbc8ef8a36a09f8cdf18c3bffe4a60c78", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_cache_read_errors_reach_core_operations.log": "3270970e82294fb7db0644c997430cbf04799c48e6e5335eff9d5e0b106f04f6", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_invalid_branch_reference_rejected.log": "bcfc037e7a88f2b42840e725c9720567ee4454511b71f460db37407e77e8254d", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_malformed_trunk_child_height.log": "cf8f344555ede7706754c30a3b6899ff931910546d8ccc7886f88352ff7b7d4e", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_malformed_trunk_pivot_bundle.log": "9a18a943502cff78e3d28eeefa6c25f7b906618d87fde5ee1737c0e64f67d21d", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinter-test_malformed_trunk_pivot_stats.log": "51451b6624e8966fabc72d07e502189698afa031250c87a033f8ab7558225fe1", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_bounded_iterator_start_normalization.log": "7e744ae5d37c88bdbf3fa517830222b52729801bb4eb2b30d83cd3a2a4cf01ce", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_branch_prefix_malformed_leaf_entries.log": "86a890a4b92162805121ad832deb4742f0def5db1ba981536f57b94ffcaa0471", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_branch_prefix_minimum.log": "1668270b50a63267a2ea1e6cf68c5ecce153543857754d8718ac062fe1e3f750", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_branch_prefix_roundtrip.log": "8ca175ed267d84340ca468e74c87000549ff611a3aa839c62ec30d18ab48c719", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_branch_prefix_variable_iterator.log": "45aff94c296e5e88c78c483c7e0687ad2095700a4a0a03dc285e2c99827b005c", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_immutable_branch_custom_comparator.log": "9750211fa5fc5a630b6bdac179c7fc5d4da1524e4be438a7a077e53b15cbf9ba", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_iterator_custom_comparator.log": "19a644daf1bc5519bf09c0bcd1c061441e219c4b94553664d735c0e661c328dc", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_iterator_prev_and_next.log": "685565352427f76eda289f2d9772ce859a364c675dcb8f1884ff787e1fb9a0e2", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_range_init_error_cleanup_preserves_branches.log": "0e019e29666ccbf2a8355b925ce6bcabd78b7388627ae097b5ed84c6e4264882", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sanitizers-splinterdb_quick-test_value_size_gt_max_value_size.log": "596ff4e9384ed5e750048a9a9d83bfd3736c807bd5924b41e59fa4f6af52d9e0", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/selected-read-tests-v1.patch": "bf964decfeda41d5b12eb686eff5ea1da498c99c7681e65beeb8ef5135c4c9c3", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sha256.json": "14ff1c6a89ccf0391d830a30c810060eb7c320321804421eb7c2eab40a261dd9", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sources-after.json": "d77aacc9bd7aeb274cd6e1c82f66f924b9796799249efecef69d762e54e01d78", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/sources-before.json": "d77aacc9bd7aeb274cd6e1c82f66f924b9796799249efecef69d762e54e01d78", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/storage.json": "9f9eff2f7c13cbfd9a4dec159309e298e8a277dc9df91409039648bb2dade37c", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/summary.json": "aca14c89d573bd5c9346a58ee83d3f35a0598e9f09ae1262c1d02e6f1568eb53", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/test-overlay-apply.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/test-overlay-check.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/repair-validation/validate_selected.py": "0acf4b32497bbedb06b3f36cb7999f49c82b23510527b076d77ded913fe1b2e3", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/resolution.json": "0c4fe6d62356c2baa9736ae42239e10f05f2251e09c8641934923c1bbaf6fc5b", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/run_repair.py": "5f7683a23d01f609b7ecbda7acbff90b7d9dad40e9ba485664190e3aba4a83f5", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/selected-io-alignment.json": "c71c268ef025f6f43fcc1ea030128b72a14742ff1bab89ae9f7d46565c2d160c", + "benchmarks/results-20261016/btree-nonlexical/alignment-diagnosis/selected-io-alignment.patch": "978146f6016019a94866b6d0fdabb8d43738f4f86704ed372c7d6e9a7808c400", + "benchmarks/results-20261016/btree-nonlexical/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/application.json": "72c5dffbbe3d90651f5b4e144f4d11bb1e9c004fcc33272dfe253a806c87a9f3", + "benchmarks/results-20261016/btree-nonlexical/audit-campaigns-final.json": "1be4cc5747f3eb3e6af4508676714eb62e699b821476ca4e6c572521c6816de0", + "benchmarks/results-20261016/btree-nonlexical/audit-final.json": "4d8c3afc19b9257dadfcab1d41e7f647a7d429f5d294c440c89dc5aa87df619b", + "benchmarks/results-20261016/btree-nonlexical/audit-v2-from-v1.patch": "097407a0722d76e838f27dc159f7c1645b43d1d8874b0155b83881e24a1a714e", + "benchmarks/results-20261016/btree-nonlexical/audit.py": "2d7946e1a337f6506144d5592816c7cd4615de50d4838b9a17e8b27560540132", + "benchmarks/results-20261016/btree-nonlexical/audit_final.py": "aeee41e89c04bfacd211be0d2e2f42dd9b9fab6e1c5d2fbf42f65d11aa6a273f", + "benchmarks/results-20261016/btree-nonlexical/audit_v2.py": "a0781b7c45ce9e0c7dc474fe34462105dbf8496486aaa79ec10d3aa63eda6fe4", + "benchmarks/results-20261016/btree-nonlexical/build.json": "c6e8058d572fa4e60a6d39bb6a2d0b0e268f52464b5b65866240b93d25e88b75", + "benchmarks/results-20261016/btree-nonlexical/build_variants.py": "0f6539ddb8743187e9c8c8234406e6c320b9e04d0b96f76e366262c9dc107253", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/build.json": "2732f40cb8d6c3a959eee50aea5991e49cbfec4c6fdeafc3d781595500742133", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/build_variants.py": "e2fb995dcb4192a70beb35d3b9873caebd7e9ecdaaaae21294989eb09c63cae2", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/invocation.json": "b169d515a711a0ad36a2483aac4f89dedfcae2b0703360cf1e1e1201da15f725", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/sources-after.json": "284b89ab97ff7cbd60bf0a76fc943ff00418cde4f6bd51357d7384bedd6cbe54", + "benchmarks/results-20261016/btree-nonlexical/builds/callback-search/sources-before.json": "284b89ab97ff7cbd60bf0a76fc943ff00418cde4f6bd51357d7384bedd6cbe54", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/build.json": "fff48d6d6da48559a232e45361347591d80662d99776d8421f9199a626b2ef4e", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/build_variants.py": "0f6539ddb8743187e9c8c8234406e6c320b9e04d0b96f76e366262c9dc107253", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/invocation.json": "e94a6e67dba7527cc59bd65b85ac1fbd775aaf6025ffb098205eca1b3d611889", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/sources-after.json": "3a555b0094741a06b18d4234a6ccd8fe5fa9b88dff31f8a91efb52959288b427", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-blob-v1/sources-before.json": "3a555b0094741a06b18d4234a6ccd8fe5fa9b88dff31f8a91efb52959288b427", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/build.json": "c68ba200043b3481602480addec3dcd97c9253f525dce66da34b188722cd540d", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/build_variants.py": "0f6539ddb8743187e9c8c8234406e6c320b9e04d0b96f76e366262c9dc107253", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/invocation.json": "bbfc11125b362904bf1a2f7102a5b907894666e51fba32c8ef1ae007ca639734", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/sources-after.json": "f710e734e1c213c4521ee655e142ffd8422b348028edec9cddd76d5ed5e37442", + "benchmarks/results-20261016/btree-nonlexical/builds/combined-read-v1/sources-before.json": "f710e734e1c213c4521ee655e142ffd8422b348028edec9cddd76d5ed5e37442", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/build.json": "a79ad32c1a684cd7d8d52468931c1d9816e9867ab91d2fa502d446fd52df1731", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/build_variants.py": "e2fb995dcb4192a70beb35d3b9873caebd7e9ecdaaaae21294989eb09c63cae2", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/invocation.json": "a56c493a2b22652c99e56ddd95d6ee4a7cd364a2bac63ca89adc5d6bcda713a2", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/sources-after.json": "748f03b677ab2c5b640ca31ec3c22244770d1be6c50e4ed0d5d2d2b0c7750bb1", + "benchmarks/results-20261016/btree-nonlexical/builds/decode-outline/sources-before.json": "748f03b677ab2c5b640ca31ec3c22244770d1be6c50e4ed0d5d2d2b0c7750bb1", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/build.json": "a17d276fa5afeb7e857af84abd878bfee516a119a2ce51350d6bf2f550d235ed", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/build_variants.py": "e2fb995dcb4192a70beb35d3b9873caebd7e9ecdaaaae21294989eb09c63cae2", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/invocation.json": "9f74793084f5df12d7d0e96ce5fc001511728727231a63b4e721cb24b2577333", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/sources-after.json": "1f05be0f0f8937970fac38490f1d18771c114b43a8f4e00752d2d8d233013607", + "benchmarks/results-20261016/btree-nonlexical/builds/lazy-pivot/sources-before.json": "1f05be0f0f8937970fac38490f1d18771c114b43a8f4e00752d2d8d233013607", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/build.json": "30cc4cc09a68ad7105c85e3e413535509f0092c319d967d5a6083ed5ea99e50b", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/build_variants.py": "0f6539ddb8743187e9c8c8234406e6c320b9e04d0b96f76e366262c9dc107253", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/invocation.json": "593a109d3e2e8d99e02f148e61d84c8628fd9ef3b6556139c10499ea1d516516", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/sources-after.json": "36675465d77c83d3157a26521e4f0f9f01d90697fb80277ceee6f11f3463f565", + "benchmarks/results-20261016/btree-nonlexical/builds/message-type/sources-before.json": "36675465d77c83d3157a26521e4f0f9f01d90697fb80277ceee6f11f3463f565", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/build.json": "1e9e0bf16dc43184c2b43183c2b52400ac852789c4f8390547d7d511ced0bceb", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/build_variants.py": "e2fb995dcb4192a70beb35d3b9873caebd7e9ecdaaaae21294989eb09c63cae2", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/invocation.json": "cbf4b05040a51d07595e3d64673476abadf75aa8963413d90d4a7e35dc9585c7", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/sources-after.json": "4721fd74b0aa7ae358fc5d8f581c954acddc7a13623fe2ca817374f41dee7875", + "benchmarks/results-20261016/btree-nonlexical/builds/prefix-scratch/sources-before.json": "4721fd74b0aa7ae358fc5d8f581c954acddc7a13623fe2ca817374f41dee7875", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/build.json": "7e9e6358c93d860f9ccd8599f6d6f75ce88a0f1bdd3ed8ab22713d8b34a56892", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/build_variants.py": "e2fb995dcb4192a70beb35d3b9873caebd7e9ecdaaaae21294989eb09c63cae2", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/invocation.json": "be181ceb14668c47a1bd237cc1110ad1d19adc1604da0d09b26e0a97966eb647", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/sources-after.json": "db4c09932701468c9a3bbc6c9d8f4b0d535a4a17b501e8364c58fd00213ea40b", + "benchmarks/results-20261016/btree-nonlexical/builds/rare-blob/sources-before.json": "db4c09932701468c9a3bbc6c9d8f4b0d535a4a17b501e8364c58fd00213ea40b", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/btree_prefix_bench.c": "35a8e826c6a454169df149273b52427833ef08fde058e5f5f79974153c273685", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/build.json": "c566b777e07339544b9edab277ba00873ca7696abc480de03b39538c39660e82", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/build_variants.py": "0f6539ddb8743187e9c8c8234406e6c320b9e04d0b96f76e366262c9dc107253", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/invocation.json": "f00aad1897c135a28b37e400829ebc93dae3c2730e6de0a346c721de140248f2", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/link.log": "6566bd93435841d5bbd9d23b3a83d554d15e781431635d97ef151473b05bad8f", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/make.log": "e375583b62f45dabf1ff4dc66796b3a0da0c8930dc7816b0a94a2074c309e173", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/sources-after.json": "cede7431ee63190262e4e805fb5b2087c0f155109cac43e34964f27ac60f7075", + "benchmarks/results-20261016/btree-nonlexical/builds/selected-io-alignment/sources-before.json": "cede7431ee63190262e4e805fb5b2087c0f155109cac43e34964f27ac60f7075", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-plan.json": "95cac0484e689704245bd1ee03807865c7c528cf736ad3e157111c948aea5303", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert-plan.json": "3bd559fc637e3832ca1859de7f4e803150f8d08d398349fe263634111f650848", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0001-r0-nonlexical-insert-random-main.log": "8fa976591003266ec5c8926fbb7c48b5d34d500204479cca0982afdc17003097", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0001-r0-nonlexical-insert-random-main.stat": "d7b673a54f47a70c0b8626ffbffa9750ce1072090e40e45c7301c71c46b65c1c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0002-r0-nonlexical-insert-random-selected-aligned.log": "0a3f8ebedd24fa8c36be585a2a51cb8913bad861af95c5a234d54e488769e7ec", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0002-r0-nonlexical-insert-random-selected-aligned.stat": "abcbeace5e80db8dbf09fc965468cef58b68204fff22f3783be9be82ef1c4d82", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0003-r1-nonlexical-insert-random-selected-aligned.log": "af1567ba3db1699d964d26d2fc07a86f21f31fc3b5dd567db1253d3a83bba84f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0003-r1-nonlexical-insert-random-selected-aligned.stat": "04fccaa37fbcbd0715d713d59a0142d5ced5b5c80d493f6f9632e3c37fb7b09b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0004-r1-nonlexical-insert-random-main.log": "c3cb4fb825f5f9d6e6fd1a0b4515b9373ec343f7c28ae8408bdb5b909e70ff27", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0004-r1-nonlexical-insert-random-main.stat": "8828d42645df8f6d3643c28d32485509b68b787bbea6693162734811969a614a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0005-r2-nonlexical-insert-random-main.log": "eba6e4ef96dfa85b2160f7020139a2a81deb3e4caf04f547fb77a201775ac813", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0005-r2-nonlexical-insert-random-main.stat": "057d7be75a60dcfffd23f8c1e849b8cfb7e96ffcfad9d14a5cd6cdda8a74819a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0006-r2-nonlexical-insert-random-selected-aligned.log": "8dc540a3b8955a0663fcff09edc4b956a883f842561d171853e2ae904207d95b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0006-r2-nonlexical-insert-random-selected-aligned.stat": "eeabd7b1c8a73eeec2ec295e7c63427d50af612672a497808aeba31c542cdcf7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0007-r3-nonlexical-insert-random-selected-aligned.log": "5975f14314fe962bbad2ccc805b594d9583d08b1645fba72b1bbd2f9ced160d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0007-r3-nonlexical-insert-random-selected-aligned.stat": "e4ac4b69371e12fe3a91dbba67087cbcf9c371eaa8b022f3e69e2ca02205daea", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0008-r3-nonlexical-insert-random-main.log": "f76f5beadda11368431324ca90a241f0cb84c4acc28e7124d4646a2af0c00a18", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0008-r3-nonlexical-insert-random-main.stat": "4ec66fa16bd2f5f028725397f5f633cff31c01dbe0d4245cf05f281ca0e65579", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0009-r4-nonlexical-insert-random-main.log": "96a047ead81d16e8e7565a7fb0f3056653f0cc94d7ce35ca8a7bb528657e19af", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0009-r4-nonlexical-insert-random-main.stat": "c41d0dfb6cb7104aa6f82cdfbc7007a811490876155e3ca10118025992136c70", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0010-r4-nonlexical-insert-random-selected-aligned.log": "6b25958fe556797fa36b9769a0da2fa6e2fb0951bf3e4d4456fea374fbfeb421", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0010-r4-nonlexical-insert-random-selected-aligned.stat": "c1829460981ebd399372d9da4944c4f866790998114bd5502fa689119a65c25f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0011-r5-nonlexical-insert-random-selected-aligned.log": "71e1348e4e98b851e9318b3d0eff5acf2172783d72e86f8bbfb73f4bcb92b7bf", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0011-r5-nonlexical-insert-random-selected-aligned.stat": "c520bb18f5f13a57d73c78944669ddda34982c738d3311fd9aa9d2e9048da810", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0012-r5-nonlexical-insert-random-main.log": "9dad991bc56f94001c253ee3e1f814b2c95e8b8c35f707bba33d4fe8b32e86d5", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0012-r5-nonlexical-insert-random-main.stat": "dfef056a7d3dddf8dfd345a9a9764a92582b37eeecac9f8bdca24ed8d03cd77c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0013-r6-nonlexical-insert-random-main.log": "2bda05676648bdaf5d0a75bad2c9d35edaab8654ed87871a34a14cb0058b01fe", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0013-r6-nonlexical-insert-random-main.stat": "24b1598d8a44e57812eae2047a148fc5c74f026782b0754d3dca7189f914d1a7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0014-r6-nonlexical-insert-random-selected-aligned.log": "0b71cb4439c3a638b8f67948d350d4a252e4af25b4c818c8a0bd88e3d541d270", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0014-r6-nonlexical-insert-random-selected-aligned.stat": "9850186a297c751871cd92b6e79536d3fb0ff7d77d0aebe5ff9b21ef42440ad0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0015-r7-nonlexical-insert-random-selected-aligned.log": "89eef8e3158afdd53ba123478a42316ee7750bc8d5dabd490b3b36920c97d334", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0015-r7-nonlexical-insert-random-selected-aligned.stat": "6c9dd596c6dfec3af16be3758b2cb7094b7c64b10d21add4f267ac1be53cd598", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0016-r7-nonlexical-insert-random-main.log": "724bbfd92b0c721e76e7b2907a1481c7f74a018799f94495f170862108dd4e00", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0016-r7-nonlexical-insert-random-main.stat": "eab4f51d0c53f002a978dbe63de3bd3c37b6b2c6b73bc60d78ab6f8fef5cd83e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0017-r8-nonlexical-insert-random-main.log": "6e09eb3e434dbd1764774cee0d2cb01b89789527766b2ea45eaca4dd3ba9ea7a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0017-r8-nonlexical-insert-random-main.stat": "f49b167734cacb232177a5155c2111a62615948d61d9a5e8ca50deab47ea2658", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0018-r8-nonlexical-insert-random-selected-aligned.log": "a81e1ab40d89c5a1e0f26e0e61cc067c7aea5dd653698b72721237068104a10a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0018-r8-nonlexical-insert-random-selected-aligned.stat": "cacb2133e764a607574edf1dab5da368a3a4c1196840bff38add4d5c25fdcfb7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0019-r9-nonlexical-insert-random-selected-aligned.log": "ea18026f2053db3742d724ebb2f82149b50049281792fbdc06b93fc02d90dac5", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0019-r9-nonlexical-insert-random-selected-aligned.stat": "b058f2b1b25146c542b692ed38255b05494e19745b1f4db9ee3403f8f6601b0e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0020-r9-nonlexical-insert-random-main.log": "e5fbee54bc73d47bdc7012ec1a8afd1dabcba5765334e7052efc5fe20746bff2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0020-r9-nonlexical-insert-random-main.stat": "98c5b9c28f53b80cdb17484bce0ceab830d4c8d1b24668d6665f4e3aebffe1f7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0021-r10-nonlexical-insert-random-main.log": "efca2bd602d9f87a79c94f7297e19306feed62a469b88c3ac67a7326492138cf", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0021-r10-nonlexical-insert-random-main.stat": "9ed5eaf417022d4ec479f2d54fd60541378d9fe003356c71eea12d47b1d14534", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0022-r10-nonlexical-insert-random-selected-aligned.log": "d75a7cb0b66a465826496abeb75fc7c78d8c22b2e48a5f5470f818dc43fdba7b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0022-r10-nonlexical-insert-random-selected-aligned.stat": "4544d479a45d0aab2264d9dbffa99ba2c9759d973a9e0cbfd046c27cddc2d881", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0023-r11-nonlexical-insert-random-selected-aligned.log": "c301eb3ecbe9230ea5a26879ee1cb6333ad7790bfead0a93705b28eba6d06813", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0023-r11-nonlexical-insert-random-selected-aligned.stat": "5647b7f099fa061260dfd38f4396aa1a28227c9c198276ec341f74bc0dd9d688", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0024-r11-nonlexical-insert-random-main.log": "ab6526cd3ca645b73a5fecbd9463cfd438c2d369bd85db14f9340a7cce70bd51", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0024-r11-nonlexical-insert-random-main.stat": "a4b96748834f94263507a451781fb8d193d482f6da1575d0ecebae43aa7c36bf", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0025-r12-nonlexical-insert-random-main.log": "982bb467f3a114621d9c494587d1ea19a46af33a12397215b2fe22a5b3cabc5f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0025-r12-nonlexical-insert-random-main.stat": "be1b9081f0b3413313877539d0c5fd3c57a47972b8c5d8a184e0d2b303d5dfe7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0026-r12-nonlexical-insert-random-selected-aligned.log": "1fc3a37a0b29406c8541dab41b325000538f1cf64c0a7218f2c1caa12cb30864", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0026-r12-nonlexical-insert-random-selected-aligned.stat": "b93bfc5616e2164671ef167312fc25bc83923d05584c943db7f358ae4901f68e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0027-r13-nonlexical-insert-random-selected-aligned.log": "45e406a3aaab219081e1a06e5cd4c7c532e9f7fd44175f9ff086b71b9be7fb82", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0027-r13-nonlexical-insert-random-selected-aligned.stat": "c44eee580f9f6e2752d3dd6e6943c1ce49be9947ece077c53502ad45878a89af", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0028-r13-nonlexical-insert-random-main.log": "0fd02dff17d9b69acd03c92e94035d95a8d96382c3ea222457a6976305a95e3d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0028-r13-nonlexical-insert-random-main.stat": "493b803b6ab5adecbe712cc436a52c9d46374fbfec8ca1750901caeff1dc2673", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0029-r14-nonlexical-insert-random-main.log": "c907b0583f531d5c439dc81f6e2749bab50287a373d3475631402c78a1c39233", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0029-r14-nonlexical-insert-random-main.stat": "65e7570926e4f3c27b619916f1c0cd5f43bc8468223744c79753dba394ed5382", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0030-r14-nonlexical-insert-random-selected-aligned.log": "c392edadd2b1f3963680b4cab39ead5442c9914ac7d9c4e940f3ea079ce0fcd6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0030-r14-nonlexical-insert-random-selected-aligned.stat": "444202b8e1682274e32b73f6c949391a009da62c374264714e325dc6d46f8f3f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0031-r15-nonlexical-insert-random-selected-aligned.log": "1b0c3a128aacbc3b1b81f4cf09e857f228806f64592d1a7ada46867d007dcaf6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0031-r15-nonlexical-insert-random-selected-aligned.stat": "ef4660a0eb2e466eee2383abd7708a461d7da9937612a1c083209b8383c47a5a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0032-r15-nonlexical-insert-random-main.log": "fc7f14425ba9a2203dcc1c475a371eb4a2e88863703e9e63a4c5a824734e8c68", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0032-r15-nonlexical-insert-random-main.stat": "ab48408bdbe60b3f9115d38e7ac033c73fb8f0eea64e1371388df7c34d9ac754", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0033-r16-nonlexical-insert-random-main.log": "86996ac4894c057988c9fff39dff5ba71ffcf50dfc007b332fc5e845cb879d0d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0033-r16-nonlexical-insert-random-main.stat": "1b50b3ec7b12592f2a2adeee369c8a7fbda2e635c31516f85a73a0421942d164", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0034-r16-nonlexical-insert-random-selected-aligned.log": "4c2280fa2ac281bd64b1c99d1702fa5492b05b7f35d777985bc80f93b4a66c31", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0034-r16-nonlexical-insert-random-selected-aligned.stat": "4438881bb19e209ee00efab9fadbee6f0cc92215b90fb9fff9e0573db64f562f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0035-r17-nonlexical-insert-random-selected-aligned.log": "b46d84ee5ceca76774b1a8c97d6d783fbcf3f3a7acdecc8bf2fb7611ea33e305", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0035-r17-nonlexical-insert-random-selected-aligned.stat": "fae16c0be70d01241380487f83c3f2738bb3641d924ba76c019fb9b6ba06178f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0036-r17-nonlexical-insert-random-main.log": "61c19bd41b7b4d79994fdac16c4062228d1cf78f646e3e67900c23258e6ea1ba", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/0036-r17-nonlexical-insert-random-main.stat": "b376e8787aad39d3c1b3a7f0c9ca6c76124f615c95bbd22da20ef6e06b82d3cc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/build.json": "c6e8058d572fa4e60a6d39bb6a2d0b0e268f52464b5b65866240b93d25e88b75", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/independent-review.json": "c55ad290c70945e09db6730a01e3cbf8d22a80c616463663c2e00986d7465bb6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/independent-review.log": "5bdb0e3e86cd26b12fc024706094c24a9a8708972144311f0c79a2d5a755c7af", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/manifest.json": "28bc94ff63e6ad605a0a91a3dd5ac75e05e6daa6f7ca37fa55991ed28a563e14", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/plan.json": "3bd559fc637e3832ca1859de7f4e803150f8d08d398349fe263634111f650848", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned-random-insert/summary.json": "5d7ba53a81a82167eb08d323f5bcdb11309453de04174c129924d514d2cffd8b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0001-r0-common-scanfull-main.log": "c7e77b387cebd6709652e82f7819ea289eeaac4680a9f5204321f291c952b7ab", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0001-r0-common-scanfull-main.stat": "b98712b3d0870d49fcd4777a63fd923ef6993cdda79426300473f44e917b580f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0002-r0-common-scanfull-previous-selected-on.log": "cbf2d67db9f59b354c7ddf8349d59074845cd8c4a6ca455ad5e0879ff93c2473", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0002-r0-common-scanfull-previous-selected-on.stat": "514c48bef760ae8992529361f727c25898bbe5dfb5c1578333080cab7a48e8a3", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0003-r0-common-scanfull-selected-aligned-on.log": "b3301ff15d4ce2f3bd542c955373d7e9fa63e93e7a21249b4442f23115b0de5f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0003-r0-common-scanfull-selected-aligned-on.stat": "d68f4aba5309a9ba3665c8d2e444020acd9ab3db1722c71cb87fa1d10add3a1f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0004-r0-nonlexical-insert-random-main.log": "0e79623b868e8d4c1c28c1c92c4eda8555880ddd9c38ef19b4e61ca69541b42f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0004-r0-nonlexical-insert-random-main.stat": "580ac55c49dacf8810b1af9c05c7a0d573e060322f08d9ab696aed029bba3e58", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0005-r0-nonlexical-insert-random-previous-selected.log": "6b89b3b827ccdbf58c0744559180e5de59e25572a1472d5c72ec2617f435c0db", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0005-r0-nonlexical-insert-random-previous-selected.stat": "e616579d08400f8cdb281d013b77357fc0dfe28503799392c0955a1e10c5b18c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0006-r0-nonlexical-insert-random-selected-aligned.log": "1455fee23da25781e4059a7b6a989b884edc459fa3849040256dbbfc6570e75a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0006-r0-nonlexical-insert-random-selected-aligned.stat": "8dcc44a8b8d6bb6dbf10dbdb00f87b1429073d0ff4f4435721e02cce36bbe975", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0007-r0-nonlexical-insert-sorted-main.log": "d2efc4f4915b177c8a1ac18580899b0004aa3f01fae9c8576337afcbdb692650", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0007-r0-nonlexical-insert-sorted-main.stat": "08750fd2274df232bf16b90d5decbb39a53b9f3adb93262c434586a041ef8558", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0008-r0-nonlexical-insert-sorted-previous-selected.log": "3e2d2426d89693d79c9db0bb8ca255e9bef3fb91451ffa396a290b42f92165ad", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0008-r0-nonlexical-insert-sorted-previous-selected.stat": "ab6521689828e6d19cf9083905d95be80c7b8712c003e08cbe8aa83aefa9f13e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0009-r0-nonlexical-insert-sorted-selected-aligned.log": "c6b067ed5f7e70fe47cdf0475c86dbf3498736de52de648ad13434ac06ce0d63", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0009-r0-nonlexical-insert-sorted-selected-aligned.stat": "0cc9e5b56272f95ba989b39b1c8e67701402dfd3acb06586dc2628f57e126527", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0010-r0-nonlexical-overwrite-main.log": "3197f840004ea20089f3cbe9a623a01f8edd577dbf4221f75cf1346b5a62ea12", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0010-r0-nonlexical-overwrite-main.stat": "aac7d7804aaf1e306a1cdc652812fb29e51dc25bed8a6c38e6ef52fb278a94b4", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0011-r0-nonlexical-overwrite-previous-selected.log": "8a8bbc87f17f29b1078424e95bdd6ae4b0c33c5d284a380c7869a7222ccf1043", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0011-r0-nonlexical-overwrite-previous-selected.stat": "2108464543e75892e6fa9fafe17dbc174fb302f5c9d2f7a24aaeb7d903ae3352", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0012-r0-nonlexical-overwrite-selected-aligned.log": "3eef39224000659117c05c1c67fccb0664d98809e7b88663ceb2c7532c643a9b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0012-r0-nonlexical-overwrite-selected-aligned.stat": "47e6535e2c6d11cae8a670d50a9af6031f3c8f6f3a190379f20fcfc6e928b648", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0013-r0-nonlexical-pack-main.log": "984bcd48ac9855df9e92015fa26b9c457c88b9ece0c8978ddf8e957cf085dd99", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0013-r0-nonlexical-pack-main.stat": "9c665813b0e356ee1cc1a3148d08d3c3df769fb62c282f96204acc2c7dbe8573", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0014-r0-nonlexical-pack-previous-selected.log": "5bdd7c35549734622a2797c43efdda04956b9b4a6b26dba380450181bc1727b4", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0014-r0-nonlexical-pack-previous-selected.stat": "76dc144e41e9432a60a4c837666b4dcb5e24a0938b3248985e4c532617543fb3", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0015-r0-nonlexical-pack-selected-aligned.log": "fbfde175d17a5d173f876a2ef900f78e49117818377888305e5166c00504140d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0015-r0-nonlexical-pack-selected-aligned.stat": "de3595bcd8a932bbe2bcc4343f82131cb75f06283944d81bd0b6088f6d2b9b7b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0016-r0-nonlexical-hit-main.log": "3193c3edd4a007755e4febae875d250545a547049e3277e87c8a9f3c08898bff", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0016-r0-nonlexical-hit-main.stat": "410ed958e4e1428c4c0b2b40de7b698912c8494c67445ed46c340d758fac1b3d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0017-r0-nonlexical-hit-previous-selected.log": "56858851e02b6d2036a095d47d49c16150968e916891dba9c81c74999cae93e1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0017-r0-nonlexical-hit-previous-selected.stat": "e40ca3ea7c7d17ef079a21fd8c8868a553b09dd7fd6f00927e628c7258d32eb9", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0018-r0-nonlexical-hit-selected-aligned.log": "0ee0a0fdd3fdce395ac3eb56dd7404e072ce0b6e7a9a744b9c401deaba922d78", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0018-r0-nonlexical-hit-selected-aligned.stat": "71ac289187d471ff2fd25692598a77e7758c25e1e8af4b050b70c1b946b7b3b0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0019-r0-nonlexical-miss-main.log": "1d731d921353d41e62ceecae2d4a1416d39f178a5b5282fda14a8abb7e8468b2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0019-r0-nonlexical-miss-main.stat": "a99385ed824a203dd927df1ce44cdcf10f0a797ce853a5d38c0e5c6e77345037", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0020-r0-nonlexical-miss-previous-selected.log": "42c4306e5611ce390280f3624bcf92f207765f4ee98f8ccf1751e10cd9fe6baf", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0020-r0-nonlexical-miss-previous-selected.stat": "df4601bedf681d19ee970158e1a99fe394d2eeac5dcb759851dd9873d0ce6119", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0021-r0-nonlexical-miss-selected-aligned.log": "48a8df43caa2b3b2efced52b6bbe5d84bf68717de106021a58ef4765f323a835", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0021-r0-nonlexical-miss-selected-aligned.stat": "06974e1ae801f7294305a6fdf2d81196b75e10bd64595aaea5d64f0f8a952a66", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0022-r0-nonlexical-scan1-main.log": "35e18888d204e81b263bb19ef0f06d3ac3d43e28acbe0a42ea0d740f5b5856a0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0022-r0-nonlexical-scan1-main.stat": "9a8115983db9a66dce5866144181d0bf01ef204a2badab76cfc02f27356e007f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0023-r0-nonlexical-scan1-previous-selected.log": "6090e7e495674e54a6ab4ed665c5ef28abe6646b908c128cc2a454f985c4e0ab", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0023-r0-nonlexical-scan1-previous-selected.stat": "1c4fe5f5ad6d8bcf7255e3781a286f81fba54c4f58c5945814a9c1fdfe6a2c21", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0024-r0-nonlexical-scan1-selected-aligned.log": "1f424df6abfed89583c98243b8e26137bc927085e7ad3d09c062e2c0940e84d1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0024-r0-nonlexical-scan1-selected-aligned.stat": "4dfeb2130898334c0d6b90ad7a8a719ed0e60aab0e31534a80021903d6be9e5c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0025-r0-nonlexical-scan10000-main.log": "be3918778a334c4d472a349600fec0a388b4905c694be4969af3da711a7f4256", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0025-r0-nonlexical-scan10000-main.stat": "5ceafe4ee775b2d8051bd04d0dcb95e91c16d18d077c51731813d4627851d175", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0026-r0-nonlexical-scan10000-previous-selected.log": "5b9f99238c8ce0a52dadae1922f9504851a2591730e98d9982390aff5269d8d5", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0026-r0-nonlexical-scan10000-previous-selected.stat": "e5b9d39ed87658d6258ebd5e2538be97c660ce98a1db05e607de746c11800b9e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0027-r0-nonlexical-scan10000-selected-aligned.log": "f615ac2e86c08d5758234147dde3432b67c39793614c8ff596d63e0c0bd3b743", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0027-r0-nonlexical-scan10000-selected-aligned.stat": "0ceee37c3017ee915a7f0f9e6a75afe70561d4868197d34a3192d9d67fb75aca", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0028-r0-nonlexical-scanfull-main.log": "5fb50f86f8a8b7548f2cfcf34703cb5dd29fa5cd743d202d1fb646e0c3b863b1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0028-r0-nonlexical-scanfull-main.stat": "43b84b668508f25d68a955ae030ccba0ba30968f114273da284cf561e354a853", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0029-r0-nonlexical-scanfull-previous-selected.log": "7b0f0ce58012acd7312b0df27434f333d08156f923c6c48db5174964a5ed2e49", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0029-r0-nonlexical-scanfull-previous-selected.stat": "9a48323a4a7daf4883b13a2e634e225dcf595dcb6b2ce55a3a479eeec1c1f0ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0030-r0-nonlexical-scanfull-selected-aligned.log": "4b8aa8b5b5eda6a07eae3ed15cf93795519aed9cc81d3081a2e6efda860e91ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0030-r0-nonlexical-scanfull-selected-aligned.stat": "2e2c2efed1a128a00650d55793cc108a203593ea0a0e93a1eda77616e763f69f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0031-r1-nonlexical-insert-random-main.log": "4a3b1b73f375b76c24604c15fe40f769988a09ad1f626178a02b61a4b8776e12", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0031-r1-nonlexical-insert-random-main.stat": "98bcbd5e3696c5c0e9d095bac9c4a9135dcaa572d8a5279be2e31595416ddb6b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0032-r1-nonlexical-insert-random-selected-aligned.log": "beac9cf5dbd02553ae4b9471ed80e864561e1d4181ceff0fa125cee1315a668a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0032-r1-nonlexical-insert-random-selected-aligned.stat": "6b0495f75b52f7b0492ccd0ae7dfc8b45db0d436cd0653153e27d3b5e385fe55", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0033-r1-nonlexical-insert-random-previous-selected.log": "1c98575b7b3423ba7bdcf66267f6713729ac121792f4cacf1c214da966027aa7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0033-r1-nonlexical-insert-random-previous-selected.stat": "536bfe475e7762b13bb1ca5586f1cc328ead0392f6937791e74612d0a95df799", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0034-r1-nonlexical-insert-sorted-main.log": "6f03fc5a74d81d0f894e2b8b7e605ff4ebcb05a7bbdca9d609a04babe6d837ca", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0034-r1-nonlexical-insert-sorted-main.stat": "91c34df35eb3b19dbe03ca5977082f4a5038a2b0824351304c536309896d5303", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0035-r1-nonlexical-insert-sorted-selected-aligned.log": "50584e467e4d16eb5cf7f0d280f968755c00b6bdc59b65aa1c60c4c76c3bc9f1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0035-r1-nonlexical-insert-sorted-selected-aligned.stat": "e70eec7a07101dde64d26b876a8febace3381aa93cdb9c44affaffbd5041d3e5", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0036-r1-nonlexical-insert-sorted-previous-selected.log": "8fcec716bd117afb5c7daed545a24bc77c68d9397302d379fb6049e9b9f12ee7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0036-r1-nonlexical-insert-sorted-previous-selected.stat": "b5634675cb5585c514045fde38a229b0c864b2a7b76ece2cc6fc6edeb82620b1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0037-r1-nonlexical-overwrite-main.log": "c520697cf9173e442d9a22eb0c30d5f75d94b3c196efffbd28f1ae11169eb9b2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0037-r1-nonlexical-overwrite-main.stat": "7ddda6645c0f718dc21bbdeeee67db9b307f79ca6ceed7bdbeb4e15ba80fa71c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0038-r1-nonlexical-overwrite-selected-aligned.log": "e3630d9ada2c2111f51b3177635a035ab55a483fd8561cff0a00d0638825350d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0038-r1-nonlexical-overwrite-selected-aligned.stat": "fc66475b41501b83673f8bffc6c39ac67f2f43a19136184808d99cf5d50176c4", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0039-r1-nonlexical-overwrite-previous-selected.log": "c07044a9fb709f9b3cd59ce3ee18e9e35278b8e314dd3d22c34a30898a080c37", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0039-r1-nonlexical-overwrite-previous-selected.stat": "ed1ae5c560150b5e685b05a8e53dcaafcfee93a80db5d28e33b5a6a98deb81f8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0040-r1-nonlexical-pack-main.log": "d49422cf32ee6106d7ebdb7e01c8cf2b028cd05a629133cedb5da14e672e25eb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0040-r1-nonlexical-pack-main.stat": "52cd39563074c4d09605f89726ec511e92667b0aa3763f7d3e40a58f5864bd59", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0041-r1-nonlexical-pack-selected-aligned.log": "dd7b24288e6006bf0c4b2501e5fb9c98f923550f02cac1510abf9d29d1440a5d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0041-r1-nonlexical-pack-selected-aligned.stat": "bc27afad70df1f10e1b9874aa6d41b1c2f728431956e817bdedb7ce856614d80", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0042-r1-nonlexical-pack-previous-selected.log": "df5bc1f3386efb23d789f0bedff386525f88c51a486e6f6a0d0bfb411777e617", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0042-r1-nonlexical-pack-previous-selected.stat": "043c0110d34bdcc66dac70c1599208361222c1d051622c5eb8ccd3c6c0549b6a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0043-r1-nonlexical-hit-main.log": "68231d8e407c0f3463b8b4de83e4b28103b236797435f3c18420c3f3517d0559", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0043-r1-nonlexical-hit-main.stat": "38fc72791ee3d75f95ba2565f26c3dffb3ea46c005d3db098d93fc123f8e066e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0044-r1-nonlexical-hit-selected-aligned.log": "bff9567e20a14b30e06c5a8db380f80c2b9fb2f829555c3d48b2896d2fb6899a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0044-r1-nonlexical-hit-selected-aligned.stat": "7354199fb2053082458a1625d069bcb8a00be6946b52b0b6b04aa3d055a41e54", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0045-r1-nonlexical-hit-previous-selected.log": "543b2c2afd417dc20ac32a2ef1f74c71f60f2e433ca216cad71661e95fc50a84", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0045-r1-nonlexical-hit-previous-selected.stat": "2691275bdd23a13d273498c3e7e9170d2040a31379c3293011934314e8fccbf6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0046-r1-nonlexical-miss-main.log": "79d38d32482c99cb542a43eecd222d12e7242e189b45afa7dd008406aac90ed2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0046-r1-nonlexical-miss-main.stat": "fbc2b4913a7cbca2f897990d16fd5ee791ccd15a3f086dadb3bbe198e094a400", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0047-r1-nonlexical-miss-selected-aligned.log": "0c0c90e0250b8e7d2590f3c8e7ab0383794176816829d6c87f870a4e33bf2fbc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0047-r1-nonlexical-miss-selected-aligned.stat": "73e148fe1ffa697425f282a398447935decc9bf3362fd700c897b0995a86c6d6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0048-r1-nonlexical-miss-previous-selected.log": "25e93c2bc52b38bbe3d3b4a473c6542edd1414628114c5cd4ac30d410d3f3fa7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0048-r1-nonlexical-miss-previous-selected.stat": "d8277a6218d826b77793ab9117ea72c211c055b00e2d0a1aa36814b40130272f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0049-r1-nonlexical-scan1-main.log": "d31a0d161d68dce70f6019f365c2599b96d9ab3a903763aabb0ac51abcd15650", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0049-r1-nonlexical-scan1-main.stat": "7b61a185f4e5c9869a75f7c275aeacc06c9f6a8bbb443b5682d9f24b5b37d2a4", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0050-r1-nonlexical-scan1-selected-aligned.log": "a99dfb79c1c2e8584d31daf4ec0c89841ea445937c0bbbc7b42a350dd018cad2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0050-r1-nonlexical-scan1-selected-aligned.stat": "4959eebe2ea0b518de6710310f7ba0076b7e4709333e8c9fe951b21df8e9f147", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0051-r1-nonlexical-scan1-previous-selected.log": "1355e404f09daa3fa95c51220c98dbeb8c466cfac01ef3f6719ee1ddfe8367cb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0051-r1-nonlexical-scan1-previous-selected.stat": "648ab4d0362805abe5ffec3434b0413331612341a5598a855b167bd7ef25b152", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0052-r1-nonlexical-scan10000-main.log": "f9ddefd001b7dcbbd31a258ab3d96501ce2cd03b918b2ed7fdee3ee4dc5e427a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0052-r1-nonlexical-scan10000-main.stat": "25a8b5389c4b8bb18248f17b2d3bc0c43ee41dd2a457fff693c96a55583e4d36", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0053-r1-nonlexical-scan10000-selected-aligned.log": "03811549480f83beaba5a26fb70ceed17cf0491d34f41d1ad2eabaacc4f86607", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0053-r1-nonlexical-scan10000-selected-aligned.stat": "aef726817b1f8c42523df77b42850192c129fd3e4c582f0297307ac4cb69c284", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0054-r1-nonlexical-scan10000-previous-selected.log": "8d3cc6fc5f81a73030fa2a491dc146177f06a21b28eff0bbdd22588e297e2f29", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0054-r1-nonlexical-scan10000-previous-selected.stat": "b1af1da8d4a1d19ea2564dbe3df2aa3e0984001b9e69e49bf379bd9c840c9028", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0055-r1-nonlexical-scanfull-main.log": "68099af71da231c5eeacaf703ab24a537945ecbb6feaff3629f06fcca4a7d0b1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0055-r1-nonlexical-scanfull-main.stat": "93c79a3f8c1075c7d19dd8feefff228e59c82a631ec7654ae6ffb74b8c811332", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0056-r1-nonlexical-scanfull-selected-aligned.log": "154d8c9aa2a5693516c43cd1690a39bdd35e47df5fdb6e4f42865978110540d7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0056-r1-nonlexical-scanfull-selected-aligned.stat": "775c10317f523be5743984199f4874af75e8cd6d6240e3d8b12267fe01cd6987", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0057-r1-nonlexical-scanfull-previous-selected.log": "3ef9053aec1408ac10b2f46f786a12c28d2f5030bc0cc6db7f1df1722627d521", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0057-r1-nonlexical-scanfull-previous-selected.stat": "7fde6e557ffa059b19b701e6dfc48ff382007b91cdd0c903d0e4d64b0eb21a45", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0058-r1-common-scanfull-main.log": "63376639e7b77e9f7c4d5e2a1e9009d1f786af10078012acaec69e25f194c753", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0058-r1-common-scanfull-main.stat": "d60a0f3b9649432817ae0935ae03d5c36dfbdd6389b1ab79956eacbafc9714ad", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0059-r1-common-scanfull-selected-aligned-on.log": "41512d37c96ac6f03a8534fdb97808ddcaefd467de5fe647fbf09ab0392b95cd", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0059-r1-common-scanfull-selected-aligned-on.stat": "e6afbd99e70a9c275cdf45292cc4d49758e083af6a7a70987d9518f7cea78689", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0060-r1-common-scanfull-previous-selected-on.log": "e71f3d19f2ecf0ce7fb98575832ea8155ee81c0d6e5ae1774d622fe6c70049ac", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0060-r1-common-scanfull-previous-selected-on.stat": "b35271cba7bbf13e0778bcd12ca73598b822efd7513b6d7213b7d2220d135e08", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0061-r2-nonlexical-insert-sorted-previous-selected.log": "da2a60352bfbb6f2981727da14f33f8843cfbfd64f132af0d8cac3bdb4e517a8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0061-r2-nonlexical-insert-sorted-previous-selected.stat": "3e87d573dbe05c37970377017bcbb0345bbd63274d81c81ac71e681a724b024c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0062-r2-nonlexical-insert-sorted-main.log": "cad6b661b3ead857adec8ab059fcb4e03f47d1fd2ef94376ab6402bab7ec0c52", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0062-r2-nonlexical-insert-sorted-main.stat": "927f160317a72155db0fe856efbd23c738c298b0cc17155220eb2fc59826e51a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0063-r2-nonlexical-insert-sorted-selected-aligned.log": "60ae379c0f1bb56140c63de02e34503a3ac472f91ce23cb55265df479aa6deb8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0063-r2-nonlexical-insert-sorted-selected-aligned.stat": "b38044307190abe8b64ac5c4de7644cf83df320bae7c539b03e3ba01c735325e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0064-r2-nonlexical-overwrite-previous-selected.log": "3e042d87f02665f83fe4ee4af0dfc54896987770b88a1e8f05699c3b49bd06bb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0064-r2-nonlexical-overwrite-previous-selected.stat": "5de7a7d81485a5cc4296768f2f41513de48de7c634238c27bebda6f9e9741807", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0065-r2-nonlexical-overwrite-main.log": "0ee90047bcd106f38ef0e541626a6bc0ab95d78591c7203641b0f87f3e7ab1fe", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0065-r2-nonlexical-overwrite-main.stat": "e2100dfd0a812bfdeaba85a2b7cf369c064f47f2391261cb81750a012b6966e1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0066-r2-nonlexical-overwrite-selected-aligned.log": "d69079e915a76b9e4fa2792e2d360b00c607f4d9ab51b163a9ab28cbfbd4794d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0066-r2-nonlexical-overwrite-selected-aligned.stat": "89d678d7bcb103266b9d5ac5b6860cabd7e3abcbe6cc2c39333059053b6de66b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0067-r2-nonlexical-pack-previous-selected.log": "6f64eac150de5a048ed49ac7f0af54e4b54987f9a74ba83eb8d37210b4c276f4", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0067-r2-nonlexical-pack-previous-selected.stat": "a8d63986b6e70fff52d42a2065236c20220462450526aeabaa255a70f948debd", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0068-r2-nonlexical-pack-main.log": "66c5d7e6f4bfe752487e1a185c8543a31bd0f578602abfaa26f4ee459940da18", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0068-r2-nonlexical-pack-main.stat": "7c4861d48e43fcf5a5d24e55930b4c1315146b6a9c8fe2e9fe1007b2e299f406", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0069-r2-nonlexical-pack-selected-aligned.log": "d71408349548773d655ff7df997d626f4e6932d35b82f0aea027c616ad9878e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0069-r2-nonlexical-pack-selected-aligned.stat": "7b356956e7f31ef910068c79ac9e5771c1be14a455813519677316f80830d405", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0070-r2-nonlexical-hit-previous-selected.log": "766d9342a4a00e6312d6f8bf75e05d109a30699884172ac69a4c56918e32f70d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0070-r2-nonlexical-hit-previous-selected.stat": "efc28f973a659bab72f9fdf83518ae227010603e99140a2f4245efad53e02559", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0071-r2-nonlexical-hit-main.log": "226d262a534d0e646a28fdd0d00225e255dc2625a96c8ba3c087706692b7702f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0071-r2-nonlexical-hit-main.stat": "80ee9428ec48d0e3c11cd7e41951bedaada6ed2782bdd1ac920fba2398836825", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0072-r2-nonlexical-hit-selected-aligned.log": "f52ce9d9a3fbc2c4762c32ca76eb5e7ce16c8db7ba47b515925908338a47afbe", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0072-r2-nonlexical-hit-selected-aligned.stat": "3d70c69c5a9244f02783c3002a550fcac07a340d22c8ea41420587e8aa44ac65", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0073-r2-nonlexical-miss-previous-selected.log": "8793a3f5f35a26787c0699d9b1d4a900af82c52b55bc5eaa7c660eb1044352a5", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0073-r2-nonlexical-miss-previous-selected.stat": "324e7501420105ad6541bd0e5d4dd5d60883164b5f4ff61316aaae7265f4a608", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0074-r2-nonlexical-miss-main.log": "90111ad5f26dc3854561368e5736cccc09c59e6c0c95ecbbcb0d7e2d38cd8963", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0074-r2-nonlexical-miss-main.stat": "790abb42257213dfeb747d6fd9bba18ad2eca8453e15c3ad9d40cf26fd939d6f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0075-r2-nonlexical-miss-selected-aligned.log": "d494d1789a0974676036899c05230494e0c0244613439dd4e0233ad1d5f9b1ce", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0075-r2-nonlexical-miss-selected-aligned.stat": "381d0cf30c459696613d6fd26012928febc02d498d31291d481d0e28aef09594", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0076-r2-nonlexical-scan1-previous-selected.log": "b83685544a8bb8530ae8388550559a764d75a0689508936519e629f95207a885", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0076-r2-nonlexical-scan1-previous-selected.stat": "666345cdb39b386ce619ef69ffbb6428eac107e73d9b4e7137295bcca5ca1665", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0077-r2-nonlexical-scan1-main.log": "5a908d9c5a06806826afb774eb103d9fb40df7eedb4291a1ecd7ce6bb851db1f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0077-r2-nonlexical-scan1-main.stat": "f30e17d029888e895b63bf98837a78fa890f4c85cb36b84ed9449620936f3e9a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0078-r2-nonlexical-scan1-selected-aligned.log": "a9643e09aeff74be05c08e9360d37b959d61a90258c1518f15beb97db3a9b1df", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0078-r2-nonlexical-scan1-selected-aligned.stat": "4643fdfc0d0df0db366ebd1a1a036add6771d669f53d140941c96e65f582c20e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0079-r2-nonlexical-scan10000-previous-selected.log": "d8007f4d37aa386a52a852e5ee27e39f7725d91516c94a749cf4a8a5916c695e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0079-r2-nonlexical-scan10000-previous-selected.stat": "08ff443958610a7b208e84bdafc54a6115a291f25b9490c25c391eddd356008f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0080-r2-nonlexical-scan10000-main.log": "44c6e2a7dc7154dccb2705d14180ec0246bcea3d16a05ecc893adb5e85c1cee3", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0080-r2-nonlexical-scan10000-main.stat": "b14fea2a8c0a9da95c6e0eb8700b09533cae03c17bec688bfe0696814f6cd7fa", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0081-r2-nonlexical-scan10000-selected-aligned.log": "ba95beba5a8e9e54c222aba7b569d49f49ba893b3371fe04097a290a4627d1d6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0081-r2-nonlexical-scan10000-selected-aligned.stat": "dfce8aa443d412053dad3d334ff01af068fac39ea3e4cd4c750f1a8ce9bfdf29", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0082-r2-nonlexical-scanfull-previous-selected.log": "7d8862dfdcf9ad9540eb60a4c8489f6a4deb9da36d81d05230397f450f673a3d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0082-r2-nonlexical-scanfull-previous-selected.stat": "804a0efba770d974c9d17b5987524691277360dfc46600eb230cd70d50701172", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0083-r2-nonlexical-scanfull-main.log": "529bdac64915572f37dec1d58e49e6012b2841793f3359c30c79873bcd7162f3", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0083-r2-nonlexical-scanfull-main.stat": "d1ffc831ce41ecb68ea4e9097b14efde8acbcb3cea3f5c4904948f648ccd8e18", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0084-r2-nonlexical-scanfull-selected-aligned.log": "36b129a8631704549d1d99a5dbab2306f9283617f829040c1034e3418e846857", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0084-r2-nonlexical-scanfull-selected-aligned.stat": "0a0fbb68313f54f484395c11384057e0bb96f01930e1d9c3fd6414af094af2cc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0085-r2-common-scanfull-previous-selected-on.log": "b98985c697b22dbe4e830ad636dc0e74b85c39af0e36c2f8cde08349e25bd6a0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0085-r2-common-scanfull-previous-selected-on.stat": "8a43bc4c56e41d35fcfdedeff5977031c5370f874da7e171ad1519b9f6c490e8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0086-r2-common-scanfull-main.log": "e37a227cf57a56270e96e4da15df4f96527a07265bc00a4f6ee54ebff18cc8d5", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0086-r2-common-scanfull-main.stat": "5180c2aa14b1d21f6e6526f7add2998a68acd394bd940cde7e5fb461af17b40a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0087-r2-common-scanfull-selected-aligned-on.log": "1becf0488b5ed8c75d2d546b9fd264e26f50223f88840f845bf6f1000e8abf4f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0087-r2-common-scanfull-selected-aligned-on.stat": "8f351e3f0fc57afd96facb266f3dbb1f35f147a4dc2a9b011b3b844e1212ab42", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0088-r2-nonlexical-insert-random-previous-selected.log": "e6b92b436dcc4c95eaa42e0a3e0a3e1d86479c9dd9267b98802dd906b4e6807a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0088-r2-nonlexical-insert-random-previous-selected.stat": "e73be253ecf0a194159e532e4bca1bf8acce02ef14647b5567a52ed2c150d046", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0089-r2-nonlexical-insert-random-main.log": "b5a2ad6cdf0612e3ef78308f326808bce1b447ea4ca0ea73255981bcf71d68da", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0089-r2-nonlexical-insert-random-main.stat": "cc733f6c4d0daf022d57eb1538b6b46259278fc4165c756cbf42aaf3ae54578d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0090-r2-nonlexical-insert-random-selected-aligned.log": "b419ac416de043776582ef31a8b81eded1996c97a275a6d9070c3c54db636292", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0090-r2-nonlexical-insert-random-selected-aligned.stat": "060d89aa36f310c1b472b7e7b02604deb7e88be2d4efe203d054a09dbd2041cc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0091-r3-nonlexical-overwrite-previous-selected.log": "85ba7007b4d6ad39ae54ca53266718fe1ab1c47cfd4966c5f7f0e099b5238565", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0091-r3-nonlexical-overwrite-previous-selected.stat": "ba2018860814c4d9e8146b36a0c671da3a4aa0d00f8a643cb5b5f9a2db5539ce", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0092-r3-nonlexical-overwrite-selected-aligned.log": "d9efd83c0cab4cb1701e3516c62fc8feb23efd71f5fde48103ec210c27851003", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0092-r3-nonlexical-overwrite-selected-aligned.stat": "0daf5a9555f53271ed1bc82b6d332d0c9b8f7fcf74c00ed14dc42b4badcb2118", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0093-r3-nonlexical-overwrite-main.log": "8a8610e6c5e6e74c078a96d03cfe81eae6592d7997a89ee135991126a8069fb2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0093-r3-nonlexical-overwrite-main.stat": "aac2a46328ad47b539105c189b101ea9e8ff5e03d90bc66eba23e14b777a62af", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0094-r3-nonlexical-pack-previous-selected.log": "84821381d3d6661549f27a6c0cd8dec815a0b3308bd5afaf4aee78fce9058617", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0094-r3-nonlexical-pack-previous-selected.stat": "1dcf86dc6602d34dcf39a186cdadc3116aecafc8d919b400395ac7a6e6f80b29", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0095-r3-nonlexical-pack-selected-aligned.log": "5b56164e27e48c1459bd50fd8cc9026fded38b81757ae64224ece78c5575b4a0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0095-r3-nonlexical-pack-selected-aligned.stat": "4843d1ae34f6ed1bf8351cfa05f4265f15676f5221b5a0bb8f3bd997e2ab6b14", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0096-r3-nonlexical-pack-main.log": "b8f05c89aebd8504fca7bd607828db3ec5e96d0fab8f84d2215ed615a6be2cab", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0096-r3-nonlexical-pack-main.stat": "f0969f7e243021a2c0f6b8672a1ebeaea81b9d1a54024677737744ef0a84fa8c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0097-r3-nonlexical-hit-previous-selected.log": "7024af3fd22ea523a7f094ef352126706c6e698487163988d2101bd1cf11fd90", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0097-r3-nonlexical-hit-previous-selected.stat": "3bccc6bae139b168d7e699aac245e56cac9460ae8c6dedf6eb9c8a1f883dbefc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0098-r3-nonlexical-hit-selected-aligned.log": "184231358bff2956c05920d78bd2526f0a916de198a5f328de9198058f02943b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0098-r3-nonlexical-hit-selected-aligned.stat": "391624f356054c7b4b093ad27790ec96ec422cb495ae9a9bbdfbc68a69e11203", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0099-r3-nonlexical-hit-main.log": "27229302421dfc91ab79e4fddae181dde5d87cfc66d4f15bc0b6497525cab2d6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0099-r3-nonlexical-hit-main.stat": "cc26fc4bf945824acc14d5935e28967a92233f74e41960ea7841aefc0f2aab0d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0100-r3-nonlexical-miss-previous-selected.log": "f7604a915d1c6511909a65298ffad8a8be1ac9cda466dc45d4e0bfd2452ada15", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0100-r3-nonlexical-miss-previous-selected.stat": "081e7bf5da775a43f6ca8e2cf876aedf613d0efdba2237d002003952d1052155", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0101-r3-nonlexical-miss-selected-aligned.log": "c88038f4a4e3a47f20756c513bb1d16f172341149b9d08c522718b1dc036d2bf", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0101-r3-nonlexical-miss-selected-aligned.stat": "31456e36eba76af169ba3d6b27dcb22fc746d8c3d16d5faa9212e1dddeb9b02a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0102-r3-nonlexical-miss-main.log": "904241446dfaee07bb3f4a1bdb331e880a788a2640f89d945f423bcbbd2a3fef", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0102-r3-nonlexical-miss-main.stat": "58fd60a363dec251b98b347429484803169eade5ee6b82e877e617bfc3c5f70f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0103-r3-nonlexical-scan1-previous-selected.log": "2568582273de6158aebf4a7429f4feaca1c475dc9e04c748fc60d09a50803edc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0103-r3-nonlexical-scan1-previous-selected.stat": "4e0bdc151d17b9814af4239ae0eb923e4e8da6c0453fb5ab8df1e103f355e8d7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0104-r3-nonlexical-scan1-selected-aligned.log": "ca6b4418c9dd07173f69217c855bb0357123ee556d6e46050adc4883f8b65612", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0104-r3-nonlexical-scan1-selected-aligned.stat": "d5e221b02ed39e353523cad60cdcbaacd74fe215da19531dd01614279d5b34cc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0105-r3-nonlexical-scan1-main.log": "7062475af6d0fbaa4af5529245c25b8bddb0811c7fef575393f200ce09f4fbeb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0105-r3-nonlexical-scan1-main.stat": "a1217b7a1b32fbbd4ed44da1e809fdca2afa050057e003777b1fe8b4e40025c7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0106-r3-nonlexical-scan10000-previous-selected.log": "689f2ec8f496c2671d6814aa889c899bbcca871893ae495eefd7f5ac69f817cf", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0106-r3-nonlexical-scan10000-previous-selected.stat": "1d596fb0d34f3ba676e85a3fb5a3d48bd3c341d61ca28f3eb8b571404da4862c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0107-r3-nonlexical-scan10000-selected-aligned.log": "e1359a574baac65c9e084a8b69b60ce7c669108eb17ca0c2fe64cafa4241454e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0107-r3-nonlexical-scan10000-selected-aligned.stat": "37f8491421afdca1fb5a3e9408d7529b8f431d4bf7a877191e1c30d087cd541b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0108-r3-nonlexical-scan10000-main.log": "5684dc6eb915ff29fcfa59996979b22a1359cf139b5d47ba97be44c53d666dba", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0108-r3-nonlexical-scan10000-main.stat": "99bcd5dca53cc9eaeccb37af89ff58f11a3e891a8304af7a2f41fe4304258c5e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0109-r3-nonlexical-scanfull-previous-selected.log": "24cb662b17295166167681bbf790494990d9c938caccbc73c0814e9af0567cf0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0109-r3-nonlexical-scanfull-previous-selected.stat": "04780fc87f82bf36af64520524df7b7fbaff28489d4495f45264176978e41157", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0110-r3-nonlexical-scanfull-selected-aligned.log": "94a0a6f6cb6037f8505ea9702fdb19221b62dbd84cea858b38f4cf5e3361cdbd", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0110-r3-nonlexical-scanfull-selected-aligned.stat": "2fdcd7e2a46c4b096b1ffdeac1d0f7e9957dc8aa204bf2442b02b0d239c116b3", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0111-r3-nonlexical-scanfull-main.log": "e0f1b22071c65f6411c4bcff2377475a59c9e1c9e8bae517d5b9824d8cf6ed1c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0111-r3-nonlexical-scanfull-main.stat": "2b1ce90c8d8bab9e54886e22e8aa040b10ba2adeb4a46fd1f4bf9bd4fc48b7d8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0112-r3-common-scanfull-previous-selected-on.log": "626cd4e86bf9c21ccb98cf51b89160938f2b67effc0c6279dbc4efce12ed8958", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0112-r3-common-scanfull-previous-selected-on.stat": "08298ff47d6d3d16b273071465ee1b8acbefad30a55332e7ca5c1446500e0533", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0113-r3-common-scanfull-selected-aligned-on.log": "859d58385ab73dd9a5c2289d760ceff81ef51bd23d5c5135d1c87cfed245406a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0113-r3-common-scanfull-selected-aligned-on.stat": "8e0ec6562b89c1bc6af8eca9e81f3c848372d956e3750efa05dc8f2c4d60ab77", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0114-r3-common-scanfull-main.log": "8d86d0f8b2d199638e09a9f662ef5cceb991842539e9493c97797988d8b5f250", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0114-r3-common-scanfull-main.stat": "b6f5993b9eddecb549fbea5ae42264e0bbb351526ab4f7ea3db5d2ce12b8f3d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0115-r3-nonlexical-insert-random-previous-selected.log": "24e56b889c7c6aa5fdaf404709cccc0208f2acaf8e802e450319a239dea87a60", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0115-r3-nonlexical-insert-random-previous-selected.stat": "ece24f9aa788dcdbce724c70b29c21e44affb617606d5fa84f38b1fc9780216c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0116-r3-nonlexical-insert-random-selected-aligned.log": "e9d9d2d4f1f9850f8135e526fba136d40b0eb326e7750dff208d13ea7848c282", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0116-r3-nonlexical-insert-random-selected-aligned.stat": "c17c9dabc6884e161662dccaa14fc6057418861d220820b75497150b08f43a72", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0117-r3-nonlexical-insert-random-main.log": "87753fcd1f00c4934aa6a609e28c7c31e6099b139d7ac6b5f887fe4b23f0c985", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0117-r3-nonlexical-insert-random-main.stat": "78e95b26911bdf6fb8fb767ff6e0afd3f9b8a23201760f4cfe3972353830b598", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0118-r3-nonlexical-insert-sorted-previous-selected.log": "3f30b7f8a9e8fc9f6198431d2ab7f549b9b8f2b13582bf08af55905399b36425", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0118-r3-nonlexical-insert-sorted-previous-selected.stat": "934a7ebc1856659ac2ec93bfbfe6a5352395824a761bc243bbff3e4448aec670", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0119-r3-nonlexical-insert-sorted-selected-aligned.log": "cc8545e4fafa0f8afc8826af2bcfe328dfb1bf948c5793034e24effccdab4973", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0119-r3-nonlexical-insert-sorted-selected-aligned.stat": "56569b3297816e923fd8311b1739a26c16c5e165247f08baa99ac232986c6304", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0120-r3-nonlexical-insert-sorted-main.log": "218fd0ba0b718a5f0b51977d23498587a2ebb5e578d6d093c4ae0b9dae294160", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0120-r3-nonlexical-insert-sorted-main.stat": "d8614e2875513d7df4ed5ed95f29a7cee71a52c2468ec4a54f0347e096094b93", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0121-r4-nonlexical-pack-selected-aligned.log": "721ed61579059aa4b890340105a54a81f4f0929546a8dc570e87e8ee6336eaf8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0121-r4-nonlexical-pack-selected-aligned.stat": "149786cf470fbb5ee540da5ac31581913900bf70db29a41230e8538906652899", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0122-r4-nonlexical-pack-main.log": "fdd12d012978e1eebbb1a616c5b0468c0a129eb3ef3d46a88d80639a31d151ac", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0122-r4-nonlexical-pack-main.stat": "dea9279d3beb93c9f6b51e93eba3666ff0013da274d88a00b56c9e7b25628bfe", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0123-r4-nonlexical-pack-previous-selected.log": "807f32a97cb03f9faa75f8f0928d64fb034f759a31169dddaf224824dfca48b3", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0123-r4-nonlexical-pack-previous-selected.stat": "b11e54ac1fcae1de1f2d7513f2ffa5129e2ab7ee4b712eec62a68df488e20aee", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0124-r4-nonlexical-hit-selected-aligned.log": "81e8294e6dbe123648371b59025aee6ed0361507480d9497be0f116e1f4aab4a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0124-r4-nonlexical-hit-selected-aligned.stat": "f80094f6b82cce733e064a112988de7fc7749aca137223266d687891e470fa01", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0125-r4-nonlexical-hit-main.log": "bcee76966f3ab733860152bfee623e082ad68b0de0bbacbcfadde40a0cc9e94f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0125-r4-nonlexical-hit-main.stat": "89bf03faffa9beea00d3cfab542ab8c663aa6c427bf9d45c337bd3b9b580ad96", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0126-r4-nonlexical-hit-previous-selected.log": "6567277e49c2bf2ec10101edf3c59ca643126d5a2d1e205c62feeb5e4eba2939", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0126-r4-nonlexical-hit-previous-selected.stat": "877b0789e7c5a12e5b7f76a81759f4ddce175249175f9bcb6f49a20ee15fb70a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0127-r4-nonlexical-miss-selected-aligned.log": "74b9e2eb2d6580656be62b9612c47666bc8942fa13311eb86c7b603b723776f6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0127-r4-nonlexical-miss-selected-aligned.stat": "96f90eec5d897992cca4c0da3621fd6ee0ea5ab4e65d9466cb1e32ac533e534b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0128-r4-nonlexical-miss-main.log": "4e4a25f23cc4d8c73a21cbfea7f454c763f339d2fac24be8df445455467ed4eb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0128-r4-nonlexical-miss-main.stat": "f9cb0b22a1c2f9b6ab5628e3d81cb22e752ba4f690ea05ce5bb65ab5a4835449", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0129-r4-nonlexical-miss-previous-selected.log": "5e6e16f71de6fc21605d39185bc58f2f3feff2463515d25fe3448b749a1587d1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0129-r4-nonlexical-miss-previous-selected.stat": "ecf9e07d41737fe52b20b9f320236bb2d27edd1e2669057210fc2ee88d869226", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0130-r4-nonlexical-scan1-selected-aligned.log": "98ecbcb9a5cfc7915a6799c50d532aa8c3f897dbd99917b2ccc79a35d5f085ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0130-r4-nonlexical-scan1-selected-aligned.stat": "f6953e8a3a39c10e3ab5a4e7fccfe63ee8982b4a5964604ab04507b7f2226760", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0131-r4-nonlexical-scan1-main.log": "1a8f0800271a7e03469e27d7a1d791aa44b633048e601c7605594965ea05bbe1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0131-r4-nonlexical-scan1-main.stat": "217b8aec06209099e1c566e8d1b75eaf0379e7e3da7b5548f085e6692e5cef85", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0132-r4-nonlexical-scan1-previous-selected.log": "02c6d97d7383008feeada22a708102280161e5b59a316455b440ec05bd59692a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0132-r4-nonlexical-scan1-previous-selected.stat": "8c569ac3867d04d0719dd944bfe1edd7444fdab342f69aa64c2552b22ea1fc66", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0133-r4-nonlexical-scan10000-selected-aligned.log": "685b5d13434cde8f16e670c2ce795314fd5abf5759bf8c603aa46cfe16400821", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0133-r4-nonlexical-scan10000-selected-aligned.stat": "87a8a50292d29a48a5296ded137abfba61ec525dffef45d1571b50a2df9b67c6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0134-r4-nonlexical-scan10000-main.log": "d3d92290e0c339bcf2befe71ac160e6e254aefe23e84b1a428df985b36345f31", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0134-r4-nonlexical-scan10000-main.stat": "93eb458d2162ee4f20e9d888854152c90a3865ed006b9b2052ff1b8b54074594", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0135-r4-nonlexical-scan10000-previous-selected.log": "61ea48707ecae2f7e03d6198d839075b32606eabb721fcf9e30c18e87d8d972d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0135-r4-nonlexical-scan10000-previous-selected.stat": "9f099688f60c6722033a99d372f14098b09ba64a018cd75b05bdbb7d8809da3d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0136-r4-nonlexical-scanfull-selected-aligned.log": "94849eebd9478f2358961c584e16d6d4d9f38284734c64dff3242257bd7195fb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0136-r4-nonlexical-scanfull-selected-aligned.stat": "5cd16d15e6e398f3035e691da0f5903273b416897b4660eb569b1383663a7bf2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0137-r4-nonlexical-scanfull-main.log": "30fec0099ae3cc134fe8a37148929e9e8806483c152fc114bff36ef068759c53", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0137-r4-nonlexical-scanfull-main.stat": "9713ab8563189a48ab4887a3a987f1794b7dcccc85eea0736c8711b349f51cc1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0138-r4-nonlexical-scanfull-previous-selected.log": "ed169f0290c137c83c293cd55b976949d603605690e22b0ca928b82067155d10", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0138-r4-nonlexical-scanfull-previous-selected.stat": "88fcad0c5bc54183531d4f716dd91b5b7472e4070d3210d45171825a0059322f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0139-r4-common-scanfull-selected-aligned-on.log": "a100e750af0ba947ee017d80380e193cc48ed77b21c7a65f17f96945ccc4663e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0139-r4-common-scanfull-selected-aligned-on.stat": "ce73aa488039ed2a4dfa87ee14b8abcdf9a1d113862483cdb87b46d34369e3f6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0140-r4-common-scanfull-main.log": "e0a9b07f6e51c6cf890c54b478c1c344a26810ee95b2f8535cecae6a28c71e33", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0140-r4-common-scanfull-main.stat": "2fbc0a1e58d94a45e1c3fc41093db1dba524b6ba4e2b9838d4fd69173f5faa3b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0141-r4-common-scanfull-previous-selected-on.log": "22e42f91a793f13566aa7efba7e407407fc5de2aaa600b8264e15c3b223e85be", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0141-r4-common-scanfull-previous-selected-on.stat": "0795ac819f874dcb4e21fa1a11d20e0059ce3803078245be2a1fd7466724020e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0142-r4-nonlexical-insert-random-selected-aligned.log": "0c1d523814e8332364238f7ee5b47cc83172d0c30719b8d1cb838b9299287995", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0142-r4-nonlexical-insert-random-selected-aligned.stat": "b7a543066c2e09d9890fbcfa18753a4b5c21f6293739d52aa92eedafb6e76214", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0143-r4-nonlexical-insert-random-main.log": "8807365d8dfd70d8477fa2c09b2c1bd8460958cb6d8fe7fce0610a1ebcb035b7", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0143-r4-nonlexical-insert-random-main.stat": "27d7e66b02da4100de86eb3c2b422801ca2beca647f8814a31a4b72907ac2137", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0144-r4-nonlexical-insert-random-previous-selected.log": "9c1b5d9412f4b4ae928c98aab397800231d0cc5e1e84a2832395310f9b16b673", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0144-r4-nonlexical-insert-random-previous-selected.stat": "c98527fdd14a179afea0a4f79c0a6e1b5d08734f2294ce80e65806a43c35fb3e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0145-r4-nonlexical-insert-sorted-selected-aligned.log": "46a42569627ea465306d99d1cd53c82d492151582bf0bb3936d5dccc524f490f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0145-r4-nonlexical-insert-sorted-selected-aligned.stat": "a4bc67a56d393b8fe50dec4c89dee6f18d81566407d63f48f4810bacc28860d8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0146-r4-nonlexical-insert-sorted-main.log": "288235f6a47656c29f631ba0f8ac05522a010611323a1615f7c330ca44eaf319", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0146-r4-nonlexical-insert-sorted-main.stat": "92c6502f3292a64298530542160752392990ca0ae15f5807be823c6ddd1de5e8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0147-r4-nonlexical-insert-sorted-previous-selected.log": "63576a59eff2e93bc63aa67ea7f40e6332c2534ae0a1292f763de2b80517099b", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0147-r4-nonlexical-insert-sorted-previous-selected.stat": "3046e73a0a9c038cecbdd7fb2fdb7fb1f7c4938c51378adbd323efe91131741e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0148-r4-nonlexical-overwrite-selected-aligned.log": "5ab34e1b459712134f128e5f6b5099cb4cdd9466e99f32144e083795a850c982", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0148-r4-nonlexical-overwrite-selected-aligned.stat": "ac22bb6e859afed76cf27fa491c345c17518a8ee2660f95b222e1f8764292777", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0149-r4-nonlexical-overwrite-main.log": "f0c84fac1446deb478cb6b50767b48cc265b11702111d1d0a7782f03efd5bceb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0149-r4-nonlexical-overwrite-main.stat": "f825efafe523f993ae129fa8c42967b4fbd7fd0dc87d2998b526164941392e2e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0150-r4-nonlexical-overwrite-previous-selected.log": "63cb8508aea930a3254596e946e4d371a93c33438c3425977b460c184ca49929", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0150-r4-nonlexical-overwrite-previous-selected.stat": "d6da43b028bf7f8daed403db5be5e38c17b506a7bfde3f3482c8961f45974874", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0151-r5-nonlexical-hit-selected-aligned.log": "f36e8dcfe7452f6ced645f2ee2dc55dbda43d61e62e9d9139afcc5405998af00", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0151-r5-nonlexical-hit-selected-aligned.stat": "f57c9be9de637f2b712620c510d347b5da76a90c4e11c50ceede0b7b8f42bf67", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0152-r5-nonlexical-hit-previous-selected.log": "181d301c0c76467e01248e54423127bdf8dca101981806ed6bc4dbfeaf33eeea", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0152-r5-nonlexical-hit-previous-selected.stat": "c7b20b2b69b9cdc9b553d30a047b3986efca9bb19cb0aa227d9da903f0e521cb", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0153-r5-nonlexical-hit-main.log": "042628d40bfaf9d0e6c09726c9158563533fbfb87e8204889637686a51fd569d", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0153-r5-nonlexical-hit-main.stat": "308d0be416f3133e3193f8f1ecf1a2b2001b0907cf4fe7f2534921aaba52b6c8", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0154-r5-nonlexical-miss-selected-aligned.log": "34c6f9ce521c02edf2e3ca5ef22f680fd9b5f70b92a1330d9ce0550716898604", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0154-r5-nonlexical-miss-selected-aligned.stat": "f4d1465558cbab558131a653808557079f701770da0635deec7d45558dcaa24e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0155-r5-nonlexical-miss-previous-selected.log": "8b75868381756d0104b350be2e27e0110ca39ceba612a8020ee50f6f5d5a1458", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0155-r5-nonlexical-miss-previous-selected.stat": "024ed4614785eafae9b57cd1523feaa8c48effbb5d65b218a9559d7949329b09", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0156-r5-nonlexical-miss-main.log": "ebd6bfb32cd91f8225b1771bbd8749acaf03aa1388339ec67a6279f43a096c28", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0156-r5-nonlexical-miss-main.stat": "80a7c4f60d7ec683d09a91ac0bcc0855ba157464bd3745614b0b253310443084", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0157-r5-nonlexical-scan1-selected-aligned.log": "513d8fbff158074b61f4b1aefaf08a51850d17c59259d7d0746265b0945d9237", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0157-r5-nonlexical-scan1-selected-aligned.stat": "4f3131dedda87b20c51218f2c8f910af4e5f253b86ff2cc46f75967eb75072cd", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0158-r5-nonlexical-scan1-previous-selected.log": "317a038d3abe72b1bba89d351cdb785db32653a560f9aeef16c709c048640113", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0158-r5-nonlexical-scan1-previous-selected.stat": "474c5aaeb87a3947ade2848b128f5f1c19504e0375c0d79eb522addf8d4fe1e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0159-r5-nonlexical-scan1-main.log": "776d4c9cb3c4d63e162f1821ea5af595e30c7c8742111639fec17eb2a3fa7985", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0159-r5-nonlexical-scan1-main.stat": "b49fe0eb965fc51da9c8a2af8c789810ee7e9b5076e87c05e71897c9525b6f20", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0160-r5-nonlexical-scan10000-selected-aligned.log": "1260310aa8dbd4b703eab1d7faf12571575578ae56addec3dd0b1a55d0d98930", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0160-r5-nonlexical-scan10000-selected-aligned.stat": "ebd28c76e2bc06ebb5432a5c9b656315b3ba8c2b22def789c4303c4f36f3e14f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0161-r5-nonlexical-scan10000-previous-selected.log": "7e4f2f6db5dfd30e6f194c00d7e3d5ef44b9ed3fcf62a02b74f708a957095694", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0161-r5-nonlexical-scan10000-previous-selected.stat": "69dd4b84898fe13f5168b8975b3c90585508630903233e5041cbc2e44f7395e4", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0162-r5-nonlexical-scan10000-main.log": "be7528a0650aa75ae85609c94afe0f19dce97bd0bbeeb1793fc6eb666fdd7299", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0162-r5-nonlexical-scan10000-main.stat": "3f5ea99afe4dac7144cad50dcb2aeff4bc768fa57f1df11f972464f39ffaadc9", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0163-r5-nonlexical-scanfull-selected-aligned.log": "cb2c2984d6356aa3d945ecf0a81e09341e30ed77b44d1f9b02c79d4d7b1cefbd", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0163-r5-nonlexical-scanfull-selected-aligned.stat": "24e109c4f69e3289e85a0a623a83b7b0dc243d13011acf4db04caa7775212924", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0164-r5-nonlexical-scanfull-previous-selected.log": "b0f50367a6dcd8fc88b51086de30b03ea7bf123229ee09a5213ce9095285a5f9", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0164-r5-nonlexical-scanfull-previous-selected.stat": "40cd007a75e8921c79476556bf4f9d4428fd02373e138cecc6cb866f1b300f3f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0165-r5-nonlexical-scanfull-main.log": "64ba05373347c188803db5ee10a7ef06199df853faf8fe9cffffec75624e64db", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0165-r5-nonlexical-scanfull-main.stat": "4b779ce9c7c6a672a5b42b5dd99c0cb5ab0223de6cec6c27cbfd43673064644e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0166-r5-common-scanfull-selected-aligned-on.log": "164056959181d82639c8b0dbc6e201a384942baf8be423b636d8a01453f2b3ac", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0166-r5-common-scanfull-selected-aligned-on.stat": "d9a37daf28f13f47bb223dc8ea5e0234c7b8bd93cc300ad7d0e724fa0ee1c27a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0167-r5-common-scanfull-previous-selected-on.log": "8330c94af1a38479814eb776550a8cbe9573edac534fd76fc6b7ec3e777998cc", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0167-r5-common-scanfull-previous-selected-on.stat": "6018cc4781d0bd916f866a67bccc474938b6d786d5ac9a19c819cf0059196616", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0168-r5-common-scanfull-main.log": "85619543b8bd8e9ced50cd26ed6af835ef2fa478176142817cab085d0ca0b9e2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0168-r5-common-scanfull-main.stat": "db2bb506cc1c1613aac8cd97b053820c60f321b3e8dd70fbee6233530e7c68fd", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0169-r5-nonlexical-insert-random-selected-aligned.log": "da03eb7dee1d08141f84570ee9ccae7b00f2000585c81be7cde9a1ec87e94bbd", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0169-r5-nonlexical-insert-random-selected-aligned.stat": "7cd75917bc90a28f3011dfebdb3b913fd447229edc8d504868f503d608625dac", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0170-r5-nonlexical-insert-random-previous-selected.log": "fdc94db6289deec5ccaf3f9500fcd42db75afbe14ae11eaba1483b1f5172fc57", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0170-r5-nonlexical-insert-random-previous-selected.stat": "b9d47c2cf046c12238e164296f0b7282946f86801d3ffa07d12b7757718fc73c", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0171-r5-nonlexical-insert-random-main.log": "fd4f00a8c12c2f945a66d69572ab7a30a18be78dd446330c078633ad42d248b2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0171-r5-nonlexical-insert-random-main.stat": "020a6f134ac7bf86b53eec6820e7164c29b64d8f1f915d1888549d36d33c86b1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0172-r5-nonlexical-insert-sorted-selected-aligned.log": "86d477584c847f310cbf04a4a80e5030a7c8ee471db5b49e3b22ece2b7e26cda", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0172-r5-nonlexical-insert-sorted-selected-aligned.stat": "e697bf9067b42bc8aa4b6e5fb490708410b5eb4fe14c83053e8f64798028a3e9", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0173-r5-nonlexical-insert-sorted-previous-selected.log": "70ea60cbbd3b615dbd3bcc094861e9959d45c9fbbb91c987f84c08483ff789a1", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0173-r5-nonlexical-insert-sorted-previous-selected.stat": "67b37b3c1e61b66d06489f5cdc84e2c021618046c350dd9c72e12a16c8bab282", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0174-r5-nonlexical-insert-sorted-main.log": "b773bf2aef2c745780cff0e2ab51e75a29751f8d623884e5bb7ef96fafc12e28", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0174-r5-nonlexical-insert-sorted-main.stat": "b1630cf4b56b73d45c271535612ecc010a94f10c4a668c5522d33f673a407da4", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0175-r5-nonlexical-overwrite-selected-aligned.log": "5945b7a779f0a9404d6dfd795fe86e6f28f6c4cd5991a6f95643299d9eb8ec93", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0175-r5-nonlexical-overwrite-selected-aligned.stat": "221b11a3c8579cc6900dd08d593e06b0efbb3ee3c27006d6ecd30434793775df", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0176-r5-nonlexical-overwrite-previous-selected.log": "233f84cc304679a0cf7652d5ad0d48b05e6e726612525c9ded6085be633c4d39", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0176-r5-nonlexical-overwrite-previous-selected.stat": "abb8b37f921395aa5e6740ad63a4b33ee7051b772c3975cc5a37f811a9902d95", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0177-r5-nonlexical-overwrite-main.log": "530d271282c53eaa6e236349f3f1c2bff5688ef5a943c908c0adfd357e6b41c6", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0177-r5-nonlexical-overwrite-main.stat": "78a617e14aea552fbb2c0bd93798080bdc1aac718bf01a9cbac3ba6f499d1af0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0178-r5-nonlexical-pack-selected-aligned.log": "03455777bcfedae0e326d8dc959c76ba4e9a8e24148a1fac8f4a39a14a65e653", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0178-r5-nonlexical-pack-selected-aligned.stat": "68ac9c7b5917f32b8de1fcb0f0a5d9a71fa5665159902f6e3e0cedcad62a9c21", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0179-r5-nonlexical-pack-previous-selected.log": "fa76fcd3da44f3b73f0b6beb36936036f01e09a4f672dcacaf72c318dfed594e", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0179-r5-nonlexical-pack-previous-selected.stat": "bfbb67a893f722de33dff8b329902f25d0dc156c8f9e0c8e7ef6da5ccfdf3522", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0180-r5-nonlexical-pack-main.log": "7432e870c3dc53435c93b8ae61f598570f525b4d158a51fa622bcf4dd8dccd84", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/0180-r5-nonlexical-pack-main.stat": "4fc5153719379ed671283f989c91c0d51f995e5cc1dfda0a5cf9dcfd88b08b4a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/build.json": "c6e8058d572fa4e60a6d39bb6a2d0b0e268f52464b5b65866240b93d25e88b75", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/independent-review.json": "7c1e511ef16edededb58bac8f5304adfd82881efb8b90796db71adbb092cadd2", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/independent-review.log": "227dfc0b8a5e942beb0e424fb0f330b9aff900405692953d77f6b49b37fd7c2f", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/manifest.json": "57e24d1670e39fdd3164e085e8164a2ffd9a8c2ca7d659569e3a55c85da00f8a", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/plan.json": "95cac0484e689704245bd1ee03807865c7c528cf736ad3e157111c948aea5303", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/confirmation-aligned/summary.json": "c5b386157e9202e069d5d8ccae8aa546d87aafaa29f71c3f66ac52884e194fce", + "benchmarks/results-20261016/btree-nonlexical/confirmation-plan.json": "f245b34e6248f6e000c302fb90055e69f95f841e95a95a6d4f7e59ec7fa5da27", + "benchmarks/results-20261016/btree-nonlexical/confirmation-selected-plan.json": "0805532b2eb2f39cb332eac0830c8d3ba7ed1ae9e35cb9ff3345268dc48f9950", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0001-r0-common-pack-main.log": "a4ac0828e3f6b0770798d112e1ddc4acf0036a2617140563c0cf46680bb6b00d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0001-r0-common-pack-main.stat": "ee271d514f9c73fa192e12a466bb2e5f9e97567c4f3786b6dede4febc017882f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0002-r0-common-pack-baseline-on.log": "96c44c7df6d2c0eec54f5912fa3a4e6e4c1956c21ca59409c8b2c107eced88d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0002-r0-common-pack-baseline-on.stat": "a2b4d15c4604ef9acf6071a8be7a849e9e2a19c86b3b4a6f36551b4eb8545c3c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0003-r0-common-pack-selected-on.log": "86280790fbe56316b41c640b899bb22f6a8fddd6d168579e2b1e3b7b160b39e3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0003-r0-common-pack-selected-on.stat": "4749572fdbaeab15386d9786aa6195f57e32b792ea24770255a8df06d3069e44", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0004-r0-common-hit-main.log": "7058dbe0ccedd8ad348a6d79d3c4ca5e06d0d3495e2aec668d9945acdccadbb1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0004-r0-common-hit-main.stat": "9bb6cdce4948f54527a001747cef1c61451c12399487f5fd308c45658e299cc0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0005-r0-common-hit-baseline-on.log": "dc43b31ff866b89c7751c9fc748f20036367d8b5d48913936b69f5c40e8b2021", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0005-r0-common-hit-baseline-on.stat": "341886415cfedcddc3ead1622364cd8d735d4f8a9f53c6dd7a45653e8bffe8ac", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0006-r0-common-hit-selected-on.log": "7521a27b3b97322d44a37da7a409e3667f91686678dd7ac566e5068bf5f79e84", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0006-r0-common-hit-selected-on.stat": "3d5487fff02e0814e9a7484ea23d0ecd6281c82220de19e6df44717ac170748f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0007-r0-common-miss-main.log": "98256fa87037759273d39e40fe3b49af753ca3326cecff00bd56e9643c1812c6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0007-r0-common-miss-main.stat": "a05dfe337559d0d5144f431937b72fdbc43f06494ce75b61e323d4d248648081", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0008-r0-common-miss-baseline-on.log": "771e84d76795aa303ac5e8683298afe823f10748b01eee656d1bf43bfa799d1c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0008-r0-common-miss-baseline-on.stat": "24452a7e2080dbf49e0d40d2f4e923b6bedc8d0da6407d052ee5d0242262a71c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0009-r0-common-miss-selected-on.log": "932ad80cabbe3891eaf44d00387fae39af472a97bbde199118cc5c0dd4870f47", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0009-r0-common-miss-selected-on.stat": "9030c4a778b0c6afccbfc0eac86d1d3d23c306b94fa265d399634b0d9758a3a6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0010-r0-common-scan1-main.log": "74f3911671e6904d2f452d8c1ef285a7e179ff5abc412cdf1deca1d6b8f5cec4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0010-r0-common-scan1-main.stat": "4ad9f0dda815172ebd8991f43cee389ca123643b0c7066f19ec6c71a963ce896", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0011-r0-common-scan1-baseline-on.log": "4f26f6865952bd7727a90ee8add7842245a5bf30a966a5ec71572493d3f45819", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0011-r0-common-scan1-baseline-on.stat": "926d9f59a3ae42b62fb2e562e7018ef95a45228047909364a1e57f3b013d5112", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0012-r0-common-scan1-selected-on.log": "c5b04a93f7fedf898e51a1d9ebc9403aa02c9aeb1acaa536ebf2ff7410cb807b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0012-r0-common-scan1-selected-on.stat": "9466d01a0ff1dd7b875570e5d25adda924161a3d8cc2f94ffacb0946c2cb5a4f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0013-r0-common-scan10000-main.log": "4795bd6464a6b082b6c3eba6909e5f3c53453e22439decf38c4926fb4d8ebf52", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0013-r0-common-scan10000-main.stat": "eed1d230ad7be1959146c234711a343d206616114d9f6a1cdd7ede875f8af0f7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0014-r0-common-scan10000-baseline-on.log": "487dd584dc9ddffa4b6ac384aad5b6271ad91aa2b4eaf087278d0b5767bb2e8f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0014-r0-common-scan10000-baseline-on.stat": "85eadd94f16d8e88f4e99b3601bb4482294a342aed082ab9ce9dca415d75e483", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0015-r0-common-scan10000-selected-on.log": "5584cdfb860e81c0d94f417833edb95ba2765be3d7feb62ca4afcf6e6adc7fb5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0015-r0-common-scan10000-selected-on.stat": "30dd9578cd1fdeb367149d2fc6713e49003ecc904c09e1b6bd7bc27f58f72a27", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0016-r0-common-scanfull-main.log": "e6efbffa1ea9be414b9e8490f6ae957fdc333b633f6f3e540c83f99290526e2b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0016-r0-common-scanfull-main.stat": "45d8282cf2f0eae40ce73d62e6a6c454ba659e920901954fc211bd74e846d0ac", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0017-r0-common-scanfull-baseline-on.log": "e44e50d65744b740c92af151daf27dbba79d318cd58b8164f2a2ef8f6589dc50", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0017-r0-common-scanfull-baseline-on.stat": "c4eeb1897cd75b62e14085f49a473bd25623e898d68c8e8055469d887130e4a1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0018-r0-common-scanfull-selected-on.log": "fab110fe40fcfd6f1197a25fa29b51ebea2941422274fdf009967386c4b79dff", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0018-r0-common-scanfull-selected-on.stat": "492b0fd1a07ea7bacb61ccbb5c250cf79411ed56196ca2448ef2fd7f132dc1ac", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0019-r0-random-pack-main.log": "4b8311e090abf58d7146ebc49ef92cd31bc8cba9892aba453a04ef37433b7452", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0019-r0-random-pack-main.stat": "54edf045f7875111c1066650150d1136e2acc0f54668fbc2f983093ed24d9ff2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0020-r0-random-pack-baseline-on.log": "586bc24fe787ad54946e962498ae41da7fe14b0ac90d2e366b7c1e180f313c29", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0020-r0-random-pack-baseline-on.stat": "ae7bdf472117debc9e83ef2e7e22a907fdb7da28e172d6b0e5d6a031334b51e8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0021-r0-random-pack-selected-on.log": "00610496dfa414d0945f4e5aa2e24c09b95ae0f907e7308ac929e07a233b26f9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0021-r0-random-pack-selected-on.stat": "d468fed74fbe31910bb164cbb8511ae31342df7cd17891675684c2ec9a07e18d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0022-r0-random-hit-main.log": "3572c35e4e8a14367c11517c692690cf5e6e1ccd7aab365aef91be9aa8d14253", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0022-r0-random-hit-main.stat": "10b79a7310a647d7df31e8b34376e1c298b1ea0cdded0fb5c7321c543ae3a60f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0023-r0-random-hit-baseline-on.log": "4283f2d8cee214166e4a3a5642420279101046d7fc34abfb794dafadc9fe8b30", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0023-r0-random-hit-baseline-on.stat": "29bf3ad31c2fd32024a7c55e1d22fc3fbf0aac87c3721d8f0083408f6f4bf8ec", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0024-r0-random-hit-selected-on.log": "080d5667efc3cb827644a0850e53d28decf0ca6417ff1e6121a4f2ce82c33d61", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0024-r0-random-hit-selected-on.stat": "7105a8f8b1933559d4412e0eb1b58d93be3f008b83f1ad9bae37f34af17ab665", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0025-r0-random-miss-main.log": "ea494c5908b27960a6a08b9ed08150e8687b7b1c1b3b5326536b2116fdfa1480", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0025-r0-random-miss-main.stat": "81405f3f20e33050990e06fdb03a532f27ae50fc0244d05b7a3756739d95743b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0026-r0-random-miss-baseline-on.log": "4330483a22e13eec9514258225a4e261ea69128888dbe6df0d68c9f26ebd964f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0026-r0-random-miss-baseline-on.stat": "8bd63136f772b50280301c64c4c54207f961639c1037b8400c5d5f62dc38357f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0027-r0-random-miss-selected-on.log": "2588424458527e0832dcd1b521f1df1d7a7eb98dd382c36bb8e5f427c3ec687d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0027-r0-random-miss-selected-on.stat": "f4e744fa914d35b7a653703a7cc0644342f7e9ebaf3f42f09b2927ab827f80b2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0028-r0-random-scan1-main.log": "9d883f051d321f65f0cf1e469f782b8c73a9ff73d7000ba2ef5cd988e5c90080", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0028-r0-random-scan1-main.stat": "db5b3172c95fb44179cc895abca062143cb14ec83f246fa5795c4968b0dfbbfe", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0029-r0-random-scan1-baseline-on.log": "0bb0b4a277ac04ece0d99cbe85f90fad4ce5b1c2beba8efd69584edb33f8f9a1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0029-r0-random-scan1-baseline-on.stat": "5417cb0b3e7645801b26b704907e214d70d4d19b0e7537c8c7c552ff27d4771d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0030-r0-random-scan1-selected-on.log": "a6224bdcfa14b8168c4c98a5248e126d345e4cfb39dc908a26dfde6768b1318c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0030-r0-random-scan1-selected-on.stat": "9a8036373582c374de5e4b0b783704b4cd084725fff4822a3db20e0f86fc5f76", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0031-r0-random-scan10000-main.log": "3e3a6412e75b34c9bed35d55d074687837f45e6f2f05fd136e4caa57065d04ac", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0031-r0-random-scan10000-main.stat": "b6a27849a37d08631560beb6a602b4642a1f0e4ce26a9c9aabc62fd8343f5a8f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0032-r0-random-scan10000-baseline-on.log": "fc1c010ad2be1288f426c7bcd106931f4bd353ea76b2a717068f02d6be1f56b2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0032-r0-random-scan10000-baseline-on.stat": "70c48572e54700d3dcebbac8908bc0d6ca1c3442aa79a814848e8a3a0c9433d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0033-r0-random-scan10000-selected-on.log": "1e520ebde8bb5ced58ccf74ec09facfe863e1a8f8990dc78c3d5f21ae828505d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0033-r0-random-scan10000-selected-on.stat": "ea6dcc57df3b686a933ceb1e15e03809e67b61b3e7045a41389756f80131933f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0034-r0-random-scanfull-main.log": "74ca90a8b4f5879bdcaaf31bc50819965d8c4f9da76c0b8b4a005273049f19a2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0034-r0-random-scanfull-main.stat": "c4229c1021f63d7732146ac8dce903461a2d71e8854102174f6f690c5a49307b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0035-r0-random-scanfull-baseline-on.log": "d4b1178917eae410b9116529e6eb82728cd90240ece3dfc2bbad24a629756825", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0035-r0-random-scanfull-baseline-on.stat": "1a736dfccf7027ae438aa941d22b753d49cdc73d92ce993a82a29500741c2619", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0036-r0-random-scanfull-selected-on.log": "12dd9d23097c81608c72c349c3e3f13502e631bfa4e85d19347cbeedfbb23335", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0036-r0-random-scanfull-selected-on.stat": "7e36b19bff6a76f139d767112e0c1253e63120cace42f876cccee0cf1f3a3da7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0037-r0-nonlexical-insert-random-main.log": "bbe9c40b2665bc139891fcf22aad20c7dc52883126146ee822fb9d898bcdfffd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0037-r0-nonlexical-insert-random-main.stat": "8b5d672b029b9f4e639cc117c377e46fcadcda6f56a550d9091666e76f787883", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0038-r0-nonlexical-insert-random-baseline.log": "1f2045e923087fd6b8adc1badac8b94db38d783e59f6bb5dc74a0226f966350a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0038-r0-nonlexical-insert-random-baseline.stat": "79a99b7757f75c8097ef07a0a448996d13f8bf2f79326b20dbc6af11a3071166", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0039-r0-nonlexical-insert-random-selected.log": "72f048fb77367461f9dc79e759f438e86f2d67c8048416ec7682e279f391c422", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0039-r0-nonlexical-insert-random-selected.stat": "162b5ad9b1ca2983fc66549d7e617efa56054974f6d23ab4ec9a2132f21fa13b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0040-r0-nonlexical-insert-sorted-main.log": "0ab5fb780de2a65ab8f98a86008d0d13686aa373261d1b01cda17432c0161f4f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0040-r0-nonlexical-insert-sorted-main.stat": "45cafa3fa5eda6b3d3a3cc24a52755aa4aa40bd7c9f4e75505b1f1d27503a043", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0041-r0-nonlexical-insert-sorted-baseline.log": "0debd497632e9c8d06ebc7e95a838fa05f04456814daee92c70b3d595a91e29f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0041-r0-nonlexical-insert-sorted-baseline.stat": "1988cd7aaa408cf2b5d8b88ee7d80b6e4a94683b536b44abe018b21721313c93", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0042-r0-nonlexical-insert-sorted-selected.log": "e381e4741a8159eb85d302c909510b55a39d722deea9b15c6e77966788c1bfb8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0042-r0-nonlexical-insert-sorted-selected.stat": "beb72b95d975ee352dcece33f4ba431af3fd98c89c8ff46db79e1d2404220289", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0043-r0-nonlexical-overwrite-main.log": "34b48e0dca17e389377fe5d616a2f360094e04fe5105415e18ef625c824b6cc0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0043-r0-nonlexical-overwrite-main.stat": "20697b7197af4031756b80428b79d4539e2917004976b505bb65cb39445b0d9f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0044-r0-nonlexical-overwrite-baseline.log": "f412cdea8f02fafd2704d72d391a30e0741eaae902ad4bb3977a5b2e1962111d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0044-r0-nonlexical-overwrite-baseline.stat": "e664ae034f12e089a72fd02cdcbcd5c3962539fa5226259f7de399ecace5d4d2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0045-r0-nonlexical-overwrite-selected.log": "80a4e00d49420949929af8f3efbb6d211aff11a04f0ce7c0deb0679fb1d4db3b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0045-r0-nonlexical-overwrite-selected.stat": "72b6fac1fc22f5325a8ced9c093d6455e73b28a58998b731ad2621bc5b95d910", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0046-r0-nonlexical-pack-main.log": "664f100adfc9f9f2742d6858f0847ce7eef7e29ecd951b6c1005302868d51ecd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0046-r0-nonlexical-pack-main.stat": "d55bde57de9f607c04a26efea82762ee55d19fda928a4b8a241803de9b9c6890", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0047-r0-nonlexical-pack-baseline.log": "59734751c5e530a10bf7b922c77c94d221f9349b5633212b7267d2c60dd0f6c2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0047-r0-nonlexical-pack-baseline.stat": "2e5fc218b8f5c7a8c98d33d70b707bd78f9bc8634b55e60392cb80e55448846b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0048-r0-nonlexical-pack-selected.log": "41a7db2239af5621bf7581cbf43b0534af42e8af69838dedaa139bceae94cbe7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0048-r0-nonlexical-pack-selected.stat": "1b45b73bdf58ca9648ef9c6cf2ee6afbe778a80cfcc2961e4fb95b4c1dd722c9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0049-r0-nonlexical-hit-main.log": "be7a436cae98b96e5186817eab91b9179112c66a3ec2f922a571607fae9c5658", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0049-r0-nonlexical-hit-main.stat": "f8c654818217dc2327147972dffc747c993a6b1572de7502006866d0f080e8d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0050-r0-nonlexical-hit-baseline.log": "0ac0533969a86540e1eab19143d15a7742eb2a5519e811783dbd58447309cabd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0050-r0-nonlexical-hit-baseline.stat": "d41a08e8a42ec3509f6f865c4e7d14e6d0b2cfd29c9ebc0dc58fe0f4009a9c07", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0051-r0-nonlexical-hit-selected.log": "99517d9971a6bb44d72d0ec25b64fedaa78e84a5ceac267c9786acc05c1f5e00", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0051-r0-nonlexical-hit-selected.stat": "560f18635891e261046dfc3cda6afb6d8b46c45338468b2736bef7e2ae301979", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0052-r0-nonlexical-miss-main.log": "c8acb0f9d811dbc6daa75bf955d6f43b9d3ddf37c4d7c45782ae5aacec6d165e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0052-r0-nonlexical-miss-main.stat": "dddd8d3a76d03ba80fabf80aab63216e1e0fd1924443d8dcc5b0e0c4b77d7af2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0053-r0-nonlexical-miss-baseline.log": "31e623ba9d5a3a951449b37773a253af3dd7bf7bb11951a05802948d633218a2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0053-r0-nonlexical-miss-baseline.stat": "1ee839718cf16fe82f1e4e2ba2cf0170ea9af09a781f1cdad8e5fce1e908273c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0054-r0-nonlexical-miss-selected.log": "b1b5e38acd257c0a478095cfa3ff905af7abe7d7dc427e253f7f0fd6c878c336", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0054-r0-nonlexical-miss-selected.stat": "a47fe3aeab0c2b85a8193550546782decdede950a913edc727c7f6d9ae264c48", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0055-r0-nonlexical-scan1-main.log": "c5e6680bbc06cbb922510e870c86236b919ef8e57cd6f298372e95621a8d2968", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0055-r0-nonlexical-scan1-main.stat": "de9eb5c78acad73fad8ed727176d471067042bfd23ad76d1816019ad4ac58d8a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0056-r0-nonlexical-scan1-baseline.log": "7ef64a040b840e5aefe971fc8e64da0d23b646bea57d134375d2ba7c82f0c685", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0056-r0-nonlexical-scan1-baseline.stat": "f439f598aec03939df0b52c4bb0f2a0829a867e44c9f974b53cbebc6ac37352d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0057-r0-nonlexical-scan1-selected.log": "548977b3d63a0fdbb1a490d713e71b003ccaa259e62ea95139040a59ed9e8aa4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0057-r0-nonlexical-scan1-selected.stat": "db056b37c7a548c11b3cb1c8f3fd1979418a6b8415433241a6c1e96e987a248e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0058-r0-nonlexical-scan10000-main.log": "267ba6ee6298bdfb31b80d75bed85414d52b5a6be718531605dfd0692a4606c2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0058-r0-nonlexical-scan10000-main.stat": "d9788bfea7783d8a19295ae269067f0dc845211b3ed74bf383cbee595f2a085b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0059-r0-nonlexical-scan10000-baseline.log": "32eb4cb2302cd03c9ee9511018a84561dc79f46694459c5759e3916bbd690ad0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0059-r0-nonlexical-scan10000-baseline.stat": "199fa94acfd9e56caf84309f4628c95151876daf63ab3318273c132bf7a94c70", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0060-r0-nonlexical-scan10000-selected.log": "ffe0e929ca8980408f90238c1c79eb4ff7fc8f73fc1c9ab799dde4101854906f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0060-r0-nonlexical-scan10000-selected.stat": "cfa7917478325c4fa3bf910d564b00481da5dada0cdd656d495d0f1a2df8a876", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0061-r0-nonlexical-scanfull-main.log": "829a29dae2ceceece1ddafa77b1444ab0e967c0b46d63d8318da82a68bfdb184", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0061-r0-nonlexical-scanfull-main.stat": "82e92b177214579dad4b41f20a74b418424da374e4067a1247fae426284b34aa", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0062-r0-nonlexical-scanfull-baseline.log": "b334ec127a8fde3b96b44df2ecbecd69ab3703ca0de965613e850324e175a83e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0062-r0-nonlexical-scanfull-baseline.stat": "f563e4cfe84a065a025b1f2c1d4b3e3c7e7f5a4c7cfa3442b994d5cc6e96c6a1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0063-r0-nonlexical-scanfull-selected.log": "2d6cf02e282d1355982fd3689407321e7769988c8547d2073afd9c8f1a388172", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0063-r0-nonlexical-scanfull-selected.stat": "012f43691f8ba938d0170d6eead81d7f84593b28823c136fe9e1c1454627a6ab", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0064-r1-common-hit-main.log": "109c1689a03bc130433a59ff2521e6173c7a05f898c86de5a1c389d2adf9c01b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0064-r1-common-hit-main.stat": "dfa4366965e59dea7de9c16db54d54984ee8fd898336672c13aa64f5260fc455", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0065-r1-common-hit-selected-on.log": "95a613e8d16158559aeb38c802503fd39911b753a9a4a0aaf36faace74acacd3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0065-r1-common-hit-selected-on.stat": "fd061577676524fb33aeffa21257aa969e533a0daa9cdeaa38a98cb9e7991964", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0066-r1-common-hit-baseline-on.log": "f8b139792df6395dba6fc8e9331d1aa35e0ea1f06f577cd8070fe11d82f67d7b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0066-r1-common-hit-baseline-on.stat": "365b43037053bedaa46b62fc352540b2640a330a1a6f4b583712cca877a99a50", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0067-r1-common-miss-main.log": "94317cf08b2afea432ba5836278206eb424a2374c5e2489f50d5b3060d9347ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0067-r1-common-miss-main.stat": "55814eabb73408a59d0def3ebbe3accd92625f6ee59a57a1f3ff8fa52aa12f65", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0068-r1-common-miss-selected-on.log": "07293f5a06cd44dc0c5e4a3c3a70af3d3a8cc141d12741311e33379821b2a471", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0068-r1-common-miss-selected-on.stat": "7c1caa131e46ddf0177b943efbd792108d67244c5e00f7ca1cec047fa9f928e1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0069-r1-common-miss-baseline-on.log": "379786b1cc8ddc391c2f4e58d516bce2688ef9f4f71023385c98a5e38cb9743e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0069-r1-common-miss-baseline-on.stat": "e9975993e63f02a8085739f8a2776052b96a6c78e713d1d8afa718997e32bacd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0070-r1-common-scan1-main.log": "1e90a88b0e0bba8c1b3ee0879bbd8f642e53d4b8341816bd885af7432974b251", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0070-r1-common-scan1-main.stat": "c890e0fbee52edd4b062bca2a528f94ec16c4ba4dc2576187b00d7e10389a628", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0071-r1-common-scan1-selected-on.log": "6586961cb56939b4463fe9fff7a1d311dfcd284ac82b49cb6b8ef755a625d941", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0071-r1-common-scan1-selected-on.stat": "a67c11e5f3ec78c810c1878b46602f2c8f5fdc657a35cbc540ab07c4c5299733", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0072-r1-common-scan1-baseline-on.log": "6ecf25c401d7bd63a851cdf575e4b20c5411d529b3caf7971afc57cd5a811ffa", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0072-r1-common-scan1-baseline-on.stat": "ad49b67de2b33fda275a89a2e966d6600f7bcd1d00bc6f0dd73fcaf29eb482bc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0073-r1-common-scan10000-main.log": "1764f85c8b2dd7a787daa3e315604ea01063bd3cae7c0372bd87098fc5a5873d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0073-r1-common-scan10000-main.stat": "855a54d7ebf8e9bc70dd179330eb403a778bc2d3d50bc9f2d698411334e54cd9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0074-r1-common-scan10000-selected-on.log": "002179b45b1304efe5bac211ea04fb73cdee1c0e41f500323ed5790e2353e2f8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0074-r1-common-scan10000-selected-on.stat": "667cee456bf8c79d488ddd26a7cb3aa95b7a7af1753c584bd10d31959745e3e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0075-r1-common-scan10000-baseline-on.log": "07634aabaf0a04412fadd29fae34760c812d8bd5e89d36202f07bd4ae3599678", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0075-r1-common-scan10000-baseline-on.stat": "73cd6ff7b5de42c949143631d896dc3d3307d05fc5f6d6215b23b2b9179af573", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0076-r1-common-scanfull-main.log": "06247a04f3eee82f38ae308e92308bec140a5457b48e5f3f718c48c4b9ccddff", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0076-r1-common-scanfull-main.stat": "c1262fa76cb0df57d4610942eeda17eba460451ad645a796dc7a6154e98fab3d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0077-r1-common-scanfull-selected-on.log": "529cf9f0120843b9e5d41089607d49ee18965db334cd8ae44b75e8b8eb61e12c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0077-r1-common-scanfull-selected-on.stat": "a8d4e85684bf06b5974be96503ff7d55dbddcfbd5b716cc3bfbafb8e47dfc4c4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0078-r1-common-scanfull-baseline-on.log": "89070bde52d26e017e88e4042ad4422ba0153522f8af021992e627ca4c18ba10", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0078-r1-common-scanfull-baseline-on.stat": "1ca47b22f6b73cc4af825e76bb0a5d8d93f128b86be0494aaa980909363bef7f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0079-r1-random-pack-main.log": "22601f20f0f12bb000293b348fb7e90100e78c3a763d34c32f60faad7e3af691", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0079-r1-random-pack-main.stat": "334eb99c4382010fda41309b707b3e97815020508f2dac9cbf66e8f03ed0e9b6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0080-r1-random-pack-selected-on.log": "dc31717f09ee33540ec00b39725b3be47b62efd25e309b3c944096c2ed71493b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0080-r1-random-pack-selected-on.stat": "dbd0bc53bd78b36884a95529e5b9d9e71b58920bdbce39b0fa487723d1b9125d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0081-r1-random-pack-baseline-on.log": "9d3dc316a2b1caa903f45eea30176b0dd4898ee2d4124cba9cd6bd6d5c114021", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0081-r1-random-pack-baseline-on.stat": "c32453e031d5b7ef6f6e96c0c2bd11deb8da0cb2c6a79c14fff7cc83e7ed21e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0082-r1-random-hit-main.log": "5f3cd675ac09b9e621d582eca79849f61ec73caaa154e2d0258e5419871133d6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0082-r1-random-hit-main.stat": "55f743ae451e8c8c57aaabd2ecdac6f70db9df3fe792a2935d0152daea5191fd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0083-r1-random-hit-selected-on.log": "ccc831d95d9d0b1ae7b1681dfd21e5d3274bc4f29e34deaa61e610671416ad80", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0083-r1-random-hit-selected-on.stat": "702ea438cb1077f508cea335fd96599e9d211c37cf83a8adee5654c23f46e57b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0084-r1-random-hit-baseline-on.log": "634f1d91e6f46fd513eca1e34af04d1cfd67c4bc2f2c8dde2e40317c74711d05", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0084-r1-random-hit-baseline-on.stat": "d7ecc96d7d49624f2e1689dc6f191c7fcdf9e3ee78ac93f906d356dbe50dab9b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0085-r1-random-miss-main.log": "ead83df13b5980bc5667f4b11ea2fa312db8397e2405f02cea84cd46e3ecbbba", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0085-r1-random-miss-main.stat": "0e3633178b8e670be52144f206651c11fea4a3c68946d4e5f9854276c62daca9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0086-r1-random-miss-selected-on.log": "bb6458b8b220611cabc7a85c795962097560d2e9e84d92691a55b255fb30f5f4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0086-r1-random-miss-selected-on.stat": "cd493a88bd966b81703805b0f22f943b218ecc7cb879dcc178ee17e31948caf4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0087-r1-random-miss-baseline-on.log": "e47e30442ee09f29e6235496ea63d0fcde23a02e9ccacc5c411948ba58463691", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0087-r1-random-miss-baseline-on.stat": "58aa2385be4db1318cf6cbeaae200c1ee035a2c70ab492e2d3fbec8ff5220b7f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0088-r1-random-scan1-main.log": "d587687655d53099861f8b2984ece47e36d206d0d61c405c394b4d6e07a47e74", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0088-r1-random-scan1-main.stat": "c469370794897560c46c6b6a2c6c6656b0bc242480a3ef3eb2e5f9876f71c627", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0089-r1-random-scan1-selected-on.log": "3e303bb9f28d032bbba954d2983ff9b595a57a909a378171a8107665b40dcf58", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0089-r1-random-scan1-selected-on.stat": "bc56e850e5fdb467ff92b7240096815d795e743d1c76de0918214b2e7f0c5d69", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0090-r1-random-scan1-baseline-on.log": "32dcb3bb2c16453205c270bba1a70b0b47e5dc70bf913336b637f3a7a0cf3aae", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0090-r1-random-scan1-baseline-on.stat": "a13c6c4a0cfa7a21d252597773fa65962c967215dc7124bdb93135b6d4a25e22", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0091-r1-random-scan10000-main.log": "1c11ed80fb31d1b5d788f8e49fc6b4fec1622c1c7c2b123d1afc351791365857", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0091-r1-random-scan10000-main.stat": "03b79864dd3f0dfdb0d016c7e1701fecb3f9c79b00f89995b512376f254e0953", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0092-r1-random-scan10000-selected-on.log": "67fd3715583aee0a14cecb12045d4d1318c48498ff616518afff4f7bc013db10", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0092-r1-random-scan10000-selected-on.stat": "db7c9927c92b0664b7a9e05d70b54823800b97dea4d385850aa22f1926ad60ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0093-r1-random-scan10000-baseline-on.log": "1082bc4f070294587b6badfd7267f96496305705f27fddd56ee342e9779d595d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0093-r1-random-scan10000-baseline-on.stat": "31d6a18616be2a562a57f8c8f7bb0f45391643ce7d5bc2ad7711376c1fe9b820", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0094-r1-random-scanfull-main.log": "410f5b3f6d341be9a438a44e5dd46b3966ead83add4d4ea7864f64524d793078", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0094-r1-random-scanfull-main.stat": "c15f74fdff9030b38a5fe32ee0ce96f1b184a267e30f4b8f27a2011edef68527", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0095-r1-random-scanfull-selected-on.log": "eb29cd9aa1745cafad949b52fc968e74aa1012e998cd01415a66da0123e8d490", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0095-r1-random-scanfull-selected-on.stat": "8fd725bdd8d3e5ae4c00b55de5edc6427eb5c0380009ac84bc92aafdd4f38272", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0096-r1-random-scanfull-baseline-on.log": "c5679f5a07e6cfaee401ecf4b6fc0ce65b57375146b373eb56aac684b8dadf66", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0096-r1-random-scanfull-baseline-on.stat": "70c69cd513547bf6bb18c99a9831fc538a2ebbb304d897070676b3239598f9f9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0097-r1-nonlexical-insert-random-main.log": "01cab38cf843b44795832c6c8d229d7bf931097b8d80c3bfbc7bf06399385213", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0097-r1-nonlexical-insert-random-main.stat": "09e2fd1e2345e22c0defde63d5c8395feaf3ebfab6190bd8ff5ce27d45b301dd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0098-r1-nonlexical-insert-random-selected.log": "ce0cb0a74c6f42601a4e62df3d3e28507eb66ab510b1fcea05a1a9b4f8f9d54a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0098-r1-nonlexical-insert-random-selected.stat": "034ed4ff94b252cac17b367dd89dfb62c7c6a80acb32a8351fa47227379abf97", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0099-r1-nonlexical-insert-random-baseline.log": "e03d56bcb60ac078e57f7ea33c97274affced2fc8d1e4e16fae26df9d8794ed8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0099-r1-nonlexical-insert-random-baseline.stat": "28ed1b47a7a4ad0ae070c8afdcf35e94e3335dbeba0e50ed3686d6c0cfd2ece4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0100-r1-nonlexical-insert-sorted-main.log": "55b47d069fd829319f85fde431814244b21180533b80c6d5d81620da96de3c72", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0100-r1-nonlexical-insert-sorted-main.stat": "c0208135ed7c7bcc78086e8961369b2e20324c1e5a976a43792e97465af1893c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0101-r1-nonlexical-insert-sorted-selected.log": "559c294e902fcc7d9430b3666eb482f4acaa5eadb0e0f584a7db895aaa0158a8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0101-r1-nonlexical-insert-sorted-selected.stat": "67309eba8b5a307e13e104cb8e4dfd106801f6a9ace3f314596813f632fde493", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0102-r1-nonlexical-insert-sorted-baseline.log": "c6685ae840995f2e72865f9bc8b18264ba40d49a60a6b4c31bba6cb2a53bd2dc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0102-r1-nonlexical-insert-sorted-baseline.stat": "2e4b774a24908a7d8538a8eac3f8d578b66070a1bf35467ad8ccde67b662b9ce", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0103-r1-nonlexical-overwrite-main.log": "da1ca5566f05abd65be7518e1601897059ac7e4ec83e6f1359cc3bae5c3bc6f9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0103-r1-nonlexical-overwrite-main.stat": "4e31241c147d441f31d85a29ba61050793b9a0606eaeb3cccc4567b32ce3cd69", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0104-r1-nonlexical-overwrite-selected.log": "abf45565f53daaf932d998ade7ac8c52216da393fbb9c1061d6c1106b7ffb725", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0104-r1-nonlexical-overwrite-selected.stat": "cb60f5759d3c992a72430c15229f0f0111350fe7bc775e58740a7755047e577f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0105-r1-nonlexical-overwrite-baseline.log": "6aa6e343c140e3f5f230f3ef49d304b4a785a5dae009d85e99dc22fdf428c2d2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0105-r1-nonlexical-overwrite-baseline.stat": "53c3a90b88aeeb8b222e0e010d63dcc31cec0ead9c5b79922492860a335a958c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0106-r1-nonlexical-pack-main.log": "0c97338c05d00bb432f5cadbf6a4df09d140608b5d5da1bc4c60ac1c45dc54c9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0106-r1-nonlexical-pack-main.stat": "5fe6f8dd071fd78f8f04c07b809b348b17f5b1f75fbdb69eeba7b083bebd154d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0107-r1-nonlexical-pack-selected.log": "4f8ab894b37725c36a9619aa612bea8add94dc433e9dc762fad05d27bec7e406", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0107-r1-nonlexical-pack-selected.stat": "a379bbabb54cde3daedff3c82d0e2a10d51df66e39169d41304605526294ef50", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0108-r1-nonlexical-pack-baseline.log": "d4db68eacfe522d31f4e1efdd63a71ab42818d5285862c7c178050b72c698d62", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0108-r1-nonlexical-pack-baseline.stat": "f6b19255b7d287b401dfa9992b990c2cbe5bf69dd26b42704dda6cbfab66193d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0109-r1-nonlexical-hit-main.log": "53e0af25a6f5f4d150ab9c9eb309573553c8088d05dc72f1be1138d9790adece", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0109-r1-nonlexical-hit-main.stat": "0b58ffb97d308f7ff052773c41c677a00d84dde1d53c5c15f90d29d472add501", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0110-r1-nonlexical-hit-selected.log": "1523213420ee2c15bcf138d94d88850862564551afbe629f0cb71e10ad1b7679", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0110-r1-nonlexical-hit-selected.stat": "76613248a31229dd5c8a6360c1b71d73f675cffda1a930140f71677b267f9207", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0111-r1-nonlexical-hit-baseline.log": "7c7fecdb9d8e89949b391c125ad1b02e76f7c3a52cde36fc25206c231f2ef060", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0111-r1-nonlexical-hit-baseline.stat": "d427819f375dcec27a4ab0ec179c749f7ae87189efcc886f14966f973c7a361e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0112-r1-nonlexical-miss-main.log": "cd9dc94930e3a97d95e8fa3749dc69ebb87862754632749cd4aaee37936abca7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0112-r1-nonlexical-miss-main.stat": "434b81b86a9c0f01e68718975b095231b4ecdeb2d766fa502bb805c3a8066c0e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0113-r1-nonlexical-miss-selected.log": "8f746d8843ed780f1919efa4c004952655fb716f60b561bc07b349c072e0f7ba", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0113-r1-nonlexical-miss-selected.stat": "95e2b1bc1b607d8604d9be6481d9671df096f83ea08154c69c66130ecd6aca6f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0114-r1-nonlexical-miss-baseline.log": "b2f677306721ccce66f18e7bf13cadb82df5385e16ff402a4decf145ac6019bf", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0114-r1-nonlexical-miss-baseline.stat": "385bf9af51e91e03e4576c3d2a2789d5791c13ec0edcf47bddd0242129be190a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0115-r1-nonlexical-scan1-main.log": "8b3925d3ff63b84946445296513b04f6fb592d564690ed50eea7b686775897af", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0115-r1-nonlexical-scan1-main.stat": "55b0f6c14c28d7ea1e6ec475631918484e47eea07ff0d7b2d08fbd5071b83e94", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0116-r1-nonlexical-scan1-selected.log": "6c156bd2f39e44239f3b732c6f0c10bd5e0e45a041990f7a0c164d1cc2980c41", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0116-r1-nonlexical-scan1-selected.stat": "9929d371b71029735c3a259370ee04dfa328f0d4ed3766dfd68d1d6d49aff5a8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0117-r1-nonlexical-scan1-baseline.log": "6d8d08d88a075024e9a751eb44527c0990a2622e9c712fe06d012e7ab0fa84af", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0117-r1-nonlexical-scan1-baseline.stat": "6ca92b059ca1d0f9f817312953324de2968cf4561af3cbb06d41594713876eca", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0118-r1-nonlexical-scan10000-main.log": "99b75b9d7d71256c324d83f9d612d45afa5186b768b2d10a89bc0e167a5b540a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0118-r1-nonlexical-scan10000-main.stat": "591c2c486a4b757aeaf4ba01b52e339267aa2572f483b1801b9001009bf77877", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0119-r1-nonlexical-scan10000-selected.log": "e9bd87f4ad0d2db7a3ed50df72024fb29b1bff2ed3da67954f6601cc6bdb6fb9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0119-r1-nonlexical-scan10000-selected.stat": "61fb5f72edfc38f47a75cbec9e451538fe04a963223373d50fcd246861c248e0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0120-r1-nonlexical-scan10000-baseline.log": "2f9b374e5f5e615db0e566bf4df6cc40aa1606feada76c95a1cf58911d134c59", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0120-r1-nonlexical-scan10000-baseline.stat": "909fb47391b897e98865d8a3d8ceb5aa633c966ff58498fee227da1259cf2c5e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0121-r1-nonlexical-scanfull-main.log": "b80f263a8ad8f7666bfdaaee90f7b3a1ee8b507416f7e658a5d373a25d64c2b6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0121-r1-nonlexical-scanfull-main.stat": "8c7c10dae542c00141151e67fe8a85637643497dcf99c330ccfc7ebc94cae67e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0122-r1-nonlexical-scanfull-selected.log": "fac1f95574f16e5260ef8ddd797d8e938f07abb30ba65ce4f630505c90295d24", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0122-r1-nonlexical-scanfull-selected.stat": "78f2a656ea1ab4e47d2b630ef8f6f657de33a5d46e2651fd0a8152fc543cac19", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0123-r1-nonlexical-scanfull-baseline.log": "608cb8d00f875520bd1cca2ee9b837f49d859ecb6a8d08d5fc287c74de8b0cb9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0123-r1-nonlexical-scanfull-baseline.stat": "5e49fcfeda31fca7a9ba6a618ca313a05d76b03d0b9afe545770686abe5f52bd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0124-r1-common-pack-main.log": "96e8165418f7ec0766b0aecb56dfe2fec1e1a66c0398c001f49fd79ffa7beafd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0124-r1-common-pack-main.stat": "6879bb8ab1d241a611875c2162a152585d286ca9ec7c1c9ff4e28226428ad6f0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0125-r1-common-pack-selected-on.log": "fa6bd0e021e69f081119361eed452f1f4cee251908eef710d0cd2bd0da6b3f75", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0125-r1-common-pack-selected-on.stat": "a4ac1e41703e15a3ac71b65bf43c042857c2d1726152c2c3b65ccdeaeb29aa75", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0126-r1-common-pack-baseline-on.log": "5c49994a41e2091ac10d148e812768f402a074f12116267003bda4950e8a8625", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0126-r1-common-pack-baseline-on.stat": "4ce15ef4d65cacb4dfeab6da0158d4afe11be8a371c0c4690c8f1856d14f6dcb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0127-r2-common-miss-baseline-on.log": "0740196840606f36cf45e9195e5f59910a18812d65ee10102dba87c4eaee1070", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0127-r2-common-miss-baseline-on.stat": "e1e21af9d427f32b238f858755cf210751341e748a26257380f088e66cf70d8d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0128-r2-common-miss-main.log": "e7b659d07faa7d1056ba802cb7acca7d76e6abc74ac10f7f9fe97fc0b98b55a0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0128-r2-common-miss-main.stat": "9ff096f3048886c756fba28cdd5382fe9f5d125a5e340bd1e46b08e8016336f7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0129-r2-common-miss-selected-on.log": "47a8ff2985de2e6e72b96e89696142bc81dc2b6987929ea6c69d1c6242e8869a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0129-r2-common-miss-selected-on.stat": "85c84a4dd8af60af2691a222de9fc71dbb7af5c417bca63dc4d5a03244de1af3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0130-r2-common-scan1-baseline-on.log": "c608545429547367d02bc2cfd59e9fe3d7d4d399eb73dba679976cd63e5afd76", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0130-r2-common-scan1-baseline-on.stat": "ff075077134db1f5b02f9897e8e010f987ea4f0b23958709a7192a98e2d3c133", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0131-r2-common-scan1-main.log": "eea97a93939380d7ba738f67bf4ebcb60f59dce9f52a3e1439a9a619a6469379", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0131-r2-common-scan1-main.stat": "0e7aeb78b92b9fe71de60738064c9a384425627f80243063626e2e8862201940", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0132-r2-common-scan1-selected-on.log": "dc22e60055bb08204960223103e3381e8f04acb6c61f2984f2e6ad5bf4713d57", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0132-r2-common-scan1-selected-on.stat": "940b96f4b3b4ba1a9dc8c5594b4dda83bd9ef77df22f3f98e9fe6214a5f04cf7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0133-r2-common-scan10000-baseline-on.log": "802d8a1cab1f5a6d752a13e1e6961cb4c8b53ec47a3473a5d04f09f40bd84673", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0133-r2-common-scan10000-baseline-on.stat": "8d97e9b54ea633cb7f53501929e893bc5e43a1e71388287b4d27fc7fdcfb1ea6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0134-r2-common-scan10000-main.log": "1a556fb6fdf800243f7ab4243fa6fb5013609faa110f0fffa2f1f71b5151bf0e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0134-r2-common-scan10000-main.stat": "195926b426d970a137c1b761bd9e1959d65af035cc1e653e9bc4e509c1f35923", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0135-r2-common-scan10000-selected-on.log": "179f7c9b653d13f880ae750cfff4b9f6b995d9fc59c17430b3ad651ef28df4f0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0135-r2-common-scan10000-selected-on.stat": "4c39360bd936b1f2f918af8a3c4f7690532cc34bd15ba0881532a21adfddc918", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0136-r2-common-scanfull-baseline-on.log": "27c7939307edb17bc89b6028b8d39cee0913c3599a9051091116d3f1bfd02669", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0136-r2-common-scanfull-baseline-on.stat": "274a336b2207211250d01b822130d8ff0f46baf78daf5d888e8db1cd5c9a0a13", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0137-r2-common-scanfull-main.log": "01241ea7aa3c6ef0590968546a3e58f305f694eb1ea173894d424e44a741b0c2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0137-r2-common-scanfull-main.stat": "b04d1964fdef52832c00e6adcdca63c9411c32195486cfc8232097f574ecbb32", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0138-r2-common-scanfull-selected-on.log": "22467560d97ae9480535b7292b029fa9d51e9ae80bf1f574e92996efa000ed26", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0138-r2-common-scanfull-selected-on.stat": "d2912c8eb223f0d896f02acb16db0a69e917db331361e795c2f9f2028a2b29ef", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0139-r2-random-pack-baseline-on.log": "e0aca85ef6db5b3ab597199d5788356b43286c95503101ebb7d08e84a1ef48d0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0139-r2-random-pack-baseline-on.stat": "27dbe1869abf2718c44351b0546015433c1f8bb2d2bf4041a63eaeff29e548fc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0140-r2-random-pack-main.log": "e079207a826f12de04a5bd0f16ef572c4da416ed4da693dc8de8f24fe07d989f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0140-r2-random-pack-main.stat": "a44b27ed126571111106086ab3ae65e59c2dc13ecf377f57a85046c4e6c78ca9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0141-r2-random-pack-selected-on.log": "b236e50b2df93ad5fd213b378627076ba95aded713148468c9b50921bb7c3f5e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0141-r2-random-pack-selected-on.stat": "a4d7eab75dc8afbe6ec1c898d026fba583fffc6bce95f8369b99b0c4358149ff", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0142-r2-random-hit-baseline-on.log": "8f658abcedc63d8f42e4a6619350a9d3a4e847bd252a8fbf2aa90240a12ba201", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0142-r2-random-hit-baseline-on.stat": "c6acba0bc37560badbeacc1b169cf4f66d45b8a064174f72ffd257522b473a05", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0143-r2-random-hit-main.log": "5703b050be871e8b921b67465bd8cdb072777020a894e4c3e8f65bb2b3199dc5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0143-r2-random-hit-main.stat": "5634af6c571c8227691983125ff1c7d499744936cdd5b049b0491f59a5dcd9d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0144-r2-random-hit-selected-on.log": "845305489f092042f6f9e095bd2b2e1073784c427660ff55665b00c5bc5b58ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0144-r2-random-hit-selected-on.stat": "bb6637fc7a59b58a9b8fc835cb47c64e78ecd7c906be07c0f755fb1cd5285d23", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0145-r2-random-miss-baseline-on.log": "a1674a3896b598e4dfc533cdc7ad2d978a01d08e8b509f595a83bb27d95259aa", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0145-r2-random-miss-baseline-on.stat": "e10872df50aeb7a3147f3d843320495a358b7eb0a6eb008a5dd8005c53118cfe", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0146-r2-random-miss-main.log": "1585520d070ce671163a5cb8d37e46666de28b95d07d84d92ff3b0797b5a62b7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0146-r2-random-miss-main.stat": "93d0fd75ba5e8f949fbc828c4a4b87428e92e5dc62f090b376095448b12dfeaf", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0147-r2-random-miss-selected-on.log": "00ff5a9417673d195b36b93b7d9c19e53851cf37ab6a55208b7717871e539f69", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0147-r2-random-miss-selected-on.stat": "8f74811911837b7d83e7bf4861fb5f9e28fb73fa04edce889cd4899174071f83", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0148-r2-random-scan1-baseline-on.log": "53439605f03004858088bec99a46b6431add5cddad9d37fb17e5c7f9d52f8955", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0148-r2-random-scan1-baseline-on.stat": "c04823808c620ce1744363dc1750b79060ec8afca76839b95ba4a139f6806225", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0149-r2-random-scan1-main.log": "05aea2e1a1f4b63df22182f7682941b40a87a4d27598524385861e5e5bd626ee", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0149-r2-random-scan1-main.stat": "17bb14ed7c85809145d01f325ac1c47db1350afe30a065c365cd0b8447ab3c26", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0150-r2-random-scan1-selected-on.log": "326401928cc4412be43a222b767f8eee5c9fe94dd168c02fc6e2b06dec2eb882", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0150-r2-random-scan1-selected-on.stat": "2aadcb155e991b81f73d364be7ef724e40bfc51a5db6118a4e4f27504c4edf79", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0151-r2-random-scan10000-baseline-on.log": "7218a7bddf843e2e53021cb44302a0bb8339099ebd33dabe11a5b486de4931ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0151-r2-random-scan10000-baseline-on.stat": "007590bc8981f06272e1cae96c8c4818a4abbe52f947911bd1dead3496bf75aa", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0152-r2-random-scan10000-main.log": "5f605efbee6a7216487445d335d77bfc7aad47189991738a309f250f8acd46a9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0152-r2-random-scan10000-main.stat": "3a8f5db22a89b554eabcc518e595cfeac673a72924a75a46c0b96fe2b86408c2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0153-r2-random-scan10000-selected-on.log": "91a08556f10bea96464e1cdc37687888480377cce4d8fbe2b208319a5608d35a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0153-r2-random-scan10000-selected-on.stat": "66c7b1661be17ff047b526d6450d2660f8dccd1d452138c5ab342c38b9d51792", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0154-r2-random-scanfull-baseline-on.log": "c286e03e0c21258c71644aa143ad8a3b93372c69d3d44227a51677289c99543a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0154-r2-random-scanfull-baseline-on.stat": "69441e69febef43e024d9be573b815655c3cb60200799e7e4a349224b783f582", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0155-r2-random-scanfull-main.log": "a312feec61a49b7024ee70811b3d170f41b9004709ded4c02de92643b043cdd6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0155-r2-random-scanfull-main.stat": "d411db3565bc0db3a1a4e0b473ad88580e8f6f6e9b914e2832dfa687f1ea6e4b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0156-r2-random-scanfull-selected-on.log": "e95c1a63c225b5384a72883a2dc0862a2a3772ccabf61f6144ea25c2b4ae8a0f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0156-r2-random-scanfull-selected-on.stat": "3395e202b34de3a11ce47b420759d5b9de509856de33718adbbeb66b146d8369", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0157-r2-nonlexical-insert-random-baseline.log": "5e536dd500da4eb7d6bdadaa3a2bae20f87cb51698f70daa8847486da87081e9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0157-r2-nonlexical-insert-random-baseline.stat": "b3afb1b0b1c1ab9785227b1bcb3b5390caf9aac54549d0e3bfc916c90d218186", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0158-r2-nonlexical-insert-random-main.log": "594fbdfa69f01d7fbd95c2dda64a3058f9c4bee21e2dfd7cef048967a56d24e7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0158-r2-nonlexical-insert-random-main.stat": "2b798bba8bc5d464e66fdcf20e0f3e88c5aa13c98c73a7f9f7a293fba43aee0a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0159-r2-nonlexical-insert-random-selected.log": "2ed9965b46dac0d8a34e45f18cfe78e3082f84f41fcd4dce168b78846b3e3d46", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0159-r2-nonlexical-insert-random-selected.stat": "f47e3b2c57d7101ee1dac90175179f65a771abd5f47ef80353e08d2d0dc8b7bf", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0160-r2-nonlexical-insert-sorted-baseline.log": "40c0dff25d287922c7805034d47af5da8b19efca30360b4efe3631d67b87c093", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0160-r2-nonlexical-insert-sorted-baseline.stat": "5a1f628559715103d7893c701b82715059b773f939a8b14669e392c185d222af", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0161-r2-nonlexical-insert-sorted-main.log": "0cd6ebef71f19f622674fcf8c591cd34542e423772ba331b3c42e59b3c02806f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0161-r2-nonlexical-insert-sorted-main.stat": "f4a51f7312c480757b6d498530b502b0f8fa421e00c9652ae568d523225f514f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0162-r2-nonlexical-insert-sorted-selected.log": "16bda6745c4e3b33dbb909db43ae5aa8ab11c8dec42b63450a0ccce07fad4215", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0162-r2-nonlexical-insert-sorted-selected.stat": "66bf8f7fdd989a83e9f47a720363a3a07bd5bb841c15d5e738cc56a4bcaed6c2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0163-r2-nonlexical-overwrite-baseline.log": "8fc4947ad8bdfdd0b8e05dbda5423e5f52cadd823e87ff9b7a2b919d8aae87f0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0163-r2-nonlexical-overwrite-baseline.stat": "e312e4c306999fe03680d2988b521b9096ed07e6c72e0734e9c5e87187ec1242", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0164-r2-nonlexical-overwrite-main.log": "92967c1d0f2a08b1e04ace4f7d2c054fdaab929db78f066086bbf8ec4e78c544", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0164-r2-nonlexical-overwrite-main.stat": "991a640e8d7b9f225cf482e74133dbbd1a38e371cf6eaa1a18c2d07cb22052ce", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0165-r2-nonlexical-overwrite-selected.log": "76d8c2a86cfb1c1801acd43b9bb54a1af350a6af1597ef27cb327b93ecf99173", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0165-r2-nonlexical-overwrite-selected.stat": "68a256df4b50c40be35e4fc0be698872cc8d6931548909b41f7b539ffbbb40d4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0166-r2-nonlexical-pack-baseline.log": "11bef67f7eefe0b56e1950e6bf706fbd7097b1de900d675266ea4b0a1a6827f5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0166-r2-nonlexical-pack-baseline.stat": "e0d2e1a5eefcffd7ef017a38112df68983bffa0b5a8c4d5e5bee9b534c5d06f2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0167-r2-nonlexical-pack-main.log": "6c2957efb37e533e542da5550f70bcc0b53bf849e1d82db34a46e17da5da9b93", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0167-r2-nonlexical-pack-main.stat": "b227413ec7fee3b318150aeb6cf77ad8e65c03d618f732803d6f24c2e862d0c4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0168-r2-nonlexical-pack-selected.log": "3af19360f4a7602d6e1108aa72b8223d19b07c16c5fb770c260c58b99a641e61", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0168-r2-nonlexical-pack-selected.stat": "7b9debc248e309eec3579bcf92e6b66ab066d99708d06af1c906918822b6642c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0169-r2-nonlexical-hit-baseline.log": "7b8aca0cd71cbd8509f42f65ef572f0caa3be66a294fd45171dc1d4e66c13e3a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0169-r2-nonlexical-hit-baseline.stat": "5a303dd8fdbd7e38ffd1faca1c09b531a6a21df1be003c2c54347a36e46a0c89", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0170-r2-nonlexical-hit-main.log": "070c31fec4ce2afcebe40767c22164e8f200771c5b7e5e27ae4d81a1e86e6a0d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0170-r2-nonlexical-hit-main.stat": "f377ab615cfd3e4d80290255acaca83bca30dbcb5ea0d6af0af5605bf962c604", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0171-r2-nonlexical-hit-selected.log": "30f21e189400a7907f7c59a97db4ccf725a46494efbba2dfc9d4644795520e93", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0171-r2-nonlexical-hit-selected.stat": "6c90087912c0bea7d02d936819cc8759a7e72e3240b0fda63e381da61601852c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0172-r2-nonlexical-miss-baseline.log": "afc12cb01c9220d01254c43d5e5eb8ddd3b3c025604e1e0d2d012606723f22e9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0172-r2-nonlexical-miss-baseline.stat": "2256e1807d02b46f2c74b8030290031fa1e4c3f79200c1dab55028e800e8b17c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0173-r2-nonlexical-miss-main.log": "3eb40cf9381ad9152b4fe1ebb5bbbd2a829ed3400f33fd52df839dbbbb9cf34d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0173-r2-nonlexical-miss-main.stat": "eac9971f067c9a44c62eb29877ac434a39560efd4ed062f646f496be1ba66414", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0174-r2-nonlexical-miss-selected.log": "e81ef9a7427ab1b20093e7bc7d93d896b40c576f39f3004ec69766e5e71482e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0174-r2-nonlexical-miss-selected.stat": "9e2b8f6102256cc0d7b87380d087fe415bb9d03ba920717148e7674f6f77d25e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0175-r2-nonlexical-scan1-baseline.log": "1e1cfc39924b3eb79d2d81a2c3f3eab2ba01b35d88e160b006aad330724ac3ce", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0175-r2-nonlexical-scan1-baseline.stat": "4b67a1a9cf80550108d47a8ce476f8d9455debcdd9b95f44fad6ab37b0a885a8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0176-r2-nonlexical-scan1-main.log": "f39ed256d5fb69c0f9894bb6d33e6a373ff8547498d45b5cbc78fff665dc68dd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0176-r2-nonlexical-scan1-main.stat": "d12bc2eb0f33b11128885dba5db285afbbbcc31a2c02183e1595873d6c2f3478", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0177-r2-nonlexical-scan1-selected.log": "50ad55ed7a039d4bed7ee94863257b2a38e69c56092be66514292d0fe19694c9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0177-r2-nonlexical-scan1-selected.stat": "d64a6f27ed3b437edb362ba59ac7465f231af6f0dc59d4db4b7a2567f038f48a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0178-r2-nonlexical-scan10000-baseline.log": "3a837ecd6baeb6d8c182377fd98d40259bd287749e3a9abde3ea2794249b7844", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0178-r2-nonlexical-scan10000-baseline.stat": "c8fc1c6f6158c160c439216e133e30cd4c662ab744f7bbd23bad8d01395b186a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0179-r2-nonlexical-scan10000-main.log": "7e20ca5686438e0ae0b6f688bf912b24c82b8bdc83fa2cf4fa4585213d0a623e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0179-r2-nonlexical-scan10000-main.stat": "820e66dcfbea22a474e70193e31146e930a968ee770a398cedf66bf332be2b0d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0180-r2-nonlexical-scan10000-selected.log": "5c07431529a481d36fbb151b7246a9f6f12d37967885ffebd93638b7cd308448", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0180-r2-nonlexical-scan10000-selected.stat": "6ec1be2e684f30dd8cabd006586ddb3814b15a42495542a2f4262d7763f79542", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0181-r2-nonlexical-scanfull-baseline.log": "63adbf6526d80065f2e03a007bd2cf2059bbc8bab2e643c4f0ef4c9c5948efcd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0181-r2-nonlexical-scanfull-baseline.stat": "7d8c0089362a1674e2b2ae976dc4cddd79e4fedd37d1767172c88bd2c28ba813", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0182-r2-nonlexical-scanfull-main.log": "bff567228addc82a8f7b4fe7ed05ee65cd7cd6913a9112172fe5f962045694cc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0182-r2-nonlexical-scanfull-main.stat": "3545fd861252b567fe95fc17d5d09f9ec9614a54ea8eb684b77217ecc043135f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0183-r2-nonlexical-scanfull-selected.log": "e9d0b59005fb7c4faeaae9641776edb127a1b356450a541e2a289d401eae09d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0183-r2-nonlexical-scanfull-selected.stat": "2062fb152e31a3080ded0d955080509eb11a3c1734256e1ba5641c3ec557ec48", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0184-r2-common-pack-baseline-on.log": "3ab404a9f2b550b13747b7f14add0fae3a6606eee920abc72dfb8e3d9f6383d3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0184-r2-common-pack-baseline-on.stat": "73adc4d42ad028af01f15c0c86be6c0a5cb931bba823f882f75baeeb2416bd13", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0185-r2-common-pack-main.log": "dffd906ec6fdcc903375b4a8250251bb61cc0b1538db2035b1ff6f3b8d853262", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0185-r2-common-pack-main.stat": "2d2a82a848dca8a7bd9fdc79e3e07fd07742334f230d5e7b86dc88866c8e65ed", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0186-r2-common-pack-selected-on.log": "4f0aee22bf32b647a5d3f1fd1fc9eecb7b56ef097687d12292a8d48c42a8cbd4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0186-r2-common-pack-selected-on.stat": "f402683da567a4c226cf2b396dc579a3a1a1ada6d4cdcaa6309ae1af86a4f69b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0187-r2-common-hit-baseline-on.log": "e11907db6c39a36e11c9c495284145e390f616f7005cab2484f628b973e11cc5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0187-r2-common-hit-baseline-on.stat": "4bf1cff27a91a686e710f7294b65f255c81a034ac2f7bd00d7952077b9e7d03c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0188-r2-common-hit-main.log": "5eb6cbf43d67451acb9f6383bd6c7a24050468ebe884354deb5f357c12991f2d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0188-r2-common-hit-main.stat": "d2b4f0a31f8ab1b8faaafe15d61f4295a2a7078d50d87a8bd3b04f346b40f2df", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0189-r2-common-hit-selected-on.log": "414be4a88b3f0cf1e76371cc5b29c8313070072729e90c20fb452cc31a653588", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0189-r2-common-hit-selected-on.stat": "730f32d0a0a0f80adf804f4a5aec0f5b99a651a7912a9cb5572c87a7ca11554f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0190-r3-common-scan1-baseline-on.log": "749a4bbb672f4a490aeb45f4aeb05e71ca7dcf5d095c33206e2804c645986302", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0190-r3-common-scan1-baseline-on.stat": "c86c272de87530b7295f5cdc56cde67ea3644362692b09a2c402b1bd4e222280", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0191-r3-common-scan1-selected-on.log": "4fc6b1d7e75d44dfa97cf491bd8bfe25a1d19f9b766a3a29a02c134d5f7d7cbc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0191-r3-common-scan1-selected-on.stat": "d153e4b91ab6dde525de4989649ac5eb193cf901177015992ce5901ef5ce1103", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0192-r3-common-scan1-main.log": "b4e9e6cbf705f46d7fb59f5422ed02158645a07dfc212f0d2f538099b32b4693", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0192-r3-common-scan1-main.stat": "4bb00022ca00b3a932e2fdd98909396b9b6125794ae3060619080949c22f04f4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0193-r3-common-scan10000-baseline-on.log": "6c58c41b85e6c13b1f0efb70c47a5941f76e8a192b58223d59eaff36db5502fe", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0193-r3-common-scan10000-baseline-on.stat": "4af5787a19eaeecc2deb5fd8cf9a60218581bcae0d00cdad833a74da25c98856", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0194-r3-common-scan10000-selected-on.log": "a9592a3c60b789fd5cf6c232c44410b2c0853ee08caa75dd5453ef2f84f8a1ad", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0194-r3-common-scan10000-selected-on.stat": "15f8c955f8b6d52128f02956c5e0a0aad56e7f9c83fcf001327339b6710748e2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0195-r3-common-scan10000-main.log": "d7ab30924b401451300b1f883dce287b75e4be9cdb993c8a48f1dec6a5231fe5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0195-r3-common-scan10000-main.stat": "2e1a297371d9ae9bac3c7bad46cd990d973108c34c4e2dce6dfd957ee23d57ef", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0196-r3-common-scanfull-baseline-on.log": "778cb7c2fbfdebdde64304c133597f84c24970c0a269219ba950daf8bee5e041", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0196-r3-common-scanfull-baseline-on.stat": "a317f2e0aa4f291c406e29bed41359bdc1f2afeba813b5cc80d544eedef562c5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0197-r3-common-scanfull-selected-on.log": "adb705fa18498f105a01ad4d7e90efa47e9f86e6834c60aec55e25a1171d5dc9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0197-r3-common-scanfull-selected-on.stat": "62bc0930874eea0749a9bbec24a9e24d346e142c20700abfe647c35ab574ba1a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0198-r3-common-scanfull-main.log": "6e67298519596824ac46f51a074c716e9fcca694635658f121a32eb5ec3477ed", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0198-r3-common-scanfull-main.stat": "d9cce5d1afe50e6bbd1bcc6c696b96db22dc38600dc0a368452e3cdc0e5d68ca", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0199-r3-random-pack-baseline-on.log": "a923c2950f355dc213d43d186f450942e8cf44564fc6878ba84dd45a8a8c42e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0199-r3-random-pack-baseline-on.stat": "f5b97eb0ed23276b7f9bb32c821d6093722e6d2fd74a072b00c8605f95795568", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0200-r3-random-pack-selected-on.log": "6fb5fa2cb0562fa5e34328b4ee028c9856a393d423ae78061647ddce783f936c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0200-r3-random-pack-selected-on.stat": "b1fff1cefd105f63b2fd4b1d787cb6c968def5c31c772ae1c67a33a8d2447794", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0201-r3-random-pack-main.log": "f6292ca4f9f94dbb3ca53ce50571e24984796373e11b2ddc753b1ba19a028a54", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0201-r3-random-pack-main.stat": "bb74a02404daae112753585804e0283e9a6c3b0310a360c2a46b9306d9b18b75", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0202-r3-random-hit-baseline-on.log": "2303acac90905bf3bb6937bf469f80c33bdcf52a029e1b8fb8564f3c5e4a483c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0202-r3-random-hit-baseline-on.stat": "f1b2c4598382c574908515298a779524b2593d92a0b97db57e3a8600093ebf33", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0203-r3-random-hit-selected-on.log": "e32dea1a9a10145e24b35ecfef37800c186ca591c61cb850298ad10eef7fef2e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0203-r3-random-hit-selected-on.stat": "7a5f4b308de90ec02da8862df571684841f5b2328112b1736496ebb819d36134", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0204-r3-random-hit-main.log": "11e1c72f507f80ce57a0f643a53ac4316f26c667ff971367564282ff08e41479", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0204-r3-random-hit-main.stat": "3453b3d337679f04d3a7ba26b4ffba5c8023a02a23fd21d169ea7496b9581ed1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0205-r3-random-miss-baseline-on.log": "b602bbdbda70105b718155de1bfb6c5a25e6087b2cf90d7457c7012f1bc3067c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0205-r3-random-miss-baseline-on.stat": "060efba18e36596e4c80d08e503396ef7719432b32e53bc85cd5b2ff4b5692b8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0206-r3-random-miss-selected-on.log": "2c426fb16661a05662a2f84ae845b2e32ad0c6aef3a158eb28730f1eb67f645e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0206-r3-random-miss-selected-on.stat": "73a38d6c0b0dec8178b128768be4d3aaf29b584dc0833b0af693f0cfee74db24", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0207-r3-random-miss-main.log": "a2f88f51120cbf1ed06360215b1f63406babcaa9e5b5730c693b2cf62184de3b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0207-r3-random-miss-main.stat": "9988355e4b367a77ed64ed0ca523a310b59170ec38e77ab21da918af3a2ed415", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0208-r3-random-scan1-baseline-on.log": "8c773d665c65de6f22d3f6c91fc7cf51c7c259bd2d403fecb4c10451eca456b8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0208-r3-random-scan1-baseline-on.stat": "50ea8454cd5fe422bd0a2bafa877a20484620e6a2c5fa58940dabea0066bd4e7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0209-r3-random-scan1-selected-on.log": "861bfd1f105f97ca28acb914e22d2ddff9399340a2b3c8992070544a3d9c935d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0209-r3-random-scan1-selected-on.stat": "a490a32995fba81fa8f7a6b04d51be04f98825e2167a6424f567f3187e06998d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0210-r3-random-scan1-main.log": "4ec5b301e730a00db14e6abd51a83b39017940f7ed372e708a555cf387080272", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0210-r3-random-scan1-main.stat": "60e92d49623dc5afc7217f199e3aaa2bbf7f31ab96cea20dd2eb928ea7439176", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0211-r3-random-scan10000-baseline-on.log": "789a5c35c7358d2363184e2a3fb66d8c34dfd8e3ef7a1c4cad484a9362e360bb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0211-r3-random-scan10000-baseline-on.stat": "8e7872e46e634597e8f41f982df40a905d7a43d138bb43b77d08302a0d5ea7ce", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0212-r3-random-scan10000-selected-on.log": "46d5cf4f4080a17dd8a0eccca80b088f4acf404894ef19221d7a14722bbe5b04", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0212-r3-random-scan10000-selected-on.stat": "e11da2ab7532277e147af1d18858bf6eb1dd8c37def96be077543cf9c5bea679", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0213-r3-random-scan10000-main.log": "cf224c673d4877597c119580cdb8ce3d6efed6faecd215b78eeb34fe9904782d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0213-r3-random-scan10000-main.stat": "502cc7368838186f0e7bce25d2127929d7f78486b0f8abf4b96851b1a941ef2d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0214-r3-random-scanfull-baseline-on.log": "1340d5973159f0ce6f3a26afc5aa442249c52724a14ea89edf500927df3c6f71", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0214-r3-random-scanfull-baseline-on.stat": "737b7dd28ca178816f949350feb2f093c790bf55286bc7fe4decb72dac1a09e8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0215-r3-random-scanfull-selected-on.log": "e635de6e6203ab86db7e383a549c84ae9b14db8818057bf53e94764e38eef7f9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0215-r3-random-scanfull-selected-on.stat": "5e7bcc0288c2bbc4a349f29a6fc3792228b675795cb7a0a933a3340dfa20b7bd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0216-r3-random-scanfull-main.log": "674b308bc11643a9c0f510d1728f618a22174d9e8ba2b3232627aef257613f47", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0216-r3-random-scanfull-main.stat": "1eb2469818e95c304d54d2b8821513c322bbf18f5963d9be6f3b2603d84762f1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0217-r3-nonlexical-insert-random-baseline.log": "5961716984eb41d21619edf9ad4e847b7f2b9fbf38ace53c420019b68f71bdcc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0217-r3-nonlexical-insert-random-baseline.stat": "ee47b262b2d8fdb37918c7c148cfc6a42d439b9da36521c56a76390ac4570b41", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0218-r3-nonlexical-insert-random-selected.log": "874cc92bc36f85b4d23674540816377f9a9f3675dcfe7c013293d5db41527d89", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0218-r3-nonlexical-insert-random-selected.stat": "d23a94681e7ce8a7b7fa6cf34ba7dcc3a894163e455156af2652836f241c9ea0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0219-r3-nonlexical-insert-random-main.log": "6ed4575b8bf521e67b3a350da03546ac8dfcb3a544b448114bc926b94c518389", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0219-r3-nonlexical-insert-random-main.stat": "5ada9aa01547948b22ba50e07a34e492ba1ec7dc62ead544e309fa2b26f9d489", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0220-r3-nonlexical-insert-sorted-baseline.log": "893addffad5d9562bc79b733d36b8abeaf57a03768c469fe28c51559e371321d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0220-r3-nonlexical-insert-sorted-baseline.stat": "9828c350b02e4cc7013ad6d2925d92fdcf897ba59063cff643b4351d98a71120", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0221-r3-nonlexical-insert-sorted-selected.log": "b85e917ac335c439c0c981ae57dcba29e8f66f1c70a88a74a26048e3db42f0dc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0221-r3-nonlexical-insert-sorted-selected.stat": "74e540752e2f3ef2e88169550ae00efdafbd1025cebc7492d58b217cdf9eb61f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0222-r3-nonlexical-insert-sorted-main.log": "1d1bb87697722c821dc49debd6f79ff58cae90bc528684fe279d820069857b06", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0222-r3-nonlexical-insert-sorted-main.stat": "29bd488a6ac84e3eabd2393e5e21d743dd737228fe226997194f507d7649f466", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0223-r3-nonlexical-overwrite-baseline.log": "c2e008b1a20800ece5ce0e9a87681b1a6a81d20cdf7d41fb28f074a8a377c765", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0223-r3-nonlexical-overwrite-baseline.stat": "c65e9351d6563bf2ca67821b3f2f3ed5f86b4e71d5a36dde3aef136e988e40c0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0224-r3-nonlexical-overwrite-selected.log": "2a1a2886e3ea2e44a254c56439ff2d33a6cd5ca8c2d97cb2eff34832412badd8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0224-r3-nonlexical-overwrite-selected.stat": "2f1f1ca5ab78e4087bd423b8e8d1729670ead996f1f977445af4c9d0a971e99c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0225-r3-nonlexical-overwrite-main.log": "ee4487066b872ed6cc4beb04f8536c8b79e95d3d231879cab2be12574a504c02", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0225-r3-nonlexical-overwrite-main.stat": "26a0bcb1c6e106d04617651bb82c3fb00eff18b63b78484328ad359a9d4ce83d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0226-r3-nonlexical-pack-baseline.log": "f454367be691336b89af23f6702a39cebc73422731c90cfb5c63453febe50b14", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0226-r3-nonlexical-pack-baseline.stat": "5f680ad85d80d042082255e727c5e3398145be071ca199d2acab4da617a595a7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0227-r3-nonlexical-pack-selected.log": "d87767018a066479e601999003fe2578549a5c2b3512cee87a58f5bcc094477c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0227-r3-nonlexical-pack-selected.stat": "58e0227d95c933e2363e7a5c02b86d729c65b47c650b265eafbd509134c7bc4a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0228-r3-nonlexical-pack-main.log": "d2b46fd3440a12fc10cbce883bffa9a26979c05a9065f9d00fe20873ace2f338", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0228-r3-nonlexical-pack-main.stat": "5818ae2d2dc2ed8a6883a8e4579338821d11051d3801de9821d360e7f5f2d8de", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0229-r3-nonlexical-hit-baseline.log": "389a3bfa2212b28f04ca147f84289218288b7b5340c80edd761937a47afef5b5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0229-r3-nonlexical-hit-baseline.stat": "6582443cc79d857458d203c21d943c10a06627b5ec575c8f59079db2e5589ee6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0230-r3-nonlexical-hit-selected.log": "65f6304d4ea111d8d368d26558d4500cec4f4d5cf47593f961ba8b7df161153a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0230-r3-nonlexical-hit-selected.stat": "2e60bea906fcf93df3f7955eb77c701b36409cd261be4af3d35a57d76e029104", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0231-r3-nonlexical-hit-main.log": "b8639007b22a4aa5e3c5294e21494c5c7b9a25bcffa6c27b85424745c7579f0b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0231-r3-nonlexical-hit-main.stat": "a43fdb71265efdb10f044009e65e463eacc388f70e39c9ad8df40882697daf7b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0232-r3-nonlexical-miss-baseline.log": "e7cbd1413df487bc9f9b5f374ba113aa3e2fb3bf66463cf9efe0ebf2ccce3de6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0232-r3-nonlexical-miss-baseline.stat": "5b63d7490cd52f125bd9f4c2bae3a64851a86e860a3cfb50db4237de160241cd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0233-r3-nonlexical-miss-selected.log": "0bd71d5cfa371a4e3fc0ce7f2a330367dcad9954f6fccc94fc906eb6d51e1d42", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0233-r3-nonlexical-miss-selected.stat": "2492f3344507355a0f40d8666b427c3f420bb9ee8406d854552b3b3958bc2bc0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0234-r3-nonlexical-miss-main.log": "7d0abb6c95c46cdc24b31d02d4205f1715dce0a37663a3d2d11db8fecab94a48", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0234-r3-nonlexical-miss-main.stat": "5447efffc1fc2df8ef4d43be4f911783b6fc6f5cb3e666bc85b64dda269a926f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0235-r3-nonlexical-scan1-baseline.log": "77786ea132dc89f22f8b1cf5201008d69454c3099600cc7aa80c361261969ab5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0235-r3-nonlexical-scan1-baseline.stat": "f582b38db8e4640c2334fd95997942c38267f8b70acad3dba6560b94437a50ad", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0236-r3-nonlexical-scan1-selected.log": "d2459825e2f36819bb1411b86738ecb09064284b423ab33e69566820c5eec827", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0236-r3-nonlexical-scan1-selected.stat": "77efb540754660f965c6734012628160674eaf8b55eee788f97b1b4dc64b95a3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0237-r3-nonlexical-scan1-main.log": "ad22022165909c5ba1c7148cb67b9a2b20d08412e198fb08cfce5bec4049098f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0237-r3-nonlexical-scan1-main.stat": "fb80b70ab274d53a793f6b89b38db0a771a764c5b3199d731bdccc35193040b7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0238-r3-nonlexical-scan10000-baseline.log": "129a2df5a6e2edd56065fbd6de3d729c51e1588d9fb6d2f04d5e948a654c0fe3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0238-r3-nonlexical-scan10000-baseline.stat": "4e11723f549b75928efc8332eaa8ef0e1d273d251a0392fe3391fb6df5703740", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0239-r3-nonlexical-scan10000-selected.log": "b7e1cd4b3bfd040134186e085fc5b5f2d2f51cfd563c492c09e77ef557fcf4dc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0239-r3-nonlexical-scan10000-selected.stat": "7fc9db3dc0a2ce3a3e94cb6c925b851b5823fab24e7eb238eb14dc68d539fa15", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0240-r3-nonlexical-scan10000-main.log": "6b312065938b0c857d5eb1aabd483c95c0a5e5576917b8728ed7034e27a9e24b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0240-r3-nonlexical-scan10000-main.stat": "e4586ccb3dde10371d2a7d768b3da5e3e2b8d0047828e7e2ceea06c57eebcca3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0241-r3-nonlexical-scanfull-baseline.log": "4fe2b0f283a523299a7c4a7d3592a7cd045f06cebe455c0783526b48e7028d74", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0241-r3-nonlexical-scanfull-baseline.stat": "75afa3355e31e32a83df83f2adbba1af236d20b73a6b2e616ad43be524c28452", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0242-r3-nonlexical-scanfull-selected.log": "1216568b38670578d2596bd1c7f168c28e6a2067c71bb4cec24cef2327a193e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0242-r3-nonlexical-scanfull-selected.stat": "54f90de0dd79d699120b9a2f1d4d38fe9d0f3ecd22bd14e571fd08419c321eef", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0243-r3-nonlexical-scanfull-main.log": "a6624c9870869a7005bbb6e575f3a44348a0d9092712ce24092e923a087f380b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0243-r3-nonlexical-scanfull-main.stat": "223bd9c9a20ac89bed42ed78998abdc8ff371f550c92bf2698c561e51636b61e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0244-r3-common-pack-baseline-on.log": "c28a71444883fd844e8043f8d5e46008059ffeb63f06ebd1de84bc537ae03974", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0244-r3-common-pack-baseline-on.stat": "13eff8da406e21f28788e71d6bd59e3ee33e71c9d55dce477b5b6143d62d48e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0245-r3-common-pack-selected-on.log": "91898abe3202a5bd4f0d97842b333bd1f490bb7aa2cce9e05abf4ae74ce591d4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0245-r3-common-pack-selected-on.stat": "a8c6c60c2e119ce48818569230d94a81d1af6c38f1b16c902c715bea80c7e651", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0246-r3-common-pack-main.log": "6387fb12e72f59b30902145309c19d210d62555afcb9ba37fd917678eec986eb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0246-r3-common-pack-main.stat": "69fbb1e8723fa7fd5909adafec87474e90111df3c862129f6b178f645fd5c12c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0247-r3-common-hit-baseline-on.log": "23245cef00144d0dcb7597cd1ca9abd077b77fafb7e6ab81e8603e145c13b5e1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0247-r3-common-hit-baseline-on.stat": "c54e058b7c857db57aac5ecd320e32759c9f9030e6ad0ac0da039904b4890324", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0248-r3-common-hit-selected-on.log": "580bed3f120762951395635e2657e172351dc0474104cecbb23b5871537b3d65", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0248-r3-common-hit-selected-on.stat": "907918a4c2ddc372c5e8b57cbfe001177c2c06dd85b3646acc89e4cc5a084ad3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0249-r3-common-hit-main.log": "8d0febdc61c5ddcf0d0b4c55bf5c9deb29370d170ef8018eb59a94dad49403d0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0249-r3-common-hit-main.stat": "94835932923498a03b0cbe1956e2bcc97e28d1c69293530d2a752b0502b02b67", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0250-r3-common-miss-baseline-on.log": "49d66ad660c4414c262799762a270232e3b1a299ab61cd409f57c6b1362a1dc3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0250-r3-common-miss-baseline-on.stat": "b02d905f7358b3a05e96f76caeff9f0988cf0c786c737c4f20484376dd8b3b51", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0251-r3-common-miss-selected-on.log": "bb25fa26cae8399a0854dc545364a794392873d6d79747c62b8decbc5356e20a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0251-r3-common-miss-selected-on.stat": "2c7570f733ea2ee573435e343b7f55dfe1a1d0f5dc7736f555acb610b0506ea3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0252-r3-common-miss-main.log": "177dacd3fa935b2870f0cb521a0c0f353604e81e8a6e7bb3f52ca69277752b4c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0252-r3-common-miss-main.stat": "a7cee580d0f9de10989bb4ed7192ed43a945b897101445e29c3ba750751290a2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0253-r4-common-scan10000-selected-on.log": "6f9abb61d93b317b11f250a20fddaceaf63b16448ff4915122e3a3d0a289e00c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0253-r4-common-scan10000-selected-on.stat": "1729dcaf2a4b65c6d9c8d901ce493ba29cd60f399cdc01a9a54b811127cb6cf2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0254-r4-common-scan10000-main.log": "b46bada10d0f7928cd7a6e9dbeb116c63f6f29475231ba5811c87475bb6a3003", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0254-r4-common-scan10000-main.stat": "7108892b8e1ed6531009c8645d1f02ff82ace890fff805200c2728d4291ffc8e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0255-r4-common-scan10000-baseline-on.log": "3d055269323df228718a20e7aac0f7e1242a9fd2c6ed2b7f29235e392d5a7862", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0255-r4-common-scan10000-baseline-on.stat": "1f23d76b9f361ebe765f95d176aebb1b4cc82330fc3604cf8ae34f82369ac4ae", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0256-r4-common-scanfull-selected-on.log": "304a7ff937cd54f49cf01858c79d8e620251b7b3015eb07a687244303edec572", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0256-r4-common-scanfull-selected-on.stat": "1aaee6087af9b6c776e612d14df8fe70a099c3c008be1db49c525326c5ad3b38", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0257-r4-common-scanfull-main.log": "7c7995325a6b43453a41e4da10a35348e2a8b580306b2b2914bb2cf30c497a47", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0257-r4-common-scanfull-main.stat": "206083a15a37d66080334cd6632eb0947fa7d98f36225dbde54c6eeefe4d70fc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0258-r4-common-scanfull-baseline-on.log": "5686e6bc2261b71847a82ce0111461cdcec0d7dd02e4a7569161b9772db1ba75", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0258-r4-common-scanfull-baseline-on.stat": "3c829b2a4b3488e18b19b35135a5e4163fc1ed1b8a2141d3c0ca911e58fd9288", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0259-r4-random-pack-selected-on.log": "46a3a1a33a58d3a0663dbc11240864ba84b11f3e3b18f02cdab98b375bc7546f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0259-r4-random-pack-selected-on.stat": "d96e82a1674e60b861989e36534ab941ffe76d455929a642e98411c41de1af05", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0260-r4-random-pack-main.log": "16b7d42ae88b5eba34053a57ee67e800dd29d01f5c9a07e9b701b6975b06e609", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0260-r4-random-pack-main.stat": "fe5cf6ff46a9e42724480a672ff708f6e85f29518c149a29cc6227524d304771", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0261-r4-random-pack-baseline-on.log": "b149a75e5632c0750ccec4758b0b164807df43e59732ce0dc1fdf2116ebb302a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0261-r4-random-pack-baseline-on.stat": "d38a097d7232ec1d282929948c44426e7d98f60ef66fa6978b4c0c0d8ffad63e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0262-r4-random-hit-selected-on.log": "627038930bdb72496c3c83b13fb6488bd05416a63a5b5a3bea2fd51b5fe831c8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0262-r4-random-hit-selected-on.stat": "3f80c7256bf9eefecb911d17217fe1641fa43ad985981cb00ece6e79f1c87a41", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0263-r4-random-hit-main.log": "60536b601d69ab67b3f940bf4e2cc0a2ef8fabf5fe89b022dce3d10bd5bf53b6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0263-r4-random-hit-main.stat": "a13dda531e85ca1351ace9671f5bdcb91e3ce15efa4130e7be2247acaa916a40", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0264-r4-random-hit-baseline-on.log": "280da1a8c78edcc9e3c78c0f46ee06f81b712d5043284daada337feaf662d3e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0264-r4-random-hit-baseline-on.stat": "1ea89c7640ea09d9bb32b9175f84b88ccc60b9fe594a625a4504ee5488ca4e0e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0265-r4-random-miss-selected-on.log": "e911ff87ce0e1eb6c2028b7205e2f7657e24c118ff7b674403edc66c59597dc1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0265-r4-random-miss-selected-on.stat": "982ead3df89e8f3faf5d83558728808bcfcbdea0ea0ee81e829bbef92a174bdb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0266-r4-random-miss-main.log": "265a3a0815c9e53c4fec8606531dde50b192d34b1a296ec0548d7564bf4b0329", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0266-r4-random-miss-main.stat": "8b0db1232d3d9ac04c8e33aebf9b3d33497cec61bc2a5b5dc8cccb342f7988d6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0267-r4-random-miss-baseline-on.log": "415b7a2e37fd15266eb963e2373256ea7861f9a7aa7387727fdb97f50b7ef16d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0267-r4-random-miss-baseline-on.stat": "71452740f54bd44a33a4475857b19a4c811962731809522f2bc2c100f1f2e9fb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0268-r4-random-scan1-selected-on.log": "f203b79539e8a0b830c36952e88924a6d796dfd8d5aee846ef632aabc2739cc5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0268-r4-random-scan1-selected-on.stat": "163675204efa01b614005fc44472b45f0d348af7446da31ab5a7c874263aba09", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0269-r4-random-scan1-main.log": "65afb6ce87459241e4e4bd30fae8d4ea293f8be2867a6677d7d3c4903b57beb6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0269-r4-random-scan1-main.stat": "48e5a3a90638933cf50c2ee05f052f24c70430f7353727a9be74ddf772c93d93", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0270-r4-random-scan1-baseline-on.log": "5581b5fb4b3c768d4ccdb304285ea6c8e5af99cd10ba07f9f23c7a5e91906d7d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0270-r4-random-scan1-baseline-on.stat": "918b61aecc2a6c06b50257de3bc7cfcfc45fed6c7a00e461b7dbe66c64a31105", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0271-r4-random-scan10000-selected-on.log": "1cc5b58b4c6cfe44e532aa8c7b6e383e2721a13d1e7376ddc812384a80ff3e36", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0271-r4-random-scan10000-selected-on.stat": "0e5270cf5aba5756640c070c97dece10bef4831dafdf500ba22a1819871709ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0272-r4-random-scan10000-main.log": "db152ba4e3d6fd53060dfa8d546ee682d9b56c8c2a770b66d534b459013e2f14", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0272-r4-random-scan10000-main.stat": "86d4a4e3e4335e96412b2aa1aaacd3e62979f47575d851474b452c42610123e9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0273-r4-random-scan10000-baseline-on.log": "e7f16bac92d71ba5576efbccad16cacf9b62d9a5470002c9c8cf0a93e0e4f9ee", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0273-r4-random-scan10000-baseline-on.stat": "35ecd3cd8f2673196c216b5a92a046174a9709cdd9de0c56372d58501cba12ea", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0274-r4-random-scanfull-selected-on.log": "a098f15dbe6c3bddcbe32c984b8cc1cf2fea18f87fb07bbb686ef76252fbc0bb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0274-r4-random-scanfull-selected-on.stat": "263452f5bb346ec6288823b38c27d1fa9cdb4633feffe43fa0a0258a68b7a17f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0275-r4-random-scanfull-main.log": "2b2aa7cbfa44ed0993654a2874ea8c9377d4b83e53712871e3225730c1fec485", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0275-r4-random-scanfull-main.stat": "86b7ec140c2c3b629619df596894eeeb456b5102ce8f33a1ecbef9a70c5c55f6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0276-r4-random-scanfull-baseline-on.log": "e7eccf015e63c63bc63c8fe30c906b07a16aeccd9849de7885c1edb62c5c722b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0276-r4-random-scanfull-baseline-on.stat": "d9329f2133147b0a232d95f5da139298f63aeed1dbf4b3fc3be76203309d8234", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0277-r4-nonlexical-insert-random-selected.log": "c9d8e26b18fc9c3a2af6864decbe045a02d84bdaa5ada3f23107891f0ad75797", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0277-r4-nonlexical-insert-random-selected.stat": "a0bfddc3ad547e67b181e09162eef882e965d70a688defbb90f4b04660e207b5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0278-r4-nonlexical-insert-random-main.log": "23133ceb614ee20053cc5176244f514983812a5b01ccc03c71b0ffb3978d7306", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0278-r4-nonlexical-insert-random-main.stat": "d5404c60317d5c94e703e68082e914c5bff35f9f4c274004026fc084ba29b322", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0279-r4-nonlexical-insert-random-baseline.log": "f00c11f3081bdf5e20a06eea01609bbdae811db570ff8e460d5d8f92f31bfa19", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0279-r4-nonlexical-insert-random-baseline.stat": "fa0e4dbb96f8a81af50b30d60dc810fb15c1af234cbfc624193520b5bdb39e37", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0280-r4-nonlexical-insert-sorted-selected.log": "a647fb7fd3d2a9c1c241c61d32c8fef49b9b7e70b320ce7d50544f94c96ef318", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0280-r4-nonlexical-insert-sorted-selected.stat": "94930921c05511895ae9fcb19e8fc6cbf465b56c8af1af183b89f8b323db4ba5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0281-r4-nonlexical-insert-sorted-main.log": "b68361015a6ccfe736267f12ec6327d4a1cdc3cb921e678001a3d695439857e0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0281-r4-nonlexical-insert-sorted-main.stat": "4a3d823b369d42d62482740cba426852e1a56c2a9e9e056fdd953503382aee4c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0282-r4-nonlexical-insert-sorted-baseline.log": "ff52bc60689f3fe8d1dd31d9e57dc7d2b254351a9c7d14f98be070c08c97b683", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0282-r4-nonlexical-insert-sorted-baseline.stat": "fe7703a6b46476c2b2bcf3398c4e5bd43eaef88769233e21bb1a30ea9f2087f1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0283-r4-nonlexical-overwrite-selected.log": "a74dc3a8a012419e7c35e083a1c770faac537ee040bef58d716e31e971b90593", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0283-r4-nonlexical-overwrite-selected.stat": "7ca769fa1eca3f63fec2fe6a9c0d99e597291bd0bfabc761e907bc73a8f6514c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0284-r4-nonlexical-overwrite-main.log": "d036199729e6e7c67cb5c804ac1e59da974258af350f6aeffd64404960bc0eae", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0284-r4-nonlexical-overwrite-main.stat": "e35b2639dc93998b5ddefb881ac3433ce44c92078685d3083dfd155159ae8856", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0285-r4-nonlexical-overwrite-baseline.log": "4e86eb98a2be168391071bc2fb68d6817d43d723519088891b6f1d687b7c8354", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0285-r4-nonlexical-overwrite-baseline.stat": "43301af4286da1955050d7b279f15f352bb577359ee1b75f40070163aa1301eb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0286-r4-nonlexical-pack-selected.log": "38ff7fd2730e8b6fca18dc70eca35484ec8e6d42a26a65e6030ccb78fd34ce06", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0286-r4-nonlexical-pack-selected.stat": "d21ddf955d231f307ded4cb36fa68698ea893028347e0ff29a503bbcd615b797", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0287-r4-nonlexical-pack-main.log": "1a5782008c5b7ca64e8a60c3476c56c659e45e41954b0b74ba2ba356d98cd546", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0287-r4-nonlexical-pack-main.stat": "4276133cb31a3c968d35abc8d2e1785ad2fcfe04d915c4233e5351daf3f8bc78", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0288-r4-nonlexical-pack-baseline.log": "a73d3e432c7f0a28e9fcc5dfe32bf2820ac106aaed4f274f635982ce0ffe20f9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0288-r4-nonlexical-pack-baseline.stat": "47793b5171f16b5b123d980901778c5529963285934773cb61026c5ff30ae390", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0289-r4-nonlexical-hit-selected.log": "a097697837b4d49585cdfbf0cb84411448f60f70faede0413bb34e3317347f23", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0289-r4-nonlexical-hit-selected.stat": "7583d7f64ca32a2ea2eff3b528f71c5afecc64fa222f1eac6d25c581cdbf7e9f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0290-r4-nonlexical-hit-main.log": "b268f506b07fabf0f3146cf86408ab5b75af6b1104b13f5c82f012988bb2ad04", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0290-r4-nonlexical-hit-main.stat": "6c30aae0146d480d67607c99420ea4cf9a331f31b09b014e0975e6bc3013e3e6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0291-r4-nonlexical-hit-baseline.log": "9f7ae0024c4acd0dd42adf8767b4ae04608ad9c59cc6160b6c277890805cb48a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0291-r4-nonlexical-hit-baseline.stat": "618340ae8fd5b0cd8dad15bedf614199b8cc3286faabc0b44f38daaef68bcdc9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0292-r4-nonlexical-miss-selected.log": "6ec05b54639fee5f5fd452b25e8d97c1187b8f24a89ec52f2218cc34e86b68ff", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0292-r4-nonlexical-miss-selected.stat": "1518f532eaf4833ec26a80ec51fdbb7df6e0f0177afdb16317de256c4e7cda5c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0293-r4-nonlexical-miss-main.log": "0c63b995535e5a76e48f775ab9020daae56b05f0bf38e01768ed07160c7ec755", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0293-r4-nonlexical-miss-main.stat": "5699944cbfc171326bad0f84cb24d5f2b73c0cd1141029c9af7120a3c72f0f2f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0294-r4-nonlexical-miss-baseline.log": "7e35eec38716407013ca55b842446be83c9ad68e93099cdd79d365607358c380", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0294-r4-nonlexical-miss-baseline.stat": "045ced1024391ea25cab30c4c2797acbff7cc4ffe7b08799e128ec8124a1da24", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0295-r4-nonlexical-scan1-selected.log": "57d6f93d28ceacf33117689191136261a8cb1a3239869c3d9f6054d93b9bb0c4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0295-r4-nonlexical-scan1-selected.stat": "c7091f921b760537c9782b8984c74514cb96e82ac3262014234453108c6469fd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0296-r4-nonlexical-scan1-main.log": "88aa6633d1bcd2c9a8368f426a6bf205c845ba1bb7306883944efd0adcb10e58", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0296-r4-nonlexical-scan1-main.stat": "73786468d3d66fc9db007c40b666e843ec49f419e5bddaab16584916fdb0c0ad", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0297-r4-nonlexical-scan1-baseline.log": "d78102ecb6d43bf5c7b280b708258ba7bb7c64fcff9e17cb32036baf2d251990", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0297-r4-nonlexical-scan1-baseline.stat": "764b1b5c5c04208d559c14be493a705ab2cfa7637a290851af8ee0fd018e8014", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0298-r4-nonlexical-scan10000-selected.log": "da618612197edb57540949676460a2fcd070865a2ad25d0ffb2d5729a0a080f8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0298-r4-nonlexical-scan10000-selected.stat": "c69371256ddce0a788bbd6eeaf5888287a7e13224685355c949d8f2cc6c74fc7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0299-r4-nonlexical-scan10000-main.log": "07da3771a0d51329d10cc7f8c4ded0e838bd3f085041ee43f8f8a5214b5b1d2b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0299-r4-nonlexical-scan10000-main.stat": "e128726264642b32148a0d3561295bd86b66d898ee08b768782fccd3a683e09e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0300-r4-nonlexical-scan10000-baseline.log": "c4d5936e3b976f7da6e1f1b91fda83157924a61c2c14538927d4d9a38119e296", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0300-r4-nonlexical-scan10000-baseline.stat": "ebbb2a81312f41a191dc1e55e5157d61adfdaf43bec7e7926e22b9893b9e65db", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0301-r4-nonlexical-scanfull-selected.log": "b953e47b5d30c3332a4f1c94de8ec50017a42b08236c9f09df20b13ae99fb573", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0301-r4-nonlexical-scanfull-selected.stat": "33cf2edd85d1bb227fc513f12a06937fddab2361b5475d81612487914c3a2abf", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0302-r4-nonlexical-scanfull-main.log": "e4acf06b35f8d90d4c166b176f0b5e957a01eedf4c16ebbc5b6de8ca5bdba8a9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0302-r4-nonlexical-scanfull-main.stat": "5a75f2b75efe8ec355f07d71884016023d740f87ce261459a1905b002a636bfc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0303-r4-nonlexical-scanfull-baseline.log": "83d5c39ce9e11de08c5a46e5e2f38dd67dbc40f155c92a8da3af1a2e5f58ae39", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0303-r4-nonlexical-scanfull-baseline.stat": "c5a5499ffe22445cc023dcd220790144bf45a6ccc739f998b3bc46cd4193dff7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0304-r4-common-pack-selected-on.log": "3e7382ca77891dd012c735eb842b4dae7f9c7867d479292636065feb99237fd6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0304-r4-common-pack-selected-on.stat": "a9c95843a5b7c2b80a27fb1d27cac45caa1469100065f197c35cdf1b4dae106a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0305-r4-common-pack-main.log": "995ad5b1f8873c4b154efab0c59e7d742d0715b59001d1721f4ec55c2f3129e3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0305-r4-common-pack-main.stat": "5afda0390830331751eaa1ce6d8f4fbb13eb78efea243d5d375e2babbd6fa8ef", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0306-r4-common-pack-baseline-on.log": "6e1c34a58dc44c5de7978d8f859a6d25730eb20168bc4f3f1e59c87a03a8df5a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0306-r4-common-pack-baseline-on.stat": "a2c5f80e2cfec50e54b3de8d7a7cab8fd6d816e474eac2bd5c57224f5c1a842f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0307-r4-common-hit-selected-on.log": "68c250cfa95607932794376ea1141bd08bcf7de71eb1c04716a8c8a8ff87cf1b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0307-r4-common-hit-selected-on.stat": "2f8491d68439356991565481b67c9d80e2765cd59786ec2de50b977021e17f39", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0308-r4-common-hit-main.log": "a41596991f803541dc6cf563c356d768ed90c98a1316f30eb69a02a0fd0004e1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0308-r4-common-hit-main.stat": "5d76f1453c842365c2c1a4859c3241b4e06cbb79b38774d3ff07308a41bbf8f5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0309-r4-common-hit-baseline-on.log": "5e494c6a44dbf5ccd429cca8656e3224e8208ce08fac2059739a146a5b65fa61", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0309-r4-common-hit-baseline-on.stat": "d23f89d9b71cc5665445dfacea6fa7bb4192adb58460183bcb653594071e7788", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0310-r4-common-miss-selected-on.log": "939b39b6161c204832861e9ac37507f599741421ea2a25f4362261938d9eaa89", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0310-r4-common-miss-selected-on.stat": "4343ee61ead54bf9e272d2b4d7747f78481093fa5b1620027b6dfcbccce918b1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0311-r4-common-miss-main.log": "d86b10302e4830c1de4903b1f3ab418a9f08d84674d2e9e66a7728f1ff4faa3d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0311-r4-common-miss-main.stat": "bff52758449885c2d9bbaa5f0e5083e11d48c415174a21041cb48f419fb03d04", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0312-r4-common-miss-baseline-on.log": "f4ee47dcc609724b1b199f115eb29928e49837d5b67a1ec9362e99628059ca13", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0312-r4-common-miss-baseline-on.stat": "b3d008672f2386007dc2f351288ec825af824e8bb6ecbe87a227ff64665ec3e4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0313-r4-common-scan1-selected-on.log": "a950f67b3b2c9d63ef9101ee781ab9bf405327a8413f6bb1fb4a8cf63c2ebe05", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0313-r4-common-scan1-selected-on.stat": "77ee740184d4120820e0d6ba227ae974ab1699440786a7f377c3852eff36a336", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0314-r4-common-scan1-main.log": "d28de656c03ca293d12455d7d64e8bc6369c277b2b048c97b05245aab569185f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0314-r4-common-scan1-main.stat": "1515fb1415ba08f00f7a1af745f8f90654788bb3fa92244d2d601932935b7d5d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0315-r4-common-scan1-baseline-on.log": "7469fb7e20fd2fd17291bd9f24f9d7b4452e93e54948b70d68e2b4f82e558df2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0315-r4-common-scan1-baseline-on.stat": "c4073cbc27c2978b94998bb5549a5e7924097a9557641df3b08877d0aa140368", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0316-r5-common-scanfull-selected-on.log": "6533ba990bf5e4b2880cd7967124ab9e6ee9347aab0ff16dced285d160e70367", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0316-r5-common-scanfull-selected-on.stat": "329a8ca1d82f9c84c9111b4661ea59f12001f0057055cccb9d2bcec9653185fb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0317-r5-common-scanfull-baseline-on.log": "4b0c4b0fbbb76154764d2c8c590dbf437fef675aba8a6da0f31833a7908f6df6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0317-r5-common-scanfull-baseline-on.stat": "46c37510937cc47d1449bef1b67f5f25bd43d327539c0cbb58f4757127035b5e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0318-r5-common-scanfull-main.log": "073a12ebc6f7e6c4153379062b73895f7790f660925403732f457421a86b938d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0318-r5-common-scanfull-main.stat": "29432067eab70bc329632b92242efb8282e9ec5a04f6afc332ff069aabc0d39d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0319-r5-random-pack-selected-on.log": "7e0df4c45a0865c022df5de8399c21d89ea264dad1f524a7c7f0e63e13f92c3f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0319-r5-random-pack-selected-on.stat": "c1676b7de9270ed37e6e4f9ae04d504e6093cfc8bd2ad26240700ebc8a0958d6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0320-r5-random-pack-baseline-on.log": "fe37ea2ac8eee0807eaef8b1e649963c1c919f231f065b67b3d72f311de93db7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0320-r5-random-pack-baseline-on.stat": "6af14c79b98b49889c07adf9cc3a3b5619b543ddafdfa785876cf382cd38a666", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0321-r5-random-pack-main.log": "ffdbf5d779c86c863e8a73b2fab2ba98d04a883e35c729c4b35758e4bed48c3d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0321-r5-random-pack-main.stat": "b84aaab3e095d7a223d6ad2f4ffee32ac97b65f26477eab5a650213fc8f6e225", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0322-r5-random-hit-selected-on.log": "06914bf6259b6b012377bd697ebf32f93dac58924893527f60c2e7be405a2f73", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0322-r5-random-hit-selected-on.stat": "a0036bbe6c463bd1acd9e944358b16debe6606ab3d4d8ec0b3e2ba909051b0e9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0323-r5-random-hit-baseline-on.log": "3033e2bd2e0c3dc886db3fdf5ecbda486187903ce66ad77b93dd27f3ebb435a8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0323-r5-random-hit-baseline-on.stat": "9615d2659a90ee886c6cce3a88cf96550067ac77c57e410096b468aae58a62ec", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0324-r5-random-hit-main.log": "b42ff29cd117db4dd73b4b06ac79d5145362306fcd713711953e51d0640ddc1f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0324-r5-random-hit-main.stat": "0179c517de8142be9872169d7793f98e91c22f3d411a27bde413d5cccbb10d6f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0325-r5-random-miss-selected-on.log": "090822fd4e7c55a9bcf29d9502cd8d9a91cc7722be0114cc8c6ac462b9b178e2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0325-r5-random-miss-selected-on.stat": "4dc7bbc9eee655064f2ce63125855c621d754dff4536169bd59fd6a979314802", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0326-r5-random-miss-baseline-on.log": "fa123beb968d24c3cf6dcd8b045f7874aee91b76d28d3f3a49f4838afb7066e9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0326-r5-random-miss-baseline-on.stat": "cbca2402b0ca4dd764ac278f31f21c4ecc4347f2edc63d169b9d7f20c2b5c338", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0327-r5-random-miss-main.log": "6e73e28848a0f9f186d943d3ca054e4e5406c90224814fcd8ecd8194a874b953", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0327-r5-random-miss-main.stat": "4794d2a9bc3b6b08a2e690c51f6ced91b2936a546e0b123aa3fee71442f4602a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0328-r5-random-scan1-selected-on.log": "28ee0134a4993ccdd00ccd57aecf3effe67ee8860a1f81c7293bce015b64644b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0328-r5-random-scan1-selected-on.stat": "427943b537ee3a08f2c449a709c4542405e69082846e07129c5f67013d06f5ad", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0329-r5-random-scan1-baseline-on.log": "13676aae02209d5b1235ef2bc307c5a64dcae153a8c218281d85b45f5324f7ae", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0329-r5-random-scan1-baseline-on.stat": "ed08d0d4c8be4db194136dd3d4c755f759cd0b87ad679f59fe74245ffa3cde13", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0330-r5-random-scan1-main.log": "245d59a419cc49ff29b5dd56ee8b23349e60d8cc3510afd20bc4978b3b55902e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0330-r5-random-scan1-main.stat": "d55ae6213560bae9d23ba3e20d5cc14954b00ecd81c8649fb920adb74cf4a88d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0331-r5-random-scan10000-selected-on.log": "396a96dd679e523d87fd68fd02891fbecdc764405ff7385225ba58560b4d5407", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0331-r5-random-scan10000-selected-on.stat": "9f2e0d92d40bf36f80fd6edb157596ad98568af3e1638877e7c3a8e068cd1e18", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0332-r5-random-scan10000-baseline-on.log": "affc6bbbbbd913c18766be12a21d5ba37b2f27f7cf2dd900a0cac5167e6a82c9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0332-r5-random-scan10000-baseline-on.stat": "a63681c41af57aae752afb6d1877d5661236a20f88d9d68401730a97c81646d8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0333-r5-random-scan10000-main.log": "e9b2cb9b0e401720f5682a57baf6de38a9edcd943789f48940e4fcd7d1e80371", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0333-r5-random-scan10000-main.stat": "3e02552fd697231a193b1a66cd97d1c0b66d9615a6d567666967a552b2657359", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0334-r5-random-scanfull-selected-on.log": "f3d09f7dcea914a5b567c777ec7b5f2880893d7aab737e3fa1b8695f61dd2db0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0334-r5-random-scanfull-selected-on.stat": "2c86492ad26dc0eb812e51d674e47d95c7bf728b10b7d40715e2980a841af982", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0335-r5-random-scanfull-baseline-on.log": "c4b3d2b821184051920d41ac1e514dcf5da40514ee9dd71559a2a38440f2adc5", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0335-r5-random-scanfull-baseline-on.stat": "aed39de7417576849803bddbc6a6a1c6c9fe06ef0fa0293cae3b03f97cf5f86c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0336-r5-random-scanfull-main.log": "db906c7b95a2c020081423d4d18de38ef4a6269e2acbd5f86b470f22eeb1513a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0336-r5-random-scanfull-main.stat": "bbe28e0d195da4e19417d9ee4c163889ce2d052ad497207d3bbe965475fa3240", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0337-r5-nonlexical-insert-random-selected.log": "413303d36e6c68b2ba2ab5524d38f0819ebecd95cf431df0d3ac45f86089c610", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0337-r5-nonlexical-insert-random-selected.stat": "483b5c7eaf8f495a3dba0ad2518ccbce0f0c9be5747d153b4b3298c4ff4c4d2a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0338-r5-nonlexical-insert-random-baseline.log": "f9f7495207852ea0147b9346ad29fe75979a8db515e1fee77f9b8fc8c965d58e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0338-r5-nonlexical-insert-random-baseline.stat": "a0065ccd6f80b1a596522a085f49677b5ad093f806dd8e5b517a66fadb6e2a1f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0339-r5-nonlexical-insert-random-main.log": "985f32600b354f98eb276867635c6eec0b2ac4b18373b7a2c0993c25b00f2aab", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0339-r5-nonlexical-insert-random-main.stat": "d3c73fcff70842c06bed413d875297c7ce9bcf83006efc7a07554463a6ed534d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0340-r5-nonlexical-insert-sorted-selected.log": "81869436676830c202989cf3c7108cbb4d41c0edacdcc984e8ee297e5bcba3c8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0340-r5-nonlexical-insert-sorted-selected.stat": "13a4c6da01ca384419c6ee7afcac0d93bacc247bd47f472f7af64cb610f44a6c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0341-r5-nonlexical-insert-sorted-baseline.log": "a1c147ab9db0e8fea8e7304cfa27d2c6ace74321513f91688ab2c0b4e0ab7243", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0341-r5-nonlexical-insert-sorted-baseline.stat": "4f1c18651541c0030761aba8f5557ce78608dab30419830507f9dc42686f823e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0342-r5-nonlexical-insert-sorted-main.log": "775fc706cf499dabcdca3f5a73d9d7ba17f05a5d7b4d7877097b0b38348e3eb4", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0342-r5-nonlexical-insert-sorted-main.stat": "1973cca8334f59b8cbc62cc1e3f00e48ed0c8bbec51c16dc14281ab3ee4500f3", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0343-r5-nonlexical-overwrite-selected.log": "361a1dd6a56fbe44bc543480f3af7049c39874cd2a281f0629c9cf15105028e7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0343-r5-nonlexical-overwrite-selected.stat": "7cd8b418fc63b666b768cfa3d423746ee1b7b23d90eb33fa300fa0e5c136d926", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0344-r5-nonlexical-overwrite-baseline.log": "886e528c83b4aa832a2fafe95439dee87168ab00d5331eb0462b14303733e747", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0344-r5-nonlexical-overwrite-baseline.stat": "66da9aecfa66b648aaaddd7bc47dff9a38aba8a0f256153b0e4da1d68e046792", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0345-r5-nonlexical-overwrite-main.log": "7f965b9bd00ccd79dea4fcdac3a756e7e1f7b8acc706139cdcf3d58fe1492c78", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0345-r5-nonlexical-overwrite-main.stat": "6e8d9684594b6eef74ee5643141342d432c4f38bd82abb396689366a852349ff", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0346-r5-nonlexical-pack-selected.log": "98fc76d13b8cad9190b21476a5eebd1525eda22bfa000561b2803b8079ae6a9a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0346-r5-nonlexical-pack-selected.stat": "0f7981f8c07c913d99d87aea16e0d0dca24da5c766bf5745a70cb5eb3cc7437f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0347-r5-nonlexical-pack-baseline.log": "d12b6095d60c1e0b3c6b38a0d1d413496b752fdb2697fe015f73d445428470c9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0347-r5-nonlexical-pack-baseline.stat": "83645e84bc481d6eff60289dc843089e1242f88e4ac5051cb310cd4d325c1c0e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0348-r5-nonlexical-pack-main.log": "3f2c6bf1390688b97c4e738d52505c3e4b07e6c4cb50627371384a896499d029", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0348-r5-nonlexical-pack-main.stat": "32caff24540a22d99dcfe359093a496738c03ea187c39c51a1ead9ba4d038d3c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0349-r5-nonlexical-hit-selected.log": "7dbe8d0d4c847f9bcc862ab27eda48569801f658324c9d0f6b3cf3ef57b39088", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0349-r5-nonlexical-hit-selected.stat": "2b33cbe964344ad77c6bfb5d3dd97e05bcd1629894de2b221d3239501e139f0a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0350-r5-nonlexical-hit-baseline.log": "c14d94bde36db3a251be3bd014d8e3c108f6c6db3d904eac47cba1d079b9c9e2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0350-r5-nonlexical-hit-baseline.stat": "42a287d61fe840595ba3a2022e4053bcc6de6774959b7940498bd984ad6f8058", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0351-r5-nonlexical-hit-main.log": "381a75878f055301ed429dc5cd7f04ddba40752c226fdfc2eab3d77900c67fd9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0351-r5-nonlexical-hit-main.stat": "fdc04c7316eb8b06ab7b62d5bc525d57d48a0db5cba6ef02ee6756ba3f4581f2", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0352-r5-nonlexical-miss-selected.log": "25713f3f97736d40db4d7ce34c8fdbf0fbc39515e76441c49c9752675ebf3c2d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0352-r5-nonlexical-miss-selected.stat": "1a13a14d80568099232b7c3b6309baa92bc031dade2bb518646dcc0e3ee9b2c7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0353-r5-nonlexical-miss-baseline.log": "eac3d2858aa8308501c8b37c5ae39eaff9fe3e48e48cdff297d71902348c2b4b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0353-r5-nonlexical-miss-baseline.stat": "e2a84be7fe34c5d140ef351c330ad8e87b392dbb5addaed7b52d50440f2f64e8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0354-r5-nonlexical-miss-main.log": "f6902a25fe03175dd667b91413b643b8001e56296ccd148996b7a9fce5710e4f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0354-r5-nonlexical-miss-main.stat": "88148365637f587e8adde6ecf00c16704a7d91f3d78287db88d3fe4a0a2b7eec", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0355-r5-nonlexical-scan1-selected.log": "c534b30984c62dffc5c8737a4c9d220ecdc8fe793caddbc7f6e989b50ca39a7a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0355-r5-nonlexical-scan1-selected.stat": "0c841c86d1f90345fe2088b34d1216cfddb7cf06ca9113f2ac31ea88c79938d9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0356-r5-nonlexical-scan1-baseline.log": "6e0682e08e90b6e1425b8e8ff851e8c89dee768418c11cdac935f5a014e195a9", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0356-r5-nonlexical-scan1-baseline.stat": "0ce4fbb9e49b295a12a3719681e1ab4bcf2bdd356c383be3ab22976528e3ca44", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0357-r5-nonlexical-scan1-main.log": "0ae3a1a865a16ac45c09f51d553984d16286c72622d8c0779ead3f01cb3c8cac", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0357-r5-nonlexical-scan1-main.stat": "12ebe9499bf39c3ab5b5ef09c6a05cc14045adde187e2768d94a094eddbc8e26", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0358-r5-nonlexical-scan10000-selected.log": "7453eca551f368a656173efc1de9e6810fb1aec349376ee1402d4cec68935117", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0358-r5-nonlexical-scan10000-selected.stat": "81a932595dd05b268c99b34ab80ad5aa942f936f24aecabbac555f32332454cb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0359-r5-nonlexical-scan10000-baseline.log": "d120056e21a586225f55320933673e0da244c34ef1c7f97df5a7b1dcd095d8b1", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0359-r5-nonlexical-scan10000-baseline.stat": "434e4b085776e61e69cc7e13485f451368d6c39c9e6feeb636c7599dbe807ffc", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0360-r5-nonlexical-scan10000-main.log": "c031bd4216b2bbbea96301fc09483087225e050f4b4796c75c9d6d4c2ea62367", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0360-r5-nonlexical-scan10000-main.stat": "c74599e5dba6da6a3a33e62358321d033c7806899071e800843b1bf27cee028d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0361-r5-nonlexical-scanfull-selected.log": "8cdd72c6f43b1fb95970998a1cacb08f4755734a0930749e0738d3ba3be45d2f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0361-r5-nonlexical-scanfull-selected.stat": "49eb6593ad05c4950f5e34fdd0e90e8483325fd788dcac41ce23e3410bda35c0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0362-r5-nonlexical-scanfull-baseline.log": "c228dd9b453306e8ab869fcff40f344a55185976e1d988813829a44003d949dd", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0362-r5-nonlexical-scanfull-baseline.stat": "683b60cf1932926eeab9353ee6232e9e942e9f39803d980dd1a2884c5e449ff7", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0363-r5-nonlexical-scanfull-main.log": "ecd3f52a60394a5f5b47ad6a88a5add57b418a9c7b3b5b437d6a4e9c2ef29c0d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0363-r5-nonlexical-scanfull-main.stat": "523564c947d13d5a1d9c537feda4fb350680de3d9c85ef478de84c4a202b2552", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0364-r5-common-pack-selected-on.log": "2f8ee077d33cfe50148bdad41d17a777bf47225fc67ac2c8d17c8d7adae7c136", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0364-r5-common-pack-selected-on.stat": "f09648e24fbd3835b5d4c71135ae3dd001f047c4bcf7cf48e15911ec90043aef", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0365-r5-common-pack-baseline-on.log": "5a4e167473cc1436cfaa60bd99f87d4bc35259e491fddc2b8a9a0eef0300734d", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0365-r5-common-pack-baseline-on.stat": "0c9b7de9e9fbcd68602c933033bf1906d3e5fe0e11103404f48f53a26bae803e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0366-r5-common-pack-main.log": "f7261803cd4d5701ec322ce65ebf8c67ddec165a5dd15fd970ce8e7e6812dd99", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0366-r5-common-pack-main.stat": "9a5faf6e357c90118c483bb0207231668805953b3c50dc1abbd0fd1773fb135a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0367-r5-common-hit-selected-on.log": "bfccd6245f081861eb596e9a747c7ed86dc67d9be2b2238ee8b5a459ab5e115e", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0367-r5-common-hit-selected-on.stat": "7cac2905ade5537078fe42fffa2d156067c9e4a55f05b4d88f686c0478749c25", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0368-r5-common-hit-baseline-on.log": "aabab4092ccd9de29d3fcce6400d9253d7561254008cda7574ba6b1eb0592287", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0368-r5-common-hit-baseline-on.stat": "f9246772611468ab7b8436ad05455f18e1e7410bdc1a5af261eea43b74b3f008", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0369-r5-common-hit-main.log": "803fd59f3ff4ccb2da98f21e7be11f71d54eb8ef0e1c925109de6a4cde37e9ed", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0369-r5-common-hit-main.stat": "da4af8257a8c3b7ab5c1b0eff68f3aba18901256f63a1c486a8f4f735cf34c4c", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0370-r5-common-miss-selected-on.log": "d5157cf5b485966e740c50a40ffa7c4df1dcb900f98055438c1d136a3024344a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0370-r5-common-miss-selected-on.stat": "7d4ef43b514c5c617a4f99b04caa2b3d624806960e7f0ff920538ecc830f2ff8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0371-r5-common-miss-baseline-on.log": "dfa520be3bd9bc5d20004bc6e5b8d2c6789b47daaf6b5e559df671ffbb140c8a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0371-r5-common-miss-baseline-on.stat": "48d57997f59d6e668639415109cc903d97b140ba2ff5e8be0e3f60652d7d28e8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0372-r5-common-miss-main.log": "c903156668fafb253b39960a27d81d1c2840262b486ce7f9a223faae206961e8", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0372-r5-common-miss-main.stat": "54296700d7201a7a067d1c910a21c81b1d92e3ea620dd8dcf6437792fa34947a", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0373-r5-common-scan1-selected-on.log": "b5a2418de1e48cf24ece53925580fcca26d2b4829615ffb96274658a72d9b723", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0373-r5-common-scan1-selected-on.stat": "2017708348a70ddeddadb744b01cb91a8fb78aa8e6443ccd9fe84f46c52114b6", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0374-r5-common-scan1-baseline-on.log": "84318c9cd938d1ffb00dc0e71cbe2a292553cc34a60af7957f5b4f57b71ac546", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0374-r5-common-scan1-baseline-on.stat": "0c5abbe747fca7b00ff96aa79733a3690754ae13dff554026807b7cbe88e1852", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0375-r5-common-scan1-main.log": "13cd4d54554bba78da1fdfd4e7236167af21eef1bcc2903467e1a538531a6312", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0375-r5-common-scan1-main.stat": "0fcf75792c6816b155bab0453fda3d5572da3d1a99456cd66f9603e807e5966b", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0376-r5-common-scan10000-selected-on.log": "a495c2b48ef761162cf0e7f301993ae44eb726b473b85fee248a65130e76fcaf", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0376-r5-common-scan10000-selected-on.stat": "a6eac1fa66f94f637e7c9243afb542f5909e05468eca0be3759184b8c2031504", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0377-r5-common-scan10000-baseline-on.log": "a173d83eca34c0b522a9952dcb841e98a45a5c394aef1fe9eec83baea1d3363f", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0377-r5-common-scan10000-baseline-on.stat": "95a03a1eb56938d0e0d45baec73e2992e261d0779e5bbc33983c98dcb1a600eb", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0378-r5-common-scan10000-main.log": "6d70b25b452b503332dcf610a7d69ab8ca89a852a306749b6d878ca96d0fea34", + "benchmarks/results-20261016/btree-nonlexical/confirmation/0378-r5-common-scan10000-main.stat": "ada9912fd4ce954f441f3fa7e39971cbcd41a3554c84a15244bd953cd0872904", + "benchmarks/results-20261016/btree-nonlexical/confirmation/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/confirmation/build.json": "c842fbfb98f9b65f6b166a87882a6cb5b4b6ec2d7255baa68eff289b9786f035", + "benchmarks/results-20261016/btree-nonlexical/confirmation/independent-review.json": "33e0ed0697f8831c283c1fc5f50b044f076c6769c2fa85d6560d088cb648cc10", + "benchmarks/results-20261016/btree-nonlexical/confirmation/independent-review.log": "23d44cc82a54fc017844b9657ee42efc2c3ece6f8395d545d538584a7f98ba38", + "benchmarks/results-20261016/btree-nonlexical/confirmation/manifest.json": "b8c393a083df9a2ee54e920ef7813fd69f6379daab19af8a08e9472a5bf4c062", + "benchmarks/results-20261016/btree-nonlexical/confirmation/plan.json": "f245b34e6248f6e000c302fb90055e69f95f841e95a95a6d4f7e59ec7fa5da27", + "benchmarks/results-20261016/btree-nonlexical/confirmation/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/confirmation/summary.json": "57588c04b8955febb08dfc2050d1a3d9132821edc0c61f809948b75182096fa5", + "benchmarks/results-20261016/btree-nonlexical/final-audit-plan.md": "3bec342cc25a591445bfdc16be566908bd5af1457c3907afd98a2f83e16c8676", + "benchmarks/results-20261016/btree-nonlexical/final-results.csv": "0f9ab9d8e4fdfebe517548a0a03a5987e36a5d3ae4eea44dca4bdcf856094911", + "benchmarks/results-20261016/btree-nonlexical/final-results.json": "28960d1ceb00b3cebfe1c224bbbaa907e6052403ec217ff3a688e1a05a8af158", + "benchmarks/results-20261016/btree-nonlexical/final-selection.json": "b781ceec1762ed6c85d112895392cef9475e92dce2f556cd975ab98de7d17d33", + "benchmarks/results-20261016/btree-nonlexical/format-check-final.json": "3f9cf531537481514ec51fd53d9fd91d4bc051dc8f8aa91caf51cbfdded03bef", + "benchmarks/results-20261016/btree-nonlexical/format-check-final.log": "e10c8900a5c8fdf97710d1158714a524888eeecf9c042b5c9d85842ed9d39389", + "benchmarks/results-20261016/btree-nonlexical/format-check-maintained.json": "80d53c7c444f6c1d27ad893661b66b2d6ff720b8ee621265440bf4c27d5773c9", + "benchmarks/results-20261016/btree-nonlexical/format-check-maintained.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/format-check-tracked.json": "43ac9d77c064f2d44544b8a1c2478e18d8031c6fd0df2ae3094f710fcb372263", + "benchmarks/results-20261016/btree-nonlexical/format-check-tracked.log": "17f9b09d75a12d54537b6c2a90cae9c852355f9563491c9238cdc412e14382b2", + "benchmarks/results-20261016/btree-nonlexical/proposals/callback-search.patch": "f463ab0d816dfc1612b2cbcf160b295b9a4f016f0cf6adfc9311990be3f33827", + "benchmarks/results-20261016/btree-nonlexical/proposals/combined-read-blob-v1-review.json": "3feb0be8b1ccc9e6d4a52add28186dd9be0085118b72a55ea843b50e2acf3edc", + "benchmarks/results-20261016/btree-nonlexical/proposals/combined-read-blob-v1-review.md": "a9b18e0c8956c3452ca3b261928c3cca5f3a92266599755862bcbc5d50b84a08", + "benchmarks/results-20261016/btree-nonlexical/proposals/combined-read-v1-review.json": "4832ecc63b6cef4b25b63595d7c839ef48c3708565ead60cf94d5f986015dc94", + "benchmarks/results-20261016/btree-nonlexical/proposals/combined-read-v1-review.md": "509a773bcbe4b6f1777f7f1b745c9d76f91d532416d5660c159b664f633231d3", + "benchmarks/results-20261016/btree-nonlexical/proposals/lazy-pivot-buffer.patch": "b906fe918268f1cdaad4fecaae44d61ff243818917460c40b449c6830b77b921", + "benchmarks/results-20261016/btree-nonlexical/proposals/message-flags-test.json": "1f90ae6306ff3de78c6249bf38d034c439f84158303977a034b27efadfde07e3", + "benchmarks/results-20261016/btree-nonlexical/proposals/message-flags-test.patch": "f1667a761bc0abf1c16ebc48692cf2a7462b25fc5540a08d0969cd6de16c54e8", + "benchmarks/results-20261016/btree-nonlexical/proposals/nonlexical-branch-test.c": "3fec898e58f9a26085e7976cba45ab8a362ea665574467b493f575c6228492de", + "benchmarks/results-20261016/btree-nonlexical/proposals/nonlexical-branch-test.json": "9103c189e48285288ce4af1e312b838037b226e6572c5ee1c1165b51c725ef52", + "benchmarks/results-20261016/btree-nonlexical/proposals/nonlexical-branch-test.patch": "3a9ff9b8f64470651584aab904b515745a14abacc99f11826e90fdda3452d145", + "benchmarks/results-20261016/btree-nonlexical/proposals/pack-point-manifest.json": "02c5e607a4c65066187c8e2455dbf6f0d938a397843c8e6ab158355b23ff2567", + "benchmarks/results-20261016/btree-nonlexical/proposals/pack-point-review-complete.json": "13f20fd9bbdb1487d3d844cfde5e3f84f72418b879a6ca75a1308075c8c97291", + "benchmarks/results-20261016/btree-nonlexical/proposals/pack-point-review.md": "c32a646c9448d894483659324ad59c14959000244543f108499ba6d4befca92a", + "benchmarks/results-20261016/btree-nonlexical/proposals/prefix-before-scratch.patch": "cac8513cd318b63ff167dee1dbaf5ce0aea92e4d2a10203656628d0c640154ff", + "benchmarks/results-20261016/btree-nonlexical/proposals/prepare_selected_read_tests.py": "7a8b38e8e0b4259b9a4b90eaa52da593fed9d775df55cdaf677dd28066a48461", + "benchmarks/results-20261016/btree-nonlexical/proposals/prepare_zero_prefix_callback.py": "11c75f3b37c0fec0ada1a994b0c4781a2fe5d5b55917db12099ea77b63625638", + "benchmarks/results-20261016/btree-nonlexical/proposals/selected-read-tests-v1.json": "4c8bf7401a373255b7a5798c3cd5ee35683d3332a34b2e7cb15ece20ed69b03e", + "benchmarks/results-20261016/btree-nonlexical/proposals/selected-read-tests-v1.patch": "bf964decfeda41d5b12eb686eff5ea1da498c99c7681e65beeb8ef5135c4c9c3", + "benchmarks/results-20261016/btree-nonlexical/proposals/validate-selected-blob-coverage.json": "7b12bfdc2a1ee9e6be93b6822435b932430a169f8e0495def607059b0216cb12", + "benchmarks/results-20261016/btree-nonlexical/proposals/validate-selected-blob-coverage.patch": "4dd152deb214f096f643aceae74ac545018a5248857943be1ef66f44cc0581bc", + "benchmarks/results-20261016/btree-nonlexical/proposals/validate_selected-before-blob-coverage.py": "3869d20042b172f5af2012f0aba3e692a09827741d861f9346a26121a12ba817", + "benchmarks/results-20261016/btree-nonlexical/proposals/zero-prefix-callback-from-selected.patch": "31b08025ae320700fa322a454fd7d9888bce2253c2e4671e3676a99097a10c59", + "benchmarks/results-20261016/btree-nonlexical/proposals/zero-prefix-callback.json": "a8944998076b50f298df7da69f10686ef2e6c76b91ea8fb1dd6f660a956b5fe7", + "benchmarks/results-20261016/btree-nonlexical/proposals/zero-prefix-callback.md": "da23a29efdba6bddec83098015ca8e71b3c12e8e1cdb4ecd735683b3b5561e9e", + "benchmarks/results-20261016/btree-nonlexical/proposals/zero-prefix-callback.patch": "09734fecff68eefdc974597b4de77bcb619e1bed61488292624642ba3322bbba", + "benchmarks/results-20261016/btree-nonlexical/proposals/zero-prefix-search-design.md": "ce53872fafb9fb4d5a88d07710425965bbc590872b9fe431c671268e9a66bd4f", + "benchmarks/results-20261016/btree-nonlexical/read-design/README.md": "1feae0b0123e15dbf9c8b1ceb64de10352cce1131ab0c8e301377a8c358c4e3d", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/formatted-dry-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/formatted-output/src/btree.c": "0c0cb6f104387df0118ba4588c40e0ac3c54cc589d6ada0ab8ae80fd1fc4ede3", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/formatted-output/src/platform_linux/laio.c": "53dc4334861d8f228c1d1a06cc3096c1a8f9ccce712b0bfcdbeb7921d2d73290", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/formatted-output/src/platform_linux/platform_io.h": "aed5d9cefd9add9bd87c8a866c6e6f26992a1be327097d6d92b087ec5f1c841b", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/formatted-output/tests/unit/splinterdb_quick_test.c": "5c881a35687d7869cdb0b27a507de25baf553ee93a365100c3ea6ac204bdec0a", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/review.json": "3a47531b47ec0152cb9fa362684fc622781684c0f6d9af3b350423d0000d4f3b", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/selected-dry-run.log": "13688bbaacc8605a9d3f6f48e613500eff72557ddf39de2714296c9a686293a3", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/selected-formatting-only.patch": "b34c022bffb1af99d7f78e9745546172248a92813600d9b301774d5b9eb9dd9c", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/selected-input/src/btree.c": "3d6a3f5d7dcc8ee5f3c474487715247d3ac901d2844f5f72cc2d9a1a0df69fad", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/selected-input/src/platform_linux/laio.c": "53dc4334861d8f228c1d1a06cc3096c1a8f9ccce712b0bfcdbeb7921d2d73290", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/selected-input/src/platform_linux/platform_io.h": "aed5d9cefd9add9bd87c8a866c6e6f26992a1be327097d6d92b087ec5f1c841b", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/selected-input/tests/unit/splinterdb_quick_test.c": "5c881a35687d7869cdb0b27a507de25baf553ee93a365100c3ea6ac204bdec0a", + "benchmarks/results-20261016/btree-nonlexical/read-design/aligned-formatting-review/test-overlay-apply.log": "2b1aa9464a61a606e36e92ba9d5bc55ad32a5f29e3c4714f40bcdea848bd1688", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-btree_find_tuple_checked.lto_priv.0.asm": "aab901edf5a6fc23f504055c097117df8e7cf48b67c845a37181e98c3085a673", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-btree_iterator_check_current.asm": "c7d597faf24936cba2c60438b6c0fb1bed27f9bfe9cbd5b96a82d6bfc42d3811", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-btree_iterator_curr.asm": "76c8e973f0cd676d9e673485705732f3674b63e17309018f358fff0bd205d110", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-btree_iterator_decode_current.asm": "74121f47396b22353092022d188f6b62ebaac1a49ea6c47f8e2c17aae7750bc2", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-btree_iterator_next.asm": "c4c61a5a442c2d6de62ec1dcf91a794e40f4b5babee414eb04e53c73feaaf6f3", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-btree_iterator_next_leaf.asm": "1c231abbcfc1e69d386a2504ffb18e30b2027197a569f6d8054363b42bd9e761", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-btree_read_leaf_blob.lto_priv.0.asm": "8d6666880efe9532775db3851347dce093696e658cf827caf1baf629780bc669", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-blob-v1-symbols.txt": "e99142deb2594bca2f5cf718010befa2b4ce40bcbd6af3e26bef10b565d4c704", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-v1-btree_find_tuple_checked.lto_priv.0.asm": "7876d648d2ba7609214b0017b46784f9ac863d4ea0fbc02e15b7446a92858c2e", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-v1-btree_iterator_check_current.asm": "0f77e4089d5fa3c885de1ee0eac8be3553c650266cec94c30d416ffe43f42954", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-v1-btree_iterator_curr.asm": "f50208b62cec5647b1126419854253acaf41769b89d35e0ed87a4a7066bd4d1b", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-v1-btree_iterator_decode_current.asm": "764a9c8f6fc624b48fad51eda328fbf2b3a67be433ca20e7a0c9f9f40d7e08b5", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-v1-btree_iterator_next.asm": "62110a7763f1befef02a76ccec135d0f6e1347d2f8ed85e1abcfc3d13c49010a", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-v1-btree_iterator_next_leaf.asm": "8cec1aec2979b869b1cd95af57d0b506a9a953c4add8b1155d706fd8b68f3a59", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/combined-read-v1-symbols.txt": "ed30015b0fce1569ace24c3ce5e82fb3e7caec8fa945973b0033dcb9f4572874", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/combined/manifest.json": "a272e87c4f0c6e1307dcabcd3cdb1f029a4a5fdf176233072369e2b3b8230cb8", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/current-btree_iterator_check_current.txt": "b2fbeb931ee45b1e8f4f63c006fa16524cc74df8206474986ce883769aaa3cae", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/current-btree_iterator_curr.txt": "f96a4422d67a7a3a96812d52cfdd1b100455e2db02974277d012ba757926b2ca", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/current-btree_iterator_next.txt": "30d914b4261bd841a4594f6433e6aeaf54d22d45dd7911731516f2a74be89470", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/current-symbols.txt": "cbe3b04f6e2d58f86b4e23c9ce618d164dfadd4e31b97bdcfa7962192778c4cd", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/decode-outline-btree_iterator_check_current.txt": "b8a46d8cf17b125455389e8086487a1e2505a9034b7251188514abf48aed2c8c", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/decode-outline-btree_iterator_curr.txt": "d91d07cbc1082a7be008954d74b7d0a5a98b5264c3d59cb1a643f7be5a831c9e", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/decode-outline-btree_iterator_decode_current.txt": "21d5d487aef3268c350b9de80395bb1c9fc1156b4865f9acbab4184b7400fc9e", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/decode-outline-btree_iterator_next.txt": "87dc001b909a659a995b342e326fef060aa035cc613090611d5eb324ffff9867", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/decode-outline-symbols.txt": "5ced714da1d844d1918427678c245475d31bf41605a621bf4644731d45207674", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/main-btree_iterator_check_current.txt": "4d978c928c2b69204734af32b9d61f0c9e7a5ec4adb653335c86287fd03223b4", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/main-btree_iterator_curr.txt": "262a5f9285b025f2b887c468460078404dbefe1d18ba678cd01d90ea7c2a414f", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/main-btree_iterator_next.txt": "b145c21f6433e7be24bfc66ff238c702df1966d9bc877351d436acbcc6ce8ac5", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/main-symbols.txt": "e07948a09a3eb496b92c2fc228c19abd28848c5fb2fcbb52f3e628190a9dc28b", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/manifest.json": "75e8f37f2acc26bb08220b3c70d2bb00e1d120a8b8f65502bd89e612289d5c79", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/message-type-btree_iterator_check_current.txt": "3e9cf1d500bcd7ece49f5cba11804af90345adafaa132cabec0c4ba7dec99cc5", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/message-type-btree_iterator_curr.txt": "93cb2689d7e6530fdd3bac068e404a9a9c566ce28493484b3e7a61069a4c372b", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/message-type-btree_iterator_next.txt": "1745d234b8a1f0d9740688352e5685b1760804c731ad8fa96f7b43ccf6107e69", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/message-type-symbols.txt": "cbe3b04f6e2d58f86b4e23c9ce618d164dfadd4e31b97bdcfa7962192778c4cd", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/rare-blob-btree_iterator_check_current.txt": "d648fdd2ec47f6a2176ea9526d90f2717c22c94be56a551621b273dfaab76a70", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/rare-blob-btree_iterator_curr.txt": "4f6f153ea1d87c1ec298177c2ffa25ecb8320f940a69d1bc0e4ec208f0657f43", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/rare-blob-btree_iterator_next.txt": "551f23b06c01fd0ebe467452abf6ebc0d6c8e95da4c69d0108eae609ee16e8fa", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/rare-blob-btree_read_leaf_blob.lto_priv.0.txt": "782a010125ec46bc2c926106383e3071dffbfb107676f42794fba31338512ce3", + "benchmarks/results-20261016/btree-nonlexical/read-design/assembly/rare-blob-symbols.txt": "b0b023c8d45f6735d915311c14cad0662b5bcd8014541eabc2e7aa03497220df", + "benchmarks/results-20261016/btree-nonlexical/read-design/async-alignment-review.md": "5c857c2c4ef3ac7bcc15a605b3592dce88af1831490a7b200feeb495c3658db0", + "benchmarks/results-20261016/btree-nonlexical/read-design/b9cc3ea4-source.tar": "b77952ae490bf63757ab7c96fee025d2df7bbd0479c0028f303db542f8e44a5b", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-assembly.md": "2b41fe788b83f7a64d16afdece4306d7d5ea352965fce935ac7b74062ab917db", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-blob-v1-format.patch": "e161ac3a6a576da0f6fa0aac137e1bcba570fc56bf51cab90f9dec1c4323e939", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-blob-v1-from-combined.patch": "1412468b6d1cfdc8fe462fee7e65209b9940f13f9a9a48a1881930529a6657a9", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-blob-v1.json": "34640e3972b170304cd0dbdd408ea88cf14878ca21507cb0fd70fa9d3114bf20", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-blob-v1.md": "8ea968366ce15a1e0e41ff8a2daab057dc3ee9be69e2c8dc22fc91098b6526ae", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-blob-v1.patch": "a1395974b0b18fb347c074bd6316aa4b8de56f1c5a6487d0bda428a959006898", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1-apply.log": "71feb2bd97f55ee96c5364a746b0b8eafaea406c26a21e8e9e03bd8c44583e4f", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1-before-callback.json": "fdf4e7cabb48bfe30f2a6978c59311b6f8a7b72ea77e21abc650076931eaa960", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1-before-callback.patch": "30af983acf3fd44be87c6c2c3e187407c99c8a2d2737f099bcd4a583e5fffa53", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1-callback-format.patch": "bc191a9be64f65df728d9dc63d2b928674dd5d15613b233c49723a46fa11adb8", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1-format.patch": "4cf6f3fa854111834493d7ac914b7e793e806ffe8aac10f3429403ece1c08ba7", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1.json": "c0e3581a8071490c4ab60771141ea95278d44aa0f2ba43739e806c93f0ecac25", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1.md": "b8cff582a314aa7df533356808b8f3fd6035de45a4b860af131a0310297a68f9", + "benchmarks/results-20261016/btree-nonlexical/read-design/combined-read-v1.patch": "94bff042846faf69b5a10cb20a219ac4e3b49d501d4d45cb200c7dca2983a48d", + "benchmarks/results-20261016/btree-nonlexical/read-design/confirmation-review.json": "5f0a5098671d8e4fcf68cf21ec4e8b583e83d7616e91cbf8c0ceb19fd118b6c9", + "benchmarks/results-20261016/btree-nonlexical/read-design/confirmation-review.md": "05af0198bf180c11ecad67017ef57e598746593ed4f733cecb6e204b2256816f", + "benchmarks/results-20261016/btree-nonlexical/read-design/decode-outline.json": "961c2b77c944c187635b536d8258b35b5391a86bf8d51272afdf549e2a5d3306", + "benchmarks/results-20261016/btree-nonlexical/read-design/decode-outline.patch": "5e47765ae5b1146b7ae757cc8ebad95a9fd075c6d09d0232cada53b0ca889279", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/base-existing-formatting.patch": "b34c022bffb1af99d7f78e9745546172248a92813600d9b301774d5b9eb9dd9c", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/formatted-dry-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/formatted-output/src/btree.c": "0c0cb6f104387df0118ba4588c40e0ac3c54cc589d6ada0ab8ae80fd1fc4ede3", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/formatted-output/tests/unit/splinterdb_quick_test.c": "5c881a35687d7869cdb0b27a507de25baf553ee93a365100c3ea6ac204bdec0a", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/review.json": "d8d816fe6f63657420681b7482444bad272eabc79de24346b82482c0993b2e06", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/selected-dry-run.log": "13688bbaacc8605a9d3f6f48e613500eff72557ddf39de2714296c9a686293a3", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/selected-formatting-only.patch": "b34c022bffb1af99d7f78e9745546172248a92813600d9b301774d5b9eb9dd9c", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/selected-input/src/btree.c": "3d6a3f5d7dcc8ee5f3c474487715247d3ac901d2844f5f72cc2d9a1a0df69fad", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/selected-input/tests/unit/splinterdb_quick_test.c": "5c881a35687d7869cdb0b27a507de25baf553ee93a365100c3ea6ac204bdec0a", + "benchmarks/results-20261016/btree-nonlexical/read-design/formatting-review/test-overlay-apply.log": "2b1aa9464a61a606e36e92ba9d5bc55ad32a5f29e3c4714f40bcdea848bd1688", + "benchmarks/results-20261016/btree-nonlexical/read-design/message-type-assembly.json": "18643cb5ff695752268ebbdcd5adc92427d3baa54fdcb41750498bf140eb12e5", + "benchmarks/results-20261016/btree-nonlexical/read-design/message-type-proof.json": "2deb22611f76fa5d51ec546f767f24160bbc39a0fcb4b69150389f6a8a469494", + "benchmarks/results-20261016/btree-nonlexical/read-design/message-type.json": "8b25739a34366bffa3645dfcfa8e3cc935a77db98f67f5c2002d3aee9838c233", + "benchmarks/results-20261016/btree-nonlexical/read-design/message-type.patch": "417ea837c7a4ea4cdd24a5aaeb292fb542438f1f3c248fdab0945a54dbcc329c", + "benchmarks/results-20261016/btree-nonlexical/read-design/message_type_proof.py": "185d8614e7f777b5560d335fad8073a8eeda4bad90529a009d722fc784902fd2", + "benchmarks/results-20261016/btree-nonlexical/read-design/rare-blob-apply.log": "1bd61fb5487631a8640218c99fe115fd4415e723a7003b76ead323e7279d85ed", + "benchmarks/results-20261016/btree-nonlexical/read-design/rare-blob.json": "b49b050d4cf09c6f5e1193b51abf81f9be8efbe69ee0a3174dbfa1266eeb6bfd", + "benchmarks/results-20261016/btree-nonlexical/read-design/rare-blob.patch": "bc69deab462c9202f486a2e75a4f7dcb2c55ff7c8ca122dc37f41182ce9a389d", + "benchmarks/results-20261016/btree-nonlexical/read-design/zero-prefix-callback-review.json": "cb9ab6372106c6e83647fc3e75978dcb690fd0b52f04f452f0576fe2cc05c345", + "benchmarks/results-20261016/btree-nonlexical/read-design/zero-prefix-callback-review.md": "56cf3b32fcb726e315f81e58ed152571a12f59e782ab9fa6a6653be2d7451563", + "benchmarks/results-20261016/btree-nonlexical/review_completed.py": "3144fbc080cd985c4d0776117bea729b44668a770be3fa834905e8322bc2f8c0", + "benchmarks/results-20261016/btree-nonlexical/review_focused18.py": "5d067a3a58b523ace8bf8e62d7435022f9e7e250acc4a7df9ad1d5c6c0cf7d3f", + "benchmarks/results-20261016/btree-nonlexical/reviewer-sources.json": "0ba2d736c340c183ede61de92cbc0795de15c815ed6997a8c9aee21203aad7df", + "benchmarks/results-20261016/btree-nonlexical/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search-plan.json": "343e04463a0d1465b64f0b742dfbda76951e14f155998afaf266bb18ab7608c7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0001-r0-common-scan10000-baseline-on.log": "ad85a2466a1ce0d47137d5c708c9e8f4e613ae3071dbe0ee359bb26785da3cd2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0001-r0-common-scan10000-baseline-on.stat": "184bb4e015464cdb7dc9e11c49ac2701feb8196e5e0b3b7536a8fe2f51604090", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0002-r0-common-scan10000-callback-search-on.log": "153f07e8dce43e1c816503eadba935308d8d4c072278fbc2fed676f5aceedf39", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0002-r0-common-scan10000-callback-search-on.stat": "3770d2e7832ecdd25e223a309bdc3cdb75ca9b9c46220b360ea992dffc9e6d40", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0003-r0-common-scanfull-baseline-on.log": "aa440f546d63086163bb1fec44f65650f851e0c9673d3d38723040d5fec4d645", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0003-r0-common-scanfull-baseline-on.stat": "7802b754aa59191253e1f6ee322667ee251bff6cf5d5d78dac5593da7c9b77f7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0004-r0-common-scanfull-callback-search-on.log": "95691468444ec88ce7d8e344521e0a657b0b207ecf74d2b6d60c42800fa2cacb", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0004-r0-common-scanfull-callback-search-on.stat": "fd8006789000a6133c7a47db10bb1be54cc976433bf00db18d34648151ec24be", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0005-r0-nonlexical-hit-baseline.log": "447ac7888a332a2ff9161f1ae4c58e178ffafd892542915002eabb363b16b8a9", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0005-r0-nonlexical-hit-baseline.stat": "d3411997a1b7b85a845e3bf127480fa36eb8042507316e3df576ece94adf806b", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0006-r0-nonlexical-hit-callback-search.log": "026d3eb690c4c647ce9f292d7a2f251ab111b39e9a006de810947b917c6dbd04", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0006-r0-nonlexical-hit-callback-search.stat": "17cbffc3c97052316448af466351c8b31ab31350ed719d3f37be13dd24cd93f7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0007-r0-nonlexical-miss-baseline.log": "59d0a0e3bf55431cbbd9aa73d5bded81b86f2cf685d53eba77772dad3bba0685", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0007-r0-nonlexical-miss-baseline.stat": "50f6236e7d15d62f850421bc9269ebfe5267d468eb8b243210366950fbd77cee", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0008-r0-nonlexical-miss-callback-search.log": "1b71e7af51d08d27f777349f70478e3add217815a390a3d936b0022899301697", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0008-r0-nonlexical-miss-callback-search.stat": "b0071e27eb8f15a6fe3defb39ad102ce8e5faa5b9b89bff05ff5e9ab15824317", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0009-r0-nonlexical-scan1-baseline.log": "34f7c807414a4dc954a85f6ef67345be0bf8f42b0a99a8d33940b87efce95b00", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0009-r0-nonlexical-scan1-baseline.stat": "513df08138248f625ec6f8839bac81ea9170d4b0bc5a29463d879a0c6d876a3c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0010-r0-nonlexical-scan1-callback-search.log": "ba8d3a8c0573615587694ef3f9faa3102f37cda05a6aae27f709555dd7e79bd4", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0010-r0-nonlexical-scan1-callback-search.stat": "36dbf414d59513c2f4b90486f2b13ba1acf4a5b654ad23217ceeea11aabbd935", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0011-r0-nonlexical-scan10000-baseline.log": "8667dbaf8a8d673b78ca48a38410c787ff949f6458be3d57508a87f09702bc15", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0011-r0-nonlexical-scan10000-baseline.stat": "2ee5930d7625eda0d4011fc8bfff485a9a00d6fe590de45129f981690435dea3", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0012-r0-nonlexical-scan10000-callback-search.log": "d4976e1501cc1d356fc723e36aaef0e4b454994f2c849d14f402f85421b96324", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0012-r0-nonlexical-scan10000-callback-search.stat": "072775c084a8b50a4ee39878052f8f7c3c462fa55b7402206760a5557e690ea7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0013-r0-nonlexical-scanfull-baseline.log": "956cd7658756bafb0a0373923cf97dc4e7522fb3782a928168c05586bfacacca", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0013-r0-nonlexical-scanfull-baseline.stat": "431bd699c9dfbd566c3d164fcb79300debfe717cc1f1db9e1f33bf73817198c4", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0014-r0-nonlexical-scanfull-callback-search.log": "d5b4d723dcf7803c9e60c376af70a880451ad67ad11ebebecc0b318406fcfb8a", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0014-r0-nonlexical-scanfull-callback-search.stat": "d5dd5c0848b3c03ea7b76fe4d7def4eb54b62bccf72b1cdeece20371e4cb0a92", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0015-r1-common-scanfull-callback-search-on.log": "aa8c3473ca1461958b9e777afa2048cb3f8ee1128bbad70476271ec6ea602305", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0015-r1-common-scanfull-callback-search-on.stat": "bbc164bdb0bc30084411c449f4231cb7a09f0d77ccbabd1db1eb1a17cfebd4e5", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0016-r1-common-scanfull-baseline-on.log": "52449dc85c0ff56ad8baaf5568658580e973b079926d340aa9a67e14b5403262", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0016-r1-common-scanfull-baseline-on.stat": "4beb34158797e9ecf6f094fe008eeb1b7d4ecf51d9b41acccd0097d3461b0828", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0017-r1-nonlexical-hit-callback-search.log": "faaa43b236fc0dc75a0646840db21113f04d44b93fd94fa6cefa6ca8e61cb2b5", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0017-r1-nonlexical-hit-callback-search.stat": "5489b7cb20310f82e8adaf30b8e4c65f957177309eab26f5d16a476bdafdd821", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0018-r1-nonlexical-hit-baseline.log": "72c5a246174f870de2803dd643dd63a2f2b567cbf24271f87dbbce9a7f82e9d1", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0018-r1-nonlexical-hit-baseline.stat": "3dcf421c524349fcf7215f46156b999cb3034602450dd46d2c5959d990c47cd7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0019-r1-nonlexical-miss-callback-search.log": "215176584873ef1b04f91f3f8e04078a72d9717e4045186fad7ea454c94294fa", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0019-r1-nonlexical-miss-callback-search.stat": "6057e5a3e8c7877b60c1e99df75dfbf283812c3f5865ae11fc31892704a66186", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0020-r1-nonlexical-miss-baseline.log": "7d0122ea0d8eb27a18e689b0b23de1c83f9e8cd645021e4069c0e782a9f7a09a", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0020-r1-nonlexical-miss-baseline.stat": "6e195291e3edb8c75558dd7fad0d081274e4a2fcf43726205a90500c455b8122", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0021-r1-nonlexical-scan1-callback-search.log": "b62db32d0cbefe6a583c30091bf888eed53a09628d6043a35672c2a3a69e3085", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0021-r1-nonlexical-scan1-callback-search.stat": "39f499850ca7f88473762f04a66d9cbb535f30f716ad834d249a195b8a09e8da", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0022-r1-nonlexical-scan1-baseline.log": "cd641e610db0147945e89365053f55a89203289e5d14fd8f7225f06b3f0364ca", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0022-r1-nonlexical-scan1-baseline.stat": "b61df2e1b418e1e80f358690a1751ea5744e177af32c56570ff7d25e5d1317ce", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0023-r1-nonlexical-scan10000-callback-search.log": "56e991da1e96734940938a4b51706062036d571b089f6f15395d1b4f4577bf12", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0023-r1-nonlexical-scan10000-callback-search.stat": "f43dae91a2c7c57eeb470aba1bde9a04a569e4f2aa8f04eceb443ed4a58fd7e3", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0024-r1-nonlexical-scan10000-baseline.log": "e10a92efc4f624802c23e8d024556a01c3b9a54b49294013105da06bdef376cf", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0024-r1-nonlexical-scan10000-baseline.stat": "6a948c35d233dffc6507afebfc00fd2f98d1bcd4bc558ee4e7615ca256c8e115", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0025-r1-nonlexical-scanfull-callback-search.log": "a4e709b3ad4386a52f92b8a4edd416edc70ffdf46ad7911fc272ca5c98907c22", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0025-r1-nonlexical-scanfull-callback-search.stat": "deac06850aea81e69e4710edf3f6176d07106d939082da6948598df6fd47c264", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0026-r1-nonlexical-scanfull-baseline.log": "9b230285b728ddad1c461dec3e3fd7918a538456ec9dea667c44a9ace11d96f5", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0026-r1-nonlexical-scanfull-baseline.stat": "3977575e4da11ac1d4ac1927da769f43974940851ad816f06517948b78fc262e", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0027-r1-common-scan10000-callback-search-on.log": "d2cff67e613dab5b0aac8b9bc4f9d7c1fa063b3a9d9ba451ea57696c2b5bf755", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0027-r1-common-scan10000-callback-search-on.stat": "16834ac154b32de954d213c9ed5e9a1afbef4ec86a9ab09c913dbf942d7f2744", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0028-r1-common-scan10000-baseline-on.log": "8625632f321b0628a8c4bdcb30e30ff572162598a7d3220a7ca9df2bda657ecd", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0028-r1-common-scan10000-baseline-on.stat": "0c4e10592a6b6697b8ebe0a9438e3e5a984bfaf10ba6ae7cb49496afe680bdb3", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0029-r2-nonlexical-hit-baseline.log": "a8185b80265265678be5dfa423ffad27a3457889c5ec1da601340dbf7f263f73", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0029-r2-nonlexical-hit-baseline.stat": "68dd996dc18ccb2e117ffec193cb53914cf3110a9527678d094e704bb3ff597b", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0030-r2-nonlexical-hit-callback-search.log": "6a3c96c76a61de64ba924384c800b0aba23084c13264182627ba87f04a2c2055", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0030-r2-nonlexical-hit-callback-search.stat": "66c5f68583a8468620cbba69102293fa724a9b6d0f8bcfe7c566d24bccac2db9", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0031-r2-nonlexical-miss-baseline.log": "3668b9cf7bc7bc232dc3d7fbe4a333cc482c59ddb68023610c3ad7fd04b0674c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0031-r2-nonlexical-miss-baseline.stat": "836e50739ae742824909ff929daf884871e1feb084a1de266eaef36c649ffd27", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0032-r2-nonlexical-miss-callback-search.log": "058bbfb4037248fa324e135a8d05abdcd98840a940b53d43d71913110c8f25d9", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0032-r2-nonlexical-miss-callback-search.stat": "0bbd2bdca490edf8125daeabb60317503a4e549fb9188619f1bffd444cf4c604", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0033-r2-nonlexical-scan1-baseline.log": "b572ee025e479c7ebdf88ecfe0750920e2d96bbbdccb2a041b819dc9bfa34101", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0033-r2-nonlexical-scan1-baseline.stat": "68d919c95325567c4335c597c4266fdd113e5280a78ee490d34b308ec907e739", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0034-r2-nonlexical-scan1-callback-search.log": "6c6e43703cf960e77bca1ff9a76a1569d66a50e7858b7b19fa7ff3495ab7f0fc", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0034-r2-nonlexical-scan1-callback-search.stat": "0103c818a85376b934bbbad606c6f594ad67dda03c61f5c73786e15c9e43822c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0035-r2-nonlexical-scan10000-baseline.log": "315a2c40a347df1a9da247187d4cc520da518cd5aff799eb7bc89e79974f03e3", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0035-r2-nonlexical-scan10000-baseline.stat": "45ce7ad826372116118628cb8c7d0d9aedc28b78a31962af280a553cea5ddab9", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0036-r2-nonlexical-scan10000-callback-search.log": "15ccfbcdbe7ddd53b967ff1533b7e55e88958a7cd9a5f116724409b7a0434517", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0036-r2-nonlexical-scan10000-callback-search.stat": "339a2399740bff20ed087567a1de712215cdc5917e3ee52236dab11be68724f2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0037-r2-nonlexical-scanfull-baseline.log": "ae53a461bc4cbc801caf92708423e2b40cc623a23f6c8c948aed4ce26709440a", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0037-r2-nonlexical-scanfull-baseline.stat": "ed08fab7263871b35bbc41f716b7ef908aeba36f8189bc746a57cd30dca69f73", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0038-r2-nonlexical-scanfull-callback-search.log": "ee5cbd48ce55f70ef3f33cf7819792168ffc399f759c545b59d653bb48a987cd", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0038-r2-nonlexical-scanfull-callback-search.stat": "caefa66a48f5f0a21303a41ba8a1f83cd848cad3e350ea2b392498d762fd292c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0039-r2-common-scan10000-baseline-on.log": "a83360a47d364d5604cd2caeb9185a58cf4a466290f769266839adf46798c728", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0039-r2-common-scan10000-baseline-on.stat": "dd840362502d8e29114f0ff20eeff2728a42f6eb8f24ac8d419742e526dbcc32", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0040-r2-common-scan10000-callback-search-on.log": "fd36c22235420c35835ea6271833bd62def6674cb9c07b01fb736ec9e77adf7d", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0040-r2-common-scan10000-callback-search-on.stat": "d8f8d83719db6a43512e025865909779d2ac9f0be45a7dd8c335b67e47c340a3", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0041-r2-common-scanfull-baseline-on.log": "96817716184a95b8e95d842a9dee9016a322c5155ac36d85a589edc63a9fdd7f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0041-r2-common-scanfull-baseline-on.stat": "54d47670a8ff1277b42286760d4ee524f2501ca33adc03fede14f5e8f9af8e42", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0042-r2-common-scanfull-callback-search-on.log": "5dffa1f0957e1203abb5377d1400fe21aa420de9dd784c96372f2377959e3742", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0042-r2-common-scanfull-callback-search-on.stat": "95aa99583a8b1c3775f75546e0641c08c1e97bfa2b40069cd66712540485525e", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0043-r3-nonlexical-miss-callback-search.log": "6dea414bfa85c7da45dc1b39f395db1253e9487673e4c9798dad634bcade54e2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0043-r3-nonlexical-miss-callback-search.stat": "90df917f4e80287b234250135adf751d5b4d1242c36715954bd6f6661c83f729", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0044-r3-nonlexical-miss-baseline.log": "05e7169ae055b1dd53820a15bf221c82665f665b15cf60331bf98feeb0fb596f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0044-r3-nonlexical-miss-baseline.stat": "1e80bbdbfb30e333e246afeb99474c4c2deb4c6137540905579155c6dce7d3b1", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0045-r3-nonlexical-scan1-callback-search.log": "7611023cfa7822bd6c21fa6f200f068701d88a9a356ee4551ea73c68138fc250", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0045-r3-nonlexical-scan1-callback-search.stat": "60ba34c758e89b5a4fbaa3563f081a56e9eeec337e7ffdbc12b61c0b1c0e2aa6", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0046-r3-nonlexical-scan1-baseline.log": "c09a9c7b969c7e3f1d0e921cb599e912d295b3d3ab55cef19f576f5bc0e9c770", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0046-r3-nonlexical-scan1-baseline.stat": "deb2c1861066e80cb125ed761d22e4783c9232e0cdb2f2a0290b94cfb276d7bb", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0047-r3-nonlexical-scan10000-callback-search.log": "8c2705e92e3078fe873b6ca81e981f47d2750ed431edb7da1bf3d9932d3385b0", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0047-r3-nonlexical-scan10000-callback-search.stat": "05cfb2000f574ac706b68248e5857e3ffd7240cf196cecae9a973a67bf33e308", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0048-r3-nonlexical-scan10000-baseline.log": "dfb13d25a908cd8ec5b1d7f30c1b206389d1ca44c2e44bbfa1d5f81d2860b11d", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0048-r3-nonlexical-scan10000-baseline.stat": "b0fb71e52ae811ddf46c2b29313946b3f1951ea2049f4611aa8951c52ea7add7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0049-r3-nonlexical-scanfull-callback-search.log": "830293e22f76b4204b76e9cb36cfd85c00b4eb866be28b9e47c6afcfa1ca1302", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0049-r3-nonlexical-scanfull-callback-search.stat": "4b74423aa5b3cbd42c9ee3138ed2f21b96f41972891b3e03683ef07c2ee92a2e", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0050-r3-nonlexical-scanfull-baseline.log": "7e662961f77fca3e3d113e8ac207978dc177fd22b1a16ea0a51687b7b762d3ec", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0050-r3-nonlexical-scanfull-baseline.stat": "d8c55e883d17d7c6125ba2f359fa8ef1f38a52e2567038b245f7e91786f001fc", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0051-r3-common-scan10000-callback-search-on.log": "d6b951e2d75cd5c646986284df2ddd667f7311a66c4640a9a0b6e8a9d59026c6", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0051-r3-common-scan10000-callback-search-on.stat": "d761951a6c79ca51882080c3cce2e82b109788aa16f864dab01dfe0ccb5098d8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0052-r3-common-scan10000-baseline-on.log": "e8ffc90ef14456a99e12df11fbdc72d7ace42ec6eecc002adecb95f67a71b8a8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0052-r3-common-scan10000-baseline-on.stat": "f52ec902991b5d9ff86d8f6e5d8fb7d3d926f9a8f90e68ac02ae0591219969b2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0053-r3-common-scanfull-callback-search-on.log": "0fc483d5726c92f7a6228348368be289e00db6ccbcfbca7212829604a616e367", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0053-r3-common-scanfull-callback-search-on.stat": "1459468852787c8ad7732df04dffae7fe15f2667543bc89772bdf84e6d883a5b", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0054-r3-common-scanfull-baseline-on.log": "e391c4ca1fa7b01f7ca2fb490c8fd8357cf1a2de65510d218ba1246d8bc2e6c7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0054-r3-common-scanfull-baseline-on.stat": "08595212815aaaaed8505d264fac39eb7c103276ee873ad709bd4f52e7cfa1a1", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0055-r3-nonlexical-hit-callback-search.log": "e56bbdb35604f72ac4ecc1f5a4f72a2f6e2d1e09b7a59d459244a151efdda8e9", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0055-r3-nonlexical-hit-callback-search.stat": "703a58cee8fdc3723cb72b9a44e98d1e5af91f36f33d3be71a3fa07c1b77bff5", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0056-r3-nonlexical-hit-baseline.log": "206aed2bd3deccef4971d07c0b5996bdaf5dbea1c3ab4b4832c493e8bc29954b", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0056-r3-nonlexical-hit-baseline.stat": "1610a32599849fc62e1ac0128c2a0de3aa1fd873284ad70ba828544fc436be8f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0057-r4-nonlexical-scan1-baseline.log": "6b6ec87943cd51fcb6e7719323a7814194928a8461bc95182c3664ceef1aaa5c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0057-r4-nonlexical-scan1-baseline.stat": "6efdb9cefcc8d7592a5121a6f3c1b34e0b4db478efc80aa837b31785491d7e5e", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0058-r4-nonlexical-scan1-callback-search.log": "55590283ebf1c009507bf9b65f91f6c10474386d58c7ca404f23113eec7b026a", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0058-r4-nonlexical-scan1-callback-search.stat": "e00553c0857912938ec75dc5e5207fd644121fbf1d4e76ce5cfc3af2a738fcc6", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0059-r4-nonlexical-scan10000-baseline.log": "7653e044a2a7494f86ea04ad7a240d36020586fdfbc0eacdcecfecad5ef0eaa2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0059-r4-nonlexical-scan10000-baseline.stat": "531ee78d0c9682e6d293f80d60d6b9db47e2efc09bf9bb71a825dc9816fcefb9", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0060-r4-nonlexical-scan10000-callback-search.log": "e5b6fac01d76388b84221e0086ac88a83738493b4c40a495b2653bdfd6746980", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0060-r4-nonlexical-scan10000-callback-search.stat": "de8a17f86849fb0b86603726c01e5d3859438296014d125d65c42ab850afb828", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0061-r4-nonlexical-scanfull-baseline.log": "50bec23f4df716693083aa2f8adaa8747191ad2a0333aa0699130f3046f9377a", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0061-r4-nonlexical-scanfull-baseline.stat": "5a02e197256c2ece30bb9d298c1be9973c488553742befda83cbd9848404cef2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0062-r4-nonlexical-scanfull-callback-search.log": "b74131e049b88b8156cd9f5701263662856b732cd0551b735a1bddd4d92efcfd", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0062-r4-nonlexical-scanfull-callback-search.stat": "030623f8b4e516076c50f3e6892714c27b89b88b197e78ee78df6fb4a27da795", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0063-r4-common-scan10000-baseline-on.log": "8ff9aec5247551e7726d6a7b54b001008bf69964c9364c0553e6a4df530d636e", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0063-r4-common-scan10000-baseline-on.stat": "447ee2a90386f4cdeec042c4966a50bf7bec32e2992642b0d3e71d47ccfd68d2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0064-r4-common-scan10000-callback-search-on.log": "14d36afc669885882acc2e9b07485f399224c53e457b96d2a037b9233d3800f8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0064-r4-common-scan10000-callback-search-on.stat": "98d2cb68296bd10bd1b4751c7aca8474f5fffa0ba9c62aee573d49c85f3611b8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0065-r4-common-scanfull-baseline-on.log": "600d44b2d605cadf98db4951e7cd5cd61ec69da31411675b97449839c474a595", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0065-r4-common-scanfull-baseline-on.stat": "6d013c81bacaa40a2fe7fbee6e1605ee63c9252b71d2ea39f369a1c3f9d7b96f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0066-r4-common-scanfull-callback-search-on.log": "9006bd481df07dbac8ab27673a39e04c5aa8d087c56e28df014de370b448d4c8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0066-r4-common-scanfull-callback-search-on.stat": "fff749212983eae26bd2e86fabf7b34e64dec636e449362c121be54962991643", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0067-r4-nonlexical-hit-baseline.log": "96bbe20ab5612c9286c8bf58db7c34d5f9e4ddae6447d2d1a409396206122cf8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0067-r4-nonlexical-hit-baseline.stat": "ed2dcc7906cdaaf5016eef33553d4faa30c722c2cee53abc646f995f282ecf04", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0068-r4-nonlexical-hit-callback-search.log": "938e288d89293b9eef5d421625194fbf05933bf0e38a8014e2f9f43e20e01a6d", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0068-r4-nonlexical-hit-callback-search.stat": "ef5c4866b4cd554d1fd8dd03eda9630c7cf9fcc9abe4d89df016e4f2b7e0aad2", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0069-r4-nonlexical-miss-baseline.log": "ffe20064575fdffcb3fc3cecc5c8f8baf992b9c033900b726cd883ca080e729f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0069-r4-nonlexical-miss-baseline.stat": "200c7c61abf85911c2d22cb32b58a0e4414886cd8853bd761e21555aa936c73c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0070-r4-nonlexical-miss-callback-search.log": "df751ebe97bf325f1a74a55d3e774d6cfd9b8ea4975e4154834b39c004ebc48c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0070-r4-nonlexical-miss-callback-search.stat": "35b2bb93f92340fe0730e0e71e8acd17ede2bc5f421a6a4a04a03608ef591716", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0071-r5-nonlexical-scan10000-callback-search.log": "ae013d2f02a378bffd8a450d777987bcfd2adcf52a0a09180062a6b28da5fe61", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0071-r5-nonlexical-scan10000-callback-search.stat": "0f5dbab685bf6eb4cf907f047f35da6251682a5f05c9ec5fbb03c86a30bd0bfc", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0072-r5-nonlexical-scan10000-baseline.log": "2f039a8e37aded2280945f3bd7612be6dbbbb58256136f5e58d18c2839d6fb2c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0072-r5-nonlexical-scan10000-baseline.stat": "774894376ba14e0a2a8418364e4153c5f47e6a93a71363e5cb2324d80745d874", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0073-r5-nonlexical-scanfull-callback-search.log": "465d52229d317292fc1e57bd40fcfce3fac892b4afee19bacb76f31b90584fc9", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0073-r5-nonlexical-scanfull-callback-search.stat": "7b5bdb3841ba17789ae851d76450a8108afbc2c9a976693414f6ec9408a3bf90", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0074-r5-nonlexical-scanfull-baseline.log": "dbc58b9dc8673372b858094132400326b67426d92813c7f1c47aefd974c2254d", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0074-r5-nonlexical-scanfull-baseline.stat": "a6767238d15bf4c43e794c8d340afc8db76db1e65025f798912b2ca2f37ef021", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0075-r5-common-scan10000-callback-search-on.log": "198aff2724294d80abbb6efbdaf0a70c9f97396cf1578b7451652eb9ff4c9fe1", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0075-r5-common-scan10000-callback-search-on.stat": "e3228d008a6e8498242aae6d0796678d19a3552964205c733a07c1565c6ac50c", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0076-r5-common-scan10000-baseline-on.log": "d6eee5de7ea09f078aa34112742f3b2b9a8ddedd21360bd56ee7b154e6f58ab5", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0076-r5-common-scan10000-baseline-on.stat": "120354d6600181181527de3924e60d5cc618d4a42c02cddd8c6bf13bd181e33f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0077-r5-common-scanfull-callback-search-on.log": "8375700ae69341a232f5ac144c3013bfd3dbad946b9a1335feb2cddb0b9e35e0", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0077-r5-common-scanfull-callback-search-on.stat": "38f1e7fd9d6fe2d4f204b46e44635d21917e12eea6a51a3cffa8c95c572487af", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0078-r5-common-scanfull-baseline-on.log": "e1247c6da6a4da21ea11470565fbfcaea62793d28535c952f7760e313cd2b4a4", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0078-r5-common-scanfull-baseline-on.stat": "e08642f040a1ad26aec26d3ee79639aacd73f740b8bb3392655f076d91ba2220", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0079-r5-nonlexical-hit-callback-search.log": "47cdefcb76af987edebea9e8a14aee99e8a457099a650deab3c5e177c45849d8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0079-r5-nonlexical-hit-callback-search.stat": "48c521a5b9cc0eea030089dc61ed4d497442563832fa0cf7ed759efaa2b3dd31", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0080-r5-nonlexical-hit-baseline.log": "681a802c5144d8559f9a871aa559877a6c997c1f8463f9b10d03e24a1920b86f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0080-r5-nonlexical-hit-baseline.stat": "8b1dc5b08415e7d21db584433ed5de7dbab12b74ae902b832cd5b7a272fd6285", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0081-r5-nonlexical-miss-callback-search.log": "19215e2c2a127f1d7e28c2a03a8136d87eb8e5cd15df0977c6d61a4d3f4334e1", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0081-r5-nonlexical-miss-callback-search.stat": "1baf8b0ffb179f8829f7bbabe331191b81d618f81cff3c45c4fa252e2dc837a8", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0082-r5-nonlexical-miss-baseline.log": "0242957808c2029db29080b269c61238f9b711ac3e65d01a7840aa2fcd1d6ad5", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0082-r5-nonlexical-miss-baseline.stat": "4994dfd0ae94705c1fbe60c5b070dc0b15c70e318ca11333cc02256057488e5a", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0083-r5-nonlexical-scan1-callback-search.log": "c5ae25dd8e59d16cd1694f7938cbcbc6dcae19a4c5e900fe69b57543c06ecc82", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0083-r5-nonlexical-scan1-callback-search.stat": "14923e8e3deb069e1b69c54ec4fbeb8e4955d8644041d4e35bc2f3deda464fc5", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0084-r5-nonlexical-scan1-baseline.log": "09ab5203d0144632817218661f1e7c6acd0a7e5cc4a37951a18f01f992f04688", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/0084-r5-nonlexical-scan1-baseline.stat": "ed93a4d01b528a3e7721dee07333e69318e1083e7b134980141c580041c64448", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/independent-review.json": "aa200f7cdfcaa0eebd1f7d7ba888f962ece439cb5b3bb2075de02975dee08e6f", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/manifest.json": "e6d775a981c2bb2bc2b34fe921ba0d760045a251915165f48b0a5f66ca216903", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/plan.json": "343e04463a0d1465b64f0b742dfbda76951e14f155998afaf266bb18ab7608c7", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-callback-search/summary.json": "b8f822aff39afcf39a7cae83e69b104c5168b77e42f433e028ebb78ec996b16a", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations-plan.json": "9a1d0851ec6ae04912fd1876224091e7c1d84926709144709e33e1ea7bb5bffc", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0001-r0-common-scanfull-baseline-on.log": "da192d17a1a6fabe0c156a324656b12dfdef4ebaabd9952b2a595c6a916ef8a0", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0001-r0-common-scanfull-baseline-on.stat": "edcc14dd45faeb960dae284ed410016af473f00da2538d6371a70b09e49a7772", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0002-r0-common-scanfull-combined-read-v1-on.log": "08f62c40f7d5e6f20a8909ea6a129c32b40fe25ce4e5d4eb01e82acef68770dd", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0002-r0-common-scanfull-combined-read-v1-on.stat": "4f0b0fa3b8a049087b3eba8b6e709fbdbc06b72a3ef451c74720f39040da0a39", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0003-r0-common-scanfull-combined-read-blob-v1-on.log": "0f1d01fbfa68aeef9c142ee4458295be03b352a500e7fc5ccd9c653ad7abf68b", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0003-r0-common-scanfull-combined-read-blob-v1-on.stat": "4c9aed8a7459bf0f6859d0a360796b1ad58c577139d019854f8391fc550044f5", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0004-r0-nonlexical-scan10000-baseline.log": "8d5e8c79dcf50e645c840b8ea8a4e22db4d9f47c3f560079028794c40c275d85", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0004-r0-nonlexical-scan10000-baseline.stat": "4ba8abd48f33b163e3063b5a225e4c7c056079fa2b6138048edc7aef4623603b", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0005-r0-nonlexical-scan10000-combined-read-v1.log": "050ccf72a23859e98e7c21894249b191f88beb412f0c70187defc7c6ef0418f6", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0005-r0-nonlexical-scan10000-combined-read-v1.stat": "408fb60ec44bc56c80b9bf3789fca60b4680471bcdb51cc17435c20ebe0b748c", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0006-r0-nonlexical-scan10000-combined-read-blob-v1.log": "3f6de7cf30dba6942e6b77d76c764080318f79c60ad7c12874fef5c40e1fff6e", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0006-r0-nonlexical-scan10000-combined-read-blob-v1.stat": "88bd6de657f790329174501ccfc0c2805e733977dca543ac9fcd330ffcb82435", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0007-r0-nonlexical-scanfull-baseline.log": "cd1702e5485a3cdf3ca435f2ad5a8e8e9ef982b9b540ef15a5fcbe2804ebe459", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0007-r0-nonlexical-scanfull-baseline.stat": "9b149503919303267250ebfdc19ea8b05c90af8195f776edb39b6ff5d42302a2", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0008-r0-nonlexical-scanfull-combined-read-v1.log": "1490901c53b7c9659d803c6231ba6b480f17a26f9998441aabffd416ab938c12", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0008-r0-nonlexical-scanfull-combined-read-v1.stat": "234b591c65b771228204a7a6ffac21a994c5360395a0354f6ea73faaafbab66a", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0009-r0-nonlexical-scanfull-combined-read-blob-v1.log": "66294f9820ed4c4cc1a76b390703bd7d8d7b744bb2262314f5b78c3576a0d2af", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0009-r0-nonlexical-scanfull-combined-read-blob-v1.stat": "ffc1622ad0c8e3f1e203f492f0d0006e0947de21cecc3bb2fd3218be61ac0456", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0010-r1-nonlexical-scan10000-baseline.log": "879b9b5ea3fdffd07597259afc7701bd348afce13398bd2123fdebebcc62f4fd", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0010-r1-nonlexical-scan10000-baseline.stat": "0351441407f4ea2fc3ced74dfea6a53eebe0417001cf4539d61f7851c80923e3", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0011-r1-nonlexical-scan10000-combined-read-blob-v1.log": "681098f2c238cbb949fdc4f5fc4f4dc57b84ea59a0d8bf2ce54d14371f576638", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0011-r1-nonlexical-scan10000-combined-read-blob-v1.stat": "5d6d4d144d13aba9be7b52f37715d205cc44eca58e1f5c2a8a7705f25902726f", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0012-r1-nonlexical-scan10000-combined-read-v1.log": "79ffd997169183f478c966eec2286728e4ea1922f4a99da99cd9311101acf35e", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0012-r1-nonlexical-scan10000-combined-read-v1.stat": "433ea2396853d8d1191bfcccb2fdcd9596da7cc825127f0f747003f7a8656d05", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0013-r1-nonlexical-scanfull-baseline.log": "2304eb56c3374778089da09e235242a64b57afa38818d1bc348a33408e54543f", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0013-r1-nonlexical-scanfull-baseline.stat": "b44510827808d58fc2bd6b2976062ef6d28cf8dcba5817ee0c94497522054cf1", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0014-r1-nonlexical-scanfull-combined-read-blob-v1.log": "790706eece0406546345065c7ec09b07cc524b67cd6ab8301428c6f23c664364", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0014-r1-nonlexical-scanfull-combined-read-blob-v1.stat": "08f3776a4113aac4da846bf94c1df2d5470ff1b29f709750e08fabe2db5c15bd", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0015-r1-nonlexical-scanfull-combined-read-v1.log": "151ea8147ae717fdd50096f7601af4665770091d1bb884092ef2fc599d9bbdd5", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0015-r1-nonlexical-scanfull-combined-read-v1.stat": "c9e0fe7489e8eac957210c2436f0922d9223215b9f3e03f69a774a1d4439dbaa", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0016-r1-common-scanfull-baseline-on.log": "20003438f4f4b3fd75cae627b68e224a1a38610fcacf01126b5f5e9e0b1793bb", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0016-r1-common-scanfull-baseline-on.stat": "51d0c80ec3e7a610106b591a45ce119d22a6f1bfb2901ed716c14b9dba834a79", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0017-r1-common-scanfull-combined-read-blob-v1-on.log": "3438c7253a962eb2ef0c001cb2b02f01bde6e7dca875b12ad6c2bb39e47a0a37", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0017-r1-common-scanfull-combined-read-blob-v1-on.stat": "25eadd98382fa69678f7d2b47dafcd174d531b3c603aaf10d540e5bde8c60fb3", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0018-r1-common-scanfull-combined-read-v1-on.log": "b1ae0cb5c2e03ba898a21802d5977550ca9c086b61656c1c79edb321c37d1d3a", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0018-r1-common-scanfull-combined-read-v1-on.stat": "5a6f54a5543568274a793731b2a8ae82d0b6089089b82e5c6f1a24cbc53fa462", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0019-r2-nonlexical-scanfull-combined-read-v1.log": "e12b6b24d4eb66cb290f838895d5ee2098560ec28a35152826551b1d8f423d2c", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0019-r2-nonlexical-scanfull-combined-read-v1.stat": "dd74408e6b495a9a84286044ccaa24644b6ae4ce9bbcb62fa3702bde0536b48d", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0020-r2-nonlexical-scanfull-baseline.log": "06214970c4ef8871219948b3905e91a11f501480d813f2d5d864f07a1efc846b", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0020-r2-nonlexical-scanfull-baseline.stat": "7246bb1b022717ca2e9387303933d2f8c97f8a9e725858443f0852c621468c6c", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0021-r2-nonlexical-scanfull-combined-read-blob-v1.log": "c71552a16baf549cf5558d686f67bb62a6571e4162d16578692ab19fb1e943b3", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0021-r2-nonlexical-scanfull-combined-read-blob-v1.stat": "56bf0e916157021846a42d27ad6b78aa55cc05b2599237a646e72168f21fbe5f", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0022-r2-common-scanfull-combined-read-v1-on.log": "39c9a5c61ba46e244d6be869f7bfa3d73f4f6af10f0f3776a6cc746239f998f2", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0022-r2-common-scanfull-combined-read-v1-on.stat": "a4676618eaac404938dc9ba89d8610fd4db198ee178e7031802f1b511dc2acf9", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0023-r2-common-scanfull-baseline-on.log": "0d3daa6076279b618ca5ab7ae177ab9702d23e6061389a904b362d48cf7a8a43", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0023-r2-common-scanfull-baseline-on.stat": "abe26fa20e10a9587e5e5c31546b9ebd12c6fc41e96ead610b5c6258a43c20af", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0024-r2-common-scanfull-combined-read-blob-v1-on.log": "ed94646bea77a87a915169e412e2691f163f86a461a133e7c97cfee060337c51", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0024-r2-common-scanfull-combined-read-blob-v1-on.stat": "edf1114a51d020ee34da35c069e7ba84f234f5e3c07c618378a1360aee7a1f58", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0025-r2-nonlexical-scan10000-combined-read-v1.log": "a8063354bac4a81b81df615e3fae231704ad61fe1d49bf6c7852e4fbb3757f18", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0025-r2-nonlexical-scan10000-combined-read-v1.stat": "ef1c950794593bcfd3ffbfe2929a2dc8666befd398ba91a6d42915af5a8622c6", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0026-r2-nonlexical-scan10000-baseline.log": "8590d5813abd9aae138af949ad1fb91f6756dcfc9ef1f412d1d3f5842fc66e09", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0026-r2-nonlexical-scan10000-baseline.stat": "1cf3481ba78890d57bb7bc0307d28cc35638190301fd74c6483b686dc1e899dd", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0027-r2-nonlexical-scan10000-combined-read-blob-v1.log": "5ffb3123fc9e1ffb8a05e4ca9029eb5c96cd4d7a9f0820acbaba3bc05a63bcc8", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0027-r2-nonlexical-scan10000-combined-read-blob-v1.stat": "4635b0f29989ba649e80949602b9056d0cd4ceaf589c61fec187859c39982e7a", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0028-r3-common-scanfull-combined-read-v1-on.log": "22fe7cd3b0500f535fcc7dcd00c08295fed551779fd74cab060eb9941c989dad", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0028-r3-common-scanfull-combined-read-v1-on.stat": "e1f045b43ed141f9d073affbb755e77bf8650c7d0ed9f5a2f512ede48a95f912", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0029-r3-common-scanfull-combined-read-blob-v1-on.log": "709f23d1a4f5b44d80ae2b5b60697c0556b4fbd3a47295f65f626b46cd553353", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0029-r3-common-scanfull-combined-read-blob-v1-on.stat": "649087c8775041e38afa4e6149a7a1dc5ef36207b7249d52aef180c96c639d48", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0030-r3-common-scanfull-baseline-on.log": "1156828ca125b58460fc5674045e843e107fcffa880b047ab726138fb7477881", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0030-r3-common-scanfull-baseline-on.stat": "e66f22a44821963997687495c97287d7d269951156729333e3dcb2018f479b59", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0031-r3-nonlexical-scan10000-combined-read-v1.log": "bc62e5360d7d6728832484110b5f26b0dde744a63e80c4348487c280ba070692", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0031-r3-nonlexical-scan10000-combined-read-v1.stat": "6a36a0ef38f30204c7d1708f4075b874e92ff1520d598b37a1142e0fb3c1b348", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0032-r3-nonlexical-scan10000-combined-read-blob-v1.log": "b136d02601e904c9fc45d7f14499d63dfa58387fd8006b5763b93105580bcce6", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0032-r3-nonlexical-scan10000-combined-read-blob-v1.stat": "c7be212577812f5c250b364e3b204c3bf91c51e9fe96004758bf4e1eac29569f", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0033-r3-nonlexical-scan10000-baseline.log": "911e23f42a343ca5bea9a801f2a6f5fb28511221a1f12cb8a86bc7f37764b665", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0033-r3-nonlexical-scan10000-baseline.stat": "442ff74b052935666f863ea6a5ec50668ade67dbb19b0bc7873225e9902d2428", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0034-r3-nonlexical-scanfull-combined-read-v1.log": "fc452503490d85c4832ca979191e426d815e614387dcc76e371deea01e3f3d27", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0034-r3-nonlexical-scanfull-combined-read-v1.stat": "678c9d268fa2179939f5272375ceb8517bfa7db72784d5ede0f64b9e3766f88c", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0035-r3-nonlexical-scanfull-combined-read-blob-v1.log": "f46081c645cd981cbd74c483ac83bb82d84f3b0aa9f4a62f5213bae316a450aa", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0035-r3-nonlexical-scanfull-combined-read-blob-v1.stat": "a362318b6dbc68edb17602b67b38aa883b2d20c3227f1d9c72a159307678d56f", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0036-r3-nonlexical-scanfull-baseline.log": "ce28a9594040bb625cdb9833871a41f886f23bc139f4c6fcdc59bcba4ac524c5", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0036-r3-nonlexical-scanfull-baseline.stat": "63a9344c23ee38c6041d37e747ef2f43c5989696405e5434529beb9258cecf12", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0037-r4-nonlexical-scan10000-combined-read-blob-v1.log": "5e94ce6ba57c5a9d2274d526ea8f7dd1df66417db2072fcacd867304645e9369", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0037-r4-nonlexical-scan10000-combined-read-blob-v1.stat": "6537daa77e1232ecdfea506151d338b8a4789da55b6e76a5f156d221430252f9", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0038-r4-nonlexical-scan10000-baseline.log": "a2a492a4397a112337e79a7a203d252c2b9a6471c671d7cfe6b609f5cbccad68", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0038-r4-nonlexical-scan10000-baseline.stat": "33c51f748d8395ea97673a67741db3af279d1b34ed130c059d160964733e4758", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0039-r4-nonlexical-scan10000-combined-read-v1.log": "8e6cd0a8a11dfcee95f0c9cdca97e245a4889385abd4d57628f06c0f8fd5adb6", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0039-r4-nonlexical-scan10000-combined-read-v1.stat": "8e4a88f4232f7960706c1df5de06af6b0dcabb8704d65c23991aeab4a76bc274", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0040-r4-nonlexical-scanfull-combined-read-blob-v1.log": "5445dd215cb8273c19fba31f8ff47e6a86bb7d1c38da682a15e02b2ae9aeb6d5", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0040-r4-nonlexical-scanfull-combined-read-blob-v1.stat": "58cf501a182fc38f03da073613c06023f4ca0553c965452a34f21066b946a266", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0041-r4-nonlexical-scanfull-baseline.log": "cd31f40cde310846e8e8a986eda9e5eadea71bb4e693838dc8d34fc219d622c6", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0041-r4-nonlexical-scanfull-baseline.stat": "3072bceee37cd38fe8f6b85512db6990396b50b578aa0fd57f66d85127e4b643", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0042-r4-nonlexical-scanfull-combined-read-v1.log": "ef193a8b48dd3ea05da2eaf597245b24fafc138aa4c6f708a6bcfae1429a67f3", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0042-r4-nonlexical-scanfull-combined-read-v1.stat": "fdd5ed108415b644cf3c2b83514200fdc3c7402f38e3d35b40aae4e342accc10", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0043-r4-common-scanfull-combined-read-blob-v1-on.log": "43c69ff6751c9d75d85688a4d359f093637c145e87204714b1a2eea2f1743199", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0043-r4-common-scanfull-combined-read-blob-v1-on.stat": "2bc315e474429a62c6b1c3ef57aa0617cf47bc88845b94dff02590c0c01f5428", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0044-r4-common-scanfull-baseline-on.log": "6be2d05cd0b86788ee08501914f8a459cfbc21ce99ba4557bd41aa2197968583", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0044-r4-common-scanfull-baseline-on.stat": "578278ac12982de7a34d07c2d0f30c1852833bf4d9795efe3939c3e84c4573fb", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0045-r4-common-scanfull-combined-read-v1-on.log": "11c00a65ac7fda160db9dcbf29a71b054a1eff717f7ec34262a36664d678c1fb", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0045-r4-common-scanfull-combined-read-v1-on.stat": "f38ef0061f0846b1f337782efe921f7e6f7d80787c5084e26fd320b2502c6ffa", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0046-r5-nonlexical-scanfull-combined-read-blob-v1.log": "611d31db2b4ce05c95fcd4b4f5d164d72792bd26ca2991b6ebaabf514b120456", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0046-r5-nonlexical-scanfull-combined-read-blob-v1.stat": "30418634e3d0691b09b0ae95b46579f0982e1e74d100a75d52f8ccd5aa390984", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0047-r5-nonlexical-scanfull-combined-read-v1.log": "62470bfcb069fc236f26ec349b81ca2003089883d824e3f4c709f054bd887399", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0047-r5-nonlexical-scanfull-combined-read-v1.stat": "8fe7fa3bea5de9fec97af74429d8e5501d14f38be294caf2f1dae96ecceb3050", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0048-r5-nonlexical-scanfull-baseline.log": "039f379f7bb935066fcffd5b3c880ef7a42b78b54d3ec6d8cfb450a6b304eda6", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0048-r5-nonlexical-scanfull-baseline.stat": "c0f49ddae8c42adec7413923234dc7eff91925b09df5a7b748cecbb7539c6f56", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0049-r5-common-scanfull-combined-read-blob-v1-on.log": "a10116649daa55c67ad5493755c3f6301483c3962186932a30cf931acc77b840", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0049-r5-common-scanfull-combined-read-blob-v1-on.stat": "4bf61fba1464c256b3c0454c6e756066cb3480cafdd70732eb4b97f041a73783", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0050-r5-common-scanfull-combined-read-v1-on.log": "085b090742e7882f4fca3b549f2e314cf17a5d98e607d52be0231cd0f0d5e9f5", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0050-r5-common-scanfull-combined-read-v1-on.stat": "e3e44495baaf892786a7cc607ba6cf7329f5fffc6162969c0670bca20c825d4a", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0051-r5-common-scanfull-baseline-on.log": "f48e3ebf8462a90c732588ec445f8baf4a8dbfcff1222d43dd48be314c99f36a", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0051-r5-common-scanfull-baseline-on.stat": "757a5e03e2b1c07cf8b103fbc67fd7def0f3521d165a7d933efe323cb38f300b", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0052-r5-nonlexical-scan10000-combined-read-blob-v1.log": "ed973628b36f7c64b68e2ffe2bf73d48963774481b57bfefb08558985421b26f", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0052-r5-nonlexical-scan10000-combined-read-blob-v1.stat": "cdf1f90630abf1766b6875697e8e7219a05fcb5b50530cfa4f36152c29384c49", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0053-r5-nonlexical-scan10000-combined-read-v1.log": "81cedf5240eacbaf0d959f96c887bd63e84e4e53bb9919cd2378a9a043f605ca", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0053-r5-nonlexical-scan10000-combined-read-v1.stat": "ab69162ac4cb40a81323ffa480873d26dc7f6d4d3cef7b6356ee7a9c32892494", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0054-r5-nonlexical-scan10000-baseline.log": "6585e2cc51b95c4569744c4f46b2c12908b8e6f5a0b89ab54d99c86de083145f", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/0054-r5-nonlexical-scan10000-baseline.stat": "1d3f54f5f16cc701d3768c22f3dc775d2db80ef78989d1688b1fe00695a12752", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/build.json": "c842fbfb98f9b65f6b166a87882a6cb5b4b6ec2d7255baa68eff289b9786f035", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/independent-review.json": "d30088e4c614c0c5265180dd232114f8af177d06e7d7c19613f75f9ef25220ba", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/manifest.json": "c3efe53b183d32c7e6b08c367bb93cef05cd5eba9118bbdade1010e6932eb933", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/plan.json": "9a1d0851ec6ae04912fd1876224091e7c1d84926709144709e33e1ea7bb5bffc", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-combinations/summary.json": "d4b672f30331c5a5976e9f6b4008dab47e2c229ae9d93ff90fd35571aab35181", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline-plan.json": "e1621ec86ad89dbd8e85cdb2f91f2955023eeecb1ca76c09fee6f9abd090dbcd", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0001-r0-common-scan10000-baseline-on.log": "104fa9e2a8a1fef9b890e902956793681c6dfd0b9a177550fda1d972d7cce685", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0001-r0-common-scan10000-baseline-on.stat": "1a20b53dd24d461ef928592d7e154f7bb37152d4ac410d9739534d1cd0f0e36a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0002-r0-common-scan10000-decode-outline-on.log": "183e571c0c802e5d08795783086a6fe6d07ef9e0952f8c1fe269d8116a9f0910", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0002-r0-common-scan10000-decode-outline-on.stat": "328a484f78c05cdf29c8431840f7564f5ec53ed1c8a4472d28711cf2e127139f", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0003-r0-common-scanfull-baseline-on.log": "8abff09b9c7fc58099754ab8c60620b44f2493de79c89faa2afd2dc0f8364ba9", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0003-r0-common-scanfull-baseline-on.stat": "cd23cb863d1016a22f66e0b7b40c0a1f9c44939b8edf69485753ae1f1697f6a8", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0004-r0-common-scanfull-decode-outline-on.log": "a6a3e0786c2c80df98d118fe9a9bdf462ac43165743792824f704edb89818b01", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0004-r0-common-scanfull-decode-outline-on.stat": "a0bc169e2e74369ba3b99f6f928e114f846a6b7ccceec91f33cb4e00f24b63f5", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0005-r0-nonlexical-hit-baseline.log": "98c39ac8892868399e8000f7a9ee894d3cf852f7bef3613792918bbeb1491560", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0005-r0-nonlexical-hit-baseline.stat": "d29fef0ad9d69e676ce4db9c74dbed033d8a2288d65bb801376ef852ea10db75", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0006-r0-nonlexical-hit-decode-outline.log": "66e878b77597ab3a500bb782ad2c6183ad13585f09e7c8c20a93fc29020c92dc", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0006-r0-nonlexical-hit-decode-outline.stat": "986646c5130c95ab4b6ce281ae8aa0591848d58b484a1d66b0f03dbabb8d500e", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0007-r0-nonlexical-miss-baseline.log": "4acb97fadc1a8360f8c4048a45f17bac0c4f37afa1c4f7f6de7c9e5f16b1117f", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0007-r0-nonlexical-miss-baseline.stat": "71ee49cd70d97136112ca23df8e9ca1140197a05b8fe4a5f4402768d06810a59", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0008-r0-nonlexical-miss-decode-outline.log": "8335793021a0c55c99be43abfd34f1e42d45933a8c3d834b3f56e683a3a07aaa", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0008-r0-nonlexical-miss-decode-outline.stat": "bef5aae7bb60a4739e2e4946e38cd3add9440dd1bad2c5c795ec3bf62554c2ce", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0009-r0-nonlexical-scan1-baseline.log": "74c7772b23741a24cdbb55e7c7e578d8f016ecc4c19f86f63cc59b9b5edca9cb", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0009-r0-nonlexical-scan1-baseline.stat": "ce531991c140acffd4392f8e078d611e1252754df1331ad8d1dfd2094a44000a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0010-r0-nonlexical-scan1-decode-outline.log": "3ffd019737c03943de62dee391baeb2e7993b2893f32782dae85e73af2aa049b", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0010-r0-nonlexical-scan1-decode-outline.stat": "53c261763f82d056bd5349aaf21f235f336bc9113adf0f381ce06ed2882a852d", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0011-r0-nonlexical-scan10000-baseline.log": "afa3f7809559907a5c7073f0cb747aace96488e46498910d3b8f359ec57b7438", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0011-r0-nonlexical-scan10000-baseline.stat": "7ed1b0623356c95ada7ee29c69f1c43fa9373c1de3c35820e4dcec3a484a48aa", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0012-r0-nonlexical-scan10000-decode-outline.log": "0b79a631869f6041eb1fb4953fac5ec533ba3cda28f1a89c1ba5f34d8581f7c3", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0012-r0-nonlexical-scan10000-decode-outline.stat": "b46ffbef4fd29570b2af42454f199d5c722a7e7b6fc0336813e5acfcafac58c3", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0013-r0-nonlexical-scanfull-baseline.log": "8e4f6a4ef176fe542a1a97246dbb2d1cf7950322e4b079069a836e54aa41ed9d", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0013-r0-nonlexical-scanfull-baseline.stat": "8a9d2bdba4856ab4c5ef0284c1ace8b653b6f2140a26516190dc82d3b331f569", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0014-r0-nonlexical-scanfull-decode-outline.log": "02989b48177b480d1760b3c2ceb6942af29b5a8498bea82ab74b238396332812", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0014-r0-nonlexical-scanfull-decode-outline.stat": "807c4bfa35c37825ecf00f46f305f07370f51280d8b1a93086b392a7ccede0e8", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0015-r1-common-scanfull-decode-outline-on.log": "decbb222fd5de2674211ac94d0f8c11fe54eba3245f158146096844b397335db", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0015-r1-common-scanfull-decode-outline-on.stat": "9c1b3ee806840df10da80e14a97db01f1b6ed59c3c0e871632e75f49f4370405", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0016-r1-common-scanfull-baseline-on.log": "145bfe8896786e800a01e3eb82ef241d3619568a6a579d50b30eb0b840cfaa21", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0016-r1-common-scanfull-baseline-on.stat": "44e7e13f8bf69333418950a0aee69c8abe2e11bf36f316d7297bdb150a16ca5f", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0017-r1-nonlexical-hit-decode-outline.log": "a25834e492f83e5759d719f18977a9ac84b27b40968f6b597154450408626039", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0017-r1-nonlexical-hit-decode-outline.stat": "6cfb0ef897eb25ae46e1c019e5aaaf72f6ca4269c425945ca43458eb6725e4b0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0018-r1-nonlexical-hit-baseline.log": "59768d0c69b3541c398752f3a342ea6925e39d9d116acf9fd5f3be3ccbd778cc", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0018-r1-nonlexical-hit-baseline.stat": "5efb31a9bb2c05de4301914e7b1c7dd126b22a06f0dd6b163345ed16f1853439", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0019-r1-nonlexical-miss-decode-outline.log": "b33aeb0261fb03f9d9626ea88483b497835ea6f88e97cef858a1ba4e463c58ea", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0019-r1-nonlexical-miss-decode-outline.stat": "daa3d45f1db7589acb9096a198ab38d25607a86f638f78cfc1df8120590dcc05", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0020-r1-nonlexical-miss-baseline.log": "64bb3899740d86f14c5e1a26d7c957a4628987bcc60957b7abc0a7ba2820821d", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0020-r1-nonlexical-miss-baseline.stat": "5997966d5e6d7bce68d3a85a2ea7c8edb5ff48291098e75abf6ec25c9394a5d9", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0021-r1-nonlexical-scan1-decode-outline.log": "78c7de9fdd3a3d8e02e191de43cf7c668d6c5b23072235e7d56d967420830bd8", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0021-r1-nonlexical-scan1-decode-outline.stat": "a6372bf3d0cbd9f76d0a2c99790d9a27109cc86f109a5dbc7c1334693f65c94c", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0022-r1-nonlexical-scan1-baseline.log": "2bd3b1d726062e16c046adeb88a04458589c1753b79b1b10affc3f6c2039abb4", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0022-r1-nonlexical-scan1-baseline.stat": "9fbc74a3de61feb422edce4ae8f15d3898ec7f56135acf355ac788964f2af9a2", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0023-r1-nonlexical-scan10000-decode-outline.log": "7364c848fae714c58e4f0c8525683f20ff7b3bbd52ba595cbb502e83437cbf60", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0023-r1-nonlexical-scan10000-decode-outline.stat": "26ca58dbc0962b9a17bca243146d39763a789aea78c34b504bb526ca63b0a6c3", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0024-r1-nonlexical-scan10000-baseline.log": "a06d160e9dc7723da27d55cb8bc41cdf009a88bd5cbb2e16bbb23b3248033272", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0024-r1-nonlexical-scan10000-baseline.stat": "19f68f9e92388fdf64f51839823f91d42c5c5b7eec7ed82ba0d4026633d7e218", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0025-r1-nonlexical-scanfull-decode-outline.log": "5c251c1cc87c4442899ebdd2128dbbe2eaf9b9f32aa182ee313b28ddfc198eda", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0025-r1-nonlexical-scanfull-decode-outline.stat": "0d6f9f9efcfefebfc30ecc9f992f300ce035d78251cfb8b2d4adc42c204afdf9", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0026-r1-nonlexical-scanfull-baseline.log": "3c98dad8ca5d78d0d1176d1d248e4a6fd47f6b5c81508aa3fb0810b7c85bb012", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0026-r1-nonlexical-scanfull-baseline.stat": "8b4e642258bf0e5dac6afc709e203e4dfc7e0e187747d098a096d8f9a0dd4cd7", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0027-r1-common-scan10000-decode-outline-on.log": "1d931ec75ee7667845da34636a2a0b720220808740615fc7dd44462a61dc8785", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0027-r1-common-scan10000-decode-outline-on.stat": "86c1fe3df6c9de3613f08821c6ef0415312fc2d14218ce6615ee4e31cafcd1b3", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0028-r1-common-scan10000-baseline-on.log": "133295788562b14a910514d17908485a3b5f04c51634b54e8ffc17f445e2527e", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0028-r1-common-scan10000-baseline-on.stat": "6ac21d148a919810f895e47fb1a6eacae5564620381dda8aa2598b1eff4f51a7", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0029-r2-nonlexical-hit-baseline.log": "8a20252aa927173698aeacd79437206b26a45752709d69bf21b9f44044511874", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0029-r2-nonlexical-hit-baseline.stat": "a993485542d23fd43a70bea952b0d38c5179441a916a41f01322aa6d5e56ca46", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0030-r2-nonlexical-hit-decode-outline.log": "07678e3be44dd467b6d6773d147c691d41e9622a312290b7592182bfa23837e0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0030-r2-nonlexical-hit-decode-outline.stat": "0932c3a0d962f363ea327dc50b5f3307ccf9037bcf22b6e3dc2c6d90bf756e61", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0031-r2-nonlexical-miss-baseline.log": "1849f6a3f701ed62472b9d82bccc33bb437928132b3c48e61f694cac28bd15a9", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0031-r2-nonlexical-miss-baseline.stat": "96b01635bbd9cbb029f2ad45bc07e0b03d5f91c017b600fd83ee7e06c77b71cd", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0032-r2-nonlexical-miss-decode-outline.log": "4328d8946ec83693342d7e6bfc77058f77bfd8492088bd9eb378647af46601b4", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0032-r2-nonlexical-miss-decode-outline.stat": "09b272972905d511f85482f8fa666aab2e93fecf2316a19e538a8d08ada36115", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0033-r2-nonlexical-scan1-baseline.log": "ef15b20822ac8ccfcbd2354fb932766c3a201635576d8e9ede10e2504e85ae55", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0033-r2-nonlexical-scan1-baseline.stat": "d434229f28f7b994ea48c4324df8f64cc50f84b37953e05d9439b97d635cbadb", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0034-r2-nonlexical-scan1-decode-outline.log": "22e9c55d2cac64d949097107f9e2791f36299dcdb630e135b4da6f2d2516d48c", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0034-r2-nonlexical-scan1-decode-outline.stat": "a39699fe6b2e5f37063bf6e5ed422377e59527749965926a9c2b0bba75eca3cf", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0035-r2-nonlexical-scan10000-baseline.log": "778ba4576bf0b8b340542e79033e1032dca8fa5c4a6ecc3a04e31f9174bcaef9", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0035-r2-nonlexical-scan10000-baseline.stat": "830689956ffc1bc3e461382ec1892d7e6e367fa19f5aa5059a0a51f4763c824b", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0036-r2-nonlexical-scan10000-decode-outline.log": "13f92477aab1b6f7c799cbacbdd570b3139d785737712a9ad908fc09920676ab", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0036-r2-nonlexical-scan10000-decode-outline.stat": "4c79d9a9e2844838daa264c97949daf8677de25af9e88c9e10a68dccfbf219a4", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0037-r2-nonlexical-scanfull-baseline.log": "022c35f7f6222b33a5d4f34cef885e325fadbaa71892982ec916d69ff40f00ee", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0037-r2-nonlexical-scanfull-baseline.stat": "84dbf167ce539d54f4840e20b749fdc43bf139e462a7578aa8826424b384cc9b", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0038-r2-nonlexical-scanfull-decode-outline.log": "c059d1998ede537c20274e81456157389261142ed47d415b317eb3e1e3bc9a83", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0038-r2-nonlexical-scanfull-decode-outline.stat": "5c177a23cd8cf4cc8d66b075026fa8cd5227459f75335a1033eea0be4c624666", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0039-r2-common-scan10000-baseline-on.log": "c782f58fa6e0e5b9ee596adb6423bc450fc4f4ce71df56070cc5081ce1959854", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0039-r2-common-scan10000-baseline-on.stat": "bb540ae6d0cf7d701f9d697d44e632a0fb265b1e87ed7520366860e3cabd26e3", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0040-r2-common-scan10000-decode-outline-on.log": "504fadb08f2f0298b5a33bea281a5e23a88a08c3efc659a88d01aef77828fa20", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0040-r2-common-scan10000-decode-outline-on.stat": "8fdce51406cf30856203ee340ba4d79c5650d2385293e8a9265f7d0653330d72", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0041-r2-common-scanfull-baseline-on.log": "8e46ff493fc9c13c01bf4f2df06b7de6150192532d8c5334f74d4a66b3136ee0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0041-r2-common-scanfull-baseline-on.stat": "9ed615cbda989a80b7c0a5ec53f54f9e8b8908df0734549b1aecc478835866c0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0042-r2-common-scanfull-decode-outline-on.log": "7c5d214ca3f4fc014e488a012f687dc3322464f23973f4784fd77ef8db2360a8", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0042-r2-common-scanfull-decode-outline-on.stat": "908873f3e8459a272937b05a1d094f36b558b21670a5d13878a7826638c430d2", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0043-r3-nonlexical-miss-decode-outline.log": "18d6c443702f17f1585dbd45853680ef6f986f0753da510f69889e0c3c704442", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0043-r3-nonlexical-miss-decode-outline.stat": "82404428a1e22858e69720df8a5b1a297eb054effa3f7daf810f10dfd6d6ca74", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0044-r3-nonlexical-miss-baseline.log": "db8d8ae8dbbc115ae4b4d9f95075518d2db9b93d3638b4b7c8e681f6191e448a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0044-r3-nonlexical-miss-baseline.stat": "63b3b1e95c1acb332118c75c4f8c2b31cb24450f80beffcc3aeedd1ee376f8ef", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0045-r3-nonlexical-scan1-decode-outline.log": "75428e4e94d3d3f332b7f706be8bc8eba85a4a77fd58b73d2b9a6af71b9c5795", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0045-r3-nonlexical-scan1-decode-outline.stat": "6c9e840510fbba036589771ba25056e354ccfadac6ddaaf0c2d806b6a10db2c7", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0046-r3-nonlexical-scan1-baseline.log": "88ea0c570dcc66a2f0e9b8547587c3981826ff3204bd231f2d1224ceaad2d5bb", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0046-r3-nonlexical-scan1-baseline.stat": "d400b92a1b8838028d5c9952bac55cc2b6b57c90f35482fe796ddd0703555264", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0047-r3-nonlexical-scan10000-decode-outline.log": "1b24faf99ce6e95246edd6013b9277e15a539164906e06be545d040fd7e29734", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0047-r3-nonlexical-scan10000-decode-outline.stat": "dd3750a7c51cc0c17b373fddda783223d93dc23ed4ebc893b369dac717574b66", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0048-r3-nonlexical-scan10000-baseline.log": "898534fa8c6a72bb51e02ba62fc4ead5ccaed73296314e66f97b8be2bf11527f", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0048-r3-nonlexical-scan10000-baseline.stat": "e8fe1d02f20a5182218c3ae68384ce8d76ef87deaaa8e944c87dc13660020b75", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0049-r3-nonlexical-scanfull-decode-outline.log": "d4bc868ea589086208580e8e5eadd39fc2f4500bd16614617c34caa8301c25e3", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0049-r3-nonlexical-scanfull-decode-outline.stat": "f911c948ae67e9a2b54145c19a4c4175173ee93b25958635de26f4d5f9671f7b", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0050-r3-nonlexical-scanfull-baseline.log": "854768cedb4b33a004887aaa8ea6f452eb4b41551cab56909e9d81714588ec29", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0050-r3-nonlexical-scanfull-baseline.stat": "a3b3f9a899ca1061e44acb6dff60d2db08c2537d242b0934494ac539b14696f5", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0051-r3-common-scan10000-decode-outline-on.log": "9087d333a65d0e6147d750fa88ffae7f16bb47a4f28f4b26a14f6e5ea90bc049", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0051-r3-common-scan10000-decode-outline-on.stat": "627cae3064b1ad350b7fa1ed795db2e3495b3b1b71d3022664ed541b85e17ea1", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0052-r3-common-scan10000-baseline-on.log": "db13e83ac92f1c81d7098662cad430200e32dd78342f36109a27620de2774c67", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0052-r3-common-scan10000-baseline-on.stat": "ba4f4b2c24728ac08e7971354447feb4fe25fdb31d7587c1b42cf02db7fd0d8a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0053-r3-common-scanfull-decode-outline-on.log": "f163e1deee15a610f4c16c1f5d56dc28337bb8cc247d455eaf7813ed130fcc45", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0053-r3-common-scanfull-decode-outline-on.stat": "2db31dd73aacbcb5ef8b26f0ac27686070a6404092edd80d72de1a8af88e7331", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0054-r3-common-scanfull-baseline-on.log": "85b5959e75fb3824c4a5bacdae779061588ff495b3c632edb3e8a5b2d1a1c953", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0054-r3-common-scanfull-baseline-on.stat": "77976b28feb2138a412976601dc82615c1fb3c00faa2f0ddc1b1d05f06ac25df", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0055-r3-nonlexical-hit-decode-outline.log": "b8bba4f8489a64d01c68da2a07b5f0e8c0f85fbc05205d737899ad989c86eb5a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0055-r3-nonlexical-hit-decode-outline.stat": "fb9b5b7fb7a7f9556dc8aa145e3356a27b3f80ce9c46c9c2e5173e8e6ffec25a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0056-r3-nonlexical-hit-baseline.log": "eb75aa6665c98869f04103c428f92cef7df7633fa5c71243578357c1779eb0f4", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0056-r3-nonlexical-hit-baseline.stat": "b8b95433d0e06a196bf8084167a39fcaaea08dec88c91964c43abe918d5fd8af", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0057-r4-nonlexical-scan1-baseline.log": "ee5ea26fd6d3e6bbd33305b8a40e9b8d2bc2675bc5a52026889eca366530996b", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0057-r4-nonlexical-scan1-baseline.stat": "e678dbfa308dff20d4f7fc858b34e1e4b4d47866d714b33bdf026598d9a386ea", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0058-r4-nonlexical-scan1-decode-outline.log": "95ba54c9c05d0d6277b175f20dbe2100a50d4562eecb96419083d36b12722e48", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0058-r4-nonlexical-scan1-decode-outline.stat": "d90dd08fea058693fa2488c5f58c6bdb6ad653c7d54e8c9ea2d875fa95de9b9d", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0059-r4-nonlexical-scan10000-baseline.log": "bbd82143ae876f06b2906c7cc5cbc0c19a6328cba7a76e9d3fb6808fddc452f5", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0059-r4-nonlexical-scan10000-baseline.stat": "1ebee8729bacb347cd15c6962ea80a6f0a2410ff79d73deffcd885bd668f26e4", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0060-r4-nonlexical-scan10000-decode-outline.log": "6fae9ca2736ec41e3873d89bf1c124abf1852451bc2fb31945bf60130cecf7cd", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0060-r4-nonlexical-scan10000-decode-outline.stat": "270896999f023cc775f0d999e8018b79ec96ac4fc22804d77de20dd92142d1f5", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0061-r4-nonlexical-scanfull-baseline.log": "a99fa03527feebf9c48b8a12b8ea5bbe46c2697a1da688d44013b3814fc04158", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0061-r4-nonlexical-scanfull-baseline.stat": "a171613eb1457016cc1f014e41529e1ddf2ba3fbc8e6068508706adc4dc4f9e8", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0062-r4-nonlexical-scanfull-decode-outline.log": "661186ef8ddccb790966946ffcafdebf54c1c98f01179c3e8cf4d39c7799e633", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0062-r4-nonlexical-scanfull-decode-outline.stat": "036f478f72b18dd75f9c3d527d5d60dd110f1fc7373e679b9ac49e4901d90d1d", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0063-r4-common-scan10000-baseline-on.log": "da55a37721a2b891d61aa13bf8c03921578a1384a80f1029edc77a295ac64a49", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0063-r4-common-scan10000-baseline-on.stat": "b0e2f88ebbaeeb0179b19cf5c52654871e9194e1eeb09b5c69d68d0690e0ab63", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0064-r4-common-scan10000-decode-outline-on.log": "f906b3e008ba68a5e2d3df31846c47ca9115977e27d1fc752224113ed102aa45", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0064-r4-common-scan10000-decode-outline-on.stat": "136c6ac64ab6b024bd182d3fa6fff62e7d7aa22b189bae130a870c83250eb760", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0065-r4-common-scanfull-baseline-on.log": "2c3fd152b9aa86905dd1ebc23f6c9e4c640389f77a65184d647854f287a45a3f", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0065-r4-common-scanfull-baseline-on.stat": "a4f9849410571f3c992d3378978f9e9544996f2fd2b9f48eaf833374be9cc17d", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0066-r4-common-scanfull-decode-outline-on.log": "e0d9bce80b260d84aff7ec58e1fa0298f90fc1de9b8601c4e2aa02e64235c50c", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0066-r4-common-scanfull-decode-outline-on.stat": "ca69169387e51e0ddacb65dd58626126e4a7dd31f6c920be89b51fdd4f3f41ed", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0067-r4-nonlexical-hit-baseline.log": "540ab523036379a9fde3c5be26eb214399a683180cf16e8b8f4a31928488cdf0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0067-r4-nonlexical-hit-baseline.stat": "65fa964fc5ff73baa28bb5722116c312a218b41830d680d1997ebb80d6cfd491", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0068-r4-nonlexical-hit-decode-outline.log": "eda33fe5a1d9b777fe4ea5baef050c8aadec4fcbb6737066e2c19306b62c1e7a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0068-r4-nonlexical-hit-decode-outline.stat": "bfed82c676df355637be6438df9c8638aab48e0b7543ab630bb1ebd5ce481a59", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0069-r4-nonlexical-miss-baseline.log": "b0bf56415e9f8d82e201dc0f52d37cdf632594297951433995a5270b238c9ac9", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0069-r4-nonlexical-miss-baseline.stat": "03ef2dada465ffea368c4dcdaa6667f22089a2c9064b99289b3db26b2ab1d257", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0070-r4-nonlexical-miss-decode-outline.log": "60bcdcbd326a39dad35b5254f086fc507d4bf62e1cb101f5fdfb6d3de0ac8d8a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0070-r4-nonlexical-miss-decode-outline.stat": "86a966c596738fa8013cb5402b39ca13fad4560fa38b45cd5fd8d0278ae97840", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0071-r5-nonlexical-scan10000-decode-outline.log": "0b34479fc963a600c4dd446c65ee91e0600e985086fb7ad976407eaf5bc2c3f0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0071-r5-nonlexical-scan10000-decode-outline.stat": "c49cebc547904836d3dcc712e28134c359984e4a939c85195796b60873e92fde", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0072-r5-nonlexical-scan10000-baseline.log": "05ce21d4a2cd62faf1aaf33762f58ecee33c6b827d7e6a8e8962b36342c89c13", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0072-r5-nonlexical-scan10000-baseline.stat": "2cd06418019ed67a0a41b432510819194e40257f4fa712536215626df8ec58bf", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0073-r5-nonlexical-scanfull-decode-outline.log": "b02d22d7efd1f93ab0051ec7e35b873410c1f4a56d0f4eddf2f54ef72056bb75", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0073-r5-nonlexical-scanfull-decode-outline.stat": "c18653ff3cdedde2498efa3305ac6d45ac536ef331719e260a67ab5c0a9ab711", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0074-r5-nonlexical-scanfull-baseline.log": "7398440c4e7dc732b0f66f5a69523653f5cc2a04675d6f985f4efd6871bfe921", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0074-r5-nonlexical-scanfull-baseline.stat": "dc041f65eeb1b9d3f064208550404e36d79ca51c5f510d3a036fad490af60e4a", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0075-r5-common-scan10000-decode-outline-on.log": "c07981b94290c767f25486485a31646f69844b97417426a63ce1a2b1aa4646a9", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0075-r5-common-scan10000-decode-outline-on.stat": "4241f609ef8a799e842106aff62496a4c029fb07b4ed26ed224310a9897c609f", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0076-r5-common-scan10000-baseline-on.log": "7b46880153b6155450f29e64936b7c836e4f1a76def70c6fba2f5192985a75fc", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0076-r5-common-scan10000-baseline-on.stat": "aae157e3c0518f1387ee616b1703c383cf7fb37038e7dc9ae9e2cf50015d7375", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0077-r5-common-scanfull-decode-outline-on.log": "261859365bc36714f83ab1f5362347025e8e42e7db3cee5c9108499316b0863e", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0077-r5-common-scanfull-decode-outline-on.stat": "999272d878fafdf1674fe64d2c502cd3846cc432a8057d84424c676dac7cbb7e", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0078-r5-common-scanfull-baseline-on.log": "d34eb700e1cb95e3edb81a093c7f47b9b5d1a6a7a0111e7d1568b7dd7f33ce5c", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0078-r5-common-scanfull-baseline-on.stat": "0efbc9c748b097d67d74bb277c5eada8d5d3a2eb77f9609d6dbef6fa725efc94", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0079-r5-nonlexical-hit-decode-outline.log": "97d85804f0084343afeefce65436e81d36385bc21a3975497c9ac053b87dd510", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0079-r5-nonlexical-hit-decode-outline.stat": "5bab090e06c5cbe3107662fc07b654b7b462a3adfca9a3603f67098ea946f397", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0080-r5-nonlexical-hit-baseline.log": "5dfb55fc03eddd1cbb71284c9ed1fbf3115940a384f050a063d979c5a29bccd3", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0080-r5-nonlexical-hit-baseline.stat": "a05a82349617e4ddd9f216d838a27c206d5a4083e7c689bbb09d76dcb1b93645", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0081-r5-nonlexical-miss-decode-outline.log": "3b93cb9c23df8b7dc7e114a02a7af5029a9b7ac5a7de1844da97cb76020c4f87", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0081-r5-nonlexical-miss-decode-outline.stat": "4ca0106a15c2b9e3cfc500f576fe6928b514dd51415e8d0a95a35e1dd1618c38", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0082-r5-nonlexical-miss-baseline.log": "4165ac6dffc9ab55fadaf35c6b84188ff57d0830de2d6d2a907e2a3aa4ac81d8", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0082-r5-nonlexical-miss-baseline.stat": "90e51945dc4b3d00c5b072a11a04c1ced49a2bbae2567f69983c230cc685ebcb", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0083-r5-nonlexical-scan1-decode-outline.log": "f08467384d7dd16c54bcb135bc16b9534435b10f838b9ed636119888ae216db0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0083-r5-nonlexical-scan1-decode-outline.stat": "f09ce90097d2ad5872359b85aa87cae634892425b2bdfbbe0101a835541b1702", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0084-r5-nonlexical-scan1-baseline.log": "16c87ef3b1552d87663f3668955cd96a833105fe25f2decacf76a54e08852f74", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/0084-r5-nonlexical-scan1-baseline.stat": "0e868a2cf42a738c8d139107523c12aa54a89dd50379529251135a49ca663fbe", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/independent-review.json": "f82ca4f650e2d2741495458022e59753ddfcb5f3d63e1393ab8d83bcdc85e44e", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/manifest.json": "ad29e6a962dcacad302e97f4bea40f5aa42bbf9f9f1c02f2441b2d0d006a10e0", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/plan.json": "e1621ec86ad89dbd8e85cdb2f91f2955023eeecb1ca76c09fee6f9abd090dbcd", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-decode-outline/summary.json": "bde5b4c82239ca00ef48cc6c8520bd00a2095b5e009acc3bb393c01a28bb3504", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot-plan.json": "a31ce2af1524785fbb6bccd55a90f7d414c9a2290a2ef23f3cd4bf3d4e7ca333", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0001-r0-common-pack-baseline-on.log": "d5562f20e014f1cc3565bb35fc72c14ba4569380d7686850125918aee6fd389a", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0001-r0-common-pack-baseline-on.stat": "38d65d14459bff21b98a38389b4d2e5fb160cf21a71625b2f7b2eabcbf629e67", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0002-r0-common-pack-lazy-pivot-on.log": "5750c2b3a6b5412a95a621b0a59fa9b8c15c4a116ffd2e9cbb49f937dcb114cd", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0002-r0-common-pack-lazy-pivot-on.stat": "11f4fb10b2f67bc2398c3ecaf85c85b9f23cdf576f24f630d2683738869d3bd0", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0003-r0-random-pack-baseline-on.log": "027b93ebfa6c5c29c2b19b2366d177f9cab2f32b2fe87990238d92ac3675e308", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0003-r0-random-pack-baseline-on.stat": "79ea2af482198d7ab47f1d91aaac804e46d10bd17eead84a818511b4edbc07dc", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0004-r0-random-pack-lazy-pivot-on.log": "a27697634c658a8862516f1c0b3f13b465c729ef76144b1031c5f803c8895755", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0004-r0-random-pack-lazy-pivot-on.stat": "18887b55c03736c8eef27bfea792cbc53e4fb7a24c994b45e437542374352d17", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0005-r0-nonlexical-pack-baseline.log": "b09341819e6039c2c3b85c748dbda67805980f8b501d95e1f36d04ccb6f817de", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0005-r0-nonlexical-pack-baseline.stat": "33ac3709d83501e4ba8e21a082ad2c50ed47025f0fd578b4ae20ca758497d80a", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0006-r0-nonlexical-pack-lazy-pivot.log": "8dd534bd92141f0dd9f935d4aca867f1870e8f338fd5941bfefd2f453667f671", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0006-r0-nonlexical-pack-lazy-pivot.stat": "ad571fd9b7429fdee849bc17a32458627e3ce8d8e4d8cdffc504ff466533aa01", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0007-r1-random-pack-lazy-pivot-on.log": "8f29ac20c1266e8a354f3d6e9ff93039e8cb1ce063e66d5ecb6765ec7b939328", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0007-r1-random-pack-lazy-pivot-on.stat": "93fe018d0a6df7c41a12fd52455a8454a32b6ae423d9d147eb47694c5f18f397", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0008-r1-random-pack-baseline-on.log": "ab1c1b545a56a7822c0fe24dfe428a3c9537da010ac243a399bcefb60d231e20", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0008-r1-random-pack-baseline-on.stat": "32a0a05234c84b6ef120b0e25f408cd98c9f80dfba2a10239083cfcb8ef94905", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0009-r1-nonlexical-pack-lazy-pivot.log": "e0fb084ee44e81330d09ee0023ad5a13ae2c579ee9b08b63225b4ffaaabe24a3", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0009-r1-nonlexical-pack-lazy-pivot.stat": "a73bf07f8f64aeca7108151bae035bed0e574a2f144cc0eae415128850228058", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0010-r1-nonlexical-pack-baseline.log": "535a75caa39f32c1f534558b75e6cf22e6c5c1d48c5f041090ca2267b08b7d28", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0010-r1-nonlexical-pack-baseline.stat": "dde61d99306a98d9d3bcb32df20d4081c55f04dd04b8d3a0848c6bc1964cd699", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0011-r1-common-pack-lazy-pivot-on.log": "ff60722ccd81bf7c7498b627ccb29141162e0eebf7e44f4c7143bef891e7ca52", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0011-r1-common-pack-lazy-pivot-on.stat": "211416bf3f1588395f73202e7b4220c979454cb97bfbc14fab244767e78f1c0e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0012-r1-common-pack-baseline-on.log": "6229e1f78d3c8629cc5d61e4cbc5e2fc592b4bcf6f6528aefce66dbd3cbdd266", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0012-r1-common-pack-baseline-on.stat": "c4c3bd00c0134827c2f72bf43513cd9299a7d166ebb1edd4710180f08292ac7e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0013-r2-nonlexical-pack-baseline.log": "55549caa9bba11d75946058230839011f2e63250434438325acb985dbd5cabd1", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0013-r2-nonlexical-pack-baseline.stat": "463abdb33c80fa73cb140ddad26160f25befa6105da44ab09fc6e9e7a82c0e6b", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0014-r2-nonlexical-pack-lazy-pivot.log": "08747d9c8455a00b561c77425092897ef66b1c08d74f88984487aa910c55deee", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0014-r2-nonlexical-pack-lazy-pivot.stat": "8631878b7dfc4812b0ce70d306d8f1a2d26726f284a6d97483d67fa2a3b8992e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0015-r2-common-pack-baseline-on.log": "982e10dbf89619e50b5b0a7154c0ac2619424929c84a0aa48380d9938d3228ca", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0015-r2-common-pack-baseline-on.stat": "3cf80c3cf16835f938d3b34624733510d149c593d894dd629105a3c77c6b5ee8", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0016-r2-common-pack-lazy-pivot-on.log": "c0ada0421a26f93fea20c348a0bcfd583f42a916b615ab1880f28138a5e8f715", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0016-r2-common-pack-lazy-pivot-on.stat": "cfe1aba3e26bec75df323b09f2f0b333124c3259ef6d1137eaad8afd81d26e4f", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0017-r2-random-pack-baseline-on.log": "07654c167060fd907b9c43ec82734eed93bb2a9f75c609cfa6f19b106fa2cf17", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0017-r2-random-pack-baseline-on.stat": "d2eeacc9cdbe9b7feb6525dbe87b448a70af846cbe0eb58982074e2ef650d7c9", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0018-r2-random-pack-lazy-pivot-on.log": "d989821bc59031602790525a82eb4578af1dc4c0ac9c277cf5c78a03d4e55de3", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0018-r2-random-pack-lazy-pivot-on.stat": "47e89f06df1f652a064480dca3ef5092fe4216fb9d6864d2709d21c29fa14222", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0019-r3-common-pack-lazy-pivot-on.log": "2ac95e2108ffd7acf10d20a3fc37a694fec7ad749f71a9d608d70c12f3f02052", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0019-r3-common-pack-lazy-pivot-on.stat": "a5523355dab00dc550b6071501e5ca5a98e3baaff2c19b0882190885866f1ec4", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0020-r3-common-pack-baseline-on.log": "4f8470d14cfd838bb6d52cd49f58edefcccf9af1df96b76f6c539ae63d5eb452", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0020-r3-common-pack-baseline-on.stat": "0364d0d06f842356c7cf54a7bee54af52dcb8933a7610c7acc349a9285d0dff7", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0021-r3-random-pack-lazy-pivot-on.log": "badf50273722808e5e77464f9ab9faf065c596a5c7aa0a8e902ab4ea05b4a016", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0021-r3-random-pack-lazy-pivot-on.stat": "5cc7bdb818a44e35d2c061d8635a2fd408dd1d32012b6e162541b4815b884f5d", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0022-r3-random-pack-baseline-on.log": "f204468da0cef59caa2b3b9ff1b8f1b3118de6a8d76f30032443cdad7aa9cd20", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0022-r3-random-pack-baseline-on.stat": "202565ce201deaf35255b6a2376ee4a357284f1eb5ac6c038fa08df56a06ad6b", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0023-r3-nonlexical-pack-lazy-pivot.log": "5985598bac7a096c161a1b0699c157a01f0efa1395f4969a58220adbf1b2565f", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0023-r3-nonlexical-pack-lazy-pivot.stat": "70d4802cbd0bd02bfc254a7079642153343a7272c902f8ea127db47252ec6dbd", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0024-r3-nonlexical-pack-baseline.log": "09df0d54f99141c95cb809d4caf9a32df1f8e94dbce3d78e97d9cfc2a22d3c6e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0024-r3-nonlexical-pack-baseline.stat": "db76cc72bc18ddc3b64470d73d2d3288168bd60cd69d5774484f9e1def48628e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0025-r4-random-pack-baseline-on.log": "f6873f7dc491cc4bad0b6e755eb4a19d233956d852b3782f24812b29e6481e4e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0025-r4-random-pack-baseline-on.stat": "e6ed4f3cf206ed8e8259ec02ca00d5eb5294aaf9f7e4620af72fc637601e6b8a", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0026-r4-random-pack-lazy-pivot-on.log": "4eea179b2c7f7738809a7678908b93b9796d3569956376ee7ac9bc015e876da9", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0026-r4-random-pack-lazy-pivot-on.stat": "cceade9d5ecf90319c0421f1fa86b0ca2a7d1fd2c2933aa5d23deb19851c2cf2", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0027-r4-nonlexical-pack-baseline.log": "ebe959a15f1005847f43b2ea3920bc8e934611b03f5372030fba236c28b15ff7", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0027-r4-nonlexical-pack-baseline.stat": "2a096763d05f40b6db057a545542a2cdaf2efa43c7b532b2065a12fb04967002", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0028-r4-nonlexical-pack-lazy-pivot.log": "f017991cb85e4cc60f1cc20c7d13ff7816f6babb64b86bee2b2ebd2606136d1f", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0028-r4-nonlexical-pack-lazy-pivot.stat": "d4a6677750bba6afd999179734c1742ad4a7ee40a746cf9d84db4e626a91aa9e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0029-r4-common-pack-baseline-on.log": "cbc5b7e955ebf43299fad96e2f3b3c02edee51d645bb256e2793d960f43afd93", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0029-r4-common-pack-baseline-on.stat": "6c29ff3c68ce335b51ec565b6600dc2b898c3a93c0d412b8820f173ee7d96dd6", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0030-r4-common-pack-lazy-pivot-on.log": "5090e6e8b75128821f78d5171a4c116c8e373f334d73e40e7876dd3d0a14b71b", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0030-r4-common-pack-lazy-pivot-on.stat": "be2e2ca8b81c232121cc24c935e464a3d28a5f3924beedeff3d89272177b7fb0", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0031-r5-nonlexical-pack-lazy-pivot.log": "a3c76804af6babf4d831975a47185c4b2cd23431fee31dbe031bfcfecd70e684", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0031-r5-nonlexical-pack-lazy-pivot.stat": "264566d0797feaa16f5a590fbd9981ed7a494b8c0bd4ae9ed9e2a02f8b47e3d4", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0032-r5-nonlexical-pack-baseline.log": "8ffbee6607b1b80ef3881cb0087cb1465a79eb0f924aecb0382048ec433253c5", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0032-r5-nonlexical-pack-baseline.stat": "87cb137a1703b93e8f67d6706d6b3af1f330038e712c8b4b24c179b172ff0e0b", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0033-r5-common-pack-lazy-pivot-on.log": "ff71b390cd039b12d65e07f7276a2430c9339d8024f5f050e7dab851b7907e4e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0033-r5-common-pack-lazy-pivot-on.stat": "b8bda7d35e180a9a26978aba59462291e1c7a6994f6e9773bc5a8c64d37f3ef1", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0034-r5-common-pack-baseline-on.log": "91e7f26c30e17874a8836e0f2b43ea067bc16cc977fd3887e062bb42e614f13e", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0034-r5-common-pack-baseline-on.stat": "4c523dcce099567fddfe7ba14932510a87975d5dd6c907fb35db5a097ce26475", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0035-r5-random-pack-lazy-pivot-on.log": "b3e463a389cedb5d55ade327f479e39728784cc0ce3b305930c5fff1da2e14cc", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0035-r5-random-pack-lazy-pivot-on.stat": "45c6b1c7068c528196de4cde5da5ec164b7015491585f7685cbbca8760b1824f", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0036-r5-random-pack-baseline-on.log": "b73445795ea4b694041ff1e34142432c6f1a20b426ea09eff4d0294ce69298d0", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/0036-r5-random-pack-baseline-on.stat": "021ffeac53bc7de7de89030a909cc447534966cbaf8630733eaa161f400c1f45", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/independent-review.json": "c97ba720a1c28d15b447af19422c0b8229d5e1049294bcc6f8c701e370802756", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/manifest.json": "b336a6bc9ee0d7752eabc3405b994aee26a3306d74129be5a2f88e2f830989f0", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/plan.json": "a31ce2af1524785fbb6bccd55a90f7d414c9a2290a2ef23f3cd4bf3d4e7ca333", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-lazy-pivot/summary.json": "e2171f6f662f5dfffc2cae8b4e20f342d74462642d6fd93156b861c32f0d3d2e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type-plan.json": "d1fa917505c696f7e2b2d723ae99f3395496fc9d9ab596596cc68393cb19f441", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0001-r0-common-scan10000-baseline-on.log": "c8a4de9d8b4ce9e8481aac9b49c4d90d04abab76f0bd5ff5186b8d689f24967d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0001-r0-common-scan10000-baseline-on.stat": "528fe959b3ba194db5886fd83b8a151adba25903d0d7590a7324f1f06b262d5a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0002-r0-common-scan10000-message-type-on.log": "475ef5d22185d41471c4efbf00bee44522de3c224cd94555b374049f7cc99294", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0002-r0-common-scan10000-message-type-on.stat": "ac012a4f119927da151bc3ae9796e30db342173012352d0dbd51ef6c0a4cc736", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0003-r0-common-scanfull-baseline-on.log": "13bf9ce285c711e3370c18f8351d384b8d3b3d5375ec1092544e5dfbbd6b7ae7", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0003-r0-common-scanfull-baseline-on.stat": "bbdc0782b4f189ec09280022e7ebe8d607e810f1a664c2e1a81d55cf2b9a341d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0004-r0-common-scanfull-message-type-on.log": "da71e15a913dea89cb0971d8efb9c75e116a0ef5e273567d26bd9a01c88cede5", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0004-r0-common-scanfull-message-type-on.stat": "842f533a8aa4343b1638c9533449b5052da9e66e3ac4e0d10676551b986c9141", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0005-r0-nonlexical-hit-baseline.log": "241356c538f25e75402cef8f4ce74554d243301fe71630894b56f8c151a6ae65", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0005-r0-nonlexical-hit-baseline.stat": "08ff689d0cd53a1953a9a8b83870a82f89add031bdf7be173ecdce08a7b8651d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0006-r0-nonlexical-hit-message-type.log": "3277db3daa6a350242a2b3e62c86ee74ac17cd868f071686d49fec61ab1cfbdd", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0006-r0-nonlexical-hit-message-type.stat": "335f22b4cb3a86fad7ac2611797c99886d369b3c6d5a966ba5c53cb3bbabc8ae", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0007-r0-nonlexical-miss-baseline.log": "710e6fe9ed4c8e153e8c3bf402cb91b800a09684309ca78fd4f50bd8d5f5a7a4", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0007-r0-nonlexical-miss-baseline.stat": "33327ca06c77ce19bfe913a5dc2cd5c7ed295ad119078fbc55479f50c1961069", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0008-r0-nonlexical-miss-message-type.log": "749169bd1deade4857d49c74683e0fddee1bf88aaaaa4610087eaf646f59a444", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0008-r0-nonlexical-miss-message-type.stat": "4768e32d4f6ba82760f06260f9f2e76a83e958298a6739b440868f5433d2aab0", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0009-r0-nonlexical-scan1-baseline.log": "61de75a01832182d01b3ba699f3f933f3de88f3992c8847d9c3131efcb70caa2", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0009-r0-nonlexical-scan1-baseline.stat": "f3861a6f61b3c6c133e9f099bb0b22c08935b32607da5cb7b0e8e66e559e6922", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0010-r0-nonlexical-scan1-message-type.log": "398ddc2ef76b55d4147a3069cd5dc9e27971f93c5ea7796e748edf8f51b56a21", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0010-r0-nonlexical-scan1-message-type.stat": "425d67544f982035f76d4fd66ed99fadb8bd8aad5e2e1badaca0a14ee529db84", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0011-r0-nonlexical-scan10000-baseline.log": "56c4933c61f3acd19b367383791bc01614ea2d3e4bd9c116b5579b729275202d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0011-r0-nonlexical-scan10000-baseline.stat": "ee24a917487bd454d9f69d0146bcb60773ac01902029c5e11700c3b857a3790a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0012-r0-nonlexical-scan10000-message-type.log": "8b3e3e4f4029b89cfe220e15d0cc80a5f1f53c967321c061a43898076658f8a6", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0012-r0-nonlexical-scan10000-message-type.stat": "bb227ab7d57de4b89fea584ec2ac63fad105c19a62038c5df897d554639170c2", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0013-r0-nonlexical-scanfull-baseline.log": "e29bc352a956b6e896a0b8163488f2dc77987172acfc1040083a052bbaaf59e9", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0013-r0-nonlexical-scanfull-baseline.stat": "c71b5a3dd9b5a44989158a881b4ab949e06861a9758e7210f3ea7c66bf0085ee", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0014-r0-nonlexical-scanfull-message-type.log": "e843d5d5f61a66d469448deceefb2b57b869db368f7de346a8d9ac6afc25809d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0014-r0-nonlexical-scanfull-message-type.stat": "df0310fe4aadc98d23fcfbb68c5d8ecd3e149eb14a868d15f03ecb30d2621ffb", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0015-r1-common-scanfull-message-type-on.log": "d31b8ec61df04d085950d7f86154b1be15a655f0b27c7a4cd7cb1891b9cea45e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0015-r1-common-scanfull-message-type-on.stat": "3940148ac88414a972e0679ccaa23eab863d232d4deef51663712374b64bcf32", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0016-r1-common-scanfull-baseline-on.log": "7efea5a82c60a8909c13eaec9567c11a037f5d7a76e5278bab47ea1d2ee3cd02", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0016-r1-common-scanfull-baseline-on.stat": "880ba36b9693ee8c06adbace1a37998371f225be9a1f79b93684bc592a00611a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0017-r1-nonlexical-hit-message-type.log": "1c10f89e1d7d38df0c72612b00dfd201fb89a3229936512107cbec190ec40652", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0017-r1-nonlexical-hit-message-type.stat": "17bf98b99f61d83805b26b77ffecd10e008ac0cf41f8e6e77a674e71d64076a1", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0018-r1-nonlexical-hit-baseline.log": "21146b691b9c6368eeb4923b1ff2b751b1ab4e8f9ecbb55dc11dbe94cd7532a5", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0018-r1-nonlexical-hit-baseline.stat": "af211eab24081d13e075d800cf7bf4e93e7129e0faf8634c91654eaf693ef53c", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0019-r1-nonlexical-miss-message-type.log": "4a7ae5fd2c1a03af36875399e6da60d44b5bb8106e224649a38209efeb03a921", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0019-r1-nonlexical-miss-message-type.stat": "a7360f6cf960771f6483f5bad8607fd5cb686c7fd85f5756ca0bc76ee6d7247f", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0020-r1-nonlexical-miss-baseline.log": "e0661b53437f7374593e109afe98d4058aac3300b548f849f189ea20003b7fa7", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0020-r1-nonlexical-miss-baseline.stat": "60d8fc95706efe2591f70ab2924e4a9310791c036510441903e802baaf5ba2d1", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0021-r1-nonlexical-scan1-message-type.log": "42eed4da31bc338953d464c79c6b659d958e54918a2593cc09e5f2540fadd3d9", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0021-r1-nonlexical-scan1-message-type.stat": "4d37d1d185e44e8c618362fcab0148434a70d536cb97092a2eb15ab56db29181", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0022-r1-nonlexical-scan1-baseline.log": "e107a6858a2d798d3119cc633cb507fe27faefeb37744c58533bbc9bdb52d048", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0022-r1-nonlexical-scan1-baseline.stat": "9230cd8c6cceb591aaeb99ca61bec7dc67d185c61415dcf55b65b028f33fd04a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0023-r1-nonlexical-scan10000-message-type.log": "621d094260c3d506cf2729ca4c983fcd515d0c4a12939363b72849778cbcd9d7", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0023-r1-nonlexical-scan10000-message-type.stat": "c44c7afb5d755299ec7d1e5a48dbe63ba6e214c71275dc6ee05e5fbcd6a05f66", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0024-r1-nonlexical-scan10000-baseline.log": "11e8ac25a3a802758e387969c2fae385e4c0745e70495b144ad29eeb8a42705c", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0024-r1-nonlexical-scan10000-baseline.stat": "93b8f0b0e0ebefbe1e50dbcbbf4725246549d21adf101e8f765da8b937e9c0ff", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0025-r1-nonlexical-scanfull-message-type.log": "58f03be476b5149e34418a13d6ad37f3ee77623dc7983dfc62c74db944d89b77", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0025-r1-nonlexical-scanfull-message-type.stat": "dd4b823ae9220dd5a2b436ae94cdc17825ee4ea4a12cd253ff51cfaf0ecc4082", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0026-r1-nonlexical-scanfull-baseline.log": "e953c3a6d86ea2172919092ff9daeb8f05fffd11dcc3b9de664e3deb7ad25240", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0026-r1-nonlexical-scanfull-baseline.stat": "6f1fa5c4639504207d6aece3d6520001d939b0901f58547aab43a932ba6a9c66", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0027-r1-common-scan10000-message-type-on.log": "f626aa9ab96f7684b8c153e59b375371f22f0ce1a076de8066e9ac14d9f0c7e2", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0027-r1-common-scan10000-message-type-on.stat": "8c7d4f03b76078bd84d02fd0278fcddc044438ff10c4647c95d1837d83328d4e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0028-r1-common-scan10000-baseline-on.log": "e9cd7dfc737f9fb66a15bf521b8a82b34fefbe3406e7664da414e7e396acb58a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0028-r1-common-scan10000-baseline-on.stat": "c3968710b34c811d219870c5883e28068920490150f5934ceabaddde6e20e503", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0029-r2-nonlexical-hit-baseline.log": "4f26d3e6f96d0de43c6e290bc92e29fd9ab174819427a1d4b7126c34de37e000", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0029-r2-nonlexical-hit-baseline.stat": "d3e2875d06bcdae4d30128e2cc54156ccf10d0bb2a9cc7636ddacfdc704aa1f1", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0030-r2-nonlexical-hit-message-type.log": "1cdefa4e365cf51f4ac260c635693d7c5507f7be055f45cbf0cb1c06d4507d9f", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0030-r2-nonlexical-hit-message-type.stat": "34d7fea5e12d1a05ccc699d74b91138a9e2e923ce59063fd7f20eb362d60b04c", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0031-r2-nonlexical-miss-baseline.log": "9d816c68dc748b9a8942fe3e01d17e0238cd0adec2b935867d5be489bf29c969", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0031-r2-nonlexical-miss-baseline.stat": "3abb6c0a3b9ad54c2a742bf5bc1f86c036e0bddb57a473995c62207d50223a72", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0032-r2-nonlexical-miss-message-type.log": "f38a6dcaa16d3af36c24cabf12dd17adf8e88b4dc7f1510545c171ee353f5503", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0032-r2-nonlexical-miss-message-type.stat": "d7a2195e59af68737e2a44f7580fd142857412cbc8eb8a992c1ca5eac6e4e929", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0033-r2-nonlexical-scan1-baseline.log": "8acbd8093e10b526818292bd38c6a66304f28613b7e3c6d87787888a83ceff6e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0033-r2-nonlexical-scan1-baseline.stat": "9a7325ad3a4b0d05429e3e055825fafa5dada20c30a08f2c241f74a4f48d15ba", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0034-r2-nonlexical-scan1-message-type.log": "7085f975081211df03a882ee5c3ddccc1f9c42cea66da879206cedf160b498d3", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0034-r2-nonlexical-scan1-message-type.stat": "3ddedccf36f8ca553bb36d6c5e443ed33cae8c3eb1181497245a33b482982ac3", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0035-r2-nonlexical-scan10000-baseline.log": "264756c195b3e764e6617564621e6b2ee5c65af099d17369d5abbff87c6f14db", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0035-r2-nonlexical-scan10000-baseline.stat": "704b4c9781c4c103c0021e71c46fdaebaaefefce70c9c69acbbb03cb77dc889e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0036-r2-nonlexical-scan10000-message-type.log": "abb43e35fe2c9124adf366b793a0630bd78beadf8f9b5d16b39e52a4134d107e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0036-r2-nonlexical-scan10000-message-type.stat": "097f9bac11103095e769c6f50ca7ff047a924a507b4c945dc9a7b7923ffb1c61", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0037-r2-nonlexical-scanfull-baseline.log": "70687e3ffa37279432877aa164476258dd5cf6114bb949b880146c71703fbd98", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0037-r2-nonlexical-scanfull-baseline.stat": "35e46d4c59afddd58a88013b7ec3903559dd99903daec708f1b50c74b5c57311", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0038-r2-nonlexical-scanfull-message-type.log": "013fe403e9507bcff122eedc2597447cf0d3ba2020b68ed6320da076481b9324", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0038-r2-nonlexical-scanfull-message-type.stat": "089b455ce7ee69d48f53f977bd17752acec12f8a7d0147aa5bc059801610ea64", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0039-r2-common-scan10000-baseline-on.log": "73e3b6842ce32e0e095c9ad53e2d4fbf682f783dd148af0221a7a074e729f5ab", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0039-r2-common-scan10000-baseline-on.stat": "a1a73292d6ab98bf86f78d7bb2b379def509d3f4202b9270e30ab51becc5176b", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0040-r2-common-scan10000-message-type-on.log": "8b3f626a3c6436d4670e798f851b51c8333ff0e80d22f51e97db94e4977e7676", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0040-r2-common-scan10000-message-type-on.stat": "e728e1d61a46e5c19e67a4e145e0df10be5044339676440346f345c186e4187c", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0041-r2-common-scanfull-baseline-on.log": "829a3760b25c39d1bd0dccb0d66134e7e9bb2d44ccb3c1804cebee1ea603437d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0041-r2-common-scanfull-baseline-on.stat": "5d9127bbcb95e974500832c9b41cfaddeb83db68f51d7d2e7911f26fabc49c96", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0042-r2-common-scanfull-message-type-on.log": "cb6d562f7856b45fae091d15551bb3d71d51ad3fcf5e0651230522dc2ade3222", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0042-r2-common-scanfull-message-type-on.stat": "6c5baea1124f30796a70bfcb36b2f2e059775ef37aadf4cab7253603df70e116", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0043-r3-nonlexical-miss-message-type.log": "aa0d74d4140ae34906d69fa8be4b0e4212766b989198d40179b001ce42d374d6", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0043-r3-nonlexical-miss-message-type.stat": "fc2183222c53a54b40c19aaad187a4f7b0f51d16dc177f53401d2473a5679532", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0044-r3-nonlexical-miss-baseline.log": "d799a5af48b89d69c7339f3a2b547dfe63525724cc5107b6d1506bcedbade6f3", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0044-r3-nonlexical-miss-baseline.stat": "c7e87ca7840b256dea3c2ece516a3f0ba962bb736b7b58da299b3d48c662a951", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0045-r3-nonlexical-scan1-message-type.log": "16137baf2273bc60a46c3002a5f14677437ff10d12c0177cf2ec42bce275a394", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0045-r3-nonlexical-scan1-message-type.stat": "2d28fa842ccb6999df32116467224e86d9360ed85ee7b1f9abe5da181a437ff0", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0046-r3-nonlexical-scan1-baseline.log": "a9c6572a26fa81abc22fb7ace24a997201d382b73fc644d026c5aa6ac077f5ca", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0046-r3-nonlexical-scan1-baseline.stat": "2c646da254ee5c2d831350ed9b11ba0649155300c11176d230d67df677925770", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0047-r3-nonlexical-scan10000-message-type.log": "277b25243b0e11d96472660b599790c6cc26a58872df89a07cee3564037a14e9", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0047-r3-nonlexical-scan10000-message-type.stat": "fd03198bb73c40dc6fa3859d94e5cab5108f53166dd78aba5c319101bdc9618d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0048-r3-nonlexical-scan10000-baseline.log": "492b4678c1f74899d363de48e23fc5b17bedc6f9de5e8b4c071be90a71a5a68a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0048-r3-nonlexical-scan10000-baseline.stat": "baca1494a60cef6f1cc2c350153307935832c1d8032ddcb14c377e4d59c2e874", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0049-r3-nonlexical-scanfull-message-type.log": "5b1e81b7bda9ccc7f6eb4c02051fa4d338c6ba5eb0a2627a32d977b22f53ec38", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0049-r3-nonlexical-scanfull-message-type.stat": "80be026afa51a7304bfcce941ab005ab297f62b329a7d21fed282e33e3db97c6", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0050-r3-nonlexical-scanfull-baseline.log": "01fc493b9513f4d4f3a09ab39f3f25aac8e56c6ccaf0e32bf443aee6b7e3c7ee", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0050-r3-nonlexical-scanfull-baseline.stat": "fa8fc2cc12c2ed45530386e051aaa6d40e7b4635f25710c97bcdcdbd5e3157a2", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0051-r3-common-scan10000-message-type-on.log": "a84d5adefa520d53792f82e233407da1c1b44540b9dfadcd78f6d6cd431ec20c", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0051-r3-common-scan10000-message-type-on.stat": "1657b220fa706fc7c7642f3b08149b2cf3da9e6e52244699c7dd599bc63e86a3", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0052-r3-common-scan10000-baseline-on.log": "71de8689ae9d096bd7617f3e60255f36dee98eb54cdf7e64933b085c76df8f22", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0052-r3-common-scan10000-baseline-on.stat": "2441b0d2dc462d429fde3bdd52e56942d5b6e71e779e573c8a3150c8179a09cb", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0053-r3-common-scanfull-message-type-on.log": "1ca075afec6208d71adde12bb1c19aa1b79591421cf709d7f8863bd5b7892ff5", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0053-r3-common-scanfull-message-type-on.stat": "ff9575dcf8309b87b039bf3d0ccfa11c505c9f99439916af38067d3bb91e1812", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0054-r3-common-scanfull-baseline-on.log": "56d4a4ee90e3f49461653add05113cc04f0f6dfac8b67cab7d889f073173c606", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0054-r3-common-scanfull-baseline-on.stat": "5a492386cf4490e0acef188bcbf30503fdcbd32c6f1e4825b0e6489d8ec2de90", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0055-r3-nonlexical-hit-message-type.log": "76975e471be2efc7e1fd9ade34771a4db6f5e5c6e824b5a373dce43c7924a114", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0055-r3-nonlexical-hit-message-type.stat": "5f0f0947be6096da6c57bf91d0207a2d07b722186299ffa9b0cc9725c57d2e2f", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0056-r3-nonlexical-hit-baseline.log": "80cc4bc7701594bd83f5baf19accd16df634d82c06fa2a6f0780ace4ecf88f1a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0056-r3-nonlexical-hit-baseline.stat": "4354b058fb60a1d0aeaed22a52090cf6fb8b59cc75b53d3b92d620c9da40ac6e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0057-r4-nonlexical-scan1-baseline.log": "9c18db4b51d79e5b1404901dc8474c654adbd9cd07bc1fc88e71d771c131e270", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0057-r4-nonlexical-scan1-baseline.stat": "673e45d20bc53b6b334dbe6b41ffda158fa261e940bbbc6a104444f9588928cf", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0058-r4-nonlexical-scan1-message-type.log": "c453e32b18db588889fad2707ceab446fd4cbe5fd0a1096d7dc194e7990f40bd", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0058-r4-nonlexical-scan1-message-type.stat": "e90c556577563ad4c621ca6c22cebcdfc717e4bb0d18851a41a27c4689f0dfa7", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0059-r4-nonlexical-scan10000-baseline.log": "2a68f0470bff548e708257509ca591e6495b31c4ea67361668cb8a7e229b8925", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0059-r4-nonlexical-scan10000-baseline.stat": "b004bbbc17e7d57ba129cfe64eb6f7a247a142ae5c060c786f6dab72f5cd5e1e", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0060-r4-nonlexical-scan10000-message-type.log": "51b0396b47affedcb64ec966fbb773121a5b2e85a5491c5f2b21d89f992c5237", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0060-r4-nonlexical-scan10000-message-type.stat": "545bc45c26d03126c53aff640e5a5efeff9ac5be86ffbe4c47a4dd0d0c6d12e4", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0061-r4-nonlexical-scanfull-baseline.log": "0c6e6fd028345d99f33e5c2940b179042acc0c6f8b719997487ba38a3abeecaf", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0061-r4-nonlexical-scanfull-baseline.stat": "709eb2cefe0a4603cb3717ffbd10bf19f81c2bfd7c764d75dc58144fa4c0d485", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0062-r4-nonlexical-scanfull-message-type.log": "a5d2f65fdb56a4ec2726ec57a2d9f3c073ec8e3ad826a58caebf3dcba5552561", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0062-r4-nonlexical-scanfull-message-type.stat": "2cd45f50a741421837323a75a80dc551c2988cc3f43f1f7ca96c6be1d26786fc", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0063-r4-common-scan10000-baseline-on.log": "75b6d8e220b76c55ce54509b9abdc1f014bd0a87d16a2b0b127090437215f498", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0063-r4-common-scan10000-baseline-on.stat": "2c6ba852a4d4106c2a4cf598aea5db6324b3f75134c5a044fc38c98fe3a26f3c", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0064-r4-common-scan10000-message-type-on.log": "82b9eaedfcaa1d047c4e8e6a5f879d6286fc62620ab7e203229c0dd65c6f400a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0064-r4-common-scan10000-message-type-on.stat": "5a86a3367a9aa715051851556c02a43bff7460f45622137b89b8f14a32a9c66b", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0065-r4-common-scanfull-baseline-on.log": "3c1793bafbbb6b36d8e8eec7267ac58eb6b7ec0215b517fe8a589dead2bba316", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0065-r4-common-scanfull-baseline-on.stat": "35f07f010a42f6cf27120c1df3664f2de6873d67e41f37749000f982372a8806", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0066-r4-common-scanfull-message-type-on.log": "27d329870fa9ca5e8aad6f225771f657738718857224bc08b249521a3fe0d14a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0066-r4-common-scanfull-message-type-on.stat": "f4dde5764c6c2ca6885a5a689c8d6d0458b1164610c7e18fad22a44798b50537", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0067-r4-nonlexical-hit-baseline.log": "840ce3a558ff1ae237dfe0fae535171d4953a4e61b0ec884d7044635dffb98da", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0067-r4-nonlexical-hit-baseline.stat": "620ba381c621aa129046564671bd8edd437fde351c5c63e32d3db7be87096a0d", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0068-r4-nonlexical-hit-message-type.log": "9de6c7a6c165272bb766639dc301d8c4a272617bfef09b9ca599dcd9e1be7d1b", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0068-r4-nonlexical-hit-message-type.stat": "524a094260f6467377b12882037df359ef212fbb55fdbb0d467e1641a6680411", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0069-r4-nonlexical-miss-baseline.log": "d41bc5408b64b6c085857ad83ac60aa7c2aba26ddb5e0a1bfb660a36fad72bbd", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0069-r4-nonlexical-miss-baseline.stat": "634659f1f40f773c9dc3f19d1f03f17b7a24f1ae3de68b28d4e5b4a4d1bf37b9", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0070-r4-nonlexical-miss-message-type.log": "d68b57fe6c528878a20a7c0129bc34393d7a8161988e7ba31c811a2067474b0f", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0070-r4-nonlexical-miss-message-type.stat": "90b632d9be0b2cd51c6572be472cd0a49059b11904ed6b871bea1d33db7b3c62", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0071-r5-nonlexical-scan10000-message-type.log": "e3144fb72558f66b6dac13ca587edec2d39c2140840b8abc7226880cd050485b", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0071-r5-nonlexical-scan10000-message-type.stat": "c73e9a070db8d7bbb208d0a63cbaa892c4000fd82b02600b00e289b777855666", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0072-r5-nonlexical-scan10000-baseline.log": "70cb053ff875298ea17a241beb7d67079228c6d40ac14f0ec5da850e5e00269f", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0072-r5-nonlexical-scan10000-baseline.stat": "b6ce23d11cd3d56268ddc7af869937f9768ef449f6baaefa77a138de2707d8a6", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0073-r5-nonlexical-scanfull-message-type.log": "d2f89bcf1165b289f9f6ea37c4913511aa4853dbdb1e9811579beca910336292", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0073-r5-nonlexical-scanfull-message-type.stat": "d822154542b85cd93768c5d78beee06947c056018f5296c1cea710888cf1ae81", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0074-r5-nonlexical-scanfull-baseline.log": "9928c2e20cfd1ca385ad80e3b1672616d132ddabcf7a144b6b98c07f184e4315", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0074-r5-nonlexical-scanfull-baseline.stat": "98a84be5a8544369bc51fca13170ae6ee590353d116e7553ddfd00c35fdb62c1", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0075-r5-common-scan10000-message-type-on.log": "2527e066678665b5caefb50d8394cfe8e39a52ba76b27f14809f16710e8e20ef", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0075-r5-common-scan10000-message-type-on.stat": "34f8749b1befa1a7fbd7a615c18e130bcee5e2216e19be7fb7e530f4f4b94fad", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0076-r5-common-scan10000-baseline-on.log": "3467e2e74fa2e4a30c75553b800d6b635a6681526657c5b4eda0f57dc0b16d61", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0076-r5-common-scan10000-baseline-on.stat": "5a00cf89382379c262b4b5fa252d1c279276eab44054783321e37f8c9ae5a080", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0077-r5-common-scanfull-message-type-on.log": "630b12f32bff94f81623a0edd982b07ae1250f5b4cfd6936437a35bd29739de0", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0077-r5-common-scanfull-message-type-on.stat": "05495b57755ee036716c4c5c581b2fcd19679617525ac603625ecd79644562c5", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0078-r5-common-scanfull-baseline-on.log": "7d705649d7a23002f73c00a480f60a0cc3e6f5f8fd8781ac64f29c0f5aac8d50", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0078-r5-common-scanfull-baseline-on.stat": "963e630b2a7fff342cac069844326d7ba337ed27b9220d837f277833773d4868", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0079-r5-nonlexical-hit-message-type.log": "535a86456edd9e0d40a00c6ac7bc697f525ed0dc3ec07adc3e5ee7c1b613690b", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0079-r5-nonlexical-hit-message-type.stat": "7f0d44c1caa1c91a44b3b2c83407322802ec18f8ba3361b456f38d4e2c9121cd", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0080-r5-nonlexical-hit-baseline.log": "5917abc0c3a27320c8b174819f3803eee651dec8b6f530878d1dbf0931717641", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0080-r5-nonlexical-hit-baseline.stat": "5bb10f21c731b9073be796ebd4bf23a4f4839aa9791f95fd42ca4f4a344f5bff", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0081-r5-nonlexical-miss-message-type.log": "21eeedd4957355c26e926dce9d35458ab1d2c01e6a3cbf0219180b91e75bdd87", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0081-r5-nonlexical-miss-message-type.stat": "dd8b8889b13b659b0bf89211dfad9f851b27585ce4c5168245db73f71ba66d3a", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0082-r5-nonlexical-miss-baseline.log": "2ca922dc5d35292619fa54e28e2e04eb146be21f4b171c700c9a27e833a37dd2", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0082-r5-nonlexical-miss-baseline.stat": "707b217428b268f0db3381d00bd81390f68ff443fea0789cc6fc2054c0433b1f", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0083-r5-nonlexical-scan1-message-type.log": "4aa14d9955394d306ba162d66ecda144e8eccf8f085662cf46c76683795aa1a6", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0083-r5-nonlexical-scan1-message-type.stat": "d849179a7ce7311ce8b1e3496c737dce53791b4b70ae0f0e8fcc09397186914c", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0084-r5-nonlexical-scan1-baseline.log": "ce3075672e2a13ab3b51206ce20ec3a30b229d3319de642216d2e10bbdf1086f", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/0084-r5-nonlexical-scan1-baseline.stat": "fe26c127eae3eacd615f48d3ccf50912a99fcee1ea942acc869c9d5db93e2752", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/independent-review.json": "222ef6cdffd9fc0a15aa45eb9002db4641c6a0790036e5102e3fc8b8ad27c9f5", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/manifest.json": "6851ef11164878abd2bf8494862197defb113a198f46abb4bdbf0ded0e841703", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/plan.json": "d1fa917505c696f7e2b2d723ae99f3395496fc9d9ab596596cc68393cb19f441", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-message-type/summary.json": "f788a3d328d089aafedb60749a108d86d16501d8e3f065b31c0d83565b08963c", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch-plan.json": "fad71214aeededb58c319c205e9cb5f8994602d2aae4f4ec603b8e6565b4fe04", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0001-r0-common-pack-baseline-on.log": "b011b9f68a63822f4a7c4a921ac1fee41be5569568223774f68ee5317b388151", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0001-r0-common-pack-baseline-on.stat": "833a3a11b94162e1678deb6651dd1fbe5f77789c45904bff85c601beafc59d36", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0002-r0-common-pack-prefix-scratch-on.log": "bb0df693baf7d7c47ca9f3895b05ff6ef995d272a4846e9ed889020458f5e830", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0002-r0-common-pack-prefix-scratch-on.stat": "6b3075c0a43e9db496e06e3ff4a1e326ac9da9b5105f6a5a20c44293d678daa2", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0003-r0-random-pack-baseline-on.log": "e01292156ca47a96317de4235117b2d5abf8a82bbe2e7ebf60add5c10019d41f", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0003-r0-random-pack-baseline-on.stat": "db942ffec037f051cb55fb44e83325a216a3381299ae6d9eddead5904e35863a", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0004-r0-random-pack-prefix-scratch-on.log": "798f4562a61e5b6055a5c79c168e34ffb023a710453c0b8f0bb9d2bbfd567e15", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0004-r0-random-pack-prefix-scratch-on.stat": "bd258303f9f9eb1b376febade90bd6ebcc6557cb7ec8b1af694d45c039120ca6", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0005-r0-nonlexical-pack-baseline.log": "985bda2de4cc10fb1cd7dc960e5991f6c280983307d86fe722b6e4b6b398ea07", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0005-r0-nonlexical-pack-baseline.stat": "18e98d1ded03f7635cc439362a26923418e209eb4a796fe9bdb49d9b67f51d30", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0006-r0-nonlexical-pack-prefix-scratch.log": "8b94660350541989947a39009512e94908a343827e73f730a631038d8fa8e3b2", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0006-r0-nonlexical-pack-prefix-scratch.stat": "7f792ceb151a9566b973dba485ecdc4e894d2f1000425633428143fd0eed9b31", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0007-r1-random-pack-prefix-scratch-on.log": "31cb9f9dae1faf3cc7f3c89d42d6926f0448745f135a689418019f49784dc9df", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0007-r1-random-pack-prefix-scratch-on.stat": "709b685ce46f7122f12047c71d456f774a9ede849bca31d77eeb9f69d52b268d", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0008-r1-random-pack-baseline-on.log": "70c4f76cbc3a2785f9722b0cfc64a518c1aa1598931812d109aa98f251911476", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0008-r1-random-pack-baseline-on.stat": "2dbb6017856b87f6e1500080105480798560ee0bdfc4cdcd8f269fe3237be545", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0009-r1-nonlexical-pack-prefix-scratch.log": "519cc88e18aa72d2663c1a3f9c93d7c28e2a755f4f3e36fdd762473a761dd746", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0009-r1-nonlexical-pack-prefix-scratch.stat": "894b075913fd42990898ef328235d9c52e2059e733ff7991944ac3709a425145", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0010-r1-nonlexical-pack-baseline.log": "32f6811cdb5c8a020814f246a25b977277afe577c58cabae6bb98eecbfd87d4f", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0010-r1-nonlexical-pack-baseline.stat": "e28728a67de28b96980e02806b7eb18a76f1b78df2a2f2fa20df54525e7b38a1", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0011-r1-common-pack-prefix-scratch-on.log": "827a229a2656e0a586e4effbdd9946127236e09ae82f5291084394c2134f3833", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0011-r1-common-pack-prefix-scratch-on.stat": "b5b53a6e6cde6dd435bb42ae39e01b6896dfc3ba933fb319bebadd461970fd8e", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0012-r1-common-pack-baseline-on.log": "91986241c147d5a98c67bb3c96f1b380bef4add2fc3e8c2b0fa12de2abc279e0", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0012-r1-common-pack-baseline-on.stat": "0c07c16faf701e11f30ce89505b8c3e7bcbbc9767ccccf6d017c7cad9f310d4a", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0013-r2-nonlexical-pack-baseline.log": "53a9150e36104741bdb3508a1ba64f800b185e416cc65a93e95aafefbb3075d7", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0013-r2-nonlexical-pack-baseline.stat": "1480d81bc68868a1e3fc3004062c35f10c298737b4b4cedfe5177fb5aae059fb", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0014-r2-nonlexical-pack-prefix-scratch.log": "2e30a97c8da2cabbb200578ee46d96596a84e9849d4c4c581693549b837a44bf", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0014-r2-nonlexical-pack-prefix-scratch.stat": "39f4d482d4c167a4075fe659b375d7ba4a2c15f42edf1990f0bffbbe3cde2e79", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0015-r2-common-pack-baseline-on.log": "bda41fc78fc96473514d71a1da7587bd34aaeb4f0764695b13603186ad7d1bf6", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0015-r2-common-pack-baseline-on.stat": "376e62acbbf97d1019e3b45a4e6e75ea99b3cafddd0388c58611e8c056000d31", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0016-r2-common-pack-prefix-scratch-on.log": "b53a9db56d1c6ad8370a05624d4326313e69c45abe797e038564b0c244a9f915", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0016-r2-common-pack-prefix-scratch-on.stat": "225fe4cbc3645b40bd265896f45e0382db3efe0aac81c47a902d7c6df87aa700", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0017-r2-random-pack-baseline-on.log": "b3ae09d1ce607d0b73eb076a844fa60cbeb60f9ec48b8e40cb320e28a40db071", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0017-r2-random-pack-baseline-on.stat": "a35ffa24e1a60231b5cbe66466db67b12ee2aefe5a8f8ca372e381463f5e4b88", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0018-r2-random-pack-prefix-scratch-on.log": "641e3e42f12e75a08525bd193f79dd0185fead61c0b6f7f8cb0d16ba189d3843", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0018-r2-random-pack-prefix-scratch-on.stat": "9919e2380f39a17a84c74cdc32e87e2c34ba11759195f390843690b2c239dce4", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0019-r3-common-pack-prefix-scratch-on.log": "7a12175ab93f65639f7d22a0d1d8103f85faadd71dfafb335f8f34c82e489670", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0019-r3-common-pack-prefix-scratch-on.stat": "8af5eabf929e9c287cd84c208e507c32b92435670d9a0ce75f859374b08cc121", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0020-r3-common-pack-baseline-on.log": "1a65b12c7adbbec106db634d79818d5390ebb3e2e35eca454f24bc594d49c194", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0020-r3-common-pack-baseline-on.stat": "ef7097b8c8060ff9bb3cef20be36d0673275c7545f64427da097da6421a700bd", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0021-r3-random-pack-prefix-scratch-on.log": "9660ac94bd6b1402ccee1fb03f3d9473344837b5f220402ce826c82f8ce3e16b", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0021-r3-random-pack-prefix-scratch-on.stat": "4575f19e34b8462ad380606ba74624615c6d170a330d58954f3f5eb337c152da", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0022-r3-random-pack-baseline-on.log": "378eb032f349804ae1025167f048d9ff64c722de26f86c9fa6faf0c6ce5f72d6", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0022-r3-random-pack-baseline-on.stat": "1c693df2cbcd81f4346239b27c9e832187a300d540e899fbd0f3e1a60f4d0ae4", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0023-r3-nonlexical-pack-prefix-scratch.log": "eb991f0442ad4ebd732c02a5fc6067c7a93a46b761efd92f3f9a6a869ceadbb1", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0023-r3-nonlexical-pack-prefix-scratch.stat": "744e08116c70a9ab40c264ec1738db1738cac3324777e40f0fb6007137d8d5cb", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0024-r3-nonlexical-pack-baseline.log": "bb3cce3f2153bc939e425c6e6b06485258ee85c9a90098eca139f568d2d5cfd5", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0024-r3-nonlexical-pack-baseline.stat": "45c88262dac713973f697230405fcff002247af4466bd488ef8e22fa93f50eca", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0025-r4-random-pack-baseline-on.log": "9239e5a2d3f5a4e1707cd6c2540ddaf99716237c35d381994c002f3cc723272e", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0025-r4-random-pack-baseline-on.stat": "b1fce094a77d9c70145bfd40f0addc8ac3f0035c9318f9b23852140d6ee6b7dd", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0026-r4-random-pack-prefix-scratch-on.log": "077ca891bda19be70d61cad27a5252c31ce44b24439c6c733a176e6ace789fa9", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0026-r4-random-pack-prefix-scratch-on.stat": "9f914888f520a37ab003713ff3c42b3481042706d67007b0d8dd1447a47e58c7", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0027-r4-nonlexical-pack-baseline.log": "01e79776c3aa096ae3b0a118b8b2991c95188a23220d7cf1d447945b83e592b3", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0027-r4-nonlexical-pack-baseline.stat": "ebfed4ee66d8333301cb6aae950a759211979c9ca1e4c524df663da729d0fdb8", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0028-r4-nonlexical-pack-prefix-scratch.log": "46aa18e27242a0a922ec52fb228ac37c9bff8aac26c67e2f1459d9bd1d5ac590", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0028-r4-nonlexical-pack-prefix-scratch.stat": "ddfc01e5b681b48f70c9af5fc22316ac6de2c11da3e294a5e75f0d227976dea7", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0029-r4-common-pack-baseline-on.log": "7e98b683325cfb2375742e6ec5f26c9a6af1bd7828edc782224482e7f20bedef", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0029-r4-common-pack-baseline-on.stat": "4589d10d9e1c53f0da88179c582800cc335b1ca420950c93f47892f5cae27378", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0030-r4-common-pack-prefix-scratch-on.log": "3db1aebbdf98125a3b81ad9ccf8d687babd954c58d594e8ce9744df54cd118ef", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0030-r4-common-pack-prefix-scratch-on.stat": "de786e5c05724f75ab6c73b27513522f0022d074f035cab8722fc59519528ca2", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0031-r5-nonlexical-pack-prefix-scratch.log": "d0889c8c54405dbc92be0b830ecafc4516758d59c20a581c9a7470b917a7645a", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0031-r5-nonlexical-pack-prefix-scratch.stat": "7713c8403139f79d6b668b280a27701d7dcb75450507a12606a3b21702721490", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0032-r5-nonlexical-pack-baseline.log": "f605e46f486561ba61e2d6ef6ea7df3bb0f0f29c4a9938e8c6ebb3d9edaf3037", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0032-r5-nonlexical-pack-baseline.stat": "805341855e55ff17e8a71136608f8b5bbce34ba171d612bbb7f6b2acc49bc346", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0033-r5-common-pack-prefix-scratch-on.log": "4bef35e13fb20afbbae921ebffe8f73028f5c66bb23005ff333945f21a517ebe", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0033-r5-common-pack-prefix-scratch-on.stat": "d9474394120b6490a79c61a8042dc5356366550d9dbf3d9e2c4b041e3bc2c627", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0034-r5-common-pack-baseline-on.log": "58db4bfb275389eec7dccf51cc11939c7dbb796a7e27608545fd0b74261b9100", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0034-r5-common-pack-baseline-on.stat": "de194f147f494db36d18a8b38e8a52a59a62601c1ec64df26cf7023072de56cc", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0035-r5-random-pack-prefix-scratch-on.log": "57a5b6599e5f33bbd82dcf02b89024044904654913a5393b50f7701bf8479bb3", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0035-r5-random-pack-prefix-scratch-on.stat": "835039832b4c6052ef2bf432484c8bbfb14906da10df3cc44193bcb6b0006d3d", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0036-r5-random-pack-baseline-on.log": "c7b7cb587e4120a3b02f77801faf98e50b48198257ceff03f569aa7e14236d97", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/0036-r5-random-pack-baseline-on.stat": "3f6e405a4ff96dec1646d0203128cf925e0609963e757c9c2a3806f14cf85942", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/independent-review.json": "8a1eebd62709e71ddbad0c0058eb9628c762a5f1eba0449f0c72c55500d1ff07", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/manifest.json": "5dfbc6d8adfc6f4e628de2905692dbe928d1bbeb4c3b008e9038dee128f06eb5", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/plan.json": "fad71214aeededb58c319c205e9cb5f8994602d2aae4f4ec603b8e6565b4fe04", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-prefix-scratch/summary.json": "d282d7aa7204d652b81d574842d924632b4cb9d8c939abbc08b814c3da5fb36c", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob-plan.json": "5e5756783a0bf0f1ee67cad40195bc32d018c030a4ae99febf6df129bca04fae", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0001-r0-nonlexical-pack-baseline.log": "d065a7d5a9dbaac75d95204ab9e32909c0f7aa282567202abd0d414600bb8739", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0001-r0-nonlexical-pack-baseline.stat": "46757b4af2948b340bb64e5f469a7d8214526d3e7c079f0c37afc0d62f428f45", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0002-r0-nonlexical-pack-rare-blob.log": "c20df0430ef9c5d044bcf5194e0b8600c42bc01cab7375bca07dbe65e66a1d10", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0002-r0-nonlexical-pack-rare-blob.stat": "ff7e1db17bd456fc9b2732e8172c841f495b803b032cacefdf87b4383fd92229", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0003-r0-nonlexical-hit-baseline.log": "7d39630a2ffeee4d1ffeba11520ba1fcb73bd0765727e32b083bf3db1bf4b25b", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0003-r0-nonlexical-hit-baseline.stat": "a1c6bfea6cb6b570e15bd7c74b2d589b7bf86f58294b7705d9a248e1a16f4365", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0004-r0-nonlexical-hit-rare-blob.log": "26651b20294fd3cfbb8c1226aef46fd82948c63b837cbd2d7a2b46e7bc738e78", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0004-r0-nonlexical-hit-rare-blob.stat": "24b0c3c98333ea5db1a4c7f95a8c8dbb0e3ade2942416115e264cf3eb3a7d0cb", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0005-r0-nonlexical-miss-baseline.log": "2cdbd748ab72c83870448b0435f32a8a9655c3960937a14f0fc4c89be8c91e16", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0005-r0-nonlexical-miss-baseline.stat": "a715bae4610b44572774533fca8efffa012cfdab194f02c3435f201d45da692b", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0006-r0-nonlexical-miss-rare-blob.log": "160497cadd335e48124833ea247b8b0509876b5bbb15608d1473682b292893ad", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0006-r0-nonlexical-miss-rare-blob.stat": "48789caabec50873f85420170240c0382b43be074bd9066f314c4aef632b06ab", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0007-r0-nonlexical-scan1-baseline.log": "974db22bddafb1afe461bcfe28132b88305e9cbb118c0348ccf045854c901683", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0007-r0-nonlexical-scan1-baseline.stat": "cdc212ff07cd68db1f8626a4dd9593a05f6ab2d4eea19c207953d9a1befecd65", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0008-r0-nonlexical-scan1-rare-blob.log": "eab525d78e2af1909a2741fe763f3d3f9264d8794093bf0086feffd24c2e3815", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0008-r0-nonlexical-scan1-rare-blob.stat": "8bfae2bee84f8705545c86d3265e480634e4974faf3db1e75441fd9fc18644cc", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0009-r0-nonlexical-scan10000-baseline.log": "2eb878f1f24cf20cda923ffbf003c3ec60360b40e5612f0e90fcc22964ec1390", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0009-r0-nonlexical-scan10000-baseline.stat": "873cfc7473e9d61fb288c45cb61e62146418ca6a9f3dce3451f6bc30ba895347", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0010-r0-nonlexical-scan10000-rare-blob.log": "c34c9135b5b87280990c214f766702285dab8a320d792f8b232fbb287c385cc5", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0010-r0-nonlexical-scan10000-rare-blob.stat": "c90b596ae24cf6e8d3dc25aa27093e972ddfcbb26d9a83e046cd7ed8bc03ea56", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0011-r0-nonlexical-scanfull-baseline.log": "1c07d22815fbc9a8d43dec146e3f9a08ac1c5dba4d5f37dea05c2a998bc8f634", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0011-r0-nonlexical-scanfull-baseline.stat": "77be09395480635775196a9d3bb01f34301fe7e3a372866d84938766c92ba0cc", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0012-r0-nonlexical-scanfull-rare-blob.log": "e1c33df214e21001426a61df4d3a9418c0d0fa038570be19c11f76a273f9eb4f", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0012-r0-nonlexical-scanfull-rare-blob.stat": "274e043b1e26636e10c540890dd56bfc56c792efb9f7fcf74ee33cc6887dd0e3", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0013-r1-nonlexical-hit-rare-blob.log": "2183d6d69927dd7e565d1fe966690b3350fea9009dda4e95ea2a912b8a2c03d9", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0013-r1-nonlexical-hit-rare-blob.stat": "05850dd62c24626ab2a6a8ea332818b5783d7284b151f555cf24dfb214ee1dd0", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0014-r1-nonlexical-hit-baseline.log": "0984d0484fdff0ca79cbfa457d2a3eafc6eb0c66ebba4be27261c1e657c12cb4", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0014-r1-nonlexical-hit-baseline.stat": "1dbcd119e397aaa87e632a9fd45096319784cd29b5aa85b762f4c15bd4846edc", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0015-r1-nonlexical-miss-rare-blob.log": "103cdf58a35e02d94de5a09f73690aa7711f65cd5f4bb0bbfa67ec227359763a", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0015-r1-nonlexical-miss-rare-blob.stat": "a72fc2f4abe10aaaf8653fc0e9355e1795cf5026a81699690cd7514308d02a03", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0016-r1-nonlexical-miss-baseline.log": "da870a6bc6f64c6267d74e3a30a6eb7f1fd3038d9b352aa0064514c19d747699", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0016-r1-nonlexical-miss-baseline.stat": "c7930b1c9aa377e196b0f7e33fe957c5094b32df7add6cf6580d2dabda65c5a2", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0017-r1-nonlexical-scan1-rare-blob.log": "20594358e35a6be55a9d41912daa6378fff65212a5149fb7cebd5a2d2ce51d35", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0017-r1-nonlexical-scan1-rare-blob.stat": "edfaabfb5c1f3610ba10a171d2303c6e8c1e1820ae5b313d43836ce02c9dce00", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0018-r1-nonlexical-scan1-baseline.log": "ecbb4c4e3d4b84e24301ae21fef40d2cb9ddcdf2681d9077cd703c1a3823ee0a", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0018-r1-nonlexical-scan1-baseline.stat": "04c54b32a07450acd625707261f33e8cbdbc2034d0e4de786e1f53e1c59ba834", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0019-r1-nonlexical-scan10000-rare-blob.log": "ce33c213486da44504bb1ad4c7407115dfa31cb980b9ae9f9e32291f294d54ce", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0019-r1-nonlexical-scan10000-rare-blob.stat": "3d01ccd8542c1e68e6a7a3a8cb43a353a467c5fea84b879ede444e75e7652c97", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0020-r1-nonlexical-scan10000-baseline.log": "1531fd66e05bf9965751180c445df28f2a795e3ca1f1aa0fcb9caf664fc33759", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0020-r1-nonlexical-scan10000-baseline.stat": "5d90bebe3d3a260f35c257c8a07793dd32c38a023ad983e59c6c24087f960770", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0021-r1-nonlexical-scanfull-rare-blob.log": "9788d4b9b151676a8aec61ae710bd639bb12cfe2e8e9dfd64f65471603c1e554", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0021-r1-nonlexical-scanfull-rare-blob.stat": "3fd02899f746e00d067010bd62c8f2b21ddc00fee1d502500ea51f395470beda", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0022-r1-nonlexical-scanfull-baseline.log": "d8a4c9eadbade10fd8dc71727053e01a91e8788d3f60c1810f17752b816d3209", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0022-r1-nonlexical-scanfull-baseline.stat": "e4750fe2724d0642b1ebec910408f495e90f973f5667b541a031c4f54498c54d", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0023-r1-nonlexical-pack-rare-blob.log": "cf2b607a749837299cc33a2f517f06aac2007474448bdb2587c95aadf688f7d5", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0023-r1-nonlexical-pack-rare-blob.stat": "00b25f366826bec4a5542b23d62e4cf8f9d76d8058c34cbce63c17214174ff39", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0024-r1-nonlexical-pack-baseline.log": "46c569a43e9716b7a6e7323b1d6d9e478a2c783e2b4563d2380fc0768bfcd785", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0024-r1-nonlexical-pack-baseline.stat": "feb0c9c042690b379e4614624a94544c50eefa335fb657f67fca3732aa9bb2da", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0025-r2-nonlexical-miss-baseline.log": "325e3374f337f95f9553f031b19bcb3fd985dba8fa6c8d4ab6427a818ab60ba7", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0025-r2-nonlexical-miss-baseline.stat": "1c5b637239b2bd1f0a45c9c8e992ea8e9732127db533b1b78e062f2f0ec6ca76", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0026-r2-nonlexical-miss-rare-blob.log": "cbf6c2f23418423889dacb411e862fbf1fc0a1e876b30c35ae757948258c1c4c", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0026-r2-nonlexical-miss-rare-blob.stat": "ef9cf8a930d5a6b3c293f1ef4a1ba4bafbb18b72d36fb8775bcaf61cef6b5732", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0027-r2-nonlexical-scan1-baseline.log": "1ebf3eeca0636734cf16d9f234c4c2030459241bb4daefce446f6f716e22588b", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0027-r2-nonlexical-scan1-baseline.stat": "dd8bd0433504261e9c9a597c45138a6ce451b17402ae128d2bd7d988c613b18d", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0028-r2-nonlexical-scan1-rare-blob.log": "4a3c1714ac387116a470384600fd731fd6931cc8538b8de017c4007099d568b9", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0028-r2-nonlexical-scan1-rare-blob.stat": "36d8f92f3d7ebdb5803622346541ef26f043e5939ff7fc39178a026928f2f3bc", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0029-r2-nonlexical-scan10000-baseline.log": "4cffd261c74840a39853ac016173a69c152e1cd7d5f6ed35eaa6eb47ba4a0a74", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0029-r2-nonlexical-scan10000-baseline.stat": "c02137b303e5b1c16578a859d5b0f1849b96e6f942719700b91e6e8cde67e4b0", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0030-r2-nonlexical-scan10000-rare-blob.log": "72b455443c60665e994a34d7783a6698548a3dec647055b3d81d415993aa64c2", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0030-r2-nonlexical-scan10000-rare-blob.stat": "7b35f30835b79a42ee50c546127e5b8219756efc740b28ff4f6711a35c0c8510", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0031-r2-nonlexical-scanfull-baseline.log": "8475eaac0290254e47d45afb962c8e585763c2983b7934638e71a108acc1cca1", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0031-r2-nonlexical-scanfull-baseline.stat": "f8dfb58bfeee49e9bcfa0a1dec2d07c96a6cae36f2d9e0ec5dc436eacb000a72", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0032-r2-nonlexical-scanfull-rare-blob.log": "700d5d4f0cff27104e6975d6cfc94fff39056e7639f69ea925697ee8f151ffd6", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0032-r2-nonlexical-scanfull-rare-blob.stat": "0eadb32b4e0b68d653696cbfe504f671a784bc541fb3ebacd4f1de5872a8906e", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0033-r2-nonlexical-pack-baseline.log": "61cba40c040665fd5419158dcef6696790897b7f1b9602b64a17a861a612f17c", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0033-r2-nonlexical-pack-baseline.stat": "3536eac06b5d84dd478cc467b60ff7d065bbdc71f430c809d9cf4f2a3486f1e3", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0034-r2-nonlexical-pack-rare-blob.log": "cbda8b158453cb0f3069977ad86e991125c3c705735b502f2337a95f0f59b3d9", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0034-r2-nonlexical-pack-rare-blob.stat": "6d5cd050b4c38f01f6f5b411dd767fd7202663ad2ca60989bf9fc1d453e987be", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0035-r2-nonlexical-hit-baseline.log": "6a4b7863b4e5beed392474bcbafc8f9cbca9678a3df3e5b427efcf35eac2a4b2", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0035-r2-nonlexical-hit-baseline.stat": "8ff1123ba2abc43fbd07d0b1873a792647be2d6c0ba10178c44c6628f3cb2468", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0036-r2-nonlexical-hit-rare-blob.log": "acf10067547fe8d713f5059b65d00eca5333340cb66c1bddbabf74fb2ac5bfec", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0036-r2-nonlexical-hit-rare-blob.stat": "7620d4d6e5a02c3d32e564470be11c3afceca07a2a6fbffad4a4ce858929d7fd", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0037-r3-nonlexical-scan1-rare-blob.log": "a8960ede1357fdf96008e129bdccab5d2fac8f3be92d10a675f2c03786e8c82b", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0037-r3-nonlexical-scan1-rare-blob.stat": "bd1b6087617b7095a588c91ece8d963d8826741d1e887a45fe734f3bd4e62d53", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0038-r3-nonlexical-scan1-baseline.log": "e3af144aa99c9361316cb27741f2c56eec459e8431478cb5c86151302c5e0a25", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0038-r3-nonlexical-scan1-baseline.stat": "d1fa24b4c28b4bd9f44eb06e57d2349d5efdb91d4dbae79df2e33323192fb532", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0039-r3-nonlexical-scan10000-rare-blob.log": "db452292368f14ea0d6276863bc9805ddf1c5d6443888f7bbfa030c240f2f981", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0039-r3-nonlexical-scan10000-rare-blob.stat": "43fe09fdea336df2ca990236dcc4792f6b8f9c2f58cc43359a82d0cec12a8c8f", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0040-r3-nonlexical-scan10000-baseline.log": "15405b7bbdbf8b16b58765469745091e0ace1c0be96d638da4ff8bb22e667055", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0040-r3-nonlexical-scan10000-baseline.stat": "63f2118ae55cee32b06e08ba3212d7e2a83ed140f6a9c250c3acaaa2352ae9ad", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0041-r3-nonlexical-scanfull-rare-blob.log": "8ac8bcc496686a6166794ec5c048bf347a0257ee746b236c4de608f67c84c6fd", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0041-r3-nonlexical-scanfull-rare-blob.stat": "4f5976b61714ab0a78cf2fa4415490bc54752195168593d6756d4a6bdd8580d0", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0042-r3-nonlexical-scanfull-baseline.log": "5bef5ec1bd162b696c4e4dc5a7a832f02d7ef24fc62f384b9e3ad7997df6dd51", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0042-r3-nonlexical-scanfull-baseline.stat": "4dbe283eb23656c66953b625b03ec07590988a24e4f4a0d71b10fb9f1e43c901", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0043-r3-nonlexical-pack-rare-blob.log": "e72fe22f041de211a8e4b80d1cb3d72256dd3dc6b016015b6eec115e7f3512f2", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0043-r3-nonlexical-pack-rare-blob.stat": "aff7aaf9be6a158b2f9e325ac2c2322a3342cced4e1666d669bedf542c328a97", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0044-r3-nonlexical-pack-baseline.log": "2398e88cb4e03e0d49e2c059bddf0b9e41bc06f98dc58b3ca602438d71d5af55", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0044-r3-nonlexical-pack-baseline.stat": "6cfaa1524d0e4cc199c1a31c65eb368911c38c7dd23d6f630f20ec597d636318", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0045-r3-nonlexical-hit-rare-blob.log": "daca2952174c55d896a98a3a7118efe6116850b5a9099d1a85ad964b25716497", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0045-r3-nonlexical-hit-rare-blob.stat": "517b949ef03a3bac93146289f808dcc4a9037e0a495680a6a839cc47185e5679", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0046-r3-nonlexical-hit-baseline.log": "72fcd6dbf3e5d6ea98821e1fe7ef1df933a468f568cbe1f615aed37d7221142f", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0046-r3-nonlexical-hit-baseline.stat": "c99b2e4eb6109bb9be162bb9cb71e955c1b7a79c3e7a41b55dafbd03972f3bb1", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0047-r3-nonlexical-miss-rare-blob.log": "bfb8aa600c4bebc57b91a175894be4d7edd927eb6af1f1b9a74a4656ce594dc5", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0047-r3-nonlexical-miss-rare-blob.stat": "3c352bcce5d2fcec5c31ed0feffa58c6bd079e830b96a1f713cc6fc92818c6cf", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0048-r3-nonlexical-miss-baseline.log": "c39fb2b149ddf95e75d0588dd9630ca55e64a25325912bb6243a3370dfcf1682", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0048-r3-nonlexical-miss-baseline.stat": "8e401918a5c636b926e037b1a6c557b659b3852a2e02673db5876680e5911221", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0049-r4-nonlexical-scan10000-baseline.log": "58cafa5b671726ea051436298b640da03d0c717ba171e6053e7b6c8228df68b5", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0049-r4-nonlexical-scan10000-baseline.stat": "4cb8191f65aa90461dbaf3501528454d60775f78d10638f4b1c391541e9a73bc", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0050-r4-nonlexical-scan10000-rare-blob.log": "1061bae071bf3969d0ee1ac8d7ec93c290731ad75f696c0427bf5cb428c2b738", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0050-r4-nonlexical-scan10000-rare-blob.stat": "cb24fecf1177a86e0bd1a28fbd010b5590b67eb7236e8f31f8aec37b768db8a1", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0051-r4-nonlexical-scanfull-baseline.log": "e297456e010cef61361caeb72c121d67428e40b2d96bc58b1818f0aa8fdb4622", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0051-r4-nonlexical-scanfull-baseline.stat": "d488f9944fa12063d6c3a7ec723093abbd290a160fc7ad67993a4f6dc36bbccc", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0052-r4-nonlexical-scanfull-rare-blob.log": "90aec98e8ad46900639515dcc6d369c80d2eddf5a9948607bea10cd2c88327e1", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0052-r4-nonlexical-scanfull-rare-blob.stat": "8d0ca747ce9a615f961251f2fa791c9e2128a46bab5239f678961a0d7c646b42", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0053-r4-nonlexical-pack-baseline.log": "1dc9dd59fd38685f3e063c2dec2c166c41b215b4170f751f658b49b7ac6e42ea", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0053-r4-nonlexical-pack-baseline.stat": "7590527468fde1cfcf32972012d2d1aaa78b513ce53c573e95eed1935a2063a2", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0054-r4-nonlexical-pack-rare-blob.log": "517aa5f051d6993641fe553d0ea1a7c982acc2bc44551b44e92c1f6cce8e8c18", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0054-r4-nonlexical-pack-rare-blob.stat": "5871aa4165c84411087f5a3072cdf759ff867dfdffa67b3dfda0911781ec7a1a", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0055-r4-nonlexical-hit-baseline.log": "9d7f6c0db170596237b312f901d1a030cbd52b0dd6552c04e7e8d64cba2859a6", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0055-r4-nonlexical-hit-baseline.stat": "0a8fc9b34d1b31a712428bf67d56a9d8ba5fa28f16c00324ef15ccc01017c122", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0056-r4-nonlexical-hit-rare-blob.log": "b34e1ac6ba4b564bc0b4c06495cda14c0deede621f456c8b5b70115f7974f85d", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0056-r4-nonlexical-hit-rare-blob.stat": "1af166b6dfdf60832e035d35aa3caaeb285881a0d0085ec041952b67b76b79f7", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0057-r4-nonlexical-miss-baseline.log": "bd771955d964159b095f3e18e27c88b3f31b91d9cafe4ddd963125c2d80aa29a", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0057-r4-nonlexical-miss-baseline.stat": "0cb0dbff1cf86879f91f268bf62fdc80f315f009c34ba671faa06e384d89c59c", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0058-r4-nonlexical-miss-rare-blob.log": "6c72b4d09c29e5849a13d418889ec01605d941a9491fc804ebadecca12f94d1d", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0058-r4-nonlexical-miss-rare-blob.stat": "d476fb9c18d24b66def502d852b892d823f6ccdba59b726291e16940aea7638d", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0059-r4-nonlexical-scan1-baseline.log": "41470820afc2168ab5fae27df7413e92a11e80505358b48952e9d09534b695cf", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0059-r4-nonlexical-scan1-baseline.stat": "4fa16592f7035d62c6c8311c853174c6faa95af2e2e62ed87ee603daaab7b4ef", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0060-r4-nonlexical-scan1-rare-blob.log": "b3b40953be1d45d79e675d1c759371e43f25068c233675571b4098088e03f4e6", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0060-r4-nonlexical-scan1-rare-blob.stat": "0746ba402589e4689da32869c5212ee121c6681d48198b931a6f3812dc338115", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0061-r5-nonlexical-scanfull-rare-blob.log": "95d42aba0bbcfeb02d6e7f819feeaecfb2f17d7b919874c502efcf090fda8d02", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0061-r5-nonlexical-scanfull-rare-blob.stat": "990da9ac8bdd0b4472e890582d37602f4a0c04eb0861769abc030051b2337c1f", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0062-r5-nonlexical-scanfull-baseline.log": "ad9cfb432fec5c9dcdf63f86ff5e2b525d7e4ba4a1ae9ede73bc3ad64377d7cc", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0062-r5-nonlexical-scanfull-baseline.stat": "27aae84e89b7df6f6867a0c6302ace34490bc3829803a69c2c3d12a34fa0abfe", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0063-r5-nonlexical-pack-rare-blob.log": "06460ed62ae039ecc001b743e50d98fc8bf392dc21cc526f3c5ba53f5b7bc0af", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0063-r5-nonlexical-pack-rare-blob.stat": "dcb7678ba0d9659c83ed316dfc047ce018939a596c6db133a0d7b3dfa667ab48", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0064-r5-nonlexical-pack-baseline.log": "79257a06727f26fb98f3690030eb6d37264e8ecc75dc12ab0fd414711f4982cf", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0064-r5-nonlexical-pack-baseline.stat": "dd61de4194c2bb38c077b7c35fab085a6a88cf00b0df2290ac8a554293d7a455", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0065-r5-nonlexical-hit-rare-blob.log": "28980deb478e6949fe6c963af7a460992988b688f5519e0468ef0bbcea1ea4c5", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0065-r5-nonlexical-hit-rare-blob.stat": "aa4b255bc2bb2272514ef37edb1ed76a6f83a0e481561684bdb5baa3c0c830b6", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0066-r5-nonlexical-hit-baseline.log": "cf6c0d96ae47ac1c00d3118b88f7c7e72b7a2125290c2725d76bb766cb5cff55", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0066-r5-nonlexical-hit-baseline.stat": "d1c891c6623bb491db9d1262844841b56caef317041d2ce059360186feb1e76d", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0067-r5-nonlexical-miss-rare-blob.log": "7d383077ef742d653b7958d09a1b518d713af9a22e78d7ca699c96c65c3640ae", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0067-r5-nonlexical-miss-rare-blob.stat": "ff7acf328d9883a8266a30f91e0e9d94eafc58eba7072b8d309080be87a92116", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0068-r5-nonlexical-miss-baseline.log": "8b05b42f9181c7fe04afab1a95445cfdbf02cfb5a293359a9359ed28c9c3caa3", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0068-r5-nonlexical-miss-baseline.stat": "5a84f69fa83b73a1fa9b6b34a5661f70fcbafb29d33acac2696a303119951678", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0069-r5-nonlexical-scan1-rare-blob.log": "0246ba15657f93e70a41def6f7ecf64c63241c2ac24a65ef37bd9b8fa3cf9657", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0069-r5-nonlexical-scan1-rare-blob.stat": "b1d75e3b04e1095e3d788a0eeab0f8a32c36a0059046c15c23cac57bb043c1b7", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0070-r5-nonlexical-scan1-baseline.log": "777b17f828c79243427a3c863ce88cddf60d87da4b91b4526da0c212364b5133", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0070-r5-nonlexical-scan1-baseline.stat": "8bef00002e3f834e20ce74a8e211ffe759b588a0782c3a2c72cf1bb3d7a6461d", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0071-r5-nonlexical-scan10000-rare-blob.log": "85744087ef50c2aec9ddf0d17339d6cc950a859112f322b487ef5cc5b3b4e933", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0071-r5-nonlexical-scan10000-rare-blob.stat": "67126790690dea0a043c01d8d56f829d78c6c5db613fc97b61c2e9606dbfbfaf", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0072-r5-nonlexical-scan10000-baseline.log": "d4083c133d534a7d0d8bad9798de28d2dd48f90f821a36cdded1d0e9ec75f245", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/0072-r5-nonlexical-scan10000-baseline.stat": "68db62fde6163dd898e280c503206f5ac08daca0f8a9494e2d899af9595c4d77", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/build.json": "5b9d626df2263f08bbfaac71168ca77be744503ba264c4d5ac8149248df5def3", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/independent-review.json": "a82df930a0c7ee71bd2fc6e6d6dc4cf2dc3149beda8d52b49240e599b6626990", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/manifest.json": "e68d70e7d61d25488f1a941931b297afa94d337a7f06274f2c4842ad5a5a6ed4", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/plan.json": "5e5756783a0bf0f1ee67cad40195bc32d018c030a4ae99febf6df129bca04fae", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/screen-rare-blob/summary.json": "61b2bb744285b94052c74330df1bd38bbc4b473c238b1fb3794f1e4d6eb11629", + "benchmarks/results-20261016/btree-nonlexical/selection.json": "2dfd65e8c081c8a99640484fd1faa0a9e0cb3b4f50e154b6b9d879fac1e1505a", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search-plan.json": "7a0f2f9a8fbc2e63b78073ee94db1915cd790c540bfbfee32a18f797e6c62b3f", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0001-r0-nonlexical-pack-baseline.log": "58e2984ba92d2b24d0d37694b336f31624f46e71498f4d5b582e70c8011cb0f3", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0001-r0-nonlexical-pack-baseline.stat": "18fd3f924c7d59bf77da02923ccc37442e08e7fd41d4aed0a776a6c4a5e975c8", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0002-r0-nonlexical-pack-callback-search.log": "b45a41a5d6910e30f83de4dc853340b5222b6eb5d73a2d89693b831f6db1ae54", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0002-r0-nonlexical-pack-callback-search.stat": "0f185a0eb0f3a8334ebf5192f9fe762b140129d6ff616cb0ffa095826912d96b", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0003-r0-nonlexical-hit-baseline.log": "11e6cb1fc1fee2f76273f73067bfb1dc83697fa0954be3da3b4455924327babf", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0003-r0-nonlexical-hit-baseline.stat": "a452198835ec9e21d13a216a811ea02a4d5cd488606a096fd64282e725d78bdc", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0004-r0-nonlexical-hit-callback-search.log": "31d0e3caf961062c4f2448167012281769ca1b51537555bea99a9dcae4e50c4f", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0004-r0-nonlexical-hit-callback-search.stat": "5fef7c1c27f9031baf82c600aea61ba39761f03a1cdd1fb30583a2c6ae540e65", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0005-r0-nonlexical-miss-baseline.log": "923d6b4a651ed637d2b1ed701c16b052e256908953c366c8d05362939184cbd0", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0005-r0-nonlexical-miss-baseline.stat": "167139d1c5a3af3f61f5c391724b441b66a0340d2a0ff7b25fd12760ba0851f8", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0006-r0-nonlexical-miss-callback-search.log": "086714414a27a761f0173527649ae2f198d74dd7166352dd37cdadbb4579a1aa", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0006-r0-nonlexical-miss-callback-search.stat": "1d2b83991f49d6a66138691acac6a4fc6ad45648c053fadddb8e85253f0d8529", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0007-r0-nonlexical-scan1-baseline.log": "8effab542d4e2ec94378bc032d9f47f44c1275e10f49a92188acc3bbe1770ed2", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0007-r0-nonlexical-scan1-baseline.stat": "2933d1cface0aacc7a33a53f58a56034f1c5774f49fe81decb268ea12142eb3b", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0008-r0-nonlexical-scan1-callback-search.log": "727d7a26a3f23c465ba71d9718dab3d577a0ce6150e73fad201f9d17c3e60836", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0008-r0-nonlexical-scan1-callback-search.stat": "60ba35baf8a5c6e394646b8cd44bfc191d3d2f363f16d181cc94e53ac6bff8ca", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0009-r0-nonlexical-scan10000-baseline.log": "766e075ef3d5cc88dc1a4887b111a828909afd9a2472e92942b113b1f21ba136", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0009-r0-nonlexical-scan10000-baseline.stat": "a9db5b552306f6b84c21242f8c8e5fb30a036712ffc6be1826d4b788376ea43c", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0010-r0-nonlexical-scan10000-callback-search.log": "873100adf86c35dc445f648a7d7b438cfc4767ca57bffb438eb8ea93fd3360e4", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0010-r0-nonlexical-scan10000-callback-search.stat": "07645a3f0ab3f1ed5a8b4624718e3fc648df0b24a58b649b199af9f17d2cdecc", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0011-r0-nonlexical-scanfull-baseline.log": "891268a1f9492ff45d9a972a9c83170e9159dfb32aed95c39fdb0e9c1158d339", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0011-r0-nonlexical-scanfull-baseline.stat": "69a9d0e91ed153e58f447728bc5b4f7b8c17b5a17ead88b99febab3ec726ce66", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0012-r0-nonlexical-scanfull-callback-search.log": "545aecd87ccc7d19b7239aca11ce374f18342d23c66fa4978b53b97b065026b5", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0012-r0-nonlexical-scanfull-callback-search.stat": "1fa1ce6611029af4b6e098930bdca11f50850a594214fa346a4ef8451e225b4e", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0013-r0-common-pack-baseline-on.log": "8140179f15b5c245e50258637d889d3812b9f1dd0c8e62686ad196b832a3506a", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0013-r0-common-pack-baseline-on.stat": "0813ff7904b68095c20c1ca2255f975c220d145a93eca48f359245c78f32c168", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0014-r0-common-pack-callback-search-on.log": "0ca235ba05ef3dec308f356cbc6678964e04e9a09a552369eae0de6eeeb5e66f", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0014-r0-common-pack-callback-search-on.stat": "246c6508bde92b709c49481d5525a754b79ce13cff6beadb5f10aa586890b407", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0015-r0-common-scan1-baseline-on.log": "729eceedd613f86a4082fe096e8269997f975ceaf4cc16d505126899acb05815", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0015-r0-common-scan1-baseline-on.stat": "4a71cdb6bc538b9e42a6cd3b6427ed0419f126bfe66666eb9306cbb945c28207", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0016-r0-common-scan1-callback-search-on.log": "09950de2b3ea1f3ed479836af6edca05264f9c5eb8db777bfb204e1021689ef9", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0016-r0-common-scan1-callback-search-on.stat": "6f0224642b10ed17aaa14e5b44732d2512c32061280dcb31b3cb1862bf6d9c2a", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0017-r0-common-scanfull-baseline-on.log": "735d5e2521f95d621868849b184e0faba85288b57a7445455c7135b0e86dfd8c", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0017-r0-common-scanfull-baseline-on.stat": "20dfbfe0142ee7210b36d2d5b240c634f1e4800fa71a7f6ffa2ec9c603defe34", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0018-r0-common-scanfull-callback-search-on.log": "32db4657d53c14df78a71cb9b668a17711f2dc046e0c8083a688d216199a4298", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/0018-r0-common-scanfull-callback-search-on.stat": "091eaf223e9a3f44fd74aeec9985c5edefe117aea44903651142fdcf6a1ca800", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/manifest.json": "8027a84fea8a62dc70018f0cdca10bdf79715d2a9fddc534a45c24d8cd010bd8", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/plan.json": "7a0f2f9a8fbc2e63b78073ee94db1915cd790c540bfbfee32a18f797e6c62b3f", + "benchmarks/results-20261016/btree-nonlexical/smoke-callback-search/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1-plan.json": "e894be56d88f0c2e35cefeef90e976446075a021f4623ca8bf65ece3927c283d", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0001-r0-nonlexical-pack-baseline.log": "7881515d530dc50d9c71c4f3f9a68541bf01a2f228a794502f76e5b1542b46b1", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0001-r0-nonlexical-pack-baseline.stat": "e4be109f3f397e7810cc89840d805e64205ef272631b6c509da3d446e5e3f68b", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0002-r0-nonlexical-pack-combined-read-blob-v1.log": "36145627af6548f3acd7ace546efe2a63c1e50dd9cece0067b783f8fcada1a6e", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0002-r0-nonlexical-pack-combined-read-blob-v1.stat": "562c01754d56643bc7c757cdb7530da3fe60fe815bbf11eb7613a6b0000d25a0", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0003-r0-nonlexical-hit-baseline.log": "34eb32d80e20195e4749f85c3908fcabf5d1a2898f1c43a855f42f10858caf1f", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0003-r0-nonlexical-hit-baseline.stat": "be1bca2a485ee663b2939dd5310ae80c067abfc32b596d5cc466cc1ff6766a3d", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0004-r0-nonlexical-hit-combined-read-blob-v1.log": "db51c7fb6a3f773b7a28dfce96ab65a9497ad8d3d72ebdeb677819f2ab0b5757", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0004-r0-nonlexical-hit-combined-read-blob-v1.stat": "5aaaf2c594b4f85c8e1aafb2367217a7ff356c6044fd1c2d33bd57a606bfa536", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0005-r0-nonlexical-miss-baseline.log": "97279185d7b7cb5c2955e7963f266862c9c0c76ef8472de1646437759435371c", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0005-r0-nonlexical-miss-baseline.stat": "8b83eb9ce04d616d99d81bfd57c903dc05d083d6e2220e979d2629902d1457fb", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0006-r0-nonlexical-miss-combined-read-blob-v1.log": "b2d0becc2ab4d8c53ad749ae73aa25e17fa33afab90e22cda9710d624ecdab9a", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0006-r0-nonlexical-miss-combined-read-blob-v1.stat": "99fb18c12628d77ceaf59e0a3f98f062db0b9d7bf82785811b9fae036df9695c", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0007-r0-nonlexical-scan1-baseline.log": "1604765ade8dd0d5d1993d93f52d4929212728c182000caaabe70a8ec7e42cdd", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0007-r0-nonlexical-scan1-baseline.stat": "f6806da9319c1efb1ad8025f0af7a898d3da0a82e40209ef8690a6505e59a034", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0008-r0-nonlexical-scan1-combined-read-blob-v1.log": "1e8e53f265c1e969775d131d3f11fe8fe0bc29ee75d42da4b005e4f4402dc07a", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0008-r0-nonlexical-scan1-combined-read-blob-v1.stat": "00dffa2659298ff343763b52df8b1cef35ac85c5c5502be1d80519385ff38718", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0009-r0-nonlexical-scan10000-baseline.log": "f96a4deb914230d465508d885f12e80684dde246ec717c6b7791b2345521852d", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0009-r0-nonlexical-scan10000-baseline.stat": "77dc7ebed97faf09a7ae395e0956921cf2706521ccbaa5341e1b0642321c86a4", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0010-r0-nonlexical-scan10000-combined-read-blob-v1.log": "27fe6f1bf30d1858098b03557664628724cd746dd327ede019af1f0a433311b7", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0010-r0-nonlexical-scan10000-combined-read-blob-v1.stat": "bb7341ce0af4db067cad238e7a596048704703ac89e8fb394f689bb84d64ce65", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0011-r0-nonlexical-scanfull-baseline.log": "00e5ce751eefbcbbd5c832ee582a2cb509ada90c58181b99e8883d3c405d2011", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0011-r0-nonlexical-scanfull-baseline.stat": "9c0d667b40775c7f58e33047d60c9a8d9d06331bfabb450f7ce89c1c7b497bed", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0012-r0-nonlexical-scanfull-combined-read-blob-v1.log": "ff2b082146146833d78f6375df471d843288b5d31988a9915ef4fdaaa97eb016", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0012-r0-nonlexical-scanfull-combined-read-blob-v1.stat": "8037bf7a1d737f90f570583bea1c615e3c50511a49e93173fd32031435b5cc80", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0013-r0-common-pack-baseline-on.log": "5e43a571e777983372393a49bd3499e52e13c7e18b847412de01aad5dcc57d3d", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0013-r0-common-pack-baseline-on.stat": "5b73ccde58e71d1fc60abb45300c18b6b99940753df61c398524da2409779221", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0014-r0-common-pack-combined-read-blob-v1-on.log": "90ad4bcf5928b904cd36de01bb464b7f05473f4a11a5bc82da76db141f7f6d1c", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0014-r0-common-pack-combined-read-blob-v1-on.stat": "af281fcfa3be5aa11a0f34e9774e3f72c85e849f27939c40d8decd43573dfc23", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0015-r0-common-scan1-baseline-on.log": "3c98698b775424a516876d065536b924e6b923f434f41871427f04edbfe2fca3", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0015-r0-common-scan1-baseline-on.stat": "ca88f01d316ea070ee0a8bd731df866c011cf789812c9581ea86cfc26abdafee", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0016-r0-common-scan1-combined-read-blob-v1-on.log": "23fcb8f7a81029e739033bae8e21e6e72803d413e66be17097c82b8703cb1699", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0016-r0-common-scan1-combined-read-blob-v1-on.stat": "75069f21c4efefe07b72278221d5b5ee4d7fc2f0fb92e63e1f48a5804d9b51af", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0017-r0-common-scanfull-baseline-on.log": "e7df4e7cb9cc497e43e1a2d8b0a522307393e5e3962a05fcc2a3efed39e8df33", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0017-r0-common-scanfull-baseline-on.stat": "3b2c86df9fb4d1d9814452516a657febf8bac5f0c17043ad7e78cd02c3763256", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0018-r0-common-scanfull-combined-read-blob-v1-on.log": "dd0752921aed7cd1b74d72ac308c8c542a04c98e5a076001377954bc2d95c173", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/0018-r0-common-scanfull-combined-read-blob-v1-on.stat": "1eb13d1e06fc3e680f329bdb81d4cc78243e9771bd098fcc225fb5fe5f501e98", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/build.json": "c842fbfb98f9b65f6b166a87882a6cb5b4b6ec2d7255baa68eff289b9786f035", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/manifest.json": "544798296db475d2a0b889dc4b06ed61336af052c81be4a18874a2510888a339", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/plan.json": "e894be56d88f0c2e35cefeef90e976446075a021f4623ca8bf65ece3927c283d", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-blob-v1/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1-plan.json": "0c074347543c2318054b6bec7628c542a5e09bd546892bf7557625573548d075", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0001-r0-nonlexical-pack-baseline.log": "9c37d01098c54c7ec6f9cb34de8b786930f103091ca7bb2bcaa4da757f173987", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0001-r0-nonlexical-pack-baseline.stat": "0b9ad8cdbd9eac8dbcfc27726a2bf57d24f33506e5fbfa4f33ed071d2c836cc4", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0002-r0-nonlexical-pack-combined-read-v1.log": "4571d9e607c464e11008806ab4546fe319e1b2c39f15a256710d19d709de1a6b", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0002-r0-nonlexical-pack-combined-read-v1.stat": "10701ea9f791391ac340a209c51dcdf2f77f03bd137783a8045af7615a3842a8", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0003-r0-nonlexical-hit-baseline.log": "91814047b72b3df37f1ad183bc88291e0c4f68858820afa1b9f6b1410d6b0e8b", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0003-r0-nonlexical-hit-baseline.stat": "f6174249db04c7a9054a0e9cb67c839f1d48a54e513990d00ee0386dee30de2c", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0004-r0-nonlexical-hit-combined-read-v1.log": "b2455af7bad0fa3cf8d15f51f8e1e68c7f8587ff49b027c8b084bd10313b235e", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0004-r0-nonlexical-hit-combined-read-v1.stat": "fec5b380d09eb31e14baa8d05786c974bec4f23eadd0a67a2daed057780da9d6", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0005-r0-nonlexical-miss-baseline.log": "c1139e91142face362b502e365288d6dce33819ffeffd17ef24d291c935d275c", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0005-r0-nonlexical-miss-baseline.stat": "e65a85a676e87d5bd86253c5229d43237a3d8b0af5f0f6bb7d342266a57eacec", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0006-r0-nonlexical-miss-combined-read-v1.log": "371726e1bdc54ab8974589bd36a91467c6e49ed9e56c104ebfd8a8c3cfa0c894", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0006-r0-nonlexical-miss-combined-read-v1.stat": "3741717bf4faa0b179ed97e7a07b8678a2bd2077c4c4a47c5b515578be80b052", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0007-r0-nonlexical-scan1-baseline.log": "cee8308cde3ba36297b8c59f7b02b420bda71665b9106f8006adecc12ae1de5a", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0007-r0-nonlexical-scan1-baseline.stat": "609e6afefea0d6a3aac5d94d69d7e0147a218ed6448e0be2c8b781aeb3667049", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0008-r0-nonlexical-scan1-combined-read-v1.log": "e31bacb6c99f23a21128e7d493ab5f06f3adc8b4bda1e7917b8c01553d52490a", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0008-r0-nonlexical-scan1-combined-read-v1.stat": "bf3c89c774cc74c3efac53148e3901e4332b2d4dae54c6e640a23e3f5b8db4f9", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0009-r0-nonlexical-scan10000-baseline.log": "c18375e7f3a5ebddf062b36fc8288d748d01a803c6b855685873f542fcafa747", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0009-r0-nonlexical-scan10000-baseline.stat": "b616f71e6ebdbed9cbbace7dbdc0fa710531426265d69fed61cede18159d7c44", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0010-r0-nonlexical-scan10000-combined-read-v1.log": "4186a41bf1475fd1f67dd21ad4fc9394dbebf77f70dfff2f8627755e82339afe", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0010-r0-nonlexical-scan10000-combined-read-v1.stat": "6c5baa64208f5f074d741d9f4feb91e91fb778d5814df56b75abce100d3f9df0", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0011-r0-nonlexical-scanfull-baseline.log": "6b635c242e1864b6044b4858bb7f174888fd6cc078f6ffcb02d77f12ddbc494d", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0011-r0-nonlexical-scanfull-baseline.stat": "6812966c26d5f354dccfbedcc6e3862b9b1a9e1451b343f67fe9e1701f344b94", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0012-r0-nonlexical-scanfull-combined-read-v1.log": "e9eb4fa5b60c9dd295e9ef16019f1ef4462881c7cdbbe1d0c46a664906cca376", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0012-r0-nonlexical-scanfull-combined-read-v1.stat": "986264b07a0e8a0fa4d3cf491d2f47f5838086af42e402d9a4218e3a23214e11", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0013-r0-common-pack-baseline-on.log": "3af977cf8d0c837b5ae5fc36304022303821b3329891a526f6cbd80e11675d52", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0013-r0-common-pack-baseline-on.stat": "4406822b69f7b4c4a3da3801d24f691527207d7b4bdd75ca129c864db1172c58", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0014-r0-common-pack-combined-read-v1-on.log": "fb638d1ae0d011379f2831ea9e1a37c884b9d18a1e15504510168265aeab6a14", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0014-r0-common-pack-combined-read-v1-on.stat": "20a0da3219859afc226811efeca701ae575048661ae15ebf56a3d56be2a803b1", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0015-r0-common-scan1-baseline-on.log": "2eff1518cecc9f7c489317f6015773f0cf55e9f9a45310eec66ed75176343036", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0015-r0-common-scan1-baseline-on.stat": "a5baa8d41a13b3b08a484ad53c8cd6d028ca808fcf3b827333f4d165f954d395", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0016-r0-common-scan1-combined-read-v1-on.log": "0be36887b3321e431c4acda905e86c5d971139989d3ac7aa98614334df4f47f9", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0016-r0-common-scan1-combined-read-v1-on.stat": "5b76aeeb5dcb2933e0419cc58f680b0c236058fdc0ccefeed1b2bb847bf1227a", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0017-r0-common-scanfull-baseline-on.log": "2e204dd99277a7c57289a81140fee3650b66c0c4950d03547b3b8fc294e9538e", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0017-r0-common-scanfull-baseline-on.stat": "db77eb50dbe6fe19a5881a7bc9045c949f044adcb2aaf385f191f3fa865b8710", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0018-r0-common-scanfull-combined-read-v1-on.log": "41786fb2150c221ba872c4bb81dfb429ddcfe42d01df9188652193bd0b6a6482", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/0018-r0-common-scanfull-combined-read-v1-on.stat": "38eea5793e623e3d1ea640a818f996dc1ee19011a14068d63914779c91f503e5", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/build.json": "c842fbfb98f9b65f6b166a87882a6cb5b4b6ec2d7255baa68eff289b9786f035", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/manifest.json": "2674a0f7eefcd72c139d447ac6bd2c95a8c121ad419ac0e73609746b86dac621", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/plan.json": "0c074347543c2318054b6bec7628c542a5e09bd546892bf7557625573548d075", + "benchmarks/results-20261016/btree-nonlexical/smoke-combined-read-v1/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline-plan.json": "72ff05d0825d5b9896f51e97eab166248e6ec86e96e6c06528b3e5380f0e37ed", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0001-r0-nonlexical-pack-baseline.log": "8b12e102e6276353749efe49d4383acd21befd67a6c688b8cd0c50dc32cfee6b", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0001-r0-nonlexical-pack-baseline.stat": "18bf3ad64e02e35316653d83a4e2e95165872e294509559867a8cfe0a75d70f2", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0002-r0-nonlexical-pack-decode-outline.log": "6364a19acaef55971b0eee5c8707bc54f1e85de16c21c640aea9a2414af580c0", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0002-r0-nonlexical-pack-decode-outline.stat": "411f13e5d2233f67f8f2a183779bab3328f15d8b3994fbe5476338d27c226650", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0003-r0-nonlexical-hit-baseline.log": "d3e2351e0bf094134ac27322c91f227311295a276caa96c661b05cd3bc9d8dab", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0003-r0-nonlexical-hit-baseline.stat": "d36f94da38f1099da5b7483cdc9908a5dae1d9d0467e93f5fc05ae6267af7912", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0004-r0-nonlexical-hit-decode-outline.log": "21ab87bd89d26de60a80734a5c83085866f3d53568db7dd2c44b066c447cb80d", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0004-r0-nonlexical-hit-decode-outline.stat": "6a49e2c0d07d5c9e704f1fff48eb093a5d1e67e932440440675a08c0867acf39", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0005-r0-nonlexical-miss-baseline.log": "97cf5c9a11e2008b63c3533f24f5dae7165b3b1bc80b2643a2b3a9e1cfca6dac", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0005-r0-nonlexical-miss-baseline.stat": "6530b767d4760a3df940991bd475e17ad9ac31f438fc8fe1a74df9483e9c4c83", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0006-r0-nonlexical-miss-decode-outline.log": "83d959f2024403a969acc7e0605ea0e1e75331c28b111c1849491bbe12cfd915", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0006-r0-nonlexical-miss-decode-outline.stat": "63c82d0cc6464aa97f2fcd953a49ac8ec171ca0c6dd24e485083944e58716f68", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0007-r0-nonlexical-scan1-baseline.log": "ae0de059f9fed413257ffb6c98826ecb631249a0df419a0a8591159b7dd58d46", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0007-r0-nonlexical-scan1-baseline.stat": "74fd15d80b69981f0331173597a85730bc16d776a4caba3f2da18d9c56b6fa02", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0008-r0-nonlexical-scan1-decode-outline.log": "bba0cdea2a5c56765df2279187247e079b49d74fe750322411a9097d0ccc7690", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0008-r0-nonlexical-scan1-decode-outline.stat": "c139d4ab0a0ee81f273b45ed9e4fddcef563bedf07c9d6c7d041ebd36b0a35c7", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0009-r0-nonlexical-scan10000-baseline.log": "0ca6b4ca2dc4b6456a441374eed0e8ffe08f5685fe58aedd6bede511cd85e90b", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0009-r0-nonlexical-scan10000-baseline.stat": "fd844d35e1c167b5382551176e300527cd3a8a5a38966abaac3ef07b6f26b973", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0010-r0-nonlexical-scan10000-decode-outline.log": "f87ae34652fb5f42d19c792f0eb50797d815ab12c27ead1c4cdce62e1508900f", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0010-r0-nonlexical-scan10000-decode-outline.stat": "b5d89819e703577cd4681064894a29cd2ac88ab9e9181204581c62f3100f09d3", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0011-r0-nonlexical-scanfull-baseline.log": "1cf26c6e51d572e6240630058b4077f9391254bba5fc1ad4ea41fda51d45e49b", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0011-r0-nonlexical-scanfull-baseline.stat": "5a9f466b2717053e8d3f5cd6af1038b564e5a27353ca6fc5defa83187d3f61e4", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0012-r0-nonlexical-scanfull-decode-outline.log": "c1c991c9cef4817f6dfaad9f6efd409ffd9e564419f3c184703ea3a228b2708c", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0012-r0-nonlexical-scanfull-decode-outline.stat": "4dab7ab90e96531ceab8d4d71c5c0857bbe3de707f7f456905e7809e8b465a40", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0013-r0-common-pack-baseline-on.log": "3a8b2b4c39b3520403c172ac588dde107946f7ffd96f54d67707eb40bd8c6cdf", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0013-r0-common-pack-baseline-on.stat": "c9d719a0d7b012c5e9d9b8c233ee66ae526e9746a581b6ba8562c7d5617a0a01", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0014-r0-common-pack-decode-outline-on.log": "bd376defa606353a89a5c3fdb57c7da6a5b8e58a69e50c58fe0c1ce95fae291c", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0014-r0-common-pack-decode-outline-on.stat": "5e2d815541e3bb03a05a3f1b278586300a1369d11864e0e30598d6af4eba79f7", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0015-r0-common-scan1-baseline-on.log": "2ecc8af2248421f694e13351277791ab4ee581d2cd5c1d7dc2058dcd1ee0ced9", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0015-r0-common-scan1-baseline-on.stat": "e9b54c3d30e057cdba79dc755e13d95e8cddd92c8797640d7592c1df1f1915c6", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0016-r0-common-scan1-decode-outline-on.log": "ecedf530f536884729f48b6981c8509487d5a0075364be363e5e838119ad43fc", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0016-r0-common-scan1-decode-outline-on.stat": "9c4d5de06461eb1c3e3cdd3c596e370f1520f8e4cfc22881aac2f098406d3315", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0017-r0-common-scanfull-baseline-on.log": "280be3992d27b51ec149359b1c5d453a60e052e2f35d195c948d6ba31ae8c9c6", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0017-r0-common-scanfull-baseline-on.stat": "d2e6910ca6dcdcdf0556dbceb289a5ab2d5c395239df66b43fb47d0641114a53", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0018-r0-common-scanfull-decode-outline-on.log": "ccc4f63877d4589af8e7eaa6e5714e524cbeca63e0e46786d2dccbbfaf9c1815", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/0018-r0-common-scanfull-decode-outline-on.stat": "6ebbffa929baa9c973b8c3a47e5113044dd62a8659ffc72d88246a9284cbcfc6", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/manifest.json": "66d27643efab899cb577f00ee6d506694d3d069c46591d62db96aca493e85111", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/plan.json": "72ff05d0825d5b9896f51e97eab166248e6ec86e96e6c06528b3e5380f0e37ed", + "benchmarks/results-20261016/btree-nonlexical/smoke-decode-outline/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot-plan.json": "23c395dc51fe3c1d1b5de624ce955ccb69e12a4ee0e638bfb2c0bfabbaf243a1", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0001-r0-nonlexical-pack-baseline.log": "f311c9146ad6d5ce84e3aaab614153238876d3007912c9a4c6c79ff140a12cfd", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0001-r0-nonlexical-pack-baseline.stat": "e4ef3c427c8bb5bc6ed1acb7cedf7ce47bdc0200df05ca724ab67c1456ccf134", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0002-r0-nonlexical-pack-lazy-pivot.log": "3a2b4240515840f2ddcb512e9b8a8ea6234bf3b363b7dfa7d16f0b8412ef8def", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0002-r0-nonlexical-pack-lazy-pivot.stat": "81f0cbfa7af5cab1cbb6398ff456b70b1138c5eea74076f2405afc3e893d6c5c", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0003-r0-nonlexical-hit-baseline.log": "edf7515bf73f99dd8592dea618bd0c989bd7c0ca1deb15ca62c10263ba5a8500", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0003-r0-nonlexical-hit-baseline.stat": "f5670e83691118260bf36ba4a1830cb4af6b6f0f9fe9a936f35bed2a3edbbf74", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0004-r0-nonlexical-hit-lazy-pivot.log": "fb984aa77696688f62d5784f405bae90d1d78709d41349dc113bf6ac5e46cda9", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0004-r0-nonlexical-hit-lazy-pivot.stat": "eb4574d6f5dc2d3d7e4d057accc666fc77070b02be3be8b26ae943aaa5d7bfba", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0005-r0-nonlexical-miss-baseline.log": "81bbe8a640748d15745e79a4429658d8e3499302ec869b7692119f519acb002b", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0005-r0-nonlexical-miss-baseline.stat": "c003bb9529ce9ff4e96ffdbccbf91774622127865e189bbe5fba30423c22c224", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0006-r0-nonlexical-miss-lazy-pivot.log": "3a78876a93f1c64732bf863c532bf51b68cc90c828c3fa7520dc42d84a8bea7d", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0006-r0-nonlexical-miss-lazy-pivot.stat": "eedb19364626ff25c1a00e42adb27c4f9c895f739f84b9857ca9d0dbc6b5c916", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0007-r0-nonlexical-scan1-baseline.log": "337c2fa21f28c152aeb9edc7cb2f558078002b7e38df3a70121e161c8a93720b", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0007-r0-nonlexical-scan1-baseline.stat": "989f2cf4533dbaaa688c9c6b4f511164b55e23d48065403d539122d3ab4e2fc9", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0008-r0-nonlexical-scan1-lazy-pivot.log": "5d07e357658a39af0775d7d4a58c866771c4a1b6a45b4ba0f59d694d21e0bea6", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0008-r0-nonlexical-scan1-lazy-pivot.stat": "02baad8e1e4b86a3a02dd3b42e02200d81c2c84e091dda267042f0c6d2a5a670", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0009-r0-nonlexical-scan10000-baseline.log": "34c670bbfdb511cc11a575df614dab8d6ade710d2e56e41f7db94da731c51acf", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0009-r0-nonlexical-scan10000-baseline.stat": "fd25503a05a738465c80c1d6391b95045362fc1f4c38b30d68e31c334e578c26", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0010-r0-nonlexical-scan10000-lazy-pivot.log": "9a4f84c2bc15d9df2f568cc58237db139e1e0438ade8eec32478fcb5d8a57c72", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0010-r0-nonlexical-scan10000-lazy-pivot.stat": "e035354ca6199ed72641d96e2c1a28344baa24bd93dab5c1c1826936da1a9c82", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0011-r0-nonlexical-scanfull-baseline.log": "b515df8f4d12095912577e5f274eeb4ebd80cc75dfcfdff9ad422996073f894f", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0011-r0-nonlexical-scanfull-baseline.stat": "8a9919f47f3dceea229fb0e874a9e6f4a779d6e11a314568ccaf754e4a31ebab", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0012-r0-nonlexical-scanfull-lazy-pivot.log": "def46f1f42d34384acf486975022300d5c922d2afd81d4c98c3f86c56791056d", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0012-r0-nonlexical-scanfull-lazy-pivot.stat": "5b504d4fa851e547c5366834ca29199a47a10b312ed9caaa5636570d169bb3a5", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0013-r0-common-pack-baseline-on.log": "633afba0ab2cf8c679231fd2ab409188414422602556e2b5ebc5f64702907c2f", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0013-r0-common-pack-baseline-on.stat": "8c09554ec027cade32c16a0bbbfab6adc136111ed380514b4bf424fcc426efeb", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0014-r0-common-pack-lazy-pivot-on.log": "7dd47886e8742f3116aff5b5e1d4bcdf9a7f78ac3287337aa4134b312d064dd4", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0014-r0-common-pack-lazy-pivot-on.stat": "b77687cdd9b991440960c794c8de0546cb44b7a18f6bcb744ab16a5197ad1568", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0015-r0-common-scan1-baseline-on.log": "a0ede3886a284b7be5ef7a9bdeec1b7932a7db5f3b81c7f053222f7a1f68739a", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0015-r0-common-scan1-baseline-on.stat": "beb59629676d483ef80987f629480a4c5acf73c053284f4245d3be6046691209", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0016-r0-common-scan1-lazy-pivot-on.log": "60ba3cea1e298353c1a4ae98e6cfc9e4787992f57cd734db797f9392dee1831b", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0016-r0-common-scan1-lazy-pivot-on.stat": "a820a68067dccefba144ad44babf70bf1552ffc0ba570df6ac3f3d30a6ff7eee", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0017-r0-common-scanfull-baseline-on.log": "50f4c8cbd23ad312acfd02bb73363be2089c1fc97bf7c6cf4befb0a4e1264f70", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0017-r0-common-scanfull-baseline-on.stat": "2f2e0c9193dfe44d2c794330be97c5e7ae4ad9080580bf3b5bcd1e48ddb56341", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0018-r0-common-scanfull-lazy-pivot-on.log": "5c1ebce1d9e63536425665015c1bab96e5e5d0bb47f7f53cc301887f178192fa", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/0018-r0-common-scanfull-lazy-pivot-on.stat": "ea72f15c460db72fb19f45671b11e03d05d3475a10d86180b30994157885d4b7", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/manifest.json": "ce6e5e9af1a99145206fcc2ae633cc4e0db8ef2b385da84c83b93f7b22935817", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/plan.json": "23c395dc51fe3c1d1b5de624ce955ccb69e12a4ee0e638bfb2c0bfabbaf243a1", + "benchmarks/results-20261016/btree-nonlexical/smoke-lazy-pivot/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type-plan.json": "e5ec2d848347e8b5da6bec4178b3e4c069601f3cb6da0e115084660a3704d75d", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0001-r0-nonlexical-pack-baseline.log": "51366c035259c062a07682a8609188b0e1708be7d8d3ed0bd67d40bc88102349", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0001-r0-nonlexical-pack-baseline.stat": "94eb8fe8151de032bb34973721b06e04616979b6efd304586940645daf5ac888", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0002-r0-nonlexical-pack-message-type.log": "9cd588f3eb91c37f8df7a7bbfcae11ba6b57cc6d913ef86c2ae018c846f44913", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0002-r0-nonlexical-pack-message-type.stat": "8a2fdbcac1e08397300f8a74769d44d2ea6e7b516bce51d996c3b49a1b6ca88b", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0003-r0-nonlexical-hit-baseline.log": "7ec1077e9e2c895e9b3d1971f579b1638c80720466679d0f8c4995961fac2c94", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0003-r0-nonlexical-hit-baseline.stat": "27e2c5689c0a12b046a230dbdab47f105cd9dd6840bdce4be08db97c2a4a2427", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0004-r0-nonlexical-hit-message-type.log": "b82aaae24a2109ae6e8234679c9867b130dba097678efefc5e7b74f65a08c0ce", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0004-r0-nonlexical-hit-message-type.stat": "631e00d9ee25011f0fb8dbf07204071ebe93a6725af7ea6a7285ed979650eb09", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0005-r0-nonlexical-miss-baseline.log": "c71ed036e6662da3d980578c865a4c9f62472c4dd276d8d7932e20a6125280a4", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0005-r0-nonlexical-miss-baseline.stat": "15f857bc6c3c50868e0a0384cff727345dcc6badeb262d8c2e38b83c60bfd121", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0006-r0-nonlexical-miss-message-type.log": "abb97fa4ff2115d382d8d05533f37f8f47a80586d180685e33db58218bc1b312", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0006-r0-nonlexical-miss-message-type.stat": "609eabe6867db51635ca2ac60e0bcfc1762d837a90c5760f4c0aff9d848ddbee", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0007-r0-nonlexical-scan1-baseline.log": "caa00b0fa29b82b16c493182edbad6bd0343c876df03f2a87f4e1cb3716dac45", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0007-r0-nonlexical-scan1-baseline.stat": "9d0c95132c711492b2b1d40c0d2d2f85be295372ee2ac6d9f33bd9dcb7691ea9", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0008-r0-nonlexical-scan1-message-type.log": "e4e3bfc9e225b17ef420544b66a875088b86af9f44fa26c8d034cfbbff86820c", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0008-r0-nonlexical-scan1-message-type.stat": "7a68a2db87b8ee5db436e58c56117f6b7a1991aa250656d87966ef898fb34b1b", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0009-r0-nonlexical-scan10000-baseline.log": "284b39e4071ca58bcf4e58375caaa6f14f55b4bd1338f84f626bad57388d82ec", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0009-r0-nonlexical-scan10000-baseline.stat": "fc6d4ee609c7dc05c40f6d3c2574ab5d6227c851e6575f5179113d7822a2f904", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0010-r0-nonlexical-scan10000-message-type.log": "d50e4988ac1b671148f955aae8475ecbe0bfba3c8040350518389d6379860e3c", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0010-r0-nonlexical-scan10000-message-type.stat": "4efe8713f6bcaca0d2f3bb30a4081b2490833843c087dfb2c355970657edf461", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0011-r0-nonlexical-scanfull-baseline.log": "2694d1ac7ca0001ec77e8387176755429134287670eb94f1a347a80f95fed4ac", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0011-r0-nonlexical-scanfull-baseline.stat": "763b250baa172efb8b3d471007e972f17fdef401aeefa8e82a178bfa82eacf6e", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0012-r0-nonlexical-scanfull-message-type.log": "d1582e40b996ff6998b1a3a08b150509d0c7b0e1c9e94fa50136bdc3240ecabb", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0012-r0-nonlexical-scanfull-message-type.stat": "1c271169c168a86b92bc05744c4f9b292dfdf54f1a0c6d92ac849cb853e1ce40", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0013-r0-common-pack-baseline-on.log": "71ede69435b3a13e78537595c4319e63790b3aff621a79d1538af69ec7fc42cc", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0013-r0-common-pack-baseline-on.stat": "72c61af435836d8255d5b6ec694352556fc24bcd6e69e10049c92a93b581a89c", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0014-r0-common-pack-message-type-on.log": "a65f5e6608a722314648516d48ebc1fda638d63804fba206c694d8ca9e088569", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0014-r0-common-pack-message-type-on.stat": "8335b7196b97ddc9f335afacb5eda82f970fb0b423a851277ace79c5691301de", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0015-r0-common-scan1-baseline-on.log": "b471c0e45751d88f4e5f484c99b9d87e8cd95148b6b810e56a7e30350a21021b", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0015-r0-common-scan1-baseline-on.stat": "7d47cb59dce71ffa7fb7f5d9e0c465413be0a0f97aeacc838110853e907b8b2d", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0016-r0-common-scan1-message-type-on.log": "5377475112d4dc00adff73cd40b6c7adb7775abe0566bf57bb7fb6edc59c2a70", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0016-r0-common-scan1-message-type-on.stat": "9b46553fab12f5e14917c1ee0224038947ee493fbcc64a98c315ca6a2212e11d", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0017-r0-common-scanfull-baseline-on.log": "a07b99ea1680e02e6d9d0a9109d098d5bd70dc4bf255e633f86e8119f1f2359a", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0017-r0-common-scanfull-baseline-on.stat": "0a0c2ea3f3becd9c78e6eb503eb35e1e9a8ff3831ae4b266bba88bf137f47ae9", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0018-r0-common-scanfull-message-type-on.log": "c6c2007f28452ba6961fd67c3e32053cf2c4054d4049b6e4e8d7177d37ea8b7b", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/0018-r0-common-scanfull-message-type-on.stat": "da68d28904f68af76732f69e1f8c99e50693dc0fb556ce1d411015486b61fb6f", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/manifest.json": "3af87da006b80150ba0d90ab7a1723c63094930d828125e077d25544d179e689", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/plan.json": "e5ec2d848347e8b5da6bec4178b3e4c069601f3cb6da0e115084660a3704d75d", + "benchmarks/results-20261016/btree-nonlexical/smoke-message-type/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch-plan.json": "ec74055a1665eb97b947837793affcde9cf2874bc1ed4b38d0d370922cbd479a", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0001-r0-nonlexical-pack-baseline.log": "865ea8de7d6a44ab1ed1406823fa3cd1010654f8dfcde32d28e29e4ae51ed301", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0001-r0-nonlexical-pack-baseline.stat": "736ec4144f1d80e00b8d90fc194ef040e171ee04fb650c578b9db3c33795a5ab", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0002-r0-nonlexical-pack-prefix-scratch.log": "03b0fe33531d693698a2c95ce4e90a6fb9151fcb460ea9dec89046a2aaf32d3d", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0002-r0-nonlexical-pack-prefix-scratch.stat": "1021fd356375d35f832ed40f9249dca02a3452b3c94049987b62ccab37dbe691", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0003-r0-nonlexical-hit-baseline.log": "ba8a95abb4dbf4d86eb65481914681e16dab1f92c0bc839290eaea6bd3700090", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0003-r0-nonlexical-hit-baseline.stat": "ccaca0e207dd941a34dca4105ea86e3187467ad0758a275250e84d1a4e96e447", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0004-r0-nonlexical-hit-prefix-scratch.log": "906012ccf45c106ac55caeb8cd670d0b9f4f2da69359537ae7316a3ac9815a17", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0004-r0-nonlexical-hit-prefix-scratch.stat": "f01613317567931c0db8e4aa9fe28907b7afc844732af19192761375e67b6f3e", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0005-r0-nonlexical-miss-baseline.log": "c5075f2b66befaa2d4d1dfdc716513a550569c0ef1f2ec0db937f251c34aac1e", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0005-r0-nonlexical-miss-baseline.stat": "1e43fcf282c6ae022bf89da2f46aab02d3bf671daee608fc274221ffc909c177", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0006-r0-nonlexical-miss-prefix-scratch.log": "cb33afc6471c333c42f2ada403008ea13d3f8f795c19f1af051dc27cb9c3b622", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0006-r0-nonlexical-miss-prefix-scratch.stat": "3193e3736700d77f56584d273c8b3dcc7672f3fda61e267bf644c9d177feb767", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0007-r0-nonlexical-scan1-baseline.log": "0823fb76e2c80479f7c6b150fec7d6faccda54cfd69c0a30535d48021b12b002", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0007-r0-nonlexical-scan1-baseline.stat": "b1d590ecb6d936e32a0fad70c3d5e134528487984f36cbf46afb63123843007f", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0008-r0-nonlexical-scan1-prefix-scratch.log": "79977db4f67dd96b6f168f0539b6346daa77380f0b5ff742831050a78f2933e3", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0008-r0-nonlexical-scan1-prefix-scratch.stat": "56b3323ec323063ba085e3775dc44a04189d067c4123cc3793b0534ecc02159f", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0009-r0-nonlexical-scan10000-baseline.log": "13ec75d781a5da3de71558e4cc215739a0bf964aaf2f878fd8c28c019d2aec6f", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0009-r0-nonlexical-scan10000-baseline.stat": "65e1d16427d497d46039348eb7fbfd4d89d7cd636a6e6e24760480e4c6b2597f", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0010-r0-nonlexical-scan10000-prefix-scratch.log": "31f6b15af8773a2b72c6f36aedcc917c4f7e586bfd2b91acceb637d2a49dc871", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0010-r0-nonlexical-scan10000-prefix-scratch.stat": "56d908a035663b26c57662686e177ef6ca505f9018eff6988048d43912854f35", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0011-r0-nonlexical-scanfull-baseline.log": "7b1e43c2e838e3f1630a39192bef63fd6386cd8fb66d566923e31ba03fce0ca2", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0011-r0-nonlexical-scanfull-baseline.stat": "a7ecc9788e91b1c191ab964d69063d02f1304f86b78c08b18a6b0079e943238e", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0012-r0-nonlexical-scanfull-prefix-scratch.log": "5d7e1a52168348136292cbd7adf38dface9c0ac6c361357973d0aa0eb8a8faa2", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0012-r0-nonlexical-scanfull-prefix-scratch.stat": "15a0f95a9c21db0c05de03e4f3225ac158bd990f69ac9ed6327d03e2a9110cad", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0013-r0-common-pack-baseline-on.log": "0a553578a39cc8069bb109ef9dafb9e2b7a820a4b4e5b4bbdfbe28903e0a8aac", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0013-r0-common-pack-baseline-on.stat": "8cc7aebf3c3835c2707507729636ac0e03386660c549c27fb2af05713b08d6ae", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0014-r0-common-pack-prefix-scratch-on.log": "9aa320a02b27013d231dfcd1aa7c3937f4487d874a904f1c24a9daf419b1eb54", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0014-r0-common-pack-prefix-scratch-on.stat": "07c35e2ce7c5269a96206979f1c44f93324d342cdc3b6b6c299a3d7e60222cd2", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0015-r0-common-scan1-baseline-on.log": "6a858eb901de08329db2ab19b84da63fdb878dc6fe9a65686bc86cb232f69f44", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0015-r0-common-scan1-baseline-on.stat": "cd623a62609b191c97be8e0515185693d56cccce0bea6f10fd0a5e3c50aa88b7", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0016-r0-common-scan1-prefix-scratch-on.log": "7b55328e26e643685c9d055d4c544e846b47821d055b7960e88e8afaf278e3c1", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0016-r0-common-scan1-prefix-scratch-on.stat": "4669adcdb70244b7460949bd3242b932248fac84a97f2cb5a01f3354547fbd65", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0017-r0-common-scanfull-baseline-on.log": "33f7539042e5e3460bbac68a0c4084097ed6d05f14e5807dc3866e075b4b5c9e", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0017-r0-common-scanfull-baseline-on.stat": "c585956e8b8562ac06afd90ebd3df76f312df1d9a81e6a0a5161439b4035a248", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0018-r0-common-scanfull-prefix-scratch-on.log": "90db9ed4ba7774aa71f3fe96b29543f0825c925f46ae9c24ecb99f07e36d06e9", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/0018-r0-common-scanfull-prefix-scratch-on.stat": "762dbd919b7871efa41c0b9f1a3be15f5375ed42b9ced1323c57f271210eea0d", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/build.json": "bd338426fb8bb0834f3fdb6bf5e1585229580cc3e71cc4cbd8ed6b48ebdc6287", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/manifest.json": "e38ca40b4d60d3d92f657541c12bdf65409ed2d93072156882f3804bcda88eb8", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/plan.json": "ec74055a1665eb97b947837793affcde9cf2874bc1ed4b38d0d370922cbd479a", + "benchmarks/results-20261016/btree-nonlexical/smoke-prefix-scratch/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob-plan.json": "79c792601d2f0e53dd79c689481dc5be68170657ada0c8460ec4804170358af7", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0001-r0-nonlexical-pack-baseline.log": "8d7dcc6ba1d201f4b96af902d8e23c30d172364b0153165d19675c1574613c66", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0001-r0-nonlexical-pack-baseline.stat": "0a301c982415db84c3b68383e685abda7ec03012f89631873557aa3e2927d7a3", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0002-r0-nonlexical-pack-rare-blob.log": "33d2ffd2485d6a1415c2e010ed53e5a3e97621c5eee2ad1f0e6f8c6c80f266db", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0002-r0-nonlexical-pack-rare-blob.stat": "e282d335ab595dd683eea705562932db3d44eee64daf167c4268241c77c9c8c1", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0003-r0-nonlexical-hit-baseline.log": "940a429fc199f44d22d3b4f1de17b5522ea1ecd31624c3233eba8a7f10c74c8f", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0003-r0-nonlexical-hit-baseline.stat": "6abfbe8d5e8cb11acc441ba8e5e17eddb4111cac874826727d8c9c94c6068761", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0004-r0-nonlexical-hit-rare-blob.log": "688989ea94667c45ccebaa0172061da6417adb0d266917e9de329bf67d53855e", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0004-r0-nonlexical-hit-rare-blob.stat": "b1402bc4e18c565dce9c70cd55ef28643749e9406b464bd4e4d41dd1ff713c0c", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0005-r0-nonlexical-miss-baseline.log": "f72272d6f06943410418e3de9ef74b85ae9208335979c9d03b80b65bb525c14f", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0005-r0-nonlexical-miss-baseline.stat": "c1859529a737c2977d65dfad1298c818f0502da19acea8f34ca1e2beb20c4a15", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0006-r0-nonlexical-miss-rare-blob.log": "80a46a1efd413bc13abbe21079e6f13184e7ed9295b130f5ff2b5c2cb4e464e0", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0006-r0-nonlexical-miss-rare-blob.stat": "088b3fbf0815af8ab3f52e9295e21302073207ff3a04e9e6ce50dfe512513510", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0007-r0-nonlexical-scan1-baseline.log": "c2f2a7eaee126ad394df7f3ef52d632e9470466d78f2bcb405bf97c31995936e", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0007-r0-nonlexical-scan1-baseline.stat": "9a900a262f9fe8f8885e60c901b415b28e441167e3dd45f14e4b2d17e650534f", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0008-r0-nonlexical-scan1-rare-blob.log": "a620f95452550cae6d16acfef2798e9aafde66ee4c0adbe93e3137b12ec74f8f", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0008-r0-nonlexical-scan1-rare-blob.stat": "8a4f1038fb36d49434c22464c64f5c46e2fd91ba6a6db0fb63d7a93a9f53e088", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0009-r0-nonlexical-scan10000-baseline.log": "642178af47d90a47eb52ba676ec3ccebb8d659176317da2fc233483a2de5c6ed", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0009-r0-nonlexical-scan10000-baseline.stat": "16adb754c1631773cba308412a86d981ff5a197d40a577706979a48b50d2b3dd", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0010-r0-nonlexical-scan10000-rare-blob.log": "9c76f2f7653780c6fa8ecf360a8a57036962dbce8b1bde66ac0189eb0e5eaa5a", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0010-r0-nonlexical-scan10000-rare-blob.stat": "ea3720a7110dd77c764671554376e5aed20dd20bfe886848d0410258b84ca03b", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0011-r0-nonlexical-scanfull-baseline.log": "245babfd32e16ec77ccc9f9e6fd96974bf8a0aa38a82a99a7754cd1ef5766035", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0011-r0-nonlexical-scanfull-baseline.stat": "58aeb43ccfda2a08cf4d86ca1665131a4ba16d01fe5175b86a0e9e5c642e830f", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0012-r0-nonlexical-scanfull-rare-blob.log": "74581e6024c6f64077446b935b06c7d0900d9ba066faaab3f77a0b6742a57d37", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0012-r0-nonlexical-scanfull-rare-blob.stat": "bfb5316ed63c68130734ce8e9cd5d53c673cdbb010a439f398db555b15dee25b", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0013-r0-common-pack-baseline-on.log": "40ebb0fa996c81db6f1a9e5c9a5e6b7a247c4d7b71c60808bf9363c79e3900c5", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0013-r0-common-pack-baseline-on.stat": "c52202d5bcae1948e20f2e16c71db6d0721ebe62560a0f1499efca2e9bd83dcc", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0014-r0-common-pack-rare-blob-on.log": "eee408f7e71e19a6ddc506e29aff1ad95f9519b8e2d4190e2b25812f8eee2be9", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0014-r0-common-pack-rare-blob-on.stat": "2bb39628bb28f0231ed228edc5a446acdbe2aabe354a38d49477f38aac628fb7", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0015-r0-common-scan1-baseline-on.log": "fcd277446414812b3dd4eae8a8a56a43728662d5555fd56b4d8d530bd58a8487", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0015-r0-common-scan1-baseline-on.stat": "d46f2cd508b038d8306ad8432f5e71c1a50053287e57db78a5ec6d1922ba2585", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0016-r0-common-scan1-rare-blob-on.log": "8cb0bfa7512656657fc149e87b6b5a7180a8cfa3619faae321f94faef9526481", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0016-r0-common-scan1-rare-blob-on.stat": "92be36de662ea8e13cc99abdd39a096d248b069145a532608e210a32b81c30d9", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0017-r0-common-scanfull-baseline-on.log": "0149ae55b25bda3ff7ee5f86bb723bdfb254e1a92ad5fe3a983d752387979a34", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0017-r0-common-scanfull-baseline-on.stat": "df7ec24e0b9cbe498c5fc0529b6f5a12bb26bed5364c727a42ab978d62bb0071", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0018-r0-common-scanfull-rare-blob-on.log": "fab777414786bf07f71973fcf8c418062ea37212b50e03bbd749fa890036aecf", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/0018-r0-common-scanfull-rare-blob-on.stat": "e688d2286bce416bb2a24352ed4899495651ad5a2f83d322a553bb8b0d2c0841", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/build.json": "5b9d626df2263f08bbfaac71168ca77be744503ba264c4d5ac8149248df5def3", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/manifest.json": "dceb5623b10a708399ac76b67077b40d9efdc94f13288b31336533701d1d0e93", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/plan.json": "79c792601d2f0e53dd79c689481dc5be68170657ada0c8460ec4804170358af7", + "benchmarks/results-20261016/btree-nonlexical/smoke-rare-blob/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment-plan.json": "932e9d37d5286658bac00e879ae8d592886d9beddceb439f608bb989a59db6a9", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0001-r0-nonlexical-pack-baseline.log": "5bdca524932957ce1e2247a2602b662f62d6b5d7294dbfc093130fa0560be0e5", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0001-r0-nonlexical-pack-baseline.stat": "ec5544197f10a94a7715f13687707f4c0c80b1769140ed2a46205880c2d75f40", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0002-r0-nonlexical-pack-selected-io-alignment.log": "c2f6703b5a65bf5f9ef2d61394c8a2dc229dddd1ac7e6ba99fdf64bef9d84721", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0002-r0-nonlexical-pack-selected-io-alignment.stat": "3ff34bb7470c4f62e39330320490000a751a12bc56bbff92e9ae39c35fd87bb3", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0003-r0-nonlexical-hit-baseline.log": "824daacfceb3e4e6dd86673a653dc5f311aee67620fda49d26521873a47dcc8b", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0003-r0-nonlexical-hit-baseline.stat": "b1fd838c80406ff4c480b056fc311a12d5c6282a7ccd90410830df64ae882d88", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0004-r0-nonlexical-hit-selected-io-alignment.log": "d4f15e7ab622372d6eb3b9ab7a2386b8dc6be399dfac9d11aa23decf34d8647c", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0004-r0-nonlexical-hit-selected-io-alignment.stat": "94a04473abe00a28fc933ef3c3354fe93d6a194a2fba5eee3418b19ea8c4c2d3", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0005-r0-nonlexical-miss-baseline.log": "d12422f172a436bc860d02ed91936b03c8e213bad1e0364b03932d8c3f095d5f", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0005-r0-nonlexical-miss-baseline.stat": "735b43d3d5766ac40a7d424e6750cf9ce148ae4d7e03fed537e4db015c01eb3b", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0006-r0-nonlexical-miss-selected-io-alignment.log": "633e8175a9f2ffd267d8ac0d0c23cc0c88389c050ad8427ae2106559ee16fd67", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0006-r0-nonlexical-miss-selected-io-alignment.stat": "db6c392a84fd77181526cb051c0c98e7270f76e6598355f7431d9c48add92d97", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0007-r0-nonlexical-scan1-baseline.log": "b5bd834643f8fbc941236ced71575d9fafa9d8c26899d5d39be59a4981b9f81d", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0007-r0-nonlexical-scan1-baseline.stat": "28e3a12dce5ecfdf3e0e4b80c2804c6edb7b375279a786aae88e3dd3824c76ac", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0008-r0-nonlexical-scan1-selected-io-alignment.log": "71672ef2d271b58c784eb11a31dff5871e1267870682fe2616388b82a50f5dc6", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0008-r0-nonlexical-scan1-selected-io-alignment.stat": "e87d5010588a161d99960de85143fbceda76f97c1f633dc191f4482013c137f7", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0009-r0-nonlexical-scan10000-baseline.log": "b9e65532389ab69aceb83a362f3e052b2e6facd153ebf0faf60a178a60a0a875", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0009-r0-nonlexical-scan10000-baseline.stat": "46e13c26a762ae86c33ce0cc7e6464a3ac8281398b2674f4e4235dfcb18ac6e9", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0010-r0-nonlexical-scan10000-selected-io-alignment.log": "3d54cd14cef9fb44066bb0f46a6f58fac230557001d9fc820b7666748c48a94a", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0010-r0-nonlexical-scan10000-selected-io-alignment.stat": "1cefe735abf298804a44aa7d132ded5988c8965cccd5156b231ba829b025d1f7", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0011-r0-nonlexical-scanfull-baseline.log": "93fb6622a3f0c80f85424c2ad6d12948e5b6a45ec79d732edd84407dc922a05d", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0011-r0-nonlexical-scanfull-baseline.stat": "1157e05040e306e50a7b0f026c0572b110f20b64e500faab4b3531fcbc093bd9", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0012-r0-nonlexical-scanfull-selected-io-alignment.log": "88ac8cb15438c73482878fdec8fffcf3c3718337cd05fc8b4205755534d1cdd1", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0012-r0-nonlexical-scanfull-selected-io-alignment.stat": "716b80780fe3f320c91326a3250c5d89b5f86a183badd8eddfe08a0816e9e60f", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0013-r0-common-pack-baseline-on.log": "60e5b2dea508eecd7add9b5544ca6d87bdaa127889f1c9c293c61b2d89bcc443", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0013-r0-common-pack-baseline-on.stat": "d00a77e5be074beb16e25308f4a74ea9c9c7a70744b30b6a4d71880cad4bd75d", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0014-r0-common-pack-selected-io-alignment-on.log": "af2c99f4e262c1ef4cdf57bbf579fbb42ebc65edf21703540a95605bd4013fbc", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0014-r0-common-pack-selected-io-alignment-on.stat": "b07b62c1a49e501af403be6e58a76a0836a272429db3585a0dfcfd2c83111987", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0015-r0-common-scan1-baseline-on.log": "c4cca7097f6dcbc6a44507a3381fc7502ec0226e5a8080aef5a6b32cb98ebf95", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0015-r0-common-scan1-baseline-on.stat": "fcc7d43070260d0b637f1d9adde252f4289422dd1bf7c27e88c0e3f0bef26646", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0016-r0-common-scan1-selected-io-alignment-on.log": "aa1fe27c9a91799868496a1650349e43c3c39637a178c4ad93e3b49e7037e8fe", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0016-r0-common-scan1-selected-io-alignment-on.stat": "d4a7d4289878eec95dcdfc22d921130bf9860ebfba75b3a20ede513aff61055c", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0017-r0-common-scanfull-baseline-on.log": "fffc1242d222d0af98add462954f63b2ed9cbd1ee126e732d8dbf6ec54f01422", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0017-r0-common-scanfull-baseline-on.stat": "a9a5b85ac74386d6e19e9ddd4cff9c9994b5f3b279dbf8484c75a3b4278e8053", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0018-r0-common-scanfull-selected-io-alignment-on.log": "9ef8fdc7d17b8d0fae95d5bbc46c65858a771dc3edf7b7749bed9b0b40cf4c41", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/0018-r0-common-scanfull-selected-io-alignment-on.stat": "396161f47a65291ee2f2c0bd5c7a970b273f6c340338941b8199316fe661a7d7", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/analyze.py": "93adbff4dc404d122cdff1cf93be9da8fb3143f46f3ee6a8a846265cfadb78d0", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/build.json": "c6e8058d572fa4e60a6d39bb6a2d0b0e268f52464b5b65866240b93d25e88b75", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/manifest.json": "29e209fea9586a4c1468937e9520755f83f990981e69a93996bd1ada81847c32", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/plan.json": "932e9d37d5286658bac00e879ae8d592886d9beddceb439f608bb989a59db6a9", + "benchmarks/results-20261016/btree-nonlexical/smoke-selected-io-alignment/runner.py": "bad9028673ac10388994ad0ccba8f1015026adb7a7e42b843764504e43b18c68", + "benchmarks/results-20261016/btree-nonlexical/tooling-origin.json": "8386881cb46fb19393101d1b22385fc481a8093dc4849b327b09662d91bf3b22", + "benchmarks/results-20261016/btree-nonlexical/validate_selected.py": "0acf4b32497bbedb06b3f36cb7999f49c82b23510527b076d77ded913fe1b2e3", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/compiler.json": "ee4e30db494d6ca08a7cfce0f71f7f9447bfb428fd3ff10471b0b4734186142f", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/invocation.json": "51578aa78f183e88cc3530f93fd0cbe4948ee2ecc925e4256d28edefad0e2984", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/results.json": "174c3e53a8abea0227db35f59b2d7f7c81f316928ba2dbdeeb1261dda302bc44", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizer-capability-build.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizer-capability-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-btree.log": "33b7404499b6f4d35e6f671f93e29889bd5736c81dbe068150539004f57a904d", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-build-files.json": "6da6e40b2b42ca9ef8635f1e15ba07d47d1b8c199eea7de286dace430c74abdc", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-build.log": "179e3e1683f1edb16b746e1862164c56e352353a0fc18ef926b1fa7dabb6eed0", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_bounded_iterator_start_normalization.log": "533e0ac4429672c324059a5fcabc72f8763d4c4a33e5c1863271b02c02685933", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_branch_prefix_malformed_leaf_entries.log": "456ac95fca3dd789ec8b7fb94900d2a5836c6819133b968eda724e68257bec05", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_branch_prefix_minimum.log": "fda8a720d654215f0892acab47953473f6fac2ae31d8ceeb77039bb6254b472a", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_branch_prefix_roundtrip.log": "71cfcacb4fb35fe7ac41d9eb58ef86c20a2122855541bcd9396ef0bd5a92f206", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_branch_prefix_variable_iterator.log": "9b4c5ae8ce925b31874689e27b462e73ff89cf52c8ddf2def1609095745c4c98", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_immutable_branch_custom_comparator.log": "9d48e529e6619005635037351059fdd06886779a2cbc179b2504ac141a919220", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_iterator_custom_comparator.log": "7c084e60bf49bce6dbd452b8f9a82648c2502a917459f20ec27b21a98541b39b", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_iterator_prev_and_next.log": "fb4526813433fd33ba3b62f82fe725e8718071294661beba874f2df3d22c8ba0", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_range_init_error_cleanup_preserves_branches.log": "29085d6531f9fe3cd662762153a9ee8831cf310cdb64abad835b408097efc59c", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sanitizers-splinterdb_quick-test_value_size_gt_max_value_size.log": "6ca45b096ec9fe5fe5b952ed7d623e76f291e728d970c5826bfa687257b00354", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sha256.json": "31da0eb803c4544e3e214299bea4bc225f5ffcdcba08d3c99e2885f9c458ff72", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sources-after.json": "013bc777296b5e9f8ea3a62e1cd698b19c5bbe3043eb9fc3cd903df029edf527", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/sources-before.json": "013bc777296b5e9f8ea3a62e1cd698b19c5bbe3043eb9fc3cd903df029edf527", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/storage.json": "f6b8f567d79fe8b895dee8288b506c4b99b05586761e7a2fc75d4ccabaaef73f", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/summary.json": "af9e36fff5f5c0b14cb9e52bb651226665dbda69ec5d755b301fe49a83b01386", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/test-overlay-00-apply.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/test-overlay-00-check.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/test-overlay-00.patch": "bf964decfeda41d5b12eb686eff5ea1da498c99c7681e65beeb8ef5135c4c9c3", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/test-overlays.json": "893e71bf7ca2b8bfd1124d2f9f54e981ec98fd0cc82120856c3d1895ddc0be0b", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/test-plan.json": "160a8b1659bc4399a282f0a35721e7e1d33958e135289fbececc399c2012da90", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/timed-build.json": "e981379b2e93d800e944f0035669e3fce19742acc980dc2d39e510e3905a44b2", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/timed-files-after.json": "33ac4b5d9c0ad65d52c07836692255c5fa3d54883e6f5f41d499c7a546725be6", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/timed-files-before.json": "33ac4b5d9c0ad65d52c07836692255c5fa3d54883e6f5f41d499c7a546725be6", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/validate_selected.py": "0acf4b32497bbedb06b3f36cb7999f49c82b23510527b076d77ded913fe1b2e3", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/validation-sources-after.json": "424ed9112cd47f26bfc3c042fb136fde46636ac665c436ef4c9a8c31492e16a0", + "benchmarks/results-20261016/btree-nonlexical/validation/baseline-alignment-reproduction/validation-sources-before.json": "424ed9112cd47f26bfc3c042fb136fde46636ac665c436ef4c9a8c31492e16a0", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/compiler.json": "ee4e30db494d6ca08a7cfce0f71f7f9447bfb428fd3ff10471b0b4734186142f", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-btree.log": "3d624e8a35351a2fe56ee630a30f4eaddf38f4d44dabcd322634254474b4af2e", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-btree_stress-copied_iterator_bounds.log": "5dab75eb5b8913d72713ef1256788fc952115959f7fcac2a7bbecb3427ffd78b", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-btree_stress-copied_iterator_prefetch.log": "d2aa28873ad2c1d270d55e0a1bda84f1961dbceee5941ed59e2c28ddc20dbd6d", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-btree_stress-copied_iterator_split_on_release.log": "c431c92d4871782fa5eacbf4069402476ea08cd8b5ffce103b29bd6d52fda5ea", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-btree_stress-count_in_range_returns_lookup_error.log": "bd51af66ec3811633041a661c92b3a3ce4ce0f0558791e371e882af976764a6a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-btree_stress-iterator_endpoint_error_is_returned_by_init.log": "d0a088ba30e775964d1deacd7a7523ffc5d16843ded82be9bc9f9b30f668eb21", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-build-files.json": "1c1a39ba9d0f1d2c7837cb265585a662717d8563436b43fbd4678e1f1b5ecdae", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-build.log": "229d39fdcf6cc3d4d50c01d1466a98d8a0e110393a8702e41b116f31bcc097af", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_blob_checksums.log": "7d15542ca86d12c6da67ca4b9cea6838fcc93f1ebe689e6cbe0fabf956551126", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_blob_descriptor_sizes.log": "4170fde88b7e58c7be0de428e9ea64e06b5474de4af9383b42053b3b9d8d80e8", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_btree_pack_abort_releases_reserved_extents.log": "09aaab7e2de0b812d137b1fdf09587dacae51d6fb8d8307705c6fc6f0057664f", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_btree_pack_rejects_counter_overflow.log": "56a29828f20adc59145906affb431cbaccb9c4b30cdabf11f25f15495ef7b8f1", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_cache_read_errors_reach_core_operations.log": "33fa4d94234e74c122932d9a17173ce8636eab0fd8d1b9cd6598b5715947de4e", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_invalid_branch_reference_rejected.log": "80c6e8cea1f633e6418a8cb0241693e2dd514c3f64a3279f4d8a6a48b15860cd", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_malformed_trunk_child_height.log": "0c5268e3aa228dfbca562b2224659fd269f217bd4fed97d3bbde7edfe8cad5c7", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_malformed_trunk_pivot_bundle.log": "964de3bef84f4126fab1f5682cf6d2c0e3b39327ad003223a071b4bce7219454", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinter-test_malformed_trunk_pivot_stats.log": "13c9253a619dffae6d2f9873443d0b0cb33f69bb1da64c87f381a7460605bc3f", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/debug-splinterdb_quick.log": "fe604c9039bd34b8dfebbf0dd37771c3c49482d8dd6d9bd9d97848d54ea743c4", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-btree.log": "3d624e8a35351a2fe56ee630a30f4eaddf38f4d44dabcd322634254474b4af2e", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-btree_stress-copied_iterator_bounds.log": "34f308eb2a8c4b36ecf4be036a40fcb73c7fd715dcb01fc6d6d39b1fdf2f85b1", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-btree_stress-copied_iterator_prefetch.log": "c335a352809e14c83806d0382bdbbecba337f88bf8202ebf50e7f4023239600d", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-btree_stress-copied_iterator_split_on_release.log": "e66239bb0cf61fb2e52a7f175f2b73e3caab7120e8804e872bcab05235ee5541", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-btree_stress-count_in_range_returns_lookup_error.log": "1957176e8fda150f878bef3c843291bbf31940e9723d86e830772ad480458c28", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-btree_stress-iterator_endpoint_error_is_returned_by_init.log": "d0a088ba30e775964d1deacd7a7523ffc5d16843ded82be9bc9f9b30f668eb21", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-build-files.json": "bde18316f064624f99fc1ad286123ec0966363ede6d2415e4c5c72783c237fa7", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-build.log": "d320a7a9a96ed7fa47e51966d35f2ad0e301cc2e94d5f38f7c466a5496992a72", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_blob_checksums.log": "2c4bdbbeb586ba3687e16a120f28bb87b115dec3518f556f283ec52fb93b702d", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_blob_descriptor_sizes.log": "a711aaa60fe1cd96eecefd5efc145e06822cc1a9612130708712cd409f6cafd7", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_btree_pack_abort_releases_reserved_extents.log": "5189dc486040cc75e68f3a69de448c0189f19cd429bc604080a147cd689c7b6c", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_btree_pack_rejects_counter_overflow.log": "d10ba874071f1ea140189681ff89d5697a59ddfe2d764015486d02e1eeb405ad", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_cache_read_errors_reach_core_operations.log": "0d4a3135d1efa4f03f0d929637fca1d7956303b91f84c3011ecd485fe11b5c84", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_invalid_branch_reference_rejected.log": "740986b46cd60f6139f1d643af1b9fabaeffef020317eba748dc304790622950", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_malformed_trunk_child_height.log": "42654c954ac6e750b7ae8cf7b8310175a00836b9d3dca0bb84a889e294e59ea5", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_malformed_trunk_pivot_bundle.log": "3ab1b2dc62f56db77113a7a9da447504e2b337727246a520f2e4ceae9c242628", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinter-test_malformed_trunk_pivot_stats.log": "51451b6624e8966fabc72d07e502189698afa031250c87a033f8ab7558225fe1", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_bounded_iterator_start_normalization.log": "a2be84564e938c0c37911541d35d7885f2626af27e7a84977173f78dbc78319c", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_branch_prefix_malformed_leaf_entries.log": "616090f18099288723319e5f5a1a162b1e77a10316e84656d0a6a794e3775604", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_branch_prefix_minimum.log": "4be99b11fc62b1a115ebaba944efef5b65706630552fe4a5a88fc963502459ac", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_branch_prefix_roundtrip.log": "84e09f395673b75689345172052d0330178c0b1a27cb311b4e3b523922b6c846", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_branch_prefix_variable_iterator.log": "6667a5a406dd12ac4c7e88d5c126792e4de1a48047fcb36d4ded6ecfee9f931d", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_immutable_branch_custom_comparator.log": "5131e01d1b4756cbc04e48c242412dc83ae4722e943c7f2f96862445a3eb603a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_iterator_custom_comparator.log": "83345dc0a115d8285c33d6722d7017e2e8be4430ec78faa16a00545267443f39", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_iterator_prev_and_next.log": "9ec302d2f1b906f10a51c38b6c722ad7ad3bd5469992db9373607c4f168e02e1", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_range_init_error_cleanup_preserves_branches.log": "53e543bd14cf60d03b8591fdf2f5989f450a45263a893278764f48c064692fde", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/fault-splinterdb_quick-test_value_size_gt_max_value_size.log": "f05a00e1f8c8288fc5845688db6a79ce8b4688a3d824c6512523e0a11169d69e", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/invocation.json": "137b4b9106aefd3f038def38853aa5677947f0a401649947a9c21b2800ea642a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/results.json": "15a15b6d270ef05caa84848faad79376b4e616c82174cd6fbfac771fb7185548", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizer-capability-build.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizer-capability-run.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-btree.log": "50427f353e04b69603a78c5cabc2909c0360cf6722d29fcda0015ca5be39a1f2", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-build-files.json": "cfbeb28e2902323d73b82ec9835ba8c91e6354886e7d8d841bb365af58df4d63", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-build.log": "b8a6510d95169c53c41f716978baf6a7419785910c55d8cc7abea20ed2b3db8a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_bounded_iterator_start_normalization.log": "31fe12db87a797d37c8cc2307db068acfa236e807dac1b2cb7ce6ea07ca7ea34", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_branch_prefix_malformed_leaf_entries.log": "28b3f8bd14e8e1695c4b9be7fb84701eb4dd1ad40362143d1ab0a267f9bdde42", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_branch_prefix_minimum.log": "9187d8b71f8213c7fcf511394b667a2f4d3bbd270c93e6657030122637466106", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_branch_prefix_roundtrip.log": "75177414d193819429b6834a12d6cf20c1321d0fd63dc8eac93cbf87a0755d9a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_branch_prefix_variable_iterator.log": "d88231ddd204cfbeebe6241b8f2896deae7b94dca3659988e7893db2da0637ca", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_immutable_branch_custom_comparator.log": "17de349e02bb279d76603dadc5238ce2340d4075b5b52f0dd2df601ab5390a67", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_iterator_custom_comparator.log": "16ad1ea8afdeb4c88d24725ba4f9e490c390ea975d0018db40d976db5b536009", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_iterator_prev_and_next.log": "eface6b7d8ecfd67444dbed58bfb7eed0235e1a73efe4f3bd70c0a4ef8cd5ca2", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_range_init_error_cleanup_preserves_branches.log": "af948400caf32b325b8dc802ce345ecc72a6d90c7c744cc84382d84649d05ab9", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sanitizers-splinterdb_quick-test_value_size_gt_max_value_size.log": "29ac718661d292608eec18528b457365130b54950902de81aca4efb19d42e97c", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sha256.json": "7e7c6fceb034b0da21ea7e74beaba4189f3e38de08d66c7701379edee4620132", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sources-after.json": "28e50dcf2def0e92ff1fbc91db77bb3e0a0221577cb944bcf7a895ab87b94713", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/sources-before.json": "28e50dcf2def0e92ff1fbc91db77bb3e0a0221577cb944bcf7a895ab87b94713", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/storage.json": "c4fade193660616190244b2464aec2fd83357c5cb08ab905455beb70cc5573fd", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/summary.json": "c2657bb600e42a6cb81f1768b5299399637afcf67a0269d80149254fc3a9eead", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/test-overlay-00-apply.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/test-overlay-00-check.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/test-overlay-00.patch": "bf964decfeda41d5b12eb686eff5ea1da498c99c7681e65beeb8ef5135c4c9c3", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/test-overlays.json": "35610e2fc7f568a47333e39c7d9e21a8a7143665548be13f64e24d72c8426aa6", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/test-plan.json": "160a8b1659bc4399a282f0a35721e7e1d33958e135289fbececc399c2012da90", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/timed-build.json": "ea9af5d74faa9f657118e95de9343c92a378ae1588f3af2b1546404d7e7753b4", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/timed-files-after.json": "90a7c1258ad3c57a8320e74d8eefd98e89e777f98f7095f1149c47925cdfd7b2", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/timed-files-before.json": "90a7c1258ad3c57a8320e74d8eefd98e89e777f98f7095f1149c47925cdfd7b2", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/validate_selected.py": "0acf4b32497bbedb06b3f36cb7999f49c82b23510527b076d77ded913fe1b2e3", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/validation-sources-after.json": "75035336c1206f8e9dd7de67d1df87f0706fe49275a7d2e379602ecf4270de63", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-postconfirmation-extra/validation-sources-before.json": "75035336c1206f8e9dd7de67d1df87f0706fe49275a7d2e379602ecf4270de63", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/compiler.json": "ee4e30db494d6ca08a7cfce0f71f7f9447bfb428fd3ff10471b0b4734186142f", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/invocation.json": "b748d3d8330d75438e30e46b9afea56d3891524fd2cb1546bb6f400e5cd8346a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-btree.log": "1159d05f22b0856c2e5eb66afcb51bf70db527e8597e2f4aef0d4dce5894cead", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-btree_stress-copied_iterator_bounds.log": "e803a5b658080e4c1a8616c693fa0d99c9e34ea2e85f24b671d8c6b333e4615a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-btree_stress-copied_iterator_prefetch.log": "7fbfe7e26e4a0bb242e745375842db494f2952ba175036345ff4590dafd64f53", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-btree_stress-copied_iterator_split_on_release.log": "c5149a7d70bbf439f01a62c6a1f46c64d340aef037ccea464c385dffb83546b5", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-btree_stress-count_in_range_returns_lookup_error.log": "86bcb38ff72f4ecd7575b73e20e41f1d7bbb572a41fd2ff9747b502ea2e97dd1", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-btree_stress-iterator_endpoint_error_is_returned_by_init.log": "7488857613e2a4b2dc9287d0b71b746f71f9eb7d509c89721c2de739df3f067a", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-build-files.json": "119feded0aaf4182cb32e8bc7e99de19ba5556c8e24e0a5535a3b173effe9ad4", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-build.log": "7a6df6345b90dd9affe512da8b21abe4fa2d9355e722430be952535f3c90cdb7", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_blob_checksums.log": "75cfc3c2a2ad9d8b3adb7fa8f4dddf2cafaa27df4c072e643b5ebf6a522e5b86", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_blob_descriptor_sizes.log": "4eb2ece5c3669e64acbe58b8b3287855058d9ba601f7b780e62b9ac98d55725e", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_btree_pack_abort_releases_reserved_extents.log": "c343a77e151db6d24f15b68dd23e3dcbb231f85b69f763247cb698b9e4dc3f59", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_btree_pack_rejects_counter_overflow.log": "1f4a6e377aaed03acd58006a488d961d5cd74c0e23026f26b201e34011f3b931", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_cache_read_errors_reach_core_operations.log": "43aa26fcb1b55f89cf565fd73af24b2aa5f92b4e9cd40871b5b13f880d384bbe", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_invalid_branch_reference_rejected.log": "93e23e15edd5dd66ec5258c522084a845840f1b6631bf1b6906b69091ae7b863", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_malformed_trunk_child_height.log": "6b3206e759abe2a529225d8ae2c241ceb16c3d1fefc5b18bd4171171fbc08a08", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_malformed_trunk_pivot_bundle.log": "9f4067797a8c784eb23a555d59929f75d6f3ac1a9fe81292fb46e6db08051edb", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinter-test_malformed_trunk_pivot_stats.log": "e39f8e0caf442c586e6f90d6729899fc5b8549ea9b9e9f2a498f86897b63d683", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/release-splinterdb_quick.log": "8c9acb3557955e25cc866011ed7b34adb93dcaab5c03017dcf0a54d48a2288e2", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/results.json": "73aad02d129246f813e461b094fa7050a7d2ca3d565bff8813ebc2eb8820c2a9", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/sha256.json": "bda7f61cf0c5199d8be8f841012d0c4c2cdea68f3d8e6d96e2fe1b62efb35d44", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/sources-after.json": "28e50dcf2def0e92ff1fbc91db77bb3e0a0221577cb944bcf7a895ab87b94713", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/sources-before.json": "28e50dcf2def0e92ff1fbc91db77bb3e0a0221577cb944bcf7a895ab87b94713", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/storage.json": "ac1f8e40dff99f9d88b93cb66a88d453417950a69cdacc6686ae7420f05a7ba9", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/summary.json": "d1126660e840a3b7adb3fd4759f16a46295fcc372d199da9f683f174107e026c", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/test-overlay-00-apply.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/test-overlay-00-check.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/test-overlay-00.patch": "bf964decfeda41d5b12eb686eff5ea1da498c99c7681e65beeb8ef5135c4c9c3", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/test-overlays.json": "7b33896ea6ff8fac59a0a938f6c35c5bd6692fe316ebd3976f89c2e3118747d9", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/test-plan.json": "160a8b1659bc4399a282f0a35721e7e1d33958e135289fbececc399c2012da90", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/timed-build.json": "ea9af5d74faa9f657118e95de9343c92a378ae1588f3af2b1546404d7e7753b4", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/timed-files-after.json": "90a7c1258ad3c57a8320e74d8eefd98e89e777f98f7095f1149c47925cdfd7b2", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/timed-files-before.json": "90a7c1258ad3c57a8320e74d8eefd98e89e777f98f7095f1149c47925cdfd7b2", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/validate_selected.py": "0acf4b32497bbedb06b3f36cb7999f49c82b23510527b076d77ded913fe1b2e3", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/validation-sources-after.json": "75035336c1206f8e9dd7de67d1df87f0706fe49275a7d2e379602ecf4270de63", + "benchmarks/results-20261016/btree-nonlexical/validation/combined-read-blob-v1-preconfirmation-release/validation-sources-before.json": "75035336c1206f8e9dd7de67d1df87f0706fe49275a7d2e379602ecf4270de63" + }, + "per_root": { + "benchmarks/results-20261015/btree-prefix": { + "file_count": 1438, + "raw_bytes": 16251259 + }, + "benchmarks/results-20261016/btree-nonlexical": { + "file_count": 2987, + "raw_bytes": 70375363 + } + }, + "schema_version": 1, + "source_roots": [ + "benchmarks/results-20261015/btree-prefix", + "benchmarks/results-20261016/btree-nonlexical" + ], + "total_raw_bytes": 86626622, + "verification": { + "every_member_sha256_matches_original": true, + "no_symlinks_or_special_files": true, + "only_files_within_source_roots": true, + "original_file_set_and_contents_unchanged": true, + "repeated_serialization_matches_archive_sha256_and_size": true + } +} diff --git a/benchmarks/branch-prefix-evaluation/evidence.tar.gz b/benchmarks/branch-prefix-evaluation/evidence.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..9fdb5ace0c8990e8ca1723fcde0c399247136360 GIT binary patch literal 12290329 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

QxZ>UbO}^YsJ!Ud$)M`s|05pZB+xlT6t*B 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

  • M-b1$QsI)Gq>j$1p@E>`#UJ~*X8dPD4yt)s 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\MDY647wO@U@G2A_ETB{x zb(AV43!ytGGC#+8Cmm8rWBKZf$vM!WNARhXHmn2X?WY~yFCTewWM%RdVfKpO9qVd4 z_(;Ml9?jxj3$^GfcDBt%x03oQHU$_fka|)VS~VhjS0V8hEjvw`k+J6{MDBqc59J&n zVyqNLuLgr@ihGaQZ~B|1%0zOHe@;lz0_YSGuGS?;L0c0?&GdXAm)Yzd96X5RPaADL zoYj=yV?Nq{1c4Zy_Km7BdQ_6Yp)!?0@uW$~jh`!ey*NF3F7=!`<}BV?B$bEj5?(EO zPK6O0{PWA7wQOw4T57Ki1BB(uKKZ0C)?_T}y6p}lY-)NG@=I?GnRd~^@`13+3W#LM z%p76m{^i{Fi_YEqG+-|x;Be3&s_L4dgJpjHCO`~geGsh|~E7^S@F73GaVWff4uro(hmc|0fmbz%lTd zLtzV%w;j>~xUy9WZ?8z8-KcCmuZHo%m8FeP!x_x4K zpl*%#!JE`Gqjx`^7IslGJS{Oc+{J139Y<5k&OTt^CW$$XM4N|1`lL8&_J-szhEyN5 zcZ@$j1c{w&dCeq+z7RV5I%3|F0X?r^LOI)VOeLrpYv!gEW)b_~nYrs=qtu$nma zz_}DMw7wc{Zi8^1+5dEfo7%PCvb9yzk&yR}l4#HFg0^K;I~)J=ul=XvQMja%=4Ii^ zWq7@HM4?tfcc?#Y8t$>te*>7y$r;_Oc0Pj#`5pc`M(W8uv)|hlN7y+_WXNOEj{^M?%0NN zmeVp`)=3$T@`~_`N?4XW0&Ukx>Hc(~&p2;h5nQs5GcSKose8(s3KPc-w)JIR+V8Dw zGrvDvqomL@%!*s*+t*I5wBER^qJe&^mX$g@q)n$Sr0HMn_5R>7-CY}Y9DrkFMj
  • BH0m|>FKgasYc4sK5>$%_%q5~( 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

    iW<9V92Up4t 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¨0a#qi?G{_)%kY#q1p4j4Yl>veiBR1 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

    c%ZtjkGPr@?Pt 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

    go1*(MX)t_v4>+-s1_yXD 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 i=sM^{FA)Hn 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%0Alk zwC8L^*ua=PvF_qP_giaW6iH$aQ?Dh*C96DkQD3VI7m4@_v`mS5Sxxrz3HM@1YXrTBuEF zml0bFV~V?|;g5w z;1KEWt<8R&LeT+7e!h}%MkurVfXO);o?Dw;-XYXXI^vK%%xorZ-A1A;n~O-6jw$0G zQ+C<(jK5bk{Bez=Z0nJKr`Wy54|W`Kw@N70A?RYlBBcWl1sf2PK4s>(>WgJyxbPcj z8!85Qb|L7p6O)o*QO2sW5XVxUKEuW^5sr`&Z^1_XuZEKoS-IcwAbKKvdN4)}rZ6*? z96I>ut-3GKU3mqe=Lci{QV9tmLbYM)62J2Q3q8a$%odap&~&F|i9Vz6yg1kp8KbJi zq?DH>T^*Rqkea&;{7M|aD)-ka3vpV%Da)*%C1qbm(eCo;z}kf!!3W)^X=rwgXq=4s ze>(2)e>(1`x|{!AU1qvNZrX7dYq;k=Y#Q?x>n946k<}dp%Z(Yj9vm1LI31cvvFqqn zh^pl+8p3rtlEqAqS9u$W=J8>KblUmBgg0t4!S~aZ*nMeH5pv zVnBb|M>6)BdVe1eX`K<1wfW{BCVS1&AC#GE)=ts3+9otTpDJjkAG#tmZB}sHA~YSd z?~Y%KO`>L$bFUsVC7dz40tyS+78o|qm9Gx-!UxZdaxQVTa{_-l?3Ih&H1YKS_-Sl) z50P3PdovBQ8sM(1D&LXS56H46Q?@Q;Y8_iuwX?T~;yX5nT!Ibvm9D|wZdjD<& z&seQa7zcow2L5|Lhu}L@-bQVOxXsn?W&H>wVFe7k|xtR<*8uGv;uT4R0s{bjCC_8#_@~ zzE$K;kEzRXt(K+JQ^!iFi~uN0Q|d$5VNPd-bC(at>nEf+9IRy`>)GfwX+`g$f7x6} zX%Cqi2%2u;J$Dq7?nsmoUm53=M)SJ1WB>K7(NNm=}b-i`y1|7aKJF`gy--o*f^9i8m&lo%-XxVM7K+9y_vd zpPN~40X#w^I6elUh}K}D*72Fmr=jt%FcGH&NzRiW+ zNj(yd?~k6S;-Mo!&l;|)sr?R$8I5)SN#&N1M37w2^y!dEQ@r%wwgkUwa+7Awz--{U z@1fRS0>J3<-TduwP&^%=lA>V(_z^v`pk{}(STCakPWZsV2@XGU%wV>j)?_9VBW+|x z(Z@<%q6w{VED`a#OM6VOT0`=rPP;6~($JZM*-gHoP@9DVwTFnW!W=nS7xr;mO_Xu^0 zNrV?z!QfYsy}`!^T*{)ho{!vj39KYuu921yjY&G!UR%-Zv|8t{k$>5_p}ZeToj zu`5hP-_66C_Jm6pX{*mxv(|@DoS4(%zj)kZ*^F0CFssA2$0yb?tbb+~SIQ@Dl*zX- z>Pe5vhg6!syd~<1sx*xeZBUuIUn+B%0Gn#)v}S*!8xK9>ri;PY_*Z9-M+R<)W*)YO zr-r36K`@SejiVS+*|$*Ub47^2Ow6*9vSoD#u@bJd1*hyeNLCzMfzKoyq69(jaW!|X zTFCkP=4kSZ@K>wlfFGRrV;FENP+1oHzR8fEs60P5_usN1_hCs{Fm2su2Olx~9?v{kf042HBvLrgH zDn5jYugFE00l$fVjjLLHGZ{Y_bHS&I1ogFvgIx)nMjouJrFTnAgyhDV#@eOIELe>` zQwJF#@p=Zlt)_GK*R`ukBlGS(?htnC{d4bJ!r`6AFfgotgn`uze%0AqR&)StkS~v4 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�r$lxAN@x#t6ttz>M9 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%0Do%f#o)sDNbQs$7pkA%iI67&7AX~k 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

    9QWQEBGuKPYtnWg4=wk2B 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î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�lIBDZ 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 z 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

    9F)V*fUP) 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