Skip to content

Commit c8cb622

Browse files
committed
Merge bitcoin/bitcoin#26999: A few follow-ups to #17487 (coins write without cache drop)
2e16054 Add assertions that BatchWrite(erase=true) erases (Pieter Wuille) 941feb6 Avoid unclear {it = ++it;} (Pieter Wuille) 98db35c Follow coding style for named arguments (Pieter Wuille) bb00357 Make test/fuzz/coins_view exercise CCoinsViewCache::Sync() (Pieter Wuille) Pull request description: This addresses a few nits left open in #17487. ACKs for top commit: jonatack: ACK 2e16054 Sjors: utACK 2e16054 achow101: ACK 2e16054 jamesob: ACK 2e16054 ([`jamesob/ackr/26999.1.sipa.a_few_follow_ups_to_1748`](https://github.com/jamesob/bitcoin/tree/ackr/26999.1.sipa.a_few_follow_ups_to_1748)) Tree-SHA512: 5e64807b850fa12ce858e87470420555ad081f2f63d53649d9904034ed5311592005eb979a8a4df2b70ecb56cf022db9750cd6999e5480bc8226184d4be22ce4
2 parents 7241b93 + 2e16054 commit c8cb622

File tree

3 files changed

+10
-4
lines changed

3 files changed

+10
-4
lines changed

src/coins.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,15 +249,18 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
249249
}
250250

251251
bool CCoinsViewCache::Flush() {
252-
bool fOk = base->BatchWrite(cacheCoins, hashBlock, /*erase=*/ true);
253-
cacheCoins.clear();
252+
bool fOk = base->BatchWrite(cacheCoins, hashBlock, /*erase=*/true);
253+
if (fOk && !cacheCoins.empty()) {
254+
/* BatchWrite must erase all cacheCoins elements when erase=true. */
255+
throw std::logic_error("Not all cached coins were erased");
256+
}
254257
cachedCoinsUsage = 0;
255258
return fOk;
256259
}
257260

258261
bool CCoinsViewCache::Sync()
259262
{
260-
bool fOk = base->BatchWrite(cacheCoins, hashBlock, /*erase=*/ false);
263+
bool fOk = base->BatchWrite(cacheCoins, hashBlock, /*erase=*/false);
261264
// Instead of clearing `cacheCoins` as we would in Flush(), just clear the
262265
// FRESH/DIRTY flags of any coin that isn't spent.
263266
for (auto it = cacheCoins.begin(); it != cacheCoins.end(); ) {

src/test/coins_tests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class CCoinsViewTest : public CCoinsView
5555

5656
bool BatchWrite(CCoinsMap& mapCoins, const uint256& hashBlock, bool erase = true) override
5757
{
58-
for (CCoinsMap::iterator it = mapCoins.begin(); it != mapCoins.end(); it = erase ? mapCoins.erase(it) : ++it) {
58+
for (CCoinsMap::iterator it = mapCoins.begin(); it != mapCoins.end(); it = erase ? mapCoins.erase(it) : std::next(it)) {
5959
if (it->second.flags & CCoinsCacheEntry::DIRTY) {
6060
// Same optimization used in CCoinsViewDB is to only write dirty entries.
6161
map_[it->first] = it->second.coin;

src/test/fuzz/coins_view.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ FUZZ_TARGET_INIT(coins_view, initialize_coins_view)
7474
[&] {
7575
(void)coins_view_cache.Flush();
7676
},
77+
[&] {
78+
(void)coins_view_cache.Sync();
79+
},
7780
[&] {
7881
coins_view_cache.SetBestBlock(ConsumeUInt256(fuzzed_data_provider));
7982
},

0 commit comments

Comments
 (0)