@@ -454,6 +454,78 @@ TEST_CASE_VERSIONS("hot archive bucket tombstones expire at bottom level",
454
454
});
455
455
}
456
456
457
+ TEST_CASE_VERSIONS (
458
+ " live bucket entries converted to init enties at bottom level" ,
459
+ " [bucket][bucketlist]" )
460
+ {
461
+ VirtualClock clock ;
462
+ Config const & cfg = getTestConfig ();
463
+
464
+ for_versions_with_differing_bucket_logic (cfg, [&](Config const & cfg) {
465
+ Application::pointer app = createTestApplication (clock , cfg);
466
+ LiveBucketList bl;
467
+ BucketManager& bm = app->getBucketManager ();
468
+ auto & mergeTimer = bm.getMergeTimer ();
469
+ CLOG_INFO (Bucket, " Establishing random bucketlist" );
470
+ for (uint32_t i = 0 ; i < LiveBucketList::kNumLevels ; ++i)
471
+ {
472
+ auto & level = bl.getLevel (i);
473
+ level.setCurr (LiveBucket::fresh (
474
+ bm, getAppLedgerVersion (app), {}, // No init entries.
475
+ LedgerTestUtils::generateValidUniqueLedgerEntries (8 ),
476
+ LedgerTestUtils::generateValidLedgerEntryKeysWithExclusions (
477
+ {CONFIG_SETTING}, 5 ),
478
+ /* countMergeEvents=*/ true , clock .getIOContext (),
479
+ /* doFsync=*/ true ));
480
+ level.setSnap (LiveBucket::fresh (
481
+ bm, getAppLedgerVersion (app), {},
482
+ LedgerTestUtils::generateValidUniqueLedgerEntries (8 ),
483
+ LedgerTestUtils::generateValidLedgerEntryKeysWithExclusions (
484
+ {CONFIG_SETTING}, 5 ),
485
+ /* countMergeEvents=*/ true , clock .getIOContext (),
486
+ /* doFsync=*/ true ));
487
+ }
488
+
489
+ auto countNonBottomLevelEntries = [&] {
490
+ auto size = 0 ;
491
+ for (uint32_t i = 0 ; i < LiveBucketList::kNumLevels - 1 ; ++i)
492
+ {
493
+ auto & level = bl.getLevel (i);
494
+ size += countEntries (level.getCurr ());
495
+ size += countEntries (level.getSnap ());
496
+ }
497
+ return size;
498
+ };
499
+
500
+ auto ledger = 0 ;
501
+ // Close ledgers until all entries have merged into the bottom level
502
+ // bucket
503
+ while (countNonBottomLevelEntries () != 0 )
504
+ {
505
+ bl.addBatch (*app, ledger, getAppLedgerVersion (app), {}, {}, {});
506
+ ++ledger;
507
+ }
508
+
509
+ auto bottomCurr = bl.getLevel (LiveBucketList::kNumLevels - 1 ).getCurr ();
510
+ EntryCounts<LiveBucket> e (bottomCurr);
511
+
512
+ if (protocolVersionStartsFrom (
513
+ cfg.LEDGER_PROTOCOL_VERSION ,
514
+ LiveBucket::FIRST_PROTOCOL_SUPPORTING_INITENTRY_AND_METAENTRY))
515
+ {
516
+ // Assert that init entries are converted to live entries
517
+ // at the lowest level.
518
+ REQUIRE (e.nLive == 0 );
519
+ REQUIRE (e.nInitOrArchived != 0 );
520
+ }
521
+ else
522
+ {
523
+ REQUIRE (e.nLive != 0 );
524
+ REQUIRE (e.nInitOrArchived == 0 );
525
+ }
526
+ });
527
+ }
528
+
457
529
TEST_CASE_VERSIONS (" live bucket tombstones expire at bottom level" ,
458
530
" [bucket][bucketlist][tombstones]" )
459
531
{
0 commit comments