@@ -3,19 +3,15 @@ use std::{
33 collections:: HashSet ,
44 fs:: { self , File , OpenOptions , ReadDir } ,
55 io:: { BufWriter , Write } ,
6- mem:: { MaybeUninit , swap, transmute } ,
6+ mem:: swap,
77 ops:: RangeInclusive ,
88 path:: { Path , PathBuf } ,
9- sync:: {
10- Arc ,
11- atomic:: { AtomicBool , AtomicU32 , Ordering } ,
12- } ,
9+ sync:: atomic:: { AtomicBool , AtomicU32 , Ordering } ,
1310} ;
1411
1512use anyhow:: { Context , Result , bail} ;
1613use byteorder:: { BE , ReadBytesExt , WriteBytesExt } ;
1714use jiff:: Timestamp ;
18- use lzzzz:: lz4:: decompress;
1915use memmap2:: Mmap ;
2016use parking_lot:: { Mutex , RwLock } ;
2117
@@ -24,6 +20,7 @@ use crate::{
2420 QueryKey ,
2521 arc_slice:: ArcSlice ,
2622 compaction:: selector:: { Compactable , compute_metrics, get_merge_segments} ,
23+ compression:: decompress_into_arc,
2724 constants:: {
2825 AMQF_AVG_SIZE , AMQF_CACHE_SIZE , DATA_THRESHOLD_PER_COMPACTED_FILE , KEY_BLOCK_AVG_SIZE ,
2926 KEY_BLOCK_CACHE_SIZE , MAX_ENTRIES_PER_COMPACTED_FILE , VALUE_BLOCK_AVG_SIZE ,
@@ -392,14 +389,9 @@ impl<S: ParallelScheduler> TurboPersistence<S> {
392389 #[ cfg( target_os = "linux" ) ]
393390 mmap. advise ( memmap2:: Advice :: Unmergeable ) ?;
394391 let mut compressed = & mmap[ ..] ;
395- let uncompressed_length = compressed. read_u32 :: < BE > ( ) ? as usize ;
396-
397- let buffer = Arc :: new_zeroed_slice ( uncompressed_length) ;
398- // Safety: MaybeUninit<u8> can be safely transmuted to u8.
399- let mut buffer = unsafe { transmute :: < Arc < [ MaybeUninit < u8 > ] > , Arc < [ u8 ] > > ( buffer) } ;
400- // Safety: We know that the buffer is not shared yet.
401- let decompressed = unsafe { Arc :: get_mut_unchecked ( & mut buffer) } ;
402- decompress ( compressed, decompressed) ?;
392+ let uncompressed_length = compressed. read_u32 :: < BE > ( ) ?;
393+
394+ let buffer = decompress_into_arc ( uncompressed_length, compressed, None , true ) ?;
403395 Ok ( ArcSlice :: from ( buffer) )
404396 }
405397
@@ -918,9 +910,9 @@ impl<S: ParallelScheduler> TurboPersistence<S> {
918910 } ) ;
919911 }
920912
921- fn create_sst_file < S : ParallelScheduler > (
913+ fn create_sst_file < ' l , S : ParallelScheduler > (
922914 parallel_scheduler : & S ,
923- entries : & [ LookupEntry ] ,
915+ entries : & [ LookupEntry < ' l > ] ,
924916 total_key_size : usize ,
925917 total_value_size : usize ,
926918 path : & Path ,
@@ -964,7 +956,7 @@ impl<S: ParallelScheduler> TurboPersistence<S> {
964956
965957 let mut total_key_size = 0 ;
966958 let mut total_value_size = 0 ;
967- let mut current: Option < LookupEntry > = None ;
959+ let mut current: Option < LookupEntry < ' _ > > = None ;
968960 let mut entries = Vec :: new ( ) ;
969961 let mut last_entries = Vec :: new ( ) ;
970962 let mut last_entries_total_sizes = ( 0 , 0 ) ;
@@ -975,7 +967,7 @@ impl<S: ParallelScheduler> TurboPersistence<S> {
975967 if let Some ( current) = current. take ( ) {
976968 if current. key != entry. key {
977969 let key_size = current. key . len ( ) ;
978- let value_size = current. value . size_in_sst ( ) ;
970+ let value_size = current. value . uncompressed_size_in_sst ( ) ;
979971 total_key_size += key_size;
980972 total_value_size += value_size;
981973
@@ -1023,7 +1015,7 @@ impl<S: ParallelScheduler> TurboPersistence<S> {
10231015 }
10241016 if let Some ( entry) = current {
10251017 total_key_size += entry. key . len ( ) ;
1026- total_value_size += entry. value . size_in_sst ( ) ;
1018+ total_value_size += entry. value . uncompressed_size_in_sst ( ) ;
10271019 entries. push ( entry) ;
10281020 }
10291021
0 commit comments