From 01962b47becdec2aab99a373b4ad7d1e29fd341d Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Mon, 17 Aug 2026 22:21:37 -0400 Subject: [PATCH 1/6] Disable address index by default. --- src/parser.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 62d6b488..f7dcda81 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -110,7 +110,8 @@ parser::parser(system::chain::selection context, configured.database.ins.size = 34'250'000'000; // outs (optional) - configured.database.outs.buckets = 1'496'771'635; + ////configured.database.outs.buckets = 1'496'771'635; + configured.database.outs.buckets = 0; configured.database.outs.size = 6'750'000'000; configured.database.input.size = 92'500'000'000; @@ -1682,7 +1683,7 @@ options_metadata parser::load_settings() THROWS ( "table.outs.buckets", value(&configured.database.outs.buckets), - "The number of buckets in the archive_outs table head, defaults to '1496771635' (0 disables address index)." + "The number of buckets in the archive_outs table head, defaults to '0' (0 disables address index)." ) ( "table.outs.size", From a8af66074ac3871bd1721cea36d0ac1fbfd88692 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Mon, 17 Aug 2026 22:50:45 -0400 Subject: [PATCH 2/6] Tune tables 1% rate and 1% of pruned start size. --- src/parser.cpp | 91 +++++++++++++++++++++++++------------------------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index f7dcda81..d718c2fe 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -89,7 +89,8 @@ parser::parser(system::chain::selection context, ////configured.server.stratum_v2.binds.emplace_back(asio::address{}, 8580_u16); // database - // load factors are set to 2.5 @ 950K. + // load factors are set to 2.5 @ 950K (except duplicate). + // sizes are set to 1% of measured pruned body @ 950K (tiny tables 100%). // Only used for electrum queries (255 is optimal otherwise). configured.database.interval_depth = 11; @@ -97,33 +98,33 @@ parser::parser(system::chain::selection context, // archive configured.database.header.buckets = 385'181; - configured.database.header.size = 21'000'000; + configured.database.header.size = 93'406'247; configured.database.txs.buckets = 950'001; - configured.database.txs.size = 1'050'000'000; + configured.database.txs.size = 54'471'017; configured.database.tx.buckets = 543'948'678; - configured.database.tx.size = 17'000'000'000; + configured.database.tx.size = 870'317'885; // ins (required) configured.database.ins.buckets = 1'345'386'901; - configured.database.ins.size = 34'250'000'000; + configured.database.ins.size = 1'749'002'971; // outs (optional) ////configured.database.outs.buckets = 1'496'771'635; configured.database.outs.buckets = 0; - configured.database.outs.size = 6'750'000'000; + configured.database.outs.size = 336'773'618; - configured.database.input.size = 92'500'000'000; - configured.database.output.size = 25'300'000'000; + configured.database.input.size = 67'269'346; + configured.database.output.size = 1'278'023'220; // indexes - configured.database.candidate.size = 2'575'500; - configured.database.confirmed.size = 2'575'500; + configured.database.candidate.size = 2'888'853; + configured.database.confirmed.size = 2'850'003; configured.database.strong_tx.buckets = 543'948'678; - configured.database.strong_tx.size = 2'900'000'000; + configured.database.strong_tx.size = 149'585'887; // caches @@ -136,10 +137,10 @@ parser::parser(system::chain::selection context, configured.database.prevout.size = 1; configured.database.duplicate.buckets = 1024; - configured.database.duplicate.size = 44; + configured.database.duplicate.size = 1; configured.database.validated_bk.buckets = 950'001; - configured.database.validated_bk.size = 1'700'000; + configured.database.validated_bk.size = 1; // unused in v4 configured.database.validated_tx.buckets = 0; @@ -1630,36 +1631,36 @@ options_metadata parser::load_settings() THROWS ( "table.header.size", value(&configured.database.header.size), - "The minimum allocation of the archive_header table body, defaults to '21000000'." + "The minimum allocation of the archive_header table body, defaults to '93406247'." ) ( "table.header.rate", value(&configured.database.header.rate), - "The percentage expansion of the archive_header table body, defaults to '5'." + "The percentage expansion of the archive_header table body, defaults to '1'." ) /* table.input */ ( "table.input.size", value(&configured.database.input.size), - "The minimum allocation of the archive_input table body, defaults to '92500000000'." + "The minimum allocation of the archive_input table body, defaults to '67269346'." ) ( "table.input.rate", value(&configured.database.input.rate), - "The percentage expansion of the archive_input table body, defaults to '5'." + "The percentage expansion of the archive_input table body, defaults to '1'." ) /* table.output */ ( "table.output.size", value(&configured.database.output.size), - "The minimum allocation of the archive_output table body, defaults to '25300000000'." + "The minimum allocation of the archive_output table body, defaults to '1278023220'." ) ( "table.output.rate", value(&configured.database.output.rate), - "The percentage expansion of the archive_output table body, defaults to '5'." + "The percentage expansion of the archive_output table body, defaults to '1'." ) /* table.ins */ @@ -1671,12 +1672,12 @@ options_metadata parser::load_settings() THROWS ( "table.ins.size", value(&configured.database.ins.size), - "The minimum allocation of the archive_ins table body, defaults to '34250000000'." + "The minimum allocation of the archive_ins table body, defaults to '1749002971'." ) ( "table.ins.rate", value(&configured.database.ins.rate), - "The percentage expansion of the archive_ins table body, defaults to '5'." + "The percentage expansion of the archive_ins table body, defaults to '1'." ) /* table.outs */ @@ -1688,12 +1689,12 @@ options_metadata parser::load_settings() THROWS ( "table.outs.size", value(&configured.database.outs.size), - "The minimum allocation of the archive_outs table body, defaults to '3700000000'." + "The minimum allocation of the archive_outs table body, defaults to '336773618'." ) ( "table.outs.rate", value(&configured.database.outs.rate), - "The percentage expansion of the archive_outs table body, defaults to '5'." + "The percentage expansion of the archive_outs table body, defaults to '1'." ) /* table.tx */ @@ -1705,12 +1706,12 @@ options_metadata parser::load_settings() THROWS ( "table.tx.size", value(&configured.database.tx.size), - "The minimum allocation of the archive_tx table body, defaults to '17000000000'." + "The minimum allocation of the archive_tx table body, defaults to '870317885'." ) ( "table.tx.rate", value(&configured.database.tx.rate), - "The percentage expansion of the archive_tx table body, defaults to '5'." + "The percentage expansion of the archive_tx table body, defaults to '1'." ) /* table.txs */ @@ -1722,36 +1723,36 @@ options_metadata parser::load_settings() THROWS ( "table.txs.size", value(&configured.database.txs.size), - "The minimum allocation of the archive_txs table body, defaults to '1050000000'." + "The minimum allocation of the archive_txs table body, defaults to '54471017'." ) ( "table.txs.rate", value(&configured.database.txs.rate), - "The percentage expansion of the archive_txs table body, defaults to '5'." + "The percentage expansion of the archive_txs table body, defaults to '1'." ) /* table.candidate */ ( "table.candidate.size", value(&configured.database.candidate.size), - "The minimum allocation of the index_candidate table body, defaults to '2575500'." + "The minimum allocation of the index_candidate table body, defaults to '2888853'." ) ( "table.candidate.rate", value(&configured.database.candidate.rate), - "The percentage expansion of the index_candidate table body, defaults to '5'." + "The percentage expansion of the index_candidate table body, defaults to '1'." ) /* table.confirmed */ ( "table.confirmed.size", value(&configured.database.confirmed.size), - "The minimum allocation of the index_confirmed table body, defaults to '2575500'." + "The minimum allocation of the index_confirmed table body, defaults to '2850003'." ) ( "table.confirmed.rate", value(&configured.database.confirmed.rate), - "The percentage expansion of the index_confirmed table body, defaults to '5'." + "The percentage expansion of the index_confirmed table body, defaults to '1'." ) /* table.strong */ @@ -1763,12 +1764,12 @@ options_metadata parser::load_settings() THROWS ( "table.strong.size", value(&configured.database.strong_tx.size), - "The minimum allocation of the index_strong table body, defaults to '2900000000'." + "The minimum allocation of the index_strong table body, defaults to '149585887'." ) ( "table.strong.rate", value(&configured.database.strong_tx.rate), - "The percentage expansion of the index_strong table body, defaults to '5'." + "The percentage expansion of the index_strong table body, defaults to '1'." ) /* table.ecdsa */ @@ -1780,7 +1781,7 @@ options_metadata parser::load_settings() THROWS ( "table.ecdsa.rate", value(&configured.database.ecdsa.rate), - "The percentage expansion of the batch_ecdsa table body, defaults to '5'." + "The percentage expansion of the batch_ecdsa table body, defaults to '1'." ) /* table.schnorr */ @@ -1792,7 +1793,7 @@ options_metadata parser::load_settings() THROWS ( "table.schnorr.rate", value(&configured.database.schnorr.rate), - "The percentage expansion of the batch_schnorr table body, defaults to '5'." + "The percentage expansion of the batch_schnorr table body, defaults to '1'." ) /* table.silent */ @@ -1804,7 +1805,7 @@ options_metadata parser::load_settings() THROWS ( "table.silent.rate", value(&configured.database.silent.rate), - "The percentage expansion of the batch_silent table body, defaults to '5'." + "The percentage expansion of the batch_silent table body, defaults to '1'." ) /* table.prevalid */ @@ -1816,7 +1817,7 @@ options_metadata parser::load_settings() THROWS ( "table.prevalid.rate", value(&configured.database.prevalid.rate), - "The percentage expansion of the batch_prevalid table, defaults to '5'." + "The percentage expansion of the batch_prevalid table, defaults to '1'." ) /* table.prevout */ @@ -1833,7 +1834,7 @@ options_metadata parser::load_settings() THROWS ( "table.prevout.rate", value(&configured.database.prevout.rate), - "The percentage expansion of the cache_prevout table, defaults to '5'." + "The percentage expansion of the cache_prevout table, defaults to '1'." ) /* table.duplicate */ @@ -1845,12 +1846,12 @@ options_metadata parser::load_settings() THROWS ( "table.duplicate.size", value(&configured.database.duplicate.size), - "The minimum allocation of the cache_duplicate table body, defaults to '44'." + "The minimum allocation of the cache_duplicate table body, defaults to '1'." ) ( "table.duplicate.rate", value(&configured.database.duplicate.rate), - "The percentage expansion of the cache_duplicate table, defaults to '5'." + "The percentage expansion of the cache_duplicate table, defaults to '1'." ) /* table.validated_bk */ @@ -1862,12 +1863,12 @@ options_metadata parser::load_settings() THROWS ( "table.validated_bk.size", value(&configured.database.validated_bk.size), - "The minimum allocation of the validated_bk table body, defaults to '1700000'." + "The minimum allocation of the validated_bk table body, defaults to '1'." ) ( "table.validated_bk.rate", value(&configured.database.validated_bk.rate), - "The percentage expansion of the validated_bk table body, defaults to '5'." + "The percentage expansion of the validated_bk table body, defaults to '1'." ) /* table.validated_tx */ @@ -1884,7 +1885,7 @@ options_metadata parser::load_settings() THROWS ( "table.validated_tx.rate", value(&configured.database.validated_tx.rate), - "The percentage expansion of the validated_tx table body, defaults to '5'." + "The percentage expansion of the validated_tx table body, defaults to '1'." ) /* table.filter_bk */ @@ -1901,7 +1902,7 @@ options_metadata parser::load_settings() THROWS ( "table.filter_bk.rate", value(&configured.database.filter_bk.rate), - "The percentage expansion of the option_filter_bk table body, defaults to '5'." + "The percentage expansion of the option_filter_bk table body, defaults to '1'." ) /* table.filter_tx */ @@ -1918,7 +1919,7 @@ options_metadata parser::load_settings() THROWS ( "table.filter_tx.rate", value(&configured.database.filter_tx.rate), - "The percentage expansion of the option_filter_tx table body, defaults to '5'." + "The percentage expansion of the option_filter_tx table body, defaults to '1'." ) /* [log] */ From 8d1b2ea701481c94057490fecdd55001656943d9 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Mon, 17 Aug 2026 23:29:02 -0400 Subject: [PATCH 3/6] Default empty table sizes to 0 vs. 1, add 1% rates. --- src/parser.cpp | 60 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index d718c2fe..2af8f62b 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -99,62 +99,82 @@ parser::parser(system::chain::selection context, configured.database.header.buckets = 385'181; configured.database.header.size = 93'406'247; + configured.database.header.rate = 1; configured.database.txs.buckets = 950'001; configured.database.txs.size = 54'471'017; + configured.database.txs.rate = 1; configured.database.tx.buckets = 543'948'678; configured.database.tx.size = 870'317'885; + configured.database.tx.rate = 1; // ins (required) configured.database.ins.buckets = 1'345'386'901; configured.database.ins.size = 1'749'002'971; + configured.database.ins.rate = 1; // outs (optional) ////configured.database.outs.buckets = 1'496'771'635; configured.database.outs.buckets = 0; configured.database.outs.size = 336'773'618; + configured.database.outs.rate = 1; configured.database.input.size = 67'269'346; + configured.database.input.rate = 1; configured.database.output.size = 1'278'023'220; + configured.database.output.rate = 1; // indexes configured.database.candidate.size = 2'888'853; + configured.database.candidate.rate = 1; configured.database.confirmed.size = 2'850'003; + configured.database.confirmed.rate = 1; configured.database.strong_tx.buckets = 543'948'678; configured.database.strong_tx.size = 149'585'887; + configured.database.strong_tx.rate = 1; // caches - configured.database.ecdsa.size = 1; - configured.database.schnorr.size = 1; - configured.database.silent.size = 1; - configured.database.prevalid.size = 1; + configured.database.ecdsa.size = 0; + configured.database.ecdsa.rate = 1; + configured.database.schnorr.size = 0; + configured.database.schnorr.rate = 1; + configured.database.silent.size = 0; + configured.database.silent.rate = 1; + configured.database.prevalid.size = 0; + configured.database.prevalid.rate = 1; configured.database.prevout.buckets = 0; - configured.database.prevout.size = 1; + configured.database.prevout.size = 0; + configured.database.prevout.rate = 1; configured.database.duplicate.buckets = 1024; - configured.database.duplicate.size = 1; + configured.database.duplicate.size = 0; + configured.database.duplicate.rate = 1; configured.database.validated_bk.buckets = 950'001; - configured.database.validated_bk.size = 1; + configured.database.validated_bk.size = 0; + configured.database.validated_bk.rate = 1; // unused in v4 configured.database.validated_tx.buckets = 0; - configured.database.validated_tx.size = 1; + configured.database.validated_tx.size = 0; + configured.database.validated_tx.rate = 1; // optional // also disabled by filter_tx configured.database.filter_bk.buckets = 0; - configured.database.filter_bk.size = 1; + configured.database.filter_bk.size = 0; + configured.database.filter_bk.rate = 1; // also disabled by filter_bk configured.database.filter_tx.buckets = 0; - configured.database.filter_tx.size = 1; + configured.database.filter_tx.size = 0; + configured.database.filter_tx.rate = 1; } options_metadata parser::load_options() THROWS @@ -1776,7 +1796,7 @@ options_metadata parser::load_settings() THROWS ( "table.ecdsa.size", value(&configured.database.ecdsa.size), - "The minimum allocation of the batch_ecdsa table body, defaults to '1'." + "The minimum allocation of the batch_ecdsa table body, defaults to '0'." ) ( "table.ecdsa.rate", @@ -1788,7 +1808,7 @@ options_metadata parser::load_settings() THROWS ( "table.schnorr.size", value(&configured.database.schnorr.size), - "The minimum allocation of the batch_schnorr table body, defaults to '1'." + "The minimum allocation of the batch_schnorr table body, defaults to '0'." ) ( "table.schnorr.rate", @@ -1800,7 +1820,7 @@ options_metadata parser::load_settings() THROWS ( "table.silent.size", value(&configured.database.silent.size), - "The minimum allocation of the batch_silent table body, defaults to '1'." + "The minimum allocation of the batch_silent table body, defaults to '0'." ) ( "table.silent.rate", @@ -1812,7 +1832,7 @@ options_metadata parser::load_settings() THROWS ( "table.prevalid.size", value(&configured.database.prevalid.size), - "The minimum allocation of the batch_prevalid table body, defaults to '1'." + "The minimum allocation of the batch_prevalid table body, defaults to '0'." ) ( "table.prevalid.rate", @@ -1829,7 +1849,7 @@ options_metadata parser::load_settings() THROWS ( "table.prevout.size", value(&configured.database.prevout.size), - "The minimum allocation of the cache_prevout table body, defaults to '1'." + "The minimum allocation of the cache_prevout table body, defaults to '0'." ) ( "table.prevout.rate", @@ -1846,7 +1866,7 @@ options_metadata parser::load_settings() THROWS ( "table.duplicate.size", value(&configured.database.duplicate.size), - "The minimum allocation of the cache_duplicate table body, defaults to '1'." + "The minimum allocation of the cache_duplicate table body, defaults to '0'." ) ( "table.duplicate.rate", @@ -1863,7 +1883,7 @@ options_metadata parser::load_settings() THROWS ( "table.validated_bk.size", value(&configured.database.validated_bk.size), - "The minimum allocation of the validated_bk table body, defaults to '1'." + "The minimum allocation of the validated_bk table body, defaults to '0'." ) ( "table.validated_bk.rate", @@ -1880,7 +1900,7 @@ options_metadata parser::load_settings() THROWS ( "table.validated_tx.size", value(&configured.database.validated_tx.size), - "The minimum allocation of the validated_tx table body, defaults to '1'." + "The minimum allocation of the validated_tx table body, defaults to '0'." ) ( "table.validated_tx.rate", @@ -1897,7 +1917,7 @@ options_metadata parser::load_settings() THROWS ( "table.filter_bk.size", value(&configured.database.filter_bk.size), - "The minimum allocation of the option_filter_bk table body, defaults to '1'." + "The minimum allocation of the option_filter_bk table body, defaults to '0'." ) ( "table.filter_bk.rate", @@ -1914,7 +1934,7 @@ options_metadata parser::load_settings() THROWS ( "table.filter_tx.size", value(&configured.database.filter_tx.size), - "The minimum allocation of the option_filter_tx table body, defaults to '1'." + "The minimum allocation of the option_filter_tx table body, defaults to '0'." ) ( "table.filter_tx.rate", From c0bf037d1d2b1bbc63a398e2b232044e19fd6877 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Mon, 17 Aug 2026 23:31:56 -0400 Subject: [PATCH 4/6] Integrate database turbo setting into native interface. --- include/bitcoin/server/protocols/protocol_native.hpp | 4 +++- src/parser.cpp | 5 ++++- src/protocols/native/protocol_native_address.cpp | 6 +++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/include/bitcoin/server/protocols/protocol_native.hpp b/include/bitcoin/server/protocols/protocol_native.hpp index 8b45339a..60c0e566 100644 --- a/include/bitcoin/server/protocols/protocol_native.hpp +++ b/include/bitcoin/server/protocols/protocol_native.hpp @@ -43,6 +43,7 @@ class BCS_API protocol_native const network::channel::ptr& channel, const options_t& options) NOEXCEPT : protocol_html(session, channel, options), + turbo_(session->database_settings().turbo), notification_strand_(channel->service().get_executor()), network::tracker(session->log) { @@ -250,8 +251,9 @@ class BCS_API protocol_native database::header_link to_header(const std::optional& height, const std::optional& hash) NOEXCEPT; - // This is thread safe, uses network threadpool. + // These are thread safe, strand uses network threadpool. network::asio::strand notification_strand_; + const bool turbo_; // These are thread safe. std::atomic_bool stopping_{}; diff --git a/src/parser.cpp b/src/parser.cpp index 2af8f62b..d250cd2f 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -89,6 +89,9 @@ parser::parser(system::chain::selection context, ////configured.server.stratum_v2.binds.emplace_back(asio::address{}, 8580_u16); // database + + configured.database.turbo = true; + // load factors are set to 2.5 @ 950K (except duplicate). // sizes are set to 1% of measured pruned body @ 950K (tiny tables 100%). @@ -1627,7 +1630,7 @@ options_metadata parser::load_settings() THROWS ( "database.turbo", value(&configured.database.turbo), - "Allow indiviudal non-validation queries to use all CPUs, defaults to false." + "Allow indiviudal non-validation queries to use all CPUs, defaults to true." ) ( "database.mark_unconfirmable", diff --git a/src/protocols/native/protocol_native_address.cpp b/src/protocols/native/protocol_native_address.cpp index 789f22c5..262ce729 100644 --- a/src/protocols/native/protocol_native_address.cpp +++ b/src/protocols/native/protocol_native_address.cpp @@ -51,7 +51,7 @@ bool protocol_native::handle_get_address(const code& ec, interface::address, // Monitor socket for close. monitor(true); - PARALLEL(do_get_address, media, turbo, hash); + PARALLEL(do_get_address, media, turbo && turbo_, hash); return true; } @@ -129,7 +129,7 @@ bool protocol_native::handle_get_address_confirmed(const code& ec, // Monitor socket for close. monitor(true); - PARALLEL(do_get_address_confirmed, media, turbo, hash); + PARALLEL(do_get_address_confirmed, media, turbo && turbo_, hash); return true; } @@ -185,7 +185,7 @@ bool protocol_native::handle_get_address_balance(const code& ec, // Monitor socket for close. monitor(true); - PARALLEL(do_get_address_balance, media, turbo, hash); + PARALLEL(do_get_address_balance, media, turbo && turbo_, hash); return true; } From 54d1f3af56f71a01a59233f1ac3b10f27a66951f Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Mon, 17 Aug 2026 23:35:10 -0400 Subject: [PATCH 5/6] Text (typo). --- src/parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser.cpp b/src/parser.cpp index d250cd2f..992554ae 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1630,7 +1630,7 @@ options_metadata parser::load_settings() THROWS ( "database.turbo", value(&configured.database.turbo), - "Allow indiviudal non-validation queries to use all CPUs, defaults to true." + "Allow individual non-validation queries to use all CPUs, defaults to true." ) ( "database.mark_unconfirmable", From ff4b7fd048ed451b3e1ecfafdae30e7b0d2180d9 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Tue, 18 Aug 2026 00:03:28 -0400 Subject: [PATCH 6/6] Add conflict logging read_test command. --- console/executor_test_reader.cpp | 39 ++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/console/executor_test_reader.cpp b/console/executor_test_reader.cpp index 58ecd8f9..c062f81e 100644 --- a/console/executor_test_reader.cpp +++ b/console/executor_test_reader.cpp @@ -26,6 +26,43 @@ using namespace network; using namespace system; using format = boost_format; +// address index conflict walk (const). + +void executor::read_test(const hash_digest& key) const +{ + if (!query_.address_enabled()) + { + logger("Address index is disabled."); + return; + } + + logger("Address conflict walk."); + const auto start = fine_clock::now(); + + // Candidates are all rows on the key's chain, matches are verified. + size_t candidates{}; + for (auto it = store_.outs.it({ key }); it; ++it) + ++candidates; + + const auto walk = duration_cast(fine_clock::now() - start); + + database::output_links out{}; + if (const auto ec = query_.to_address_outputs(out, key)) + { + logger(format("Address (%1%) failed with (%2%).") % + encode_hash(key) % ec.message()); + return; + } + + const auto span = duration_cast(fine_clock::now() - start); + logger(format("Address (%1%) candidates (%2%) matches (%3%) conflicts " + "(%4%) walk (%5%) ms total (%6%) ms.") % encode_hash(key) % + candidates % out.size() % (candidates - out.size()) % + walk.count() % span.count()); +} + +#if defined(UNDEFINED) + // arbitrary testing (const). void executor::read_test(const hash_digest&) const @@ -66,8 +103,6 @@ void executor::read_test(const hash_digest&) const size % top % span.count()); } -#if defined(UNDEFINED) - void executor::read_test(const hash_digest&) const { logger(format("Ins table body searches: %1% / (%2% + %1%)") %