Skip to content
This repository has been archived by the owner on Oct 22, 2021. It is now read-only.

Commit

Permalink
Replicator: skip documents with empty ID
Browse files Browse the repository at this point in the history
Due to a bug, older releases allowed the creation of
documents with an empty ID, which are impossible to
GET therefore making the replicator crash.
This change simply skips such documents and logs
an error message to inform users.

This is a backport of revision 1177548 from trunk.


git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1177550 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
fdmanana committed Sep 30, 2011
1 parent 1285cd9 commit e14981f
Showing 1 changed file with 21 additions and 4 deletions.
25 changes: 21 additions & 4 deletions src/couchdb/couch_rep_changes_feed.erl
Expand Up @@ -491,13 +491,30 @@ purge_req_messages(ReqId) ->
ok
end.

queue_changes_row(Row, #state{doc_ids = nil, count = Count, rows = Rows}) ->
{queue:in(Row, Rows), Count + 1};
queue_changes_row(Row, #state{doc_ids = nil} = State) ->
maybe_queue_row(Row, State);
queue_changes_row({RowProps} = Row,
#state{doc_ids = Ids, count = Count, rows = Rows}) ->
#state{doc_ids = Ids, count = Count, rows = Rows} = State) ->
case lists:member(get_value(<<"id">>, RowProps), Ids) of
true ->
{queue:in(Row, Rows), Count + 1};
maybe_queue_row(Row, State);
false ->
{Rows, Count}
end.

maybe_queue_row({Props} = Row, #state{count = Count, rows = Rows} = State) ->
case get_value(<<"id">>, Props) of
<<>> ->
[_, Db | _] = State#state.init_args,
?LOG_ERROR("Replicator: ignoring document with empty ID in source "
"database `~s` (_changes sequence ~p)",
[dbname(Db), couch_util:get_value(<<"seq">>, Props)]),
{Rows, Count};
_ ->
{queue:in(Row, Rows), Count + 1}
end.

dbname(#http_db{url = Url}) ->
couch_util:url_strip_password(Url);
dbname(#db{name = Name}) ->
Name.

0 comments on commit e14981f

Please sign in to comment.