anchor.diff:  
   %% Internal functions
   
  +collect_status(Nodes) ->
  +    receive
  +        {heartbeat, Name, Status} ->
  +            Nodes1 = update_status(Name, Status, Nodes),
  +            collect_status(Nodes1)
  +    after 0 ->
  +            Nodes
  +    end.
  +
  +
   update_status(Name, Status, Dict) ->
       Node = [{last_heard, erlang:now()} | Status],
       dict:store(Name, Node, Dict).
  
positive.code:     {ok, #state{nodes=dict:new()}}.
  
  handle_call(get_nodes, _From, State) ->
      Now = erlang:now(),
      Nodes = dict:map(fun (_, Node) ->
                               LastHeard = proplists:get_value(last_heard, Node),
                               case timer:now_diff(Now, LastHeard) > ?STALE_TIME of
                                       true -> [ stale | Node];
                                   false -> Node
                               end
                        end, State#state.nodes),
      {reply, Nodes, State}.
  
  handle_cast({heartbeat, Name, Status}, State) ->
      Nodes = update_status(Name, Status, State#state.nodes),
      {noreply, State#state{nodes=Nodes}}.
  
  handle_info(acquire_initial_status, #state{nodes=NodeDict} = State) ->
      {Replies, BadNodes} = gen_server:multi_call(ns_heart, status),
  
negative.code:                         end, NodeDict, Replies),
      error_logger:info_msg("~p got initial status ~p~n", [?MODULE, Nodes]),
      {noreply, State#state{nodes=Nodes}};
  
  handle_info({heartbeat, Name, Status}, State) ->
      Nodes = update_status(Name, Status, State#state.nodes),
      {noreply, State#state{nodes=Nodes}};
  
  handle_info(Info, State) ->
      error_logger:info_msg("ns_doctor: got unexpected message ~p in state ~p.~n",
                            [Info, State]),
  