@@ -52,15 +52,16 @@ class TempLedgerVersionSetter : NonMovableOrCopyable
52
52
};
53
53
54
54
uint32_t
55
- ApplyBucketsWork::startingLevel (bool offersOnly )
55
+ ApplyBucketsWork::startingLevel ()
56
56
{
57
- return offersOnly ? 0 : BucketList::kNumLevels - 1 ;
57
+ return mApp .getConfig ().isUsingBucketListDB () ? 0
58
+ : BucketList::kNumLevels - 1 ;
58
59
}
59
60
60
61
bool
61
62
ApplyBucketsWork::appliedAllLevels () const
62
63
{
63
- if (mOffersOnly )
64
+ if (mApp . getConfig (). isUsingBucketListDB () )
64
65
{
65
66
return mLevel == BucketList::kNumLevels - 1 ;
66
67
}
@@ -73,7 +74,7 @@ ApplyBucketsWork::appliedAllLevels() const
73
74
uint32_t
74
75
ApplyBucketsWork::nextLevel () const
75
76
{
76
- return mOffersOnly ? mLevel + 1 : mLevel - 1 ;
77
+ return mApp . getConfig (). isUsingBucketListDB () ? mLevel + 1 : mLevel - 1 ;
77
78
}
78
79
79
80
ApplyBucketsWork::ApplyBucketsWork (
@@ -87,8 +88,7 @@ ApplyBucketsWork::ApplyBucketsWork(
87
88
, mEntryTypeFilter (onlyApply)
88
89
, mApplying (false )
89
90
, mTotalSize (0 )
90
- , mOffersOnly (app.getConfig().isUsingBucketListDB())
91
- , mLevel (startingLevel(mOffersOnly ))
91
+ , mLevel (startingLevel())
92
92
, mMaxProtocolVersion (maxProtocolVersion)
93
93
, mCounters (app.getClock().now())
94
94
{
@@ -139,7 +139,7 @@ ApplyBucketsWork::doReset()
139
139
140
140
if (!isAborting ())
141
141
{
142
- if (mOffersOnly )
142
+ if (mApp . getConfig (). isUsingBucketListDB () )
143
143
{
144
144
// The current size of this set is 1.6 million during BucketApply
145
145
// (as of 12/20/23). There's not a great way to estimate this, so
@@ -173,7 +173,7 @@ ApplyBucketsWork::doReset()
173
173
mTotalSize += bucket->getSize ();
174
174
}
175
175
176
- if (mOffersOnly )
176
+ if (mApp . getConfig (). isUsingBucketListDB () )
177
177
{
178
178
mBucketsToIndex .emplace_back (bucket);
179
179
}
@@ -195,10 +195,12 @@ ApplyBucketsWork::doReset()
195
195
mApp .getLedgerTxnRoot ().prepareNewObjects (totalLECount);
196
196
}
197
197
198
- mLevel = startingLevel (mOffersOnly );
198
+ mLevel = startingLevel ();
199
199
mApplying = false ;
200
200
mDelayChecked = false ;
201
- mSpawnedAssumeStateWork = false ;
201
+
202
+ mIndexBucketsWork .reset ();
203
+ mAssumeStateWork .reset ();
202
204
203
205
mFirstBucket .reset ();
204
206
mSecondBucket .reset ();
@@ -229,24 +231,25 @@ ApplyBucketsWork::startLevel()
229
231
CLOG_DEBUG (History, " ApplyBuckets : starting level {}" , mLevel );
230
232
auto & level = getBucketLevel (mLevel );
231
233
HistoryStateBucket const & i = mApplyState .currentBuckets .at (mLevel );
234
+ bool isUsingBucketListDB = mApp .getConfig ().isUsingBucketListDB ();
232
235
233
- bool applyFirst = mOffersOnly
236
+ bool applyFirst = isUsingBucketListDB
234
237
? (i.curr != binToHex (level.getCurr ()->getHash ()))
235
238
: (i.snap != binToHex (level.getSnap ()->getHash ()));
236
- bool applySecond = mOffersOnly
239
+ bool applySecond = isUsingBucketListDB
237
240
? (i.snap != binToHex (level.getSnap ()->getHash ()))
238
241
: (i.curr != binToHex (level.getCurr ()->getHash ()));
239
242
240
243
if (mApplying || applyFirst)
241
244
{
242
- mFirstBucket = getBucket (mOffersOnly ? i.curr : i.snap );
245
+ mFirstBucket = getBucket (isUsingBucketListDB ? i.curr : i.snap );
243
246
mMinProtocolVersionSeen = std::min (
244
247
mMinProtocolVersionSeen , Bucket::getBucketVersion (mFirstBucket ));
245
248
mFirstBucketApplicator = std::make_unique<BucketApplicator>(
246
249
mApp , mMaxProtocolVersion , mMinProtocolVersionSeen , mLevel ,
247
- mFirstBucket , mEntryTypeFilter , mOffersOnly , mSeenKeys );
250
+ mFirstBucket , mEntryTypeFilter , mSeenKeys );
248
251
249
- if (mOffersOnly )
252
+ if (isUsingBucketListDB )
250
253
{
251
254
CLOG_DEBUG (History, " ApplyBuckets : starting level[{}].curr = {}" ,
252
255
mLevel , i.curr );
@@ -261,14 +264,14 @@ ApplyBucketsWork::startLevel()
261
264
}
262
265
if (mApplying || applySecond)
263
266
{
264
- mSecondBucket = getBucket (mOffersOnly ? i.snap : i.curr );
267
+ mSecondBucket = getBucket (isUsingBucketListDB ? i.snap : i.curr );
265
268
mMinProtocolVersionSeen = std::min (
266
269
mMinProtocolVersionSeen , Bucket::getBucketVersion (mSecondBucket ));
267
270
mSecondBucketApplicator = std::make_unique<BucketApplicator>(
268
271
mApp , mMaxProtocolVersion , mMinProtocolVersionSeen , mLevel ,
269
- mSecondBucket , mEntryTypeFilter , mOffersOnly , mSeenKeys );
272
+ mSecondBucket , mEntryTypeFilter , mSeenKeys );
270
273
271
- if (mOffersOnly )
274
+ if (isUsingBucketListDB )
272
275
{
273
276
CLOG_DEBUG (History, " ApplyBuckets : starting level[{}].snap = {}" ,
274
277
mLevel , i.snap );
@@ -288,34 +291,26 @@ ApplyBucketsWork::doWork()
288
291
ZoneScoped;
289
292
290
293
// Step 1: index buckets. Step 2: apply buckets. Step 3: assume state
291
- if (!mSpawnedIndexBucketsWork )
294
+ bool isUsingBucketListDB = mApp .getConfig ().isUsingBucketListDB ();
295
+ if (isUsingBucketListDB)
292
296
{
293
- if (mOffersOnly )
294
- {
295
- addWork<IndexBucketsWork>(mBucketsToIndex );
296
- }
297
- else
297
+ if (!mIndexBucketsWork )
298
298
{
299
- mFinishedIndexBucketsWork = true ;
299
+ mIndexBucketsWork = addWork<IndexBucketsWork>( mBucketsToIndex ) ;
300
300
}
301
301
302
- mSpawnedIndexBucketsWork = true ;
303
- }
304
-
305
- if (!mFinishedIndexBucketsWork )
306
- {
302
+ // If indexing has not finished or finished and failed, return result
303
+ // status. If indexing finished and succeeded, move on and spawn assume
304
+ // state work.
307
305
auto status = checkChildrenStatus ();
308
- if (status == BasicWork::State::WORK_SUCCESS)
309
- {
310
- mFinishedIndexBucketsWork = true ;
311
- }
312
- else
306
+ if (!mIndexBucketsWork ->isDone () ||
307
+ status != BasicWork::State::WORK_SUCCESS)
313
308
{
314
309
return status;
315
310
}
316
311
}
317
312
318
- if (!mSpawnedAssumeStateWork )
313
+ if (!mAssumeStateWork )
319
314
{
320
315
if (mApp .getLedgerManager ().rebuildingInMemoryState () && !mDelayChecked )
321
316
{
@@ -347,30 +342,35 @@ ApplyBucketsWork::doWork()
347
342
if (mFirstBucketApplicator )
348
343
{
349
344
TempLedgerVersionSetter tlvs (mApp , mMaxProtocolVersion );
345
+
346
+ // When BucketListDB is enabled, we apply in order starting with
347
+ // curr. If BucketListDB is not enabled, we iterate in reverse
348
+ // starting with snap.
349
+ bool isCurr = isUsingBucketListDB;
350
350
if (*mFirstBucketApplicator )
351
351
{
352
- advance (mOffersOnly ? " curr" : " snap" , *mFirstBucketApplicator );
352
+ advance (isCurr ? " curr" : " snap" , *mFirstBucketApplicator );
353
353
return State::WORK_RUNNING;
354
354
}
355
355
mApp .getInvariantManager ().checkOnBucketApply (
356
- mFirstBucket , mApplyState .currentLedger , mLevel ,
357
- /* isCurr= */ mOffersOnly , mEntryTypeFilter );
356
+ mFirstBucket , mApplyState .currentLedger , mLevel , isCurr,
357
+ mEntryTypeFilter );
358
358
mFirstBucketApplicator .reset ();
359
359
mFirstBucket .reset ();
360
360
mApp .getCatchupManager ().bucketsApplied ();
361
361
}
362
362
if (mSecondBucketApplicator )
363
363
{
364
+ bool isCurr = !isUsingBucketListDB;
364
365
TempLedgerVersionSetter tlvs (mApp , mMaxProtocolVersion );
365
366
if (*mSecondBucketApplicator )
366
367
{
367
- advance (mOffersOnly ? " snap" : " curr" ,
368
- *mSecondBucketApplicator );
368
+ advance (isCurr ? " curr" : " snap" , *mSecondBucketApplicator );
369
369
return State::WORK_RUNNING;
370
370
}
371
371
mApp .getInvariantManager ().checkOnBucketApply (
372
- mSecondBucket , mApplyState .currentLedger , mLevel ,
373
- /* isCurr= */ ! mOffersOnly , mEntryTypeFilter );
372
+ mSecondBucket , mApplyState .currentLedger , mLevel , isCurr,
373
+ mEntryTypeFilter );
374
374
mSecondBucketApplicator .reset ();
375
375
mSecondBucket .reset ();
376
376
mApp .getCatchupManager ().bucketsApplied ();
@@ -387,9 +387,9 @@ ApplyBucketsWork::doWork()
387
387
CLOG_INFO (History, " ApplyBuckets : done, assuming state" );
388
388
389
389
// After all buckets applied, spawn assumeState work
390
- addWork<AssumeStateWork>( mApplyState , mMaxProtocolVersion ,
391
- /* restartMerges */ true );
392
- mSpawnedAssumeStateWork = true ;
390
+ mAssumeStateWork =
391
+ addWork<AssumeStateWork>( mApplyState , mMaxProtocolVersion ,
392
+ /* restartMerges */ true ) ;
393
393
}
394
394
395
395
return checkChildrenStatus ();
@@ -449,7 +449,9 @@ ApplyBucketsWork::getStatus() const
449
449
{
450
450
// This status string only applies to step 2 when we actually apply the
451
451
// buckets.
452
- if (mFinishedIndexBucketsWork && !mSpawnedAssumeStateWork )
452
+ bool doneIndexing = !mApp .getConfig ().isUsingBucketListDB () ||
453
+ (mIndexBucketsWork && mIndexBucketsWork ->isDone ());
454
+ if (doneIndexing && !mSpawnedAssumeStateWork )
453
455
{
454
456
auto size = mTotalSize == 0 ? 0 : (100 * mAppliedSize / mTotalSize );
455
457
return fmt::format (
0 commit comments