From 12bf66553947e5404a603c826af04f5e17795596 Mon Sep 17 00:00:00 2001 From: Scott Lystig Fritchie Date: Mon, 26 May 2014 10:42:12 +0900 Subject: [PATCH] Another round of trying to eliminate PULSE nondeterminism. * PULSE side-effect for all bitcask_nifs functions, !@#$!. The function-by-function declaration is too specific and thus too brittle. Every time a new NIF is added or an existing NIF arity is changed, everyone (myself included) forgets to change rebar.config.script. Instead, we'll use a blanket wildcard statement, and for the few non-NIF functions in bitcask_nifs.erl, they'll get instrumented too. * Move make_merge_file() from bitcask_pulse.erl -> bitcask.erl, because bitcask_pulse has an explicit `pulse_no_side_effect` directive for file:'_' calls. --- rebar.config.script | 34 +--------------------------------- src/bitcask.erl | 17 +++++++++++++++++ test/bitcask_pulse.erl | 19 +------------------ 3 files changed, 19 insertions(+), 51 deletions(-) diff --git a/rebar.config.script b/rebar.config.script index b9a4fc62..ec596cf1 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -9,39 +9,7 @@ case PulseBuild of PulseOpts = [{pulse_no_side_effect,[{erlang,display,1}]}, {pulse_side_effect, - [ {bitcask_nifs, keydir_new, 0} - , {bitcask_nifs, keydir_new, 1} - , {bitcask_nifs, maybe_keydir_new, 1} - , {bitcask_nifs, keydir_mark_ready, 1} - , {bitcask_nifs, keydir_put_int, 10} - , {bitcask_nifs, keydir_get_int, 3} - , {bitcask_nifs, keydir_remove, 3} - , {bitcask_nifs, keydir_remove_int, 6} - , {bitcask_nifs, keydir_copy, 1} - , {bitcask_nifs, keydir_itr_int, 4} - , {bitcask_nifs, keydir_itr_next_int, 1} - , {bitcask_nifs, keydir_itr_release, 1} - , {bitcask_nifs, keydir_info, 1} - , {bitcask_nifs, keydir_release, 1} - , {bitcask_nifs, keydir_trim_fstats, 2} - - , {bitcask_nifs, increment_file_id, 1} - , {bitcask_nifs, increment_file_id, 2} - - , {bitcask_nifs, lock_acquire_int, 2} - , {bitcask_nifs, lock_release_int, 1} - , {bitcask_nifs, lock_readdata_int, 1} - , {bitcask_nifs, lock_writedata_int, 2} - - , {bitcask_nifs, file_open_int, 2} - , {bitcask_nifs, file_close_int, 1} - , {bitcask_nifs, file_sync_int, 1} - , {bitcask_nifs, file_pread_int, 3} - , {bitcask_nifs, file_pwrite_int, 3} - , {bitcask_nifs, file_read_int, 2} - , {bitcask_nifs, file_write_int, 2} - , {bitcask_nifs, file_position_int, 2} - , {bitcask_nifs, file_seekbof_int, 1} + [ {bitcask_nifs, '_', '_'} , {bitcask_file, '_', '_'} , {bitcask_time, tstamp, 0} diff --git a/src/bitcask.erl b/src/bitcask.erl index 9ca1e4bd..9b993b2e 100644 --- a/src/bitcask.erl +++ b/src/bitcask.erl @@ -3178,4 +3178,21 @@ legacy_tombstones_test() -> bitcask:close(B), ?assertEqual([Last], AllFiles3). +make_merge_file(Dir, Seed, Probability) -> + random:seed(Seed), + case filelib:is_dir(Dir) of + true -> + DataFiles = filelib:wildcard("*.data", Dir), + {ok, FH} = file:open(Dir ++ "/merge.txt", [write]), + [case random:uniform(100) < Probability of + true -> + io:format(FH, "~s\n", [DF]); + false -> + ok + end || DF <- DataFiles], + ok = file:close(FH); + false -> + ok + end. + -endif. diff --git a/test/bitcask_pulse.erl b/test/bitcask_pulse.erl index 6712a75c..45510746 100644 --- a/test/bitcask_pulse.erl +++ b/test/bitcask_pulse.erl @@ -802,7 +802,7 @@ fold_keys(H) -> bc_open(Writer, {MakeMergeFileP, Seed, Probability}) -> erlang:put(?BITCASK_TESTING_KEY, ?MODULE), if MakeMergeFileP -> - make_merge_file(?BITCASK, Seed, Probability); + bitcask:make_merge_file(?BITCASK, Seed, Probability); true -> ok end, @@ -1133,21 +1133,4 @@ mangle_temporal_relation_with_finite_time([H|T]) -> %% {check_no_tombstones, Else} %% end. -make_merge_file(Dir, Seed, Probability) -> - random:seed(Seed), - case filelib:is_dir(Dir) of - true -> - DataFiles = filelib:wildcard("*.data", Dir), - {ok, FH} = file:open(Dir ++ "/merge.txt", [write]), - [case random:uniform(100) < Probability of - true -> - io:format(FH, "~s\n", [DF]); - false -> - ok - end || DF <- DataFiles], - ok = file:close(FH); - false -> - ok - end. - -endif.