anchor.diff:              Callback,
               get_start_seq(DbName, Args),
               Acc,
  -            Timeout,
  -            TimeoutFun
  +            Timeout
           )
       after
           stop_update_notifiers(Notifiers),
  
positive.code: find_replacement_shards(#shard{range=Range}, AllShards) ->
      % TODO make this moar betta -- we might have split or merged the partition
      [Shard || Shard <- AllShards, Shard#shard.range =:= Range].
  
negative.code:     ),
      Callback({stop, pack_seqs(Seqs)}, AccOut).
  
  keep_sending_changes(DbName, Args, Callback, Seqs, AccIn, Timeout) ->
      #changes_args{limit=Limit, feed=Feed, heartbeat=Heartbeat} = Args,
      {ok, Collector} = send_changes(DbName, Args, Callback, Seqs, AccIn),
      #collector{limit=Limit2, counters=NewSeqs, user_acc=AccOut} = Collector,
      LastSeq = pack_seqs(NewSeqs),
      if Limit > Limit2, Feed == "longpoll" ->
          Callback({stop, LastSeq}, AccOut);
      true ->
          case wait_db_updated(Timeout) of
          updated ->
              keep_sending_changes(
                  DbName,
                  Args#changes_args{limit=Limit2},
                  Callback,
                  LastSeq,
                  AccOut,
                  Timeout
              );
          timeout ->
              case Heartbeat of undefined ->
                  Callback({stop, LastSeq}, AccOut);
              _ ->
                  {ok, AccTimeout} = Callback(timeout, AccOut),
                  keep_sending_changes(DbName, Args#changes_args{limit=Limit2},
                      Callback, LastSeq, AccTimeout, Timeout)
              end
          end
      end.
  
  