wallet: Move BerkeleyBatch static functions to BerkeleyDatabase #19324

pull achow101 wants to merge 3 commits into bitcoin:master from achow101:bdb-batch-rm-statics changing 7 files +25 −63
  1. achow101 commented at 9:02 pm on June 18, 2020: member

    The BerkeleyBatch class has 4 static functions that operate on BerkeleyDatabase or BerkeleyEnvironment. It doesn’t make sense for these to be standalone nor for them to be static functions. So instead, move them from BerkeleyBatch into BerkeleyDatabase and make them member functions instead of static.

    BerkeleyBatch::VerifyEnvironment and BerkeleyBatch::VerifyDatabaseFile are combined into a single BerkeleyDatabase::Verify function that operates on that BerkeleyDatabase object.

    BerkeleyBatch::Rewrite and BerkeleyBatch::PeriodicFlush both took a BerkeleyDatabase as an argument and did stuff on it. So we just make it a member function so it doesn’t need to take a database as an argument.

    Part of #18971

  2. DrahtBot added the label Wallet on Jun 18, 2020
  3. in src/wallet/bdb.cpp:300 in ae1a9d9ebb outdated
    299-    std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(file_path, walletFile);
    300     fs::path walletDir = env->Directory();
    301 
    302     LogPrintf("Using BerkeleyDB version %s\n", BerkeleyDatabaseVersion());
    303-    LogPrintf("Using wallet %s\n", file_path.string());
    304+    LogPrintf("Using wallet %s\n", walletDir.string());
    


    ryanofsky commented at 9:50 pm on June 18, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (ae1a9d9ebbe1b53fd245fddd1907ca90fe3a7abe)

    Think need to replace file_path with (walletDir / strFile) here not just walletDir


    achow101 commented at 11:54 pm on June 18, 2020:
    Done
  4. in src/wallet/wallettool.cpp:150 in ae1a9d9ebb outdated
    146+        if (!database->Verify(error)) {
    147             tfm::format(std::cerr, "%s\nError loading %s. Is wallet being used by other process?\n", error.original, name);
    148             return false;
    149         }
    150+        database.reset();
    151+        database = nullptr;
    


    ryanofsky commented at 9:52 pm on June 18, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (ae1a9d9ebbe1b53fd245fddd1907ca90fe3a7abe)

    Assigning null should be redundant after calling reset


    achow101 commented at 11:54 pm on June 18, 2020:
    Done
  5. in src/wallet/bdb.cpp:310 in ae1a9d9ebb outdated
    321+    if (fs::exists(walletDir / strFile))
    322     {
    323-        if (!env->Verify(walletFile)) {
    324-            errorStr = strprintf(_("%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup."), walletFile);
    325+        if (!env->Verify(strFile)) {
    326+            errorStr = strprintf(_("%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup."), strFile);
    


    ryanofsky commented at 9:55 pm on June 18, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (ae1a9d9ebbe1b53fd245fddd1907ca90fe3a7abe)

    Would be a change in behavior, but probably more useful to print walletDir / strFile than strFile here


    achow101 commented at 11:54 pm on June 18, 2020:
    Done
  6. in src/wallet/wallettool.cpp:115 in ae1a9d9ebb outdated
    111@@ -112,7 +112,7 @@ static bool SalvageWallet(const fs::path& path)
    112     // Initialize the environment before recovery
    113     bilingual_str error_string;
    114     try {
    115-        WalletBatch::VerifyEnvironment(path, error_string);
    116+        database->Verify(error_string);
    


    ryanofsky commented at 10:04 pm on June 18, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (ae1a9d9ebbe1b53fd245fddd1907ca90fe3a7abe)

    It doesn’t seem like there is a point to calling Verify here in SalvageWallet when ExecuteWalletToolFunc already called it immediately before calling this. It seems like this SalvageWallet function could just be dropped and ExecuteWalletToolFunc just call RecoverDatabaseFile directly.


    achow101 commented at 11:56 pm on June 18, 2020:

    Since the database is closed before we reach this function, we need to reopen it before doing the recovery function. We could remove this and only close the database for info but that seems a bit like a hack.

    Maybe something to think about for a followup.


    ryanofsky commented at 5:39 pm on July 6, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (8f1bcf8b7b6e47c05f2e43dd98ec3505b888d8b3)

    Since the database is closed before we reach this function, we need to reopen it before doing the recovery function. We could remove this and only close the database for info but that seems a bit like a hack.

    Maybe something to think about for a followup.

    It seems like the unintended change in behavior described #19324 (review) is back.

    Instead of salvage command just recovering wallet data, now it tries to verify before recovering. Maybe this change is good because verifying before recovering is good for some reason. Maybe it is bad because it prevents salvage command from working some cases. Or maybe it is ok but slows the salvage operation down unnecessarily. I can’t tell if it’s good or bad but it seems unintended and not mentioned in the PR description or any commit message and ignored in reviews.

    It looks like previous behavior could be restored by deleting the SalvageWallet function and just calling RecoverDatabaseFile function instead (previously suggested #19324 (review))


    achow101 commented at 5:50 pm on July 6, 2020:
    Hmm. Seems like there was a rebase error at some point. I’ll make a followup that handles this and a few other related suggestions.
  7. in src/wallet/wallettool.cpp:145 in ae1a9d9ebb outdated
    140@@ -141,10 +141,13 @@ bool ExecuteWalletToolFunc(const std::string& command, const std::string& name)
    141             return false;
    142         }
    143         bilingual_str error;
    144-        if (!WalletBatch::VerifyEnvironment(path, error)) {
    145+        std::unique_ptr<WalletDatabase> database = CreateWalletDatabase(path);
    146+        if (!database->Verify(error)) {
    


    ryanofsky commented at 10:17 pm on June 18, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (ae1a9d9ebbe1b53fd245fddd1907ca90fe3a7abe)

    There is a change in behavior here for the wallettool “info” and “salvage” commands. Previously these commands were just seeing if the environment could be opened here and not actually verifying anything (VerifyEnvironment method name was kind of a misnomer). Now “info” and “salvage” will be actually verifying the database before working, so they will be little slower, and maybe more useful or maybe less useful than before depending on if your database is corrupt and what you are trying to do.

    Could preserve previous behavior by adding a Database::VerifyWalletNotInUse() method that would just call env::Open and do what the previous code used to do here. Another option for preserving previous behavior would be to call the Database::ReloadDbEnv method here, which should be effectively be equivalent to the previous VerifyEnvironment.


    achow101 commented at 11:57 pm on June 18, 2020:
    I’ve added VerifyNotInUse. This function is still called by Verify so that the behavior of other Verify calls here won’t change.
  8. ryanofsky commented at 10:23 pm on June 18, 2020: member
    Code review almost-ACK 893ec59bc28cd09cfbbb2dce9e92b6b87dd81a14. Suggested some tweaks
  9. achow101 force-pushed on Jun 18, 2020
  10. DrahtBot commented at 2:31 am on June 19, 2020: member

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #19335 (wallet: Cleanup and separate BerkeleyDatabase and BerkeleyBatch by achow101)
    • #19334 (wallet: Introduce WalletDatabase abstract class by achow101)
    • #19325 (wallet: Refactor BerkeleyDatabase to introduce DatabaseBatch abstract class by achow101)
    • #19137 (wallettool: Add dump and createfromdump commands by achow101)
    • #19102 (wallet: Introduce and use DummyDatabase instead of dummy BerkeleyDatabase by achow101)
    • #19085 (Refactor: clean up PeriodicFlush() by jnewbery)
    • #19077 (wallet: Add sqlite as an alternative wallet database and use it for new descriptor wallets by achow101)
    • #18608 (refactor: Remove CAddressBookData::destdata by ryanofsky)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  11. meshcollider added this to the "PRs" column in a project

  12. promag commented at 10:33 am on June 20, 2020: member

    Code review ACK 4693b11a896cd6b18e61bb3cdbfec72f7e0a2d93.

    No strong opinion whether wallet tool info and salvage should verify.

  13. in src/wallet/wallet.cpp:3717 in 4693b11a89 outdated
    3716         error_string = Untranslated(strprintf("Error loading wallet %s. %s", location.GetName(), fsbridge::get_filesystem_error_message(e)));
    3717         return false;
    3718     }
    3719 
    3720-    return WalletBatch::VerifyDatabaseFile(wallet_path, error_string);
    3721+    assert(false);
    


    MarcoFalke commented at 11:23 am on June 20, 2020:
    I don’t think we use assert(false) anywhere, unless it is to specifically silence -Wreturn-type. Though, that doesn’t seem to be the case here.

    achow101 commented at 3:34 pm on June 24, 2020:
    This was a suggestion from a review: #18971 (review)

    MarcoFalke commented at 5:16 pm on June 24, 2020:
    If a function has a return type, but doesn’t return anything, then compilation will fail due to -Wreturn-type (assuming warnings are errors). In fact the assert(false) will turn off -Wreturn-type for this function, so this runtime assert is making the code more fragile, harder to analyse and thus review.

    achow101 commented at 5:48 pm on June 24, 2020:
    I’ve dropped this assert.
  14. in src/wallet/bdb.cpp:295 in cba81c3272 outdated
    291@@ -292,11 +292,10 @@ BerkeleyBatch::SafeDbt::operator Dbt*()
    292     return &m_dbt;
    293 }
    294 
    295-bool BerkeleyBatch::VerifyEnvironment(const fs::path& file_path, bilingual_str& errorStr)
    296+bool BerkeleyDatabase::VerifyNotInUse(bilingual_str& errorStr)
    


    ryanofsky commented at 2:29 pm on June 23, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (cba81c3272405332cbb2f3b9c6b2c828c1869d16)

    Would call this OpenEnvironment and make it private. Earlier suggestion to add a VerifyNotInUse method #19324 (review) was to add a new method wallettool could call, not rename this method in a way which I think is misleading about what it does and how it’s used outside of wallettool.


    achow101 commented at 4:05 pm on June 23, 2020:
    I’ve reverted this back to the single Verify and dropped this method entirely as its only usage has also been removed.
  15. in src/wallet/wallettool.cpp:145 in cba81c3272 outdated
    140@@ -141,10 +141,12 @@ bool ExecuteWalletToolFunc(const std::string& command, const std::string& name)
    141             return false;
    142         }
    143         bilingual_str error;
    144-        if (!WalletBatch::VerifyEnvironment(path, error)) {
    145+        std::unique_ptr<WalletDatabase> database = CreateWalletDatabase(path);
    146+        if (!database->VerifyNotInUse(error)) {
    


    ryanofsky commented at 2:40 pm on June 23, 2020:

    In commit “walletdb: Combine VerifyDatabaseFile and VerifyEnvironment” (cba81c3272405332cbb2f3b9c6b2c828c1869d16)

    I’ve added VerifyNotInUse. This function is still called by Verify so that the behavior of other Verify calls here won’t change.

    I think this open before open code in wallet tool can be dropped entirely. It seems like the only purpose of this is to show an “Error loading %s. Is wallet being used by other process?” string instead of an “Error loading wallet. %s” string


    achow101 commented at 4:04 pm on June 23, 2020:
    I’ve dropped this check and added the env->Open that SalvageWallet needs to SalvageWallet.
  16. ryanofsky approved
  17. ryanofsky commented at 2:48 pm on June 23, 2020: member
    Code review ACK 4693b11a896cd6b18e61bb3cdbfec72f7e0a2d93. VerifyNotInUse rename is wonky but other than that this is an improvement. Main difference since last review is reverting wallet tool behavior change
  18. achow101 force-pushed on Jun 23, 2020
  19. MarcoFalke commented at 2:05 pm on June 24, 2020: member
    Concept ACK
  20. achow101 force-pushed on Jun 24, 2020
  21. in src/wallet/wallettool.cpp:147 in 514ed7641f outdated
    139@@ -140,11 +140,6 @@ bool ExecuteWalletToolFunc(const std::string& command, const std::string& name)
    140             tfm::format(std::cerr, "Error: no wallet file at %s\n", name);
    141             return false;
    142         }
    143-        bilingual_str error;
    144-        if (!WalletBatch::VerifyEnvironment(path, error)) {
    145-            tfm::format(std::cerr, "%s\nError loading %s. Is wallet being used by other process?\n", error.original, name);
    146-            return false;
    147-        }
    


    MarcoFalke commented at 10:58 pm on June 30, 2020:

    in commit 17924a533346618531ed2c888c6e8fe67bc3851c

    This change seems unrelated. Maybe put it into a preceding commit and explain what it does? I presume it removes a redundant check that is done as part of LoadWallet?


    achow101 commented at 4:32 pm on July 1, 2020:
    How is it unrelated? This function is being removed from WalletBatch.

    MarcoFalke commented at 0:32 am on July 2, 2020:

    I was wrong. VerifyEnvironment is called via LoadWallet -> LoadWalletInternal -> CWallet::Verify, which is different from (edit: this was wrong) the LoadWallet call below.

    So why is it ok to remove this call to VerifyEnvironment?


    achow101 commented at 0:43 am on July 2, 2020:

    VerifyEnvironment would just call BerkeleyEnvironment::Open. A couple of other things also call that in their normal operation. In particular, CWallet::LoadWallet creates a WalletBatch which creates a BerkeleyBatch which calls BerkeleyEnvironment::Open in its constructor.

    In the cases where we need to open the environment and aren’t using the higher level stuff, a direct call to BerkeleyEnvironment::Open is needed which is why it is added to SalvageWallet.


    MarcoFalke commented at 12:02 pm on July 2, 2020:

    With “unrelated” I meant “can be split up into its own atomic and logical commit without depending on other changes in this pull request”.

    See the following commit on current master, which compiles fine and runs all tests fine as well:

     0$ git show 
     1commit 43d120ec8a7a999a48ba31e2621efec06ca668f6 (HEAD)
     2Author: MarcoFalke <falke.marco@gmail.com>
     3Date:   Thu Jul 2 07:53:05 2020 -0400
     4
     5    wallet: Remove redundant WalletBatch::VerifyEnvironment
     6    
     7    It is redundant because LoadWallet will call CWallet::LoadWallet ->
     8    LoadWalletInternal -> CWallet::Verify, which calls VerifyEnvironment
     9    
    10    For SalvageWallet it is redundant with the newly added call to Open
    11
    12diff --git a/src/wallet/salvage.cpp b/src/wallet/salvage.cpp
    13index d42950ee42..e6e62332c0 100644
    14--- a/src/wallet/salvage.cpp
    15+++ b/src/wallet/salvage.cpp
    16@@ -20,6 +20,11 @@ bool RecoverDatabaseFile(const fs::path& file_path)
    17     std::string filename;
    18     std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(file_path, filename);
    19 
    20+    if (!env->Open(true /* retry */)) {
    21+        tfm::format(std::cerr, "Error initializing wallet database environment %s!", env->Directory());
    22+        return false;
    23+    }
    24+
    25     // Recovery procedure:
    26     // move wallet file to walletfilename.timestamp.bak
    27     // Call Salvage with fAggressive=true to
    28diff --git a/src/wallet/wallettool.cpp b/src/wallet/wallettool.cpp
    29index 77ed6beb5d..430a866a7c 100644
    30--- a/src/wallet/wallettool.cpp
    31+++ b/src/wallet/wallettool.cpp
    32@@ -140,11 +140,6 @@ bool ExecuteWalletToolFunc(const std::string& command, const std::string& name)
    33             tfm::format(std::cerr, "Error: no wallet file at %s\n", name);
    34             return false;
    35         }
    36-        bilingual_str error;
    37-        if (!WalletBatch::VerifyEnvironment(path, error)) {
    38-            tfm::format(std::cerr, "%s\nError loading %s. Is wallet being used by other process?\n", error.original, name);
    39-            return false;
    40-        }
    41 
    42         if (command == "info") {
    43             std::shared_ptr<CWallet> wallet_instance = LoadWallet(name, path);
    44diff --git a/test/functional/tool_wallet.py b/test/functional/tool_wallet.py
    45index 524e1593ba..18f0beb598 100755
    46--- a/test/functional/tool_wallet.py
    47+++ b/test/functional/tool_wallet.py
    48@@ -71,8 +71,7 @@ class ToolWalletTest(BitcoinTestFramework):
    49         self.assert_raises_tool_error('Error: two methods provided (info and create). Only one method should be provided.', 'info', 'create')
    50         self.assert_raises_tool_error('Error parsing command line arguments: Invalid parameter -foo', '-foo')
    51         self.assert_raises_tool_error(
    52-            'Error initializing wallet database environment "{}"!\nError loading wallet.dat. Is wallet being used by other process?'
    53-            .format(os.path.join(self.nodes[0].datadir, self.chain, 'wallets')),
    54+            'Error loading wallet.dat. Is wallet being used by another process?',
    55             '-wallet=wallet.dat',
    56             'info',
    57         )
    

    achow101 commented at 2:52 pm on July 2, 2020:
    Maybe if I need to push again.
  22. in src/wallet/salvage.cpp:26 in 514ed7641f outdated
    19@@ -20,6 +20,11 @@ bool RecoverDatabaseFile(const fs::path& file_path)
    20     std::string filename;
    21     std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(file_path, filename);
    22 
    23+    if (!env->Open(true /* retry */)) {
    24+        tfm::format(std::cerr, "Error initializing wallet database environment %s!", env->Directory());
    25+        return false;
    26+    }
    


    MarcoFalke commented at 10:59 pm on June 30, 2020:

    Same commit

    This also seems unrelated. Is it related to the change in ExecuteWalletToolFunc?


    achow101 commented at 4:31 pm on July 1, 2020:
    Yes.

  23. MarcoFalke commented at 11:04 pm on June 30, 2020: member

    ACK 514ed7641f1df5cad04feba61a5fa12b1c5e9056 📁

    Signature:

     0-----BEGIN PGP SIGNED MESSAGE-----
     1Hash: SHA512
     2
     3ACK 514ed7641f1df5cad04feba61a5fa12b1c5e9056 📁
     4-----BEGIN PGP SIGNATURE-----
     5
     6iQGzBAEBCgAdFiEE+rVPoUahrI9sLGYTzit1aX5ppUgFAlwqrYAACgkQzit1aX5p
     7pUi4Mgv9HZbkdS5ffjQogWmlFeLv7NxfV0pmKHDWps9i1P/5QpyHNfHbSZR3Roi7
     8kEFZMRMftn0L6flvX4zxOoq1ZbVuE/2JeEwIUKs8Zq3vYM/4egmbuSyaVKruXkRT
     9lMKJk1FVYVLWAM7cx2rETlWpQRc9zahCcwI/AnXvbnux3+iQBt5ij9BEIR+42KRF
    10UB7Ty7sW45l809Or9p6lCW8MoxNzNX4VUHBZMd+b3lIbYwRwGIS5JqULTmKkymz+
    11gUBdA0Wx98EBHuG46MZukGsrmAF+aR5AuuBDsny9Oi+cUaA8YAGL8VxpeFzNTJfr
    12PITxStmdAIpqlTHt3tNz6BBqjIlnNy7GbndYQiBhsOOmrrSMB+fCgyu2TRpn28+y
    13ztA1uqQBqI8s/iDklLYbxhYieGJuiGCfUajpLdLsxl55/C3cw9PkuaBrbKSSeBzF
    14t6ezgu+OZT22iprRiutkcrlkWqUhScv4sMcu4K7zeOE1eP/LBu2CCGBrnav7RF1R
    15DVJhXzNB
    16=uigF
    17-----END PGP SIGNATURE-----
    

    Timestamp of file with hash 1639c2f3437a4a8f4fe84a0eaa5966db2964f9df9c75f3885e2308bb1c24d313 -

  24. in src/wallet/salvage.cpp:24 in 514ed7641f outdated
    19@@ -20,6 +20,11 @@ bool RecoverDatabaseFile(const fs::path& file_path)
    20     std::string filename;
    21     std::shared_ptr<BerkeleyEnvironment> env = GetWalletEnv(file_path, filename);
    22 
    23+    if (!env->Open(true /* retry */)) {
    24+        tfm::format(std::cerr, "Error initializing wallet database environment %s!", env->Directory());
    


    MarcoFalke commented at 11:06 pm on June 30, 2020:

    in commit 17924a533346618531ed2c888c6e8fe67bc3851c:

    Any reason to write to stderr when all other failures are written to the debug log? Since this is a pure utility function, I’d prefer if this returned the error string to the caller in the future, so that the caller can decide how to display the error


    achow101 commented at 4:34 pm on July 1, 2020:
    It was to largely retain the previous behavior of this error going to stderr. I think that cleaning up this function to return error strings and remove the LogPrintfs in a followup.
  25. walletdb: Combine VerifyDatabaseFile and VerifyEnvironment
    Combine these two functions into a single Verify function that is a
    member of WalletDatabase. Additionally, these are no longer static.
    8f1bcf8b7b
  26. walletdb: Move PeriodicFlush into WalletDatabase
    Make PeriodicFlush a non-static member of WalletDatabase instead of
    WalletBatch.
    91d109156d
  27. walletdb: Move Rewrite into BerkeleyDatabase
    Make Rewrite actually a member of BerkeleyDatabase instead of a static
    function in BerkeleyBatch
    d8e9ca66d1
  28. achow101 force-pushed on Jul 1, 2020
  29. achow101 commented at 4:37 pm on July 1, 2020: member
    Apparently the python linter on master fails here, so I’ve pushed a change to fix that.
  30. MarcoFalke commented at 0:15 am on July 2, 2020: member

    re-ACK d8e9ca66d1 only change is test fixup 🤞

    Signature:

     0-----BEGIN PGP SIGNED MESSAGE-----
     1Hash: SHA512
     2
     3re-ACK d8e9ca66d1 only change is test fixup 🤞
     4-----BEGIN PGP SIGNATURE-----
     5
     6iQGzBAEBCgAdFiEE+rVPoUahrI9sLGYTzit1aX5ppUgFAlwqrYAACgkQzit1aX5p
     7pUjlKwwAwqUvc8WhUv1aYY1m9LSQcs/3dHt5UFdx7DRoPH2NBB4t2uZfxn/P8rcx
     8xqfjWlLj4i6Ia5g0HhAunAo6aU7yooL2t+ZGCtPVprwNzzcYQyZkDiRe+lRNBIzG
     940lMOWuVpfVcIeYiDQcWtLf2uDyVkhWoSYmQBXsd6xn3tik5sLQMEVXOm12WfVDI
    10wxpEyH/d6FkWOJPpZjWA5Hqce7BH7IbZkDb9dbJR3qEor+++NgjBUDjr1OtHqdcQ
    11UjUOJw3LC93EjzMd2uLnjJaJMTxEEfTBRYXAM/vQrusAJo8PR76NXz1rUa2WDnLJ
    12484QwqBxAPUYRmszSG7UoD2lM2GpxdWoZLdjscKe8SuwWjqe1yn2CRn3rUAEiZpR
    13m7A4rlD54pwODWKD9HRyoZ4CJ22ljG9KjIhQaDpRxIuHbpV4xBOlRQGzpThmuk57
    14Z2jeHaILIa0ypYA0oW5ZgLtg77vOO0Qfeu9B53HuITGH6W133nGTnVkbQvGmZv2+
    156SU9QC9G
    16=sVVQ
    17-----END PGP SIGNATURE-----
    

    Timestamp of file with hash 7e2f395c7afce74dc863a67c21bbf3c3b75edbd4fb9a35f91c5cc23e1674a2a6 -

  31. MarcoFalke commented at 4:36 pm on July 2, 2020: member
    @promag or @ryanofsky Mind to re-ACK?
  32. laanwj added this to the "Blockers" column in a project

  33. promag commented at 9:47 pm on July 5, 2020: member
    Code review ACK d8e9ca66d119d80acfb2bb3c8940c386ce0fc226, good stuff.
  34. MarcoFalke merged this on Jul 5, 2020
  35. MarcoFalke closed this on Jul 5, 2020

  36. MarcoFalke removed this from the "Blockers" column in a project

  37. Sjors commented at 6:12 pm on July 6, 2020: member
    There’s a stray VerifyEnvironment and VerifyDatabaseFile in walletdb.h. Maybe fix those in #19325?
  38. MarcoFalke referenced this in commit a924f61cae on Jul 14, 2020
  39. sidhujag referenced this in commit fa48d2e308 on Jul 14, 2020
  40. meshcollider moved this from the "PRs" to the "Done" column in a project

  41. MarcoFalke referenced this in commit 30dd562fd2 on Aug 14, 2020
  42. sidhujag referenced this in commit 7ca36ff047 on Aug 16, 2020
  43. deadalnix referenced this in commit 8a99cdae3f on Dec 7, 2020
  44. deadalnix referenced this in commit 1d26b7dbb6 on Jun 8, 2021
  45. DrahtBot locked this on Feb 15, 2022

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-18 15:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me