@@ -454,6 +454,79 @@ 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 = 1 ;
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::
515
+ FIRST_PROTOCOL_CONVERTING_BOTTOM_LEVEL_LIVE_TO_INIT))
516
+ {
517
+ // Assert that init entries are converted to live entries
518
+ // at the lowest level.
519
+ REQUIRE (e.nLive == 0 );
520
+ REQUIRE (e.nInitOrArchived != 0 );
521
+ }
522
+ else
523
+ {
524
+ REQUIRE (e.nLive != 0 );
525
+ REQUIRE (e.nInitOrArchived == 0 );
526
+ }
527
+ });
528
+ }
529
+
457
530
TEST_CASE_VERSIONS (" live bucket tombstones expire at bottom level" ,
458
531
" [bucket][bucketlist][tombstones]" )
459
532
{
0 commit comments