diff options
author | Robert Newson <rnewson@apache.org> | 2019-05-08 11:37:55 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-08 11:37:55 +0100 |
commit | edff0748358b88cc2ce16f4095d92c4e6c0af426 (patch) | |
tree | ab2021eb3a9ad8c0a6f73f8f6a9dea515f7bddf2 | |
parent | bd2823a447e477f0eead28b3b2bba441bad724fa (diff) | |
parent | a4145c2947d6b6c7e29757e2e477dc81dc53702d (diff) | |
download | couchdb-update-gitignore.tar.gz |
Merge branch 'master' into update-gitignoreupdate-gitignore
-rw-r--r-- | src/couch/src/couch_db.erl | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl index ab38eb895..52c3fbb76 100644 --- a/src/couch/src/couch_db.erl +++ b/src/couch/src/couch_db.erl @@ -1560,7 +1560,14 @@ calculate_start_seq(Db, _Node, {Seq, Uuid, EpochNode}) -> calculate_start_seq(Db, _Node, {replace, OriginalNode, Uuid, Seq}) -> case is_prefix(Uuid, couch_db:get_uuid(Db)) of true -> - start_seq(get_epochs(Db), OriginalNode, Seq); + try + start_seq(get_epochs(Db), OriginalNode, Seq) + catch throw:epoch_mismatch -> + couch_log:warning("~p start_seq duplicate uuid on node: ~p " + "db: ~p, seq: ~p, uuid: ~p, epoch_node: ~p", + [?MODULE, node(), Db#db.name, Seq, Uuid, OriginalNode]), + 0 + end; false -> {replace, OriginalNode, Uuid, Seq} end. @@ -1607,8 +1614,8 @@ start_seq([{_, NewSeq}, {OrigNode, _} | _], OrigNode, Seq) when Seq > NewSeq -> NewSeq; start_seq([_ | Rest], OrigNode, Seq) -> start_seq(Rest, OrigNode, Seq); -start_seq([], OrigNode, Seq) -> - erlang:error({epoch_mismatch, OrigNode, Seq}). +start_seq([], _OrigNode, _Seq) -> + throw(epoch_mismatch). fold_docs(Db, UserFun, UserAcc) -> @@ -1986,7 +1993,8 @@ calculate_start_seq_test_() -> t_calculate_start_seq_uuid_mismatch(), t_calculate_start_seq_is_owner(), t_calculate_start_seq_not_owner(), - t_calculate_start_seq_raw() + t_calculate_start_seq_raw(), + t_calculate_start_seq_epoch_mismatch() ] }. @@ -2031,6 +2039,14 @@ t_calculate_start_seq_raw() -> ?assertEqual(13, Seq) end). +t_calculate_start_seq_epoch_mismatch() -> + ?_test(begin + Db = test_util:fake_db([]), + SeqIn = {replace, not_this_node, get_uuid(Db), 42}, + Seq = calculate_start_seq(Db, node1, SeqIn), + ?assertEqual(0, Seq) + end). + is_owner_test() -> ?assertNot(is_owner(foo, 1, [])), ?assertNot(is_owner(foo, 1, [{foo, 1}])), |