mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
merge bitcoin#16033: Hold cs_main when reading chainActive via getTipLocator(). Remove assumeLocked().
This commit is contained in:
parent
0187d2e597
commit
4bc0ae1ee2
@ -38,7 +38,7 @@
|
|||||||
namespace interfaces {
|
namespace interfaces {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
class LockImpl : public Chain::Lock
|
class LockImpl : public Chain::Lock, public UniqueLock<CCriticalSection>
|
||||||
{
|
{
|
||||||
Optional<int> getHeight() override
|
Optional<int> getHeight() override
|
||||||
{
|
{
|
||||||
@ -171,10 +171,7 @@ class LockImpl : public Chain::Lock
|
|||||||
LockAnnotation lock(::cs_main);
|
LockAnnotation lock(::cs_main);
|
||||||
return CheckFinalTx(tx);
|
return CheckFinalTx(tx);
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
class LockingStateImpl : public LockImpl, public UniqueLock<CCriticalSection>
|
|
||||||
{
|
|
||||||
using UniqueLock::UniqueLock;
|
using UniqueLock::UniqueLock;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -273,13 +270,12 @@ class ChainImpl : public Chain
|
|||||||
public:
|
public:
|
||||||
std::unique_ptr<Chain::Lock> lock(bool try_lock) override
|
std::unique_ptr<Chain::Lock> lock(bool try_lock) override
|
||||||
{
|
{
|
||||||
auto result = MakeUnique<LockingStateImpl>(::cs_main, "cs_main", __FILE__, __LINE__, try_lock);
|
auto result = MakeUnique<LockImpl>(::cs_main, "cs_main", __FILE__, __LINE__, try_lock);
|
||||||
if (try_lock && result && !*result) return {};
|
if (try_lock && result && !*result) return {};
|
||||||
// std::move necessary on some compilers due to conversion from
|
// std::move necessary on some compilers due to conversion from
|
||||||
// LockingStateImpl to Lock pointer
|
// LockImpl to Lock pointer
|
||||||
return std::move(result);
|
return std::move(result);
|
||||||
}
|
}
|
||||||
std::unique_ptr<Chain::Lock> assumeLocked() override { return MakeUnique<LockImpl>(); }
|
|
||||||
bool findBlock(const uint256& hash, CBlock* block, int64_t* time, int64_t* time_max) override
|
bool findBlock(const uint256& hash, CBlock* block, int64_t* time, int64_t* time_max) override
|
||||||
{
|
{
|
||||||
CBlockIndex* index;
|
CBlockIndex* index;
|
||||||
|
@ -147,11 +147,6 @@ public:
|
|||||||
//! unlocked when the returned interface is freed.
|
//! unlocked when the returned interface is freed.
|
||||||
virtual std::unique_ptr<Lock> lock(bool try_lock = false) = 0;
|
virtual std::unique_ptr<Lock> lock(bool try_lock = false) = 0;
|
||||||
|
|
||||||
//! Return Lock interface assuming chain is already locked. This
|
|
||||||
//! method is temporary and is only used in a few places to avoid changing
|
|
||||||
//! behavior while code is transitioned to use the Chain::Lock interface.
|
|
||||||
virtual std::unique_ptr<Lock> assumeLocked() = 0;
|
|
||||||
|
|
||||||
//! Return whether node has the block and optionally return block metadata
|
//! Return whether node has the block and optionally return block metadata
|
||||||
//! or contents.
|
//! or contents.
|
||||||
//!
|
//!
|
||||||
|
@ -369,7 +369,10 @@ public:
|
|||||||
int changePos = -1;
|
int changePos = -1;
|
||||||
std::string error;
|
std::string error;
|
||||||
CCoinControl dummy;
|
CCoinControl dummy;
|
||||||
BOOST_CHECK(wallet->CreateTransaction(*m_locked_chain, {recipient}, tx, reservekey, fee, changePos, error, dummy));
|
{
|
||||||
|
auto locked_chain = m_chain->lock();
|
||||||
|
BOOST_CHECK(wallet->CreateTransaction(*locked_chain, {recipient}, tx, reservekey, fee, changePos, error, dummy));
|
||||||
|
}
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
BOOST_CHECK(wallet->CommitTransaction(tx, {}, {}, reservekey, state));
|
BOOST_CHECK(wallet->CommitTransaction(tx, {}, {}, reservekey, state));
|
||||||
CMutableTransaction blocktx;
|
CMutableTransaction blocktx;
|
||||||
@ -388,7 +391,6 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<interfaces::Chain> m_chain = interfaces::MakeChain();
|
std::unique_ptr<interfaces::Chain> m_chain = interfaces::MakeChain();
|
||||||
std::unique_ptr<interfaces::Chain::Lock> m_locked_chain = m_chain->assumeLocked(); // Temporary. Removed in upcoming lock cleanup
|
|
||||||
std::unique_ptr<CWallet> wallet;
|
std::unique_ptr<CWallet> wallet;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -400,8 +402,9 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
|||||||
// address.
|
// address.
|
||||||
std::map<CTxDestination, std::vector<COutput>> list;
|
std::map<CTxDestination, std::vector<COutput>> list;
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, wallet->cs_wallet);
|
auto locked_chain = m_chain->lock();
|
||||||
list = wallet->ListCoins(*m_locked_chain);
|
LOCK(wallet->cs_wallet);
|
||||||
|
list = wallet->ListCoins(*locked_chain);
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
@ -416,8 +419,9 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
|||||||
// pubkey.
|
// pubkey.
|
||||||
AddTx(CRecipient{GetScriptForRawPubKey({}), 1 * COIN, false /* subtract fee */});
|
AddTx(CRecipient{GetScriptForRawPubKey({}), 1 * COIN, false /* subtract fee */});
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, wallet->cs_wallet);
|
auto locked_chain = m_chain->lock();
|
||||||
list = wallet->ListCoins(*m_locked_chain);
|
LOCK(wallet->cs_wallet);
|
||||||
|
list = wallet->ListCoins(*locked_chain);
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
@ -425,9 +429,10 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
|||||||
|
|
||||||
// Lock both coins. Confirm number of available coins drops to 0.
|
// Lock both coins. Confirm number of available coins drops to 0.
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, wallet->cs_wallet);
|
auto locked_chain = m_chain->lock();
|
||||||
|
LOCK(wallet->cs_wallet);
|
||||||
std::vector<COutput> available;
|
std::vector<COutput> available;
|
||||||
wallet->AvailableCoins(*m_locked_chain, available);
|
wallet->AvailableCoins(*locked_chain, available);
|
||||||
BOOST_CHECK_EQUAL(available.size(), 2U);
|
BOOST_CHECK_EQUAL(available.size(), 2U);
|
||||||
}
|
}
|
||||||
for (const auto& group : list) {
|
for (const auto& group : list) {
|
||||||
@ -437,16 +442,18 @@ BOOST_FIXTURE_TEST_CASE(ListCoins, ListCoinsTestingSetup)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, wallet->cs_wallet);
|
auto locked_chain = m_chain->lock();
|
||||||
|
LOCK(wallet->cs_wallet);
|
||||||
std::vector<COutput> available;
|
std::vector<COutput> available;
|
||||||
wallet->AvailableCoins(*m_locked_chain, available);
|
wallet->AvailableCoins(*locked_chain, available);
|
||||||
BOOST_CHECK_EQUAL(available.size(), 0U);
|
BOOST_CHECK_EQUAL(available.size(), 0U);
|
||||||
}
|
}
|
||||||
// Confirm ListCoins still returns same result as before, despite coins
|
// Confirm ListCoins still returns same result as before, despite coins
|
||||||
// being locked.
|
// being locked.
|
||||||
{
|
{
|
||||||
LOCK2(cs_main, wallet->cs_wallet);
|
auto locked_chain = m_chain->lock();
|
||||||
list = wallet->ListCoins(*m_locked_chain);
|
LOCK(wallet->cs_wallet);
|
||||||
|
list = wallet->ListCoins(*locked_chain);
|
||||||
}
|
}
|
||||||
BOOST_CHECK_EQUAL(list.size(), 1U);
|
BOOST_CHECK_EQUAL(list.size(), 1U);
|
||||||
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
BOOST_CHECK_EQUAL(boost::get<CKeyID>(list.begin()->first).ToString(), coinbaseAddress);
|
||||||
|
@ -5019,7 +5019,7 @@ std::shared_ptr<CWallet> CWallet::CreateWalletFromFile(interfaces::Chain& chain,
|
|||||||
return error(_("Unable to generate initial keys"));
|
return error(_("Unable to generate initial keys"));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto locked_chain = chain.assumeLocked(); // Temporary. Removed in upcoming lock cleanup
|
auto locked_chain = chain.lock();
|
||||||
walletInstance->ChainStateFlushed(locked_chain->getTipLocator());
|
walletInstance->ChainStateFlushed(locked_chain->getTipLocator());
|
||||||
|
|
||||||
// Try to create wallet backup right after new wallet was created
|
// Try to create wallet backup right after new wallet was created
|
||||||
|
Loading…
Reference in New Issue
Block a user