@@ -370,6 +370,65 @@ func TestSegmentMetric(t *testing.T) {
370370 testutil .Ok (t , w .Close ())
371371}
372372
373+ func TestCompression (t * testing.T ) {
374+ const (
375+ segmentSize = pageSize
376+ recordSize = (pageSize / 2 ) - recordHeaderSize
377+ records = 100
378+ )
379+
380+ uncompressedDir , err := ioutil .TempDir ("" , "uncompressed" )
381+ testutil .Ok (t , err )
382+ defer func () {
383+ testutil .Ok (t , os .RemoveAll (uncompressedDir ))
384+ }()
385+ w , err := NewSize (nil , nil , uncompressedDir , segmentSize , false )
386+ testutil .Ok (t , err )
387+
388+ logZeroRecords (t , w , recordSize , records )
389+ testutil .Ok (t , w .Close ())
390+
391+ compressedDir , err := ioutil .TempDir ("" , "uncompressed" )
392+ testutil .Ok (t , err )
393+ defer func () {
394+ testutil .Ok (t , os .RemoveAll (compressedDir ))
395+ }()
396+ w , err = NewSize (nil , nil , compressedDir , segmentSize , true )
397+ testutil .Ok (t , err )
398+
399+ logZeroRecords (t , w , recordSize , records )
400+ testutil .Ok (t , w .Close ())
401+
402+ uncompressedSize , err := dirSize (uncompressedDir )
403+ testutil .Ok (t , err )
404+ compressedSize , err := dirSize (compressedDir )
405+ testutil .Ok (t , err )
406+
407+ testutil .Assert (t , float64 (uncompressedSize )* 0.75 > float64 (compressedSize ), "Compressing zeroes should save at least 25%% space" )
408+ }
409+
410+ func logZeroRecords (tb testing.TB , w * WAL , recordSize , records int ) {
411+ tb .Helper ()
412+ buf := make ([]byte , recordSize )
413+ for i := 0 ; i < records ; i ++ {
414+ testutil .Ok (tb , w .Log (buf ))
415+ }
416+ }
417+
418+ func dirSize (path string ) (int64 , error ) {
419+ var size int64
420+ err := filepath .Walk (path , func (_ string , info os.FileInfo , err error ) error {
421+ if err != nil {
422+ return err
423+ }
424+ if ! info .IsDir () {
425+ size += info .Size ()
426+ }
427+ return nil
428+ })
429+ return size , err
430+ }
431+
373432func BenchmarkWAL_LogBatched (b * testing.B ) {
374433 for _ , compress := range []bool {true , false } {
375434 b .Run (fmt .Sprintf ("compress=%t" , compress ), func (b * testing.B ) {
0 commit comments