@@ -1151,7 +1151,7 @@ get_opt(Key, Opts) ->
1151
1151
put_state (Ref , State ) ->
1152
1152
erlang :put (Ref , State ).
1153
1153
1154
- kt_id (Key ) ->
1154
+ kt_id (Key ) when is_binary ( Key ) ->
1155
1155
Key .
1156
1156
1157
1157
scan_key_files ([], _KeyDir , Acc , _CloseFile , _KT ) ->
@@ -1908,9 +1908,12 @@ expiry_merge([], _LiveKeyDir, _KT, Acc) ->
1908
1908
Acc ;
1909
1909
expiry_merge ([File | Files ], LiveKeyDir , KT , Acc0 ) ->
1910
1910
FileId = bitcask_fileops :file_tstamp (File ),
1911
- Fun = fun (K , Tstamp , {Offset , _TotalSz }, Acc ) ->
1912
- bitcask_nifs :keydir_remove (LiveKeyDir , KT (K ), Tstamp , FileId , Offset ),
1913
- Acc
1911
+ Fun = fun ({tombstone , _ }, _ , _ , Acc ) ->
1912
+ Acc ;
1913
+ (K , Tstamp , {Offset , _TotalSz }, Acc ) ->
1914
+ bitcask_nifs :keydir_remove (LiveKeyDir , KT (K ), Tstamp , FileId ,
1915
+ Offset ),
1916
+ Acc
1914
1917
end ,
1915
1918
case bitcask_fileops :fold_keys (File , Fun , ok , default ) of
1916
1919
{error , Reason } ->
@@ -1965,11 +1968,13 @@ init_dataset(Dirname, Opts, KVs) ->
1965
1968
os :cmd (? FMT (" rm -rf ~s " , [Dirname ])),
1966
1969
1967
1970
B = bitcask :open (Dirname , [read_write ] ++ Opts ),
1968
- lists :foldl (fun ({K , V }, _ ) ->
1969
- ok = bitcask :put (B , K , V )
1970
- end , undefined , KVs ),
1971
+ put_kvs (B , KVs ),
1971
1972
B .
1972
1973
1974
+ put_kvs (B , KVs ) ->
1975
+ lists :foldl (fun ({K , V }, _ ) ->
1976
+ ok = bitcask :put (B , K , V )
1977
+ end , undefined , KVs ).
1973
1978
1974
1979
default_dataset () ->
1975
1980
[{<<" k" >>, <<" v" >>},
@@ -3281,6 +3286,31 @@ merge_batch_test2() ->
3281
3286
bitcask :close (B )
3282
3287
end .
3283
3288
3289
+ merge_expired_test_ () ->
3290
+ {timeout , 120 , fun merge_expired_test2 /0 }.
3291
+
3292
+ merge_expired_test2 () ->
3293
+ Dir = " /tmp/bc.merge.expired.files" ,
3294
+ NKeys = 10 ,
3295
+ KF = fun (N ) -> <<N :8 /integer >> end ,
3296
+ KVGen = fun (S , E ) ->
3297
+ [{KF (N ), <<" v" >>} || N <- lists :seq (S , E )]
3298
+ end ,
3299
+ DataSet = KVGen (1 , 3 ),
3300
+ B = init_dataset (Dir , [{max_file_size , 1 }], DataSet ),
3301
+ ok = bitcask :delete (B , KF (1 )),
3302
+ put_kvs (B , KVGen (4 , NKeys )),
3303
+ % Merge away the first 4 files as if they were completely expired,
3304
+ FirstFiles = [Dir ++ " /" ++ integer_to_list (N ) ++ " .bitcask.data" ||
3305
+ N <- lists :seq (1 , 4 )],
3306
+ ? assertEqual (ok , bitcask :merge (Dir , [], {FirstFiles , FirstFiles })),
3307
+ ExpectedKeys = [KF (N ) || N <- lists :seq (4 , NKeys )],
3308
+ ActualKeys1 = lists :sort (bitcask :list_keys (B )),
3309
+ ActualKeys2 = lists :sort (bitcask :fold (B , fun (K ,_V ,A )->[K |A ] end , [])),
3310
+ bitcask :close (B ),
3311
+ ? assertEqual (ExpectedKeys , ActualKeys1 ),
3312
+ ? assertEqual (ExpectedKeys , ActualKeys2 ).
3313
+
3284
3314
max_merge_size_test_ () ->
3285
3315
{timeout , 120 , fun max_merge_size_test2 /0 }.
3286
3316
0 commit comments