anchor.diff:      {ok, gb_sets:to_list(ReadableNodeSet), gb_sets:size(BlackSet)}.
   
   -spec do_choose_write_nodes([node_info()], non_neg_integer(), [node()], [node()]) ->
  -                                   {'ok', [node()]}.
  +                                   {ok, [node()]}.
   do_choose_write_nodes(Nodes, K, Exclude, BlackList) ->
       % Node selection algorithm:
       % 1. try to choose K nodes randomly from all the nodes which have
  
positive.code: %% internal functions
  
  -spec do_get_readable_nodes([node_info()], [node()]) ->
                                     {'ok', [node()], non_neg_integer()}.
  do_get_readable_nodes(Nodes, ReadBlacklist) ->
      NodeSet = gb_sets:from_ordset(lists:sort([Node || {Node, _} <- Nodes])),
      BlackSet = gb_sets:from_ordset(ReadBlacklist),
  
negative.code:     NewTags = [X || {_, V} = X <- gb_trees:to_list(S#state.tags), V =/= Pid],
      S#state{tags = gb_trees:from_orddict(NewTags)}.
  
  -spec do_get_tags(all | filter, [node()]) -> {[node()], [node()], [binary()]};
                   (safe, [node()]) -> {ok, [binary()]} | too_many_failed_nodes;
                   (gc, [node()]) -> {ok, [binary()], [node()]} | too_many_failed_nodes.
  do_get_tags(all, Nodes) ->
      {Replies, Failed} =
          gen_server:multi_call(Nodes, ddfs_node, get_tags, ?NODE_TIMEOUT),
  