Open
Description
Here's counterexample Cp8:
Cp8 = [[{set,{var,1},{call,bitcask_pulse,bc_open,[true,{true,{62,59,175},26}]}},{set,{var,2},{call,bitcask_pulse,puts,[{var,1},{2,3},<<188,81,240,255,122,185,227,8,104,196,56,142,250,34,8>>]}},{set,{var,6},{call,bitcask_pulse,bc_close,[{var,1}]}},{set,{var,10},{call,bitcask_pulse,fork,[[{init,{state,undefined,false,false,[]}},{set,{not_var,1},{not_call,bitcask_pulse,bc_open,[false,{true,{282,224,221},100}]}},{set,{not_var,2},{not_call,bitcask_pulse,fold,[{not_var,1}]}},{set,{not_var,3},{not_call,bitcask_pulse,fold,[{not_var,1}]}}]]}},{set,{var,12},{call,bitcask_pulse,bc_open,[true,{true,{270,229,202},55}]}},{set,{var,18},{call,bitcask_pulse,delete,[{var,12},2]}},{set,{var,19},{call,bitcask_pulse,merge,[{var,12}]}},{set,{var,20},{call,bitcask_pulse,fork_merge,[{var,12}]}},{set,{var,23},{call,bitcask_pulse,puts,[{var,12},{3,43},<<0,0,0,0>>]}},{set,{var,25},{call,bitcask_pulse,fold,[{var,12}]}},{set,{var,26},{call,bitcask_pulse,bc_close,[{var,12}]}},{set,{var,29},{call,bitcask_pulse,bc_open,[true,{true,{246,190,50},100}]}},{set,{var,35},{call,bitcask_pulse,delete,[{var,29},5]}},{set,{var,36},{call,bitcask_pulse,fold,[{var,29}]}}],{43245,66780,7696},[{events,[]}]].
[begin Now = {1405,406317,535184}, io:format("Now ~w ", [Now]), true = eqc:check(bitcask_pulse:prop_pulse(), [lists:nth(1,Cp8), Now, lists:nth(3,Cp8)]) end || _ <- lists:seq(1,100)].
That seed of {1405,406317,535184}
is nice & deterministic on my Mac. YMMV, substitute now()
in its place and run until you find something that fails very consistently.
The last three ops of the main thread are:
{set,{var,29},
{call,bitcask_pulse,bc_open,[true,{true,{246,190,50},100}]}},
{set,{var,35},{call,bitcask_pulse,delete,[{var,29},5]}},
{set,{var,36},{call,bitcask_pulse,fold,[{var,29}]}}],
The failure is key 5 should not be found by step 36's fold, but it is.
Bad:
[{0,410681,[]},
{410681,infinity,
[{bad,<<"pid_1">>,
{fold,[{2,[not_found]},
{3,[<<0,0,0,0>>]},
{4,[<<0,0,0,0>>]},
{5,[not_found]},
[...]
{43,[<<0,0,0,0>>]}],
[{3,<<0,0,0,0>>},
{4,<<0,0,0,0>>},
{5,<<0,0,0,0>>},
[...]
More research required. There's a possible race with a forked merge and/or with merge at open time via bitcask:make_merge_file()
.