From f77b1de16feee097a88e99d2ecdd4d84beb4f915 Mon Sep 17 00:00:00 2001 From: Antoine Riard Date: Mon, 24 Jun 2019 19:07:09 -0400 Subject: [PATCH] Only return early from BlockUntilSyncedToCurrentChain if current tip is exact match In the next commit, we start using BlockConnected/BlockDisconnected callbacks to establish tx depth, rather than querying the chain directly. Currently, BlockUntilSyncedToCurrentChain will return early if the best block processed by the wallet is a descendant of the node'tip. That means that in the case of a re-org, it won't wait for the BlockDisconnected callbacks that have been enqueued during the re-org but have not yet been triggered in the wallet. Change BlockUntilSyncedToCurrentChain to only return early if the wallet's m_last_block_processed matches the tip exactly. This ensures that there are no BlockDisconnected or BlockConnected callbacks in-flight. --- src/interfaces/chain.cpp | 4 +--- src/interfaces/chain.h | 5 ++--- src/wallet/wallet.cpp | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp index c2a8faf8c3f..0635909cae9 100644 --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -353,13 +353,11 @@ public: { return MakeUnique(*this, notifications); } - void waitForNotificationsIfNewBlocksConnected(const uint256& old_tip) override + void waitForNotificationsIfTipChanged(const uint256& old_tip) override { if (!old_tip.IsNull()) { LOCK(::cs_main); if (old_tip == ::ChainActive().Tip()->GetBlockHash()) return; - CBlockIndex* block = LookupBlockIndex(old_tip); - if (block && block->GetAncestor(::ChainActive().Height()) == ::ChainActive().Tip()) return; } SyncWithValidationInterfaceQueue(); } diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h index 4cb2aba2c99..e07ec1b371a 100644 --- a/src/interfaces/chain.h +++ b/src/interfaces/chain.h @@ -236,9 +236,8 @@ public: virtual std::unique_ptr handleNotifications(Notifications& notifications) = 0; //! Wait for pending notifications to be processed unless block hash points to the current - //! chain tip, or to a possible descendant of the current chain tip that isn't currently - //! connected. - virtual void waitForNotificationsIfNewBlocksConnected(const uint256& old_tip) = 0; + //! chain tip. + virtual void waitForNotificationsIfTipChanged(const uint256& old_tip) = 0; //! Register handler for RPC. Command is not copied, so reference //! needs to remain valid until Handler is disconnected. diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 512273aa822..9fdb07ce84c 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -1113,7 +1113,7 @@ void CWallet::BlockUntilSyncedToCurrentChain() { // for the queue to drain enough to execute it (indicating we are caught up // at least with the time we entered this function). uint256 last_block_hash = WITH_LOCK(cs_wallet, return m_last_block_processed); - chain().waitForNotificationsIfNewBlocksConnected(last_block_hash); + chain().waitForNotificationsIfTipChanged(last_block_hash); }