@@ -330,18 +330,36 @@ BucketManager::getMergeTimer()
330
330
return mBucketSnapMerge ;
331
331
}
332
332
333
+ template <>
334
+ MergeCounters
335
+ BucketManager::readMergeCounters<LiveBucket>()
336
+ {
337
+ std::lock_guard<std::recursive_mutex> lock (mBucketMutex );
338
+ return mLiveMergeCounters ;
339
+ }
340
+
341
+ template <>
333
342
MergeCounters
334
- BucketManager::readMergeCounters ()
343
+ BucketManager::readMergeCounters<HotArchiveBucket>()
344
+ {
345
+ std::lock_guard<std::recursive_mutex> lock (mBucketMutex );
346
+ return mHotArchiveMergeCounters ;
347
+ }
348
+
349
+ template <>
350
+ void
351
+ BucketManager::incrMergeCounters<LiveBucket>(MergeCounters const & delta)
335
352
{
336
353
std::lock_guard<std::recursive_mutex> lock (mBucketMutex );
337
- return mMergeCounters ;
354
+ mLiveMergeCounters += delta ;
338
355
}
339
356
357
+ template <>
340
358
void
341
- BucketManager::incrMergeCounters (MergeCounters const & delta)
359
+ BucketManager::incrMergeCounters<HotArchiveBucket> (MergeCounters const & delta)
342
360
{
343
361
std::lock_guard<std::recursive_mutex> lock (mBucketMutex );
344
- mMergeCounters += delta;
362
+ mHotArchiveMergeCounters += delta;
345
363
}
346
364
347
365
bool
@@ -623,7 +641,7 @@ BucketManager::getMergeFutureInternal(MergeKey const& key,
623
641
auto future = promise.get_future ().share ();
624
642
promise.set_value (bucket);
625
643
mc.mFinishedMergeReattachments ++;
626
- incrMergeCounters (mc);
644
+ incrMergeCounters<BucketT> (mc);
627
645
return future;
628
646
}
629
647
}
@@ -638,7 +656,7 @@ BucketManager::getMergeFutureInternal(MergeKey const& key,
638
656
" BucketManager::getMergeFuture returning running future for merge {}" ,
639
657
key);
640
658
mc.mRunningMergeReattachments ++;
641
- incrMergeCounters (mc);
659
+ incrMergeCounters<BucketT> (mc);
642
660
return i->second ;
643
661
}
644
662
@@ -1013,10 +1031,10 @@ BucketManager::snapshotLedger(LedgerHeader& currentHeader)
1013
1031
currentHeader.ledgerVersion ,
1014
1032
BucketBase::FIRST_PROTOCOL_SUPPORTING_PERSISTENT_EVICTION))
1015
1033
{
1016
- // TODO: Hash Archive Bucket
1017
- // Dependency: HAS supports Hot Archive BucketList
1018
-
1019
- hash = mLiveBucketList -> getHash ();
1034
+ SHA256 hsh;
1035
+ hsh. add ( mLiveBucketList -> getHash ());
1036
+ hsh. add ( mHotArchiveBucketList -> getHash ());
1037
+ hash = hsh. finish ();
1020
1038
}
1021
1039
else
1022
1040
{
@@ -1229,51 +1247,71 @@ BucketManager::assumeState(HistoryArchiveState const& has,
1229
1247
releaseAssert (threadIsMain ());
1230
1248
releaseAssertOrThrow (mConfig .MODE_ENABLES_BUCKETLIST );
1231
1249
1232
- // TODO: Assume archival bucket state
1233
1250
// Dependency: HAS supports Hot Archive BucketList
1234
- for (uint32_t i = 0 ; i < LiveBucketList::kNumLevels ; ++i)
1235
- {
1236
- auto curr = getBucketByHashInternal (
1237
- hexToBin256 (has.currentBuckets .at (i).curr ), mSharedLiveBuckets );
1238
- auto snap = getBucketByHashInternal (
1239
- hexToBin256 (has.currentBuckets .at (i).snap ), mSharedLiveBuckets );
1240
- if (!(curr && snap))
1241
- {
1242
- throw std::runtime_error (" Missing bucket files while assuming "
1243
- " saved live BucketList state" );
1244
- }
1245
1251
1246
- auto const & nextFuture = has.currentBuckets .at (i).next ;
1247
- std::shared_ptr<LiveBucket> nextBucket = nullptr ;
1248
- if (nextFuture.hasOutputHash ())
1252
+ auto processBucketList = [&](auto & bl, auto const & hasBuckets) {
1253
+ auto kNumLevels = std::remove_reference<decltype (bl)>::type::kNumLevels ;
1254
+ using BucketT =
1255
+ typename std::remove_reference<decltype (bl)>::type::bucket_type;
1256
+ for (uint32_t i = 0 ; i < kNumLevels ; ++i)
1249
1257
{
1250
- nextBucket = getBucketByHashInternal (
1251
- hexToBin256 (nextFuture.getOutputHash ()), mSharedLiveBuckets );
1252
- if (!nextBucket)
1258
+ auto curr =
1259
+ getBucketByHash<BucketT>(hexToBin256 (hasBuckets.at (i).curr ));
1260
+ auto snap =
1261
+ getBucketByHash<BucketT>(hexToBin256 (hasBuckets.at (i).snap ));
1262
+ if (!(curr && snap))
1253
1263
{
1254
- throw std::runtime_error (
1255
- " Missing future bucket files while "
1256
- " assuming saved live BucketList state" );
1264
+ throw std::runtime_error (" Missing bucket files while assuming "
1265
+ " saved live BucketList state" );
1257
1266
}
1258
- }
1259
1267
1260
- // Buckets on the BucketList should always be indexed
1261
- releaseAssert (curr->isEmpty () || curr->isIndexed ());
1262
- releaseAssert (snap->isEmpty () || snap->isIndexed ());
1263
- if (nextBucket)
1264
- {
1265
- releaseAssert (nextBucket->isEmpty () || nextBucket->isIndexed ());
1268
+ auto const & nextFuture = hasBuckets.at (i).next ;
1269
+ std::shared_ptr<BucketT> nextBucket = nullptr ;
1270
+ if (nextFuture.hasOutputHash ())
1271
+ {
1272
+ nextBucket = getBucketByHash<BucketT>(
1273
+ hexToBin256 (nextFuture.getOutputHash ()));
1274
+ if (!nextBucket)
1275
+ {
1276
+ throw std::runtime_error (
1277
+ " Missing future bucket files while "
1278
+ " assuming saved live BucketList state" );
1279
+ }
1280
+ }
1281
+
1282
+ // Buckets on the BucketList should always be indexed
1283
+ releaseAssert (curr->isEmpty () || curr->isIndexed ());
1284
+ releaseAssert (snap->isEmpty () || snap->isIndexed ());
1285
+ if (nextBucket)
1286
+ {
1287
+ releaseAssert (nextBucket->isEmpty () || nextBucket->isIndexed ());
1288
+ }
1289
+
1290
+ bl.getLevel (i).setCurr (curr);
1291
+ bl.getLevel (i).setSnap (snap);
1292
+ bl.getLevel (i).setNext (nextFuture);
1266
1293
}
1294
+ };
1267
1295
1268
- mLiveBucketList ->getLevel (i).setCurr (curr);
1269
- mLiveBucketList ->getLevel (i).setSnap (snap);
1270
- mLiveBucketList ->getLevel (i).setNext (nextFuture);
1296
+ processBucketList (*mLiveBucketList , has.currentBuckets );
1297
+ #ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION
1298
+ if (has.hasHotArchiveBuckets ())
1299
+ {
1300
+ processBucketList (*mHotArchiveBucketList , has.hotArchiveBuckets );
1271
1301
}
1302
+ #endif
1272
1303
1273
1304
if (restartMerges)
1274
1305
{
1275
1306
mLiveBucketList ->restartMerges (mApp , maxProtocolVersion,
1276
1307
has.currentLedger );
1308
+ #ifdef ENABLE_NEXT_PROTOCOL_VERSION_UNSAFE_FOR_PRODUCTION
1309
+ if (has.hasHotArchiveBuckets ())
1310
+ {
1311
+ mHotArchiveBucketList ->restartMerges (mApp , maxProtocolVersion,
1312
+ has.currentLedger );
1313
+ }
1314
+ #endif
1277
1315
}
1278
1316
cleanupStaleFiles (has);
1279
1317
}
@@ -1580,16 +1618,35 @@ BucketManager::scheduleVerifyReferencedBucketsWork(
1580
1618
continue ;
1581
1619
}
1582
1620
1583
- // TODO: Update verify to for ArchiveBucket
1584
- // Dependency: HAS supports Hot Archive BucketList
1585
- auto b = getBucketByHashInternal (h, mSharedLiveBuckets );
1586
- if (!b)
1587
- {
1588
- throw std::runtime_error (fmt::format (
1589
- FMT_STRING (" Missing referenced bucket {}" ), binToHex (h)));
1590
- }
1591
- seq.emplace_back (std::make_shared<VerifyBucketWork>(
1592
- mApp , b->getFilename ().string (), b->getHash (), nullptr ));
1621
+ auto loadFilenameAndHash = [&]() -> std::pair<std::string, Hash> {
1622
+ auto live = getBucketByHashInternal (h, mSharedLiveBuckets );
1623
+ if (!live)
1624
+ {
1625
+ auto hot = getBucketByHashInternal (h, mSharedHotArchiveBuckets );
1626
+
1627
+ // Check both live and hot archive buckets for hash. If we don't
1628
+ // find it in either, we're missing a bucket. Note that live and
1629
+ // hot archive buckets are guaranteed to have no hash collisions
1630
+ // due to type field in MetaEntry.
1631
+ if (!hot)
1632
+ {
1633
+ throw std::runtime_error (
1634
+ fmt::format (FMT_STRING (" Missing referenced bucket {}" ),
1635
+ binToHex (h)));
1636
+ }
1637
+ return std::make_pair (hot->getFilename ().string (),
1638
+ hot->getHash ());
1639
+ }
1640
+ else
1641
+ {
1642
+ return std::make_pair (live->getFilename ().string (),
1643
+ live->getHash ());
1644
+ }
1645
+ };
1646
+
1647
+ auto [filename, hash] = loadFilenameAndHash ();
1648
+ seq.emplace_back (
1649
+ std::make_shared<VerifyBucketWork>(mApp , filename, hash, nullptr ));
1593
1650
}
1594
1651
return mApp .getWorkScheduler ().scheduleWork <WorkSequence>(
1595
1652
" verify-referenced-buckets" , seq);
0 commit comments