Skip to content

Commit 75529ac

Browse files
committed
Merge remote-tracking branch 'origin/otp' into hbbft
2 parents 491f79b + cd8992a commit 75529ac

File tree

6 files changed

+74
-22
lines changed

6 files changed

+74
-22
lines changed

analysis/partisan-causality-zraft

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[].
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[
2+
{causality, []},
3+
{background, []}
4+
].

bin/check-zraft.sh

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,19 @@ export MODULE=zraft
44
export SUBLIST=0
55
export PRELOAD_SCHEDULES=false
66
export RECURSIVE=true
7-
export EXIT_ON_COUNTEREXAMPLE=true
7+
# export EXIT_ON_COUNTEREXAMPLE=true
88
export PRUNING=false
99
export SYSTEM_MODEL=prop_partisan_zraft
10+
export RESTART_NODES=true
11+
12+
# echo "Running example suite to identify minimal successful example..."
13+
# rm -rf priv/lager; pkill -9 beam.smp; DISABLE_RANDOM=true RESTART_NODES=${RESTART_NODES} IMPLEMENTATION_MODULE=${MODULE} NUM_TESTS=3 SCHEDULER=single_success bin/counterexample-find.sh
14+
15+
# echo "Replaying existing example..."
16+
# rm -rf priv/lager; pkill -9 beam.smp; REPLAY=true DISABLE_RANDOM=true RESTART_NODES=${RESTART_NODES} IMPLEMENTATION_MODULE=${MODULE} NUM_TESTS=3 SCHEDULER=single_success bin/counterexample-replay.sh
17+
18+
# echo "Running single run model checker..."
19+
# rm -rf priv/lager; pkill -9 beam.smp; TRACE_FILE=/tmp/partisan-latest.trace REPLAY_TRACE_FILE=/tmp/partisan-replay.trace PRELOAD_OMISSIONS_FILE=/tmp/partisan-preload.trace SHRINKING=true REPLAY=true SYSTEM_MODEL=${SYSTEM_MODEL} IMPLEMENTATION_MODULE=${MODULE} RESTART_NODES=${RESTART_NODES} ./rebar3 ct --readable=false -v --suite=filibuster_SUITE --case=model_checker_test
1020

1121
echo "Running multi run fault-injector..."
12-
rm -rf priv/lager; pkill -9 beam.smp; DISABLE_RANDOM=true RESTART_NODES=false IMPLEMENTATION_MODULE=${MODULE} NUM_TESTS=10 SCHEDULER=finite_fault FAULT_INJECTION=true bin/counterexample-find.sh
22+
rm -rf priv/lager; pkill -9 beam.smp; DISABLE_RANDOM=true RESTART_NODES=${RESTART_NODES} IMPLEMENTATION_MODULE=${MODULE} NUM_TESTS=10 SCHEDULER=finite_fault FAULT_INJECTION=true bin/counterexample-find.sh

src/partisan_util.erl

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,8 @@ gensym(Name) when is_atom(Name) ->
301301
gensym(Pid) when is_pid(Pid) ->
302302
{partisan_process_reference, pid_to_list(Pid)};
303303
gensym(Ref) when is_reference(Ref) ->
304-
{partisan_encoded_reference, term_to_binary(Ref)}.
304+
% {partisan_encoded_reference, binary_to_list(term_to_binary(Ref))}.
305+
{partisan_encoded_reference, 1}.
305306

306307
ref(Ref) ->
307308
GenSym = gensym(Ref),
@@ -320,14 +321,16 @@ pid(Pid) ->
320321
case partisan_config:get(register_pid_for_encoding, false) of
321322
true ->
322323
Unique = erlang:unique_integer([monotonic, positive]),
323-
Name = "partisan_registered_name_" ++ integer_to_list(Unique),
324324

325-
case process_info(Pid, registered_name) of
325+
Name = case process_info(Pid, registered_name) of
326326
{registered_name, OldName} ->
327327
lager:info("unregistering pid: ~p with name: ~p", [Pid, OldName]),
328-
unregister(OldName);
328+
329+
%% TODO: Race condition on unregister/register.
330+
unregister(OldName),
331+
atom_to_list(OldName);
329332
[] ->
330-
ok
333+
"partisan_registered_name_" ++ integer_to_list(Unique)
331334
end,
332335

333336
lager:info("registering pid: ~p as name: ~p at node: ~p", [Pid, Name, Node]),
@@ -337,25 +340,30 @@ pid(Pid) ->
337340
{partisan_remote_reference, Node, {partisan_process_reference, pid_to_list(Pid)}}
338341
end;
339342
_ ->
340-
%% This is super dangerous.
343+
%% This is even mmore super dangerous.
341344
case partisan_config:get(register_pid_for_encoding, false) of
342345
true ->
343346
Unique = erlang:unique_integer([monotonic, positive]),
347+
344348
Name = "partisan_registered_name_" ++ integer_to_list(Unique),
345349
[_, B, C] = string:split(pid_to_list(Pid), ".", all),
346350
RewrittenProcessIdentifier = "<0." ++ B ++ "." ++ C,
351+
347352
RegisterFun = fun() ->
348353
RewrittenPid = list_to_pid(RewrittenProcessIdentifier),
349354

350-
case process_info(RewrittenPid, registered_name) of
355+
NewName = case process_info(RewrittenPid, registered_name) of
351356
{registered_name, OldName} ->
352357
lager:info("unregistering pid: ~p with name: ~p", [Pid, OldName]),
353-
unregister(OldName);
358+
359+
%% TODO: Race condition on unregister/register.
360+
unregister(OldName),
361+
atom_to_list(OldName);
354362
[] ->
355-
ok
363+
Name
356364
end,
357365

358-
erlang:register(list_to_atom(Name), RewrittenPid)
366+
erlang:register(list_to_atom(NewName), RewrittenPid)
359367
end,
360368
lager:info("registering pid: ~p as name: ~p at node: ~p", [Pid, Name, Node]),
361369
%% TODO: Race here unless we wait.

test/filibuster_SUITE.erl

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,14 @@ model_checker_test(_Config) ->
300300

301301
%% Compile cover.
302302
{ok, Base} = file:get_cwd(),
303-
{ok, ImplementationModule} = cover:compile(filename:join([Base, "../../../../protocols/" ++ atom_to_list(ImplementationModule) ++ ".erl"])),
303+
CoverModule = filename:join([Base, "../../../../protocols/" ++ atom_to_list(ImplementationModule) ++ ".erl"]),
304+
case filelib:is_file(CoverModule) of
305+
true ->
306+
{ok, _ImplementationModule} = cover:compile(filename:join([Base, "../../../../protocols/" ++ atom_to_list(ImplementationModule) ++ ".erl"])),
307+
ok;
308+
false ->
309+
ok
310+
end,
304311

305312
%% Print cover modules.
306313
% CoverModules = cover:modules(),
@@ -370,6 +377,8 @@ model_checker_test(_Config) ->
370377
%% ===================================================================
371378

372379
execute(Nodes, PerformPreloads, Replaying, Shrinking, Tracing, {M, F, A}) ->
380+
debug("execute starting...", []),
381+
373382
%% Ensure replaying option is set.
374383
lists:foreach(fun({ShortName, _}) ->
375384
ok = rpc:call(?NAME(ShortName), partisan_config, set, [replaying, Replaying])
@@ -419,6 +428,7 @@ execute(Nodes, PerformPreloads, Replaying, Shrinking, Tracing, {M, F, A}) ->
419428
end, Nodes),
420429

421430
%% Run proper.
431+
debug("running proper check for ~p:~p(~p)...", [M, F, A]),
422432
Result = proper:check(M:F(), A, []),
423433
debug("execute result: ~p", [Result]),
424434

@@ -427,6 +437,8 @@ execute(Nodes, PerformPreloads, Replaying, Shrinking, Tracing, {M, F, A}) ->
427437

428438
%% Stop tracing infrastructure.
429439
partisan_trace_orchestrator:stop(),
440+
441+
debug("execute returning: ~p", [Result]),
430442

431443
Result.
432444

@@ -977,6 +989,9 @@ message_type(Message) ->
977989
MessageType1 = element(1, MessagePayload),
978990

979991
ActualType = case MessageType1 of
992+
'$gen_sync_all_state_event' ->
993+
CastMessage = element(2, MessagePayload),
994+
element(1, CastMessage);
980995
'$gen_cast' ->
981996
CastMessage = element(2, MessagePayload),
982997
element(1, CastMessage);
@@ -990,6 +1005,9 @@ message_type(Message) ->
9901005
MessageType1 = element(1, Payload),
9911006

9921007
ActualType = case MessageType1 of
1008+
'$gen_sync_all_state_event' ->
1009+
CastMessage = element(2, Payload),
1010+
element(1, CastMessage);
9931011
'$gen_cast' ->
9941012
CastMessage = element(2, Payload),
9951013
element(1, CastMessage);
@@ -1272,11 +1290,11 @@ execute_schedule(StartTime, CurrentIteration, Nodes, Counterexample, PreloadOmis
12721290
ClassificationsExplored = ClassificationsExplored0 ++ [Classification],
12731291
% debug("=> Classification for this test: ~p~n", [Classification]),
12741292

1275-
% MessageTypes = message_types(FinalTraceLines),
1276-
% debug("=> MessageTypes for this test: ~p~n", [MessageTypes]),
1293+
MessageTypes = message_types(FinalTraceLines),
1294+
debug("=> MessageTypes for this test: ~p~n", [MessageTypes]),
12771295

1278-
% OmissionTypes = message_types(Omissions),
1279-
% debug("=> OmissionTypes for this test: ~p~n", [OmissionTypes]),
1296+
OmissionTypes = message_types(Omissions),
1297+
debug("=> OmissionTypes for this test: ~p~n", [OmissionTypes]),
12801298

12811299
%% Run the trace.
12821300
CommandFun = fun() ->

test/prop_partisan_zraft.erl

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ value() ->
6060

6161
%% How many nodes to run?
6262
node_num_nodes() ->
63-
5.
63+
3.
6464

6565
%% What node-specific operations should be called.
6666
node_commands() ->
@@ -78,7 +78,7 @@ node_assertion_functions() ->
7878

7979
%% Global functions.
8080
node_global_functions() ->
81-
[check_delivery, sleep].
81+
[sleep, check_delivery].
8282

8383
%% What should the initial node state be.
8484
node_initial_state() ->
@@ -150,7 +150,7 @@ node_next_state(_State, NodeState, Response, Command) ->
150150
node_postcondition(#node_state{values=Values}, {call, ?MODULE, check_delivery, []}, Results) ->
151151
node_debug("verifying all written results are found: ~p", [Results]),
152152

153-
lists:foldl(fun({Key, Value}, All) ->
153+
PostconditionResult = lists:foldl(fun({Key, Value}, All) ->
154154
case dict:find(Key, Values) of
155155
{ok, Value} ->
156156
node_debug("=> found key ~p with value ~p", [Key, Value]),
@@ -168,7 +168,11 @@ node_postcondition(#node_state{values=Values}, {call, ?MODULE, check_delivery, [
168168
false andalso All
169169
end
170170
end
171-
end, true, Results);
171+
end, true, Results),
172+
173+
node_debug("=> postcondition result: ~p", [PostconditionResult]),
174+
175+
PostconditionResult;
172176
node_postcondition(_NodeState, {call, ?MODULE, session_read, [_Node, _Key]}, {error, timeout}) ->
173177
node_debug("=> read failed, leader unavailable...", []),
174178
true;
@@ -198,6 +202,7 @@ node_postcondition(#node_state{values=Values}, {call, ?MODULE, read, [_Node, Key
198202
node_postcondition(_NodeState, {call, ?MODULE, sleep, []}, _Result) ->
199203
true;
200204
node_postcondition(_NodeState, {call, ?MODULE, session_write, [_Node, _Key, _Value]}, {ok, _}) ->
205+
node_debug("=> write returned OK.", []),
201206
true;
202207
node_postcondition(_NodeState, {call, ?MODULE, write, [_Node, _Key, _Value]}, {ok, _}) ->
203208
true;
@@ -225,7 +230,7 @@ sleep() ->
225230
?PROPERTY_MODULE:command_preamble(RunnerNode, [sleep]),
226231

227232
node_debug("sleeping for convergence...", []),
228-
timer:sleep(40000),
233+
timer:sleep(1000),
229234

230235
?PROPERTY_MODULE:command_conclusion(RunnerNode, [sleep]),
231236

@@ -344,6 +349,12 @@ node_begin_case() ->
344349
ok = rpc:call(?NAME(ShortName), partisan_config, set, [pid_encoding, true])
345350
end, Nodes),
346351

352+
%% Enable register_pid_for_encoding.
353+
lists:foreach(fun({ShortName, _}) ->
354+
node_debug("enabling register_pid_for_encoding at node ~p", [ShortName]),
355+
ok = rpc:call(?NAME(ShortName), partisan_config, set, [register_pid_for_encoding, true])
356+
end, Nodes),
357+
347358
%% Load, configure, and start zraft.
348359
lists:foreach(fun({ShortName, _}) ->
349360
% node_debug("starting zraft_lib at node ~p", [ShortName]),

0 commit comments

Comments
 (0)