anchor.diff:  -type node_info() :: {node(), {non_neg_integer(), non_neg_integer()}}.
   -type gc_stats() :: none | gc_run_stats().
   
  --record(state, {tags      = gb_trees:empty() :: gb_tree(),
  -                tag_cache = false            :: false | gb_set(),
  -                cache_refresher              :: pid(),
  +-record(state, {tags      = gb_trees:empty()          :: gb_tree(),
  +                tag_cache = {false, gb_sets:empty()}  :: {boolean(), gb_set()},
  +                cache_refresher                       :: pid(),
   
                   nodes             = []                :: [node_info()],
                   write_blacklist   = []                :: [node()],
  
positive.code: 
  -spec do_tag_request(term(), tagname(), replyto(), state()) ->
                              state().
  do_tag_request(M, Tag, From, #state{tags = Tags, tag_cache = Cache} = S) ->
      {Pid, TagsN} = get_tag_pid(Tag, Tags, Cache),
      gen_server:cast(Pid, {M, From}),
      S#state{tags = TagsN,
              tag_cache = Cache =/= false andalso gb_sets:add(Tag, Cache)}.
  
  -spec do_tag_notify(term(), tagname(), state()) -> state().
  do_tag_notify(M, Tag, #state{tags = Tags, tag_cache = Cache} = S) ->
      {Pid, TagsN} = get_tag_pid(Tag, Tags, Cache),
      gen_server:cast(Pid, {notify, M}),
      S#state{tags = TagsN,
              tag_cache = Cache =/= false andalso gb_sets:add(Tag, Cache)}.
  
  -spec do_update_nodes(nodes_update(), state()) -> state().
  do_update_nodes(NewNodes, #state{nodes = Nodes, tags = Tags} = S) ->
  
negative.code: % Tag request: Start a new tag server if one doesn't exist already. Forward
  % the request to the tag server.
  
  -spec get_tag_pid(tagname(), gb_tree(), {boolean(), gb_set()}) ->
                           {pid(), gb_tree()}.
  get_tag_pid(Tag, Tags, {Valid, Cache}) ->
      case gb_trees:lookup(Tag, Tags) of
          none ->
              NotFound = case Valid of
                  true -> not gb_sets:is_element(Tag, Cache);
                  false -> false
              end,
              {ok, Server} = ddfs_tag:start(Tag, NotFound),
              erlang:monitor(process, Server),
              {Server, gb_trees:insert(Tag, Server, Tags)};
  