State 4: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> <<>>))
/\ time = 3
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>> >>
/\ visible_nodes = (n1 :> {} @@ n2 :> {})
/\ registered = (a :> 1)
/\ inbox = ( n1 :> <<[action |-> "DOWN", from |-> n2]>> @@
n2 :> <<[action |-> "DOWN", from |-> n1]>> )
/\ names = (n1 :> {} @@ n2 :> {a})
State 5: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> <<>>))
/\ time = 4
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>> >>
/\ visible_nodes = (n1 :> {} @@ n2 :> {})
/\ registered = (a :> 1)
/\ inbox = (n1 :> <<>> @@ n2 :> <<[action |-> "DOWN", from |-> n1]>>)
/\ names = (n1 :> {} @@ n2 :> {a})
State 6: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> <<>>))
/\ time = 5
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>> >>
/\ visible_nodes = (n1 :> {} @@ n2 :> {})
/\ registered = (a :> 1)
/\ inbox = ( n1 :> <<>> @@
n2 :>
<< [action |-> "DOWN", from |-> n1],
[action |-> "register_or_update_on_node", name |-> a] >> )
/\ names = (n1 :> {} @@ n2 :> {})
State 7: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> <<>>))
/\ time = 6
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>> >>
/\ visible_nodes = (n1 :> {} @@ n2 :> {})
/\ registered = (a :> 1)
/\ inbox = (n1 :> <<>> @@ n2 :> <<[action |-> "register_or_update_on_node", name |-> a]>>)
/\ names = (n1 :> {} @@ n2 :> {})
State 8: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> (a :> 6)))
/\ time = 7
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>> >>
/\ visible_nodes = (n1 :> {} @@ n2 :> {})
/\ registered = (a :> 2)
/\ inbox = (n1 :> <<>> @@ n2 :> <<>>)
/\ names = (n1 :> {} @@ n2 :> {})
State 9: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> (a :> 6)))
/\ time = 8
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 2)
/\ inbox = ( n1 :> <<[action |-> "discover", from |-> n2]>> @@
n2 :> <<[action |-> "discover", from |-> n1]>> )
/\ names = (n1 :> {} @@ n2 :> {})
State 10: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> (a :> 6)))
/\ time = 9
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>>,
<<"Unregister", n2, a>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 2)
/\ inbox = ( n1 :> <<[action |-> "discover", from |-> n2]>> @@
n2 :>
<< [action |-> "discover", from |-> n1],
[action |-> "unregister_on_node", name |-> a] >> )
/\ names = (n1 :> {} @@ n2 :> {})
State 11: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> (a :> 6)))
/\ time = 10
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>>,
<<"Unregister", n2, a>>,
<<"Discover", n1, n2>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 2)
/\ inbox = (n1 :> <<>> @@ n2 :> <<[action |-> "discover", from |-> n1], [action |-> "unregister_on_node", name |-> a], [action |-> "ack_sync", from |-> n1, local_data |-> (a :> 2)]>>)
/\ names = (n1 :> {} @@ n2 :> {})
State 12: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> (a :> 2) @@ n2 :> <<>>) @@ n2 :> (n1 :> <<>> @@ n2 :> (a :> 6)))
/\ time = 11
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>>,
<<"Unregister", n2, a>>,
<<"Discover", n1, n2>>,
<<"Discover", n2, n1>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 2)
/\ inbox = (n1 :> <<[action |-> "ack_sync", from |-> n2, local_data |-> (a :> 6)]>> @@ n2 :> <<[action |-> "unregister_on_node", name |-> a], [action |-> "ack_sync", from |-> n1, local_data |-> (a :> 2)]>>)
/\ names = (n1 :> {} @@ n2 :> {})
State 13: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> << >> @@ n2 :> (a :> 6)) @@ n2 :> (n1 :> <<>> @@ n2 :> (a :> 6)))
/\ time = 12
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>>,
<<"Unregister", n2, a>>,
<<"Discover", n1, n2>>,
<<"Discover", n2, n1>>,
<<"AckSync", n1, n2>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 1)
/\ inbox = (n1 :> <<>> @@ n2 :> <<[action |-> "unregister_on_node", name |-> a], [action |-> "ack_sync", from |-> n1, local_data |-> (a :> 2)]>>)
/\ names = (n1 :> {} @@ n2 :> {})
State 14: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> << >> @@ n2 :> (a :> 6)) @@ n2 :> (n1 :> <<>> @@ n2 :> << >>))
/\ time = 13
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>>,
<<"Unregister", n2, a>>,
<<"Discover", n1, n2>>,
<<"Discover", n2, n1>>,
<<"AckSync", n1, n2>>,
<<"UnregisterOnNode", n2, a>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 0)
/\ inbox = (n1 :> <<[action |-> "sync_unregister", name |-> a, from |-> n2]>> @@ n2 :> <<[action |-> "ack_sync", from |-> n1, local_data |-> (a :> 2)]>>)
/\ names = (n1 :> {} @@ n2 :> {})
State 15: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> << >> @@ n2 :> << >>) @@ n2 :> (n1 :> <<>> @@ n2 :> << >>))
/\ time = 14
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>>,
<<"Unregister", n2, a>>,
<<"Discover", n1, n2>>,
<<"Discover", n2, n1>>,
<<"AckSync", n1, n2>>,
<<"UnregisterOnNode", n2, a>>,
<<"SyncUnregister", n1, a>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 0)
/\ inbox = (n1 :> <<>> @@ n2 :> <<[action |-> "ack_sync", from |-> n1, local_data |-> (a :> 2)]>>)
/\ names = (n1 :> {} @@ n2 :> {})
State 16: <Next line 249, col 5 to line 261, col 22 of module syn>
/\ disconnections = 1
/\ locally_registered = (n1 :> (n1 :> << >> @@ n2 :> << >>) @@ n2 :> (n1 :> (a :> 2) @@ n2 :> << >>))
/\ time = 15
/\ states = << <<"Register", n1, a>>,
<<"Disconnect", n1, n2>>,
<<"RegisterOrUpdateOnNode", n1, a>>,
<<"Down", n1, n2>>,
<<"Register", n2, a>>,
<<"Down", n2, n1>>,
<<"RegisterOrUpdateOnNode", n2, a>>,
<<"Reconnect", n2, n1>>,
<<"Unregister", n2, a>>,
<<"Discover", n1, n2>>,
<<"Discover", n2, n1>>,
<<"AckSync", n1, n2>>,
<<"UnregisterOnNode", n2, a>>,
<<"SyncUnregister", n1, a>>,
<<"AckSync", n2, n1>> >>
/\ visible_nodes = (n1 :> {n2} @@ n2 :> {n1})
/\ registered = (a :> 0)
/\ inbox = (n1 :> <<>> @@ n2 :> <<>>)
/\ names = (n1 :> {} @@ n2 :> {})
Once re-connected, the sync takes place; but one node also un-registers the name, and we somehow end up with a zombie registration (to a pid that was killed by the conflict resolution).
So far, I’ve not been able to find anything in the Syn code (or the Erlang VM) that prevents this; but I’m quite open to it being a problem with my model 🤷