anchor.diff:                gen_server:reply(From, do_get_tags(Mode, [N || {N, _} <- Nodes]))
             end),
       {noreply, S}.
  +
  +handle_cast({tag_notify, M, Tag}, S) ->
  +    {noreply, do_tag_notify(M, Tag, S)};
   
   handle_cast({update_tag_cache, TagCache}, S) ->
       {noreply, S#state{tag_cache = TagCache}};
  
positive.code: 
  % Tag request: Start a new tag server if one doesn't exist already. Forward
  % the request to the tag server.
  -spec do_tag_request(term(), nonempty_string() | binary(), replyto(), state()) ->
                              state().
  do_tag_request(M, Tag, From, #state{tags = Tags, tag_cache = Cache} = S) ->
      {Pid, TagsN} =
          case gb_trees:lookup(Tag, Tags) of
              none ->
                  NotFound = (Cache =/= false
                              andalso not gb_sets:is_element(Tag, Cache)),
                  {ok, Server} = ddfs_tag:start(Tag, NotFound),
                  erlang:monitor(process, Server),
                  {Server, gb_trees:insert(Tag, Server, Tags)};
              {value, P} ->
                  {P, Tags}
          end,
      gen_server:cast(Pid, {M, From}),
      S#state{tags = TagsN,
              tag_cache = Cache =/= false andalso gb_sets:add(Tag, Cache)}.
  
  
negative.code:          get_read_nodes/0,
           choose_write_nodes/2,
           new_blob/3,
           tag_notify/2,
           tag_operation/2, tag_operation/3,
           update_nodes/1
          ]).
  