Skip to content

Commit 94e0857

Browse files
committed
Merge pull request #186 from basho/bugfix/key-transform-crash
Bugfix/key transform crash Reviewed-by: jonmeredith
2 parents f813d09 + 5fbb8f7 commit 94e0857

File tree

1 file changed

+37
-7
lines changed

1 file changed

+37
-7
lines changed

src/bitcask.erl

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,7 +1151,7 @@ get_opt(Key, Opts) ->
11511151
put_state(Ref, State) ->
11521152
erlang:put(Ref, State).
11531153

1154-
kt_id(Key) ->
1154+
kt_id(Key) when is_binary(Key) ->
11551155
Key.
11561156

11571157
scan_key_files([], _KeyDir, Acc, _CloseFile, _KT) ->
@@ -1908,9 +1908,12 @@ expiry_merge([], _LiveKeyDir, _KT, Acc) ->
19081908
Acc;
19091909
expiry_merge([File | Files], LiveKeyDir, KT, Acc0) ->
19101910
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
19141917
end,
19151918
case bitcask_fileops:fold_keys(File, Fun, ok, default) of
19161919
{error, Reason} ->
@@ -1965,11 +1968,13 @@ init_dataset(Dirname, Opts, KVs) ->
19651968
os:cmd(?FMT("rm -rf ~s", [Dirname])),
19661969

19671970
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),
19711972
B.
19721973

1974+
put_kvs(B, KVs) ->
1975+
lists:foldl(fun({K, V}, _) ->
1976+
ok = bitcask:put(B, K, V)
1977+
end, undefined, KVs).
19731978

19741979
default_dataset() ->
19751980
[{<<"k">>, <<"v">>},
@@ -3281,6 +3286,31 @@ merge_batch_test2() ->
32813286
bitcask:close(B)
32823287
end.
32833288

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+
32843314
max_merge_size_test_() ->
32853315
{timeout, 120, fun max_merge_size_test2/0}.
32863316

0 commit comments

Comments
 (0)