anchor.diff:                  getq = http_queue:new(GetMax, ?HTTP_QUEUE_LENGTH),
                   scanner = Scanner}}.
   
  +-type put_blob_msg() :: {put_blob, nonempty_string()}.
  +-type get_tag_ts_msg() :: {get_tag_timestamp, tagname()}.
  +-type get_tag_data_msg() :: {get_tag_data, tagid(),
  +                             {erlang:timestamp(), volume_name()}}.
  +-type put_tag_data_msg() :: {put_tag_data, {tagid(), binary()}}.
  +-type put_tag_commit_msg() :: {put_tag_commit, tagname(),
  +                               [{node(), volume_name()}]}.
  +
  +-spec handle_call(get_tags, from(), state()) ->
  +                         {reply, [tagname()], state()};
  +                 (get_vols, from(), state()) ->
  +                         {reply, {[volume()], path()}, state()};
  +                 (get_blob, from(), state()) ->
  +                         {reply, full, state()} | {noreply, state()};
  +                 (get_diskspace, from(), state()) ->
  +                         {reply, diskinfo(), state()};
  +                 (put_blob_msg(), from(), state()) ->
  +                         {reply, put_blob_result(), state()} | {noreply, state()};
  +                 (get_tag_ts_msg(), from(), state()) ->
  +                         {reply, tag_ts(), state()};
  +                 (get_tag_data_msg(), from(), state()) -> {noreply, state()};
  +                 (put_tag_data_msg(), from(), state()) ->
  +                         {reply, put_tag_data_result(), state()};
  +                 (put_tag_commit_msg(), from(), state()) ->
  +                         {reply, {ok, url()} | {error, _}, state()}.
   handle_call(get_tags, _, #state{tags = Tags} = S) ->
       {reply, gb_trees:keys(Tags), S};
   
  
positive.code:             exit(Reason0)
      end.
  
  stop() ->
      gen_server:call(ddfs_node, stop).
  
  
negative.code:             gen_server:reply(From, {error, read_failed})
      end.
  
  -type put_tag_data_result() :: {'ok', volume_name()} | {'error', _}.
  -spec do_put_tag_data(tagname(), binary(), #state{}) -> put_tag_data_result().
  do_put_tag_data(_Tag, _Data, #state{vols = []}) ->
      {error, no_volumes};
  do_put_tag_data(Tag, Data, S) ->
  