@@ -189,6 +189,11 @@ tape('shift many blocks', async (t) => {
189
189
t . deepEquals (
190
190
progressArr ,
191
191
[
192
+ {
193
+ sizeDiff : 0 ,
194
+ percent : 1 ,
195
+ done : true ,
196
+ } ,
192
197
{
193
198
startOffset : 11 ,
194
199
compactedOffset : 11 ,
@@ -463,6 +468,88 @@ tape('compact handling holes of different sizes', async (t) => {
463
468
t . end ( )
464
469
} )
465
470
471
+ tape ( 'startOffset is correct' , async ( t ) => {
472
+ t . timeoutAfter ( 6000 )
473
+ const file = '/tmp/compaction-test_' + Date . now ( ) + '.log'
474
+ const log = Log ( file , { blockSize : 9 , codec : hexCodec } )
475
+
476
+ await run ( log . append ) (
477
+ [
478
+ // block 0
479
+ [ 0x11 , 0x22 ] , // offsets: 0, 3
480
+ // block 1
481
+ [ 0x33 , 0x44 ] , // offsets: 9+0, 9+3
482
+ ] . flat ( )
483
+ )
484
+ await run ( log . onDrain ) ( )
485
+ t . pass ( 'append four records' )
486
+
487
+ await run ( log . del ) ( 0 )
488
+ await run ( log . onDeletesFlushed ) ( )
489
+ t . pass ( 'delete 1st record' )
490
+
491
+ const progressArr = [ ]
492
+ log . compactionProgress ( ( stats ) => {
493
+ progressArr . push ( stats )
494
+ } )
495
+
496
+ const [ err ] = await run ( log . compact ) ( )
497
+ t . error ( err , 'no error when compacting' )
498
+
499
+ t . deepEquals (
500
+ progressArr ,
501
+ [
502
+ {
503
+ sizeDiff : 0 ,
504
+ percent : 1 ,
505
+ done : true ,
506
+ } ,
507
+ {
508
+ startOffset : 0 ,
509
+ compactedOffset : 0 ,
510
+ unshiftedOffset : 3 ,
511
+ percent : 0.25 ,
512
+ done : false ,
513
+ } ,
514
+ {
515
+ startOffset : 0 ,
516
+ compactedOffset : 9 ,
517
+ unshiftedOffset : 12 ,
518
+ percent : 1 ,
519
+ done : false ,
520
+ } ,
521
+ {
522
+ sizeDiff : 0 ,
523
+ percent : 1 ,
524
+ done : true ,
525
+ } ,
526
+ ] ,
527
+ 'progress events'
528
+ )
529
+
530
+ await new Promise ( ( resolve ) => {
531
+ log . stream ( { offsets : false } ) . pipe (
532
+ push . collect ( ( err , ary ) => {
533
+ t . error ( err , 'no error when streaming compacted log' )
534
+ t . deepEqual (
535
+ ary ,
536
+ [
537
+ // block 0
538
+ [ 0x22 , 0x33 ] ,
539
+ // block 1
540
+ [ 0x44 ] ,
541
+ ] . flat ( ) ,
542
+ 'log has 2 blocks'
543
+ )
544
+ resolve ( )
545
+ } )
546
+ )
547
+ } )
548
+
549
+ await run ( log . close ) ( )
550
+ t . end ( )
551
+ } )
552
+
466
553
tape ( 'recovers from crash just after persisting state' , async ( t ) => {
467
554
t . timeoutAfter ( 6000 )
468
555
const file = '/tmp/compaction-test_' + Date . now ( ) + '.log'
@@ -482,6 +569,7 @@ tape('recovers from crash just after persisting state', async (t) => {
482
569
t . pass ( 'suppose compaction was in progress: [0x22, 0x33] and [0x33, 0x44]' )
483
570
484
571
const version = [ 1 , 0 , 0 , 0 ] // uint32LE
572
+ const startOffset = [ 0 , 0 , 0 , 0 ] // uint32LE
485
573
const truncateBlockIndex = [ 255 , 255 , 255 , 255 ] //uint32LE
486
574
const compactingBlockIndex = [ 1 , 0 , 0 , 0 ] // uint32LE
487
575
const unshiftedOffset = [ 9 + 3 , 0 , 0 , 0 ] // uint32LE
@@ -494,6 +582,7 @@ tape('recovers from crash just after persisting state', async (t) => {
494
582
file + '.compaction' ,
495
583
Buffer . from ( [
496
584
...version ,
585
+ ...startOffset ,
497
586
...truncateBlockIndex ,
498
587
...compactingBlockIndex ,
499
588
...unshiftedOffset ,
@@ -506,8 +595,35 @@ tape('recovers from crash just after persisting state', async (t) => {
506
595
log = Log ( file , { blockSize : 9 , codec : hexCodec } )
507
596
t . pass ( 'start log, compaction should autostart' )
508
597
598
+ const progressArr = [ ]
599
+ log . compactionProgress ( ( stats ) => {
600
+ progressArr . push ( stats )
601
+ } )
602
+
509
603
await timer ( 1000 )
510
604
605
+ t . deepEquals (
606
+ progressArr ,
607
+ [
608
+ {
609
+ done : false ,
610
+ } ,
611
+ {
612
+ startOffset : 0 ,
613
+ compactedOffset : 9 ,
614
+ unshiftedOffset : 12 ,
615
+ percent : 1 ,
616
+ done : false ,
617
+ } ,
618
+ {
619
+ sizeDiff : 0 ,
620
+ percent : 1 ,
621
+ done : true ,
622
+ } ,
623
+ ] ,
624
+ 'progress events'
625
+ )
626
+
511
627
await new Promise ( ( resolve ) => {
512
628
log . stream ( { offsets : false } ) . pipe (
513
629
push . collect ( ( err , ary ) => {
@@ -552,6 +668,7 @@ tape('recovers from crash just after persisting block', async (t) => {
552
668
t . pass ( 'suppose compaction was in progress: [0x22, 0x33] and [0x33, 0x44]' )
553
669
554
670
const version = [ 1 , 0 , 0 , 0 ] // uint32LE
671
+ const startOffset = [ 0 , 0 , 0 , 0 ] // uint32LE
555
672
const truncateBlockIndex = [ 255 , 255 , 255 , 255 ] //uint32LE
556
673
const compactingBlockIndex = [ 0 , 0 , 0 , 0 ] // uint32LE
557
674
const unshiftedOffset = [ 0 , 0 , 0 , 0 ] // uint32LE
@@ -564,6 +681,7 @@ tape('recovers from crash just after persisting block', async (t) => {
564
681
file + '.compaction' ,
565
682
Buffer . from ( [
566
683
...version ,
684
+ ...startOffset ,
567
685
...truncateBlockIndex ,
568
686
...compactingBlockIndex ,
569
687
...unshiftedOffset ,
@@ -621,6 +739,7 @@ tape('restarts from crash just before truncating log', async (t) => {
621
739
t . pass ( 'suppose compaction ready: [0x22, 0x44], [0x55, 0x66], [0x55, 0x66]' )
622
740
623
741
const version = [ 1 , 0 , 0 , 0 ] // uint32LE
742
+ const startOffset = [ 0 , 0 , 0 , 0 ] // uint32LE
624
743
const truncateBlockIndex = [ 1 , 0 , 0 , 0 ] //uint32LE
625
744
const compactingBlockIndex = [ 0 , 0 , 0 , 0 ] // uint32LE
626
745
const unshiftedOffset = [ 0 , 0 , 0 , 0 ] // uint32LE
@@ -629,6 +748,7 @@ tape('restarts from crash just before truncating log', async (t) => {
629
748
file + '.compaction' ,
630
749
Buffer . from ( [
631
750
...version ,
751
+ ...startOffset ,
632
752
...truncateBlockIndex ,
633
753
...compactingBlockIndex ,
634
754
...unshiftedOffset ,
0 commit comments