1717#include < optional>
1818
1919using wallet::CWallet;
20+ using wallet::DatabaseFormat;
2021using wallet::DatabaseOptions;
21- using wallet::DatabaseStatus;
2222using wallet::ISMINE_SPENDABLE;
2323using wallet::MakeWalletDatabase;
24+ using wallet::TxStateInactive;
2425using wallet::WALLET_FLAG_DESCRIPTORS;
2526using wallet::WalletContext;
27+ using wallet::WalletDatabase;
2628
27- static const std::shared_ptr<CWallet> BenchLoadWallet (WalletContext& context, DatabaseOptions& options)
29+ static const std::shared_ptr<CWallet> BenchLoadWallet (std::unique_ptr<WalletDatabase> database, WalletContext& context, DatabaseOptions& options)
2830{
29- DatabaseStatus status;
3031 bilingual_str error;
3132 std::vector<bilingual_str> warnings;
32- auto database = MakeWalletDatabase (" " , options, status, error);
33- assert (database);
3433 auto wallet = CWallet::Create (context, " " , std::move (database), options.create_flags , error, warnings);
3534 NotifyWalletLoaded (context, wallet);
3635 if (context.chain ) {
@@ -46,9 +45,47 @@ static void BenchUnloadWallet(std::shared_ptr<CWallet>&& wallet)
4645 UnloadWallet (std::move (wallet));
4746}
4847
48+ static void AddTx (CWallet& wallet)
49+ {
50+ bilingual_str error;
51+ CTxDestination dest;
52+ wallet.GetNewDestination (" " , dest, error);
53+
54+ CMutableTransaction mtx;
55+ mtx.vout .push_back ({COIN, GetScriptForDestination (dest)});
56+ mtx.vin .push_back (CTxIn ());
57+
58+ wallet.AddToWallet (MakeTransactionRef (mtx), TxStateInactive{});
59+ }
60+
61+ static std::unique_ptr<WalletDatabase> DuplicateMockDatabase (WalletDatabase& database, DatabaseOptions& options)
62+ {
63+ auto new_database = CreateMockWalletDatabase (options);
64+
65+ // Get a cursor to the original database
66+ auto batch = database.MakeBatch ();
67+ batch->StartCursor ();
68+
69+ // Get a batch for the new database
70+ auto new_batch = new_database->MakeBatch ();
71+
72+ // Read all records from the original database and write them to the new one
73+ while (true ) {
74+ CDataStream key (SER_DISK, CLIENT_VERSION);
75+ CDataStream value (SER_DISK, CLIENT_VERSION);
76+ bool complete;
77+ batch->ReadAtCursor (key, value, complete);
78+ if (complete) break ;
79+ new_batch->Write (key, value);
80+ }
81+
82+ return new_database;
83+ }
84+
4985static void WalletLoading (benchmark::Bench& bench, bool legacy_wallet)
5086{
5187 const auto test_setup = MakeNoLogFileContext<TestingSetup>();
88+ test_setup->m_args .ForceSetArg (" -unsafesqlitesync" , " 1" );
5289
5390 WalletContext context;
5491 context.args = &test_setup->m_args ;
@@ -57,27 +94,40 @@ static void WalletLoading(benchmark::Bench& bench, bool legacy_wallet)
5794 // Setup the wallet
5895 // Loading the wallet will also create it
5996 DatabaseOptions options;
60- if (!legacy_wallet) options.create_flags = WALLET_FLAG_DESCRIPTORS;
61- auto wallet = BenchLoadWallet (context, options);
97+ if (legacy_wallet) {
98+ options.require_format = DatabaseFormat::BERKELEY;
99+ } else {
100+ options.create_flags = WALLET_FLAG_DESCRIPTORS;
101+ options.require_format = DatabaseFormat::SQLITE;
102+ }
103+ auto database = CreateMockWalletDatabase (options);
104+ auto wallet = BenchLoadWallet (std::move (database), context, options);
62105
63106 // Generate a bunch of transactions and addresses to put into the wallet
64- for (int i = 0 ; i < 5000 ; ++i) {
65- generatetoaddress (test_setup-> m_node , getnewaddress ( *wallet) );
107+ for (int i = 0 ; i < 1000 ; ++i) {
108+ AddTx ( *wallet);
66109 }
67110
111+ database = DuplicateMockDatabase (wallet->GetDatabase (), options);
112+
68113 // reload the wallet for the actual benchmark
69114 BenchUnloadWallet (std::move (wallet));
70115
71- bench.minEpochIterations ( 10 ).run ([&] {
72- wallet = BenchLoadWallet (context, options);
116+ bench.epochs ( 5 ).run ([&] {
117+ wallet = BenchLoadWallet (std::move (database), context, options);
73118
74119 // Cleanup
120+ database = DuplicateMockDatabase (wallet->GetDatabase (), options);
75121 BenchUnloadWallet (std::move (wallet));
76122 });
77123}
78124
125+ #ifdef USE_BDB
79126static void WalletLoadingLegacy (benchmark::Bench& bench) { WalletLoading (bench, /* legacy_wallet=*/ true ); }
80- static void WalletLoadingDescriptors (benchmark::Bench& bench) { WalletLoading (bench, /* legacy_wallet=*/ false ); }
81-
82127BENCHMARK (WalletLoadingLegacy);
128+ #endif
129+
130+ #ifdef USE_SQLITE
131+ static void WalletLoadingDescriptors (benchmark::Bench& bench) { WalletLoading (bench, /* legacy_wallet=*/ false ); }
83132BENCHMARK (WalletLoadingDescriptors);
133+ #endif
0 commit comments