anchor.diff:      Config = get_config(Args),
       Test = proplists:get_value(test, Args),
       OldState = read_latest_state_file(Test, Config),
  +    showroom_log:message(info, "membership: membership server starting...", []),
  +    net_kernel:monitor_nodes(true),
       State = handle_init(Test, OldState),
       {ok, State#mem{args=Args}}.
   
  
positive.code:     NodeParts.
  
  
  %% cache table helper functions
  update_cache(#mem{nodes=Nodes, args=Args}) ->
      Config = get_config(Args),
      {Pmap, Fullmap} = create_maps(Config, first, Nodes, []),
      update_cache(Pmap, Fullmap).
  
  
  update_cache(Pmap, Fullmap) ->
      mochiglobal:put(pmap, Pmap),
      mochiglobal:put(fullmap, Fullmap).
  
negative.code: 
  ping_all_yall(Nodes) ->
      lists:map(fun(Node) -> net_adm:ping(Node) end, Nodes).
  
  
  get_remote_states(NodeList) ->
      NodeList1 = lists:delete(node(), NodeList),
      {States1, BadNodes} = rpc:multicall(NodeList1, mem3, state, [], 5000),
      {_Status, States2} = lists:unzip(States1),
      {States2, BadNodes}.
  
  
  %% @doc compare state with states based on vector clock
  %%      return match | {bad_state_match, Node, NodesThatDontMatch}
  compare_state_with_rest(#mem{node=Node, clock=Clock} = _State, States) ->
      Results = lists:map(fun(#mem{node=Node1, clock=Clock1}) ->
          {vector_clock:equals(Clock, Clock1), Node1}
      end, States),
      BadResults = lists:foldl(fun({true, _N}, AccIn) -> AccIn;
          ({false, N}, AccIn) -> [N | AccIn] end, [], Results),
      if
      length(BadResults) == 0 -> match;
      true -> {bad_state_match, Node, BadResults}
      end.
  