Merge pull request #5597
e413457
Catch LevelDB errors during flush (Pieter Wuille)02bced1
Bugfix: only track UTXO modification after lookup (Pieter Wuille)
This commit is contained in:
commit
7625f7ff94
2 changed files with 8 additions and 2 deletions
|
@ -92,7 +92,6 @@ bool CCoinsViewCache::GetCoins(const uint256 &txid, CCoins &coins) const {
|
||||||
|
|
||||||
CCoinsModifier CCoinsViewCache::ModifyCoins(const uint256 &txid) {
|
CCoinsModifier CCoinsViewCache::ModifyCoins(const uint256 &txid) {
|
||||||
assert(!hasModifier);
|
assert(!hasModifier);
|
||||||
hasModifier = true;
|
|
||||||
std::pair<CCoinsMap::iterator, bool> ret = cacheCoins.insert(std::make_pair(txid, CCoinsCacheEntry()));
|
std::pair<CCoinsMap::iterator, bool> ret = cacheCoins.insert(std::make_pair(txid, CCoinsCacheEntry()));
|
||||||
if (ret.second) {
|
if (ret.second) {
|
||||||
if (!base->GetCoins(txid, ret.first->second.coins)) {
|
if (!base->GetCoins(txid, ret.first->second.coins)) {
|
||||||
|
@ -233,7 +232,10 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const
|
||||||
return tx.ComputePriority(dResult);
|
return tx.ComputePriority(dResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_) : cache(cache_), it(it_) {}
|
CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_) : cache(cache_), it(it_) {
|
||||||
|
assert(!cache.hasModifier);
|
||||||
|
cache.hasModifier = true;
|
||||||
|
}
|
||||||
|
|
||||||
CCoinsModifier::~CCoinsModifier()
|
CCoinsModifier::~CCoinsModifier()
|
||||||
{
|
{
|
||||||
|
|
|
@ -1887,6 +1887,7 @@ enum FlushStateMode {
|
||||||
bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
|
bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
static int64_t nLastWrite = 0;
|
static int64_t nLastWrite = 0;
|
||||||
|
try {
|
||||||
if ((mode == FLUSH_STATE_ALWAYS) ||
|
if ((mode == FLUSH_STATE_ALWAYS) ||
|
||||||
((mode == FLUSH_STATE_PERIODIC || mode == FLUSH_STATE_IF_NEEDED) && pcoinsTip->GetCacheSize() > nCoinCacheSize) ||
|
((mode == FLUSH_STATE_PERIODIC || mode == FLUSH_STATE_IF_NEEDED) && pcoinsTip->GetCacheSize() > nCoinCacheSize) ||
|
||||||
(mode == FLUSH_STATE_PERIODIC && GetTimeMicros() > nLastWrite + DATABASE_WRITE_INTERVAL * 1000000)) {
|
(mode == FLUSH_STATE_PERIODIC && GetTimeMicros() > nLastWrite + DATABASE_WRITE_INTERVAL * 1000000)) {
|
||||||
|
@ -1926,6 +1927,9 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
|
||||||
}
|
}
|
||||||
nLastWrite = GetTimeMicros();
|
nLastWrite = GetTimeMicros();
|
||||||
}
|
}
|
||||||
|
} catch (const std::runtime_error& e) {
|
||||||
|
return state.Abort(std::string("System error while flushing: ") + e.what());
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue