Skip to content

Commit 577dc25

Browse files
committed
start followers on any error
ensure we start followers if leader node is down (rexi_DOWN) or is in maintenance mode (rexi_EXIT).
1 parent cd57656 commit 577dc25

File tree

1 file changed

+13
-5
lines changed

1 file changed

+13
-5
lines changed

src/fabric/src/fabric_doc_update.erl

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,24 +74,32 @@ go(DbName, AllDocs0, Opts) ->
7474
rexi_monitor:stop(RexiMon)
7575
end.
7676

77-
handle_message({rexi_DOWN, _, {_, NodeRef}, _}, _Worker, #acc{} = Acc0) ->
77+
handle_message({rexi_DOWN, _, {_, NodeRef}, _}, Worker, #acc{} = Acc0) ->
7878
#acc{grouped_docs = GroupedDocs} = Acc0,
7979
NewGrpDocs = [X || {#shard{node = N}, _} = X <- GroupedDocs, N =/= NodeRef],
80-
skip_message(Acc0#acc{waiting_count = length(NewGrpDocs), grouped_docs = NewGrpDocs});
80+
Acc1 = Acc0#acc{waiting_count = length(NewGrpDocs), grouped_docs = NewGrpDocs},
81+
Acc2 = start_followers(Worker, Acc1),
82+
skip_message(Acc2);
8183
handle_message({rexi_EXIT, _}, Worker, #acc{} = Acc0) ->
8284
#acc{waiting_count = WC, grouped_docs = GrpDocs} = Acc0,
8385
NewGrpDocs = lists:keydelete(Worker, 1, GrpDocs),
84-
skip_message(Acc0#acc{waiting_count = WC - 1, grouped_docs = NewGrpDocs});
86+
Acc1 = Acc0#acc{waiting_count = WC - 1, grouped_docs = NewGrpDocs},
87+
Acc2 = start_followers(Worker, Acc1),
88+
skip_message(Acc2);
8589
handle_message({error, all_dbs_active}, Worker, #acc{} = Acc0) ->
8690
% treat it like rexi_EXIT, the hope at least one copy will return successfully
8791
#acc{waiting_count = WC, grouped_docs = GrpDocs} = Acc0,
8892
NewGrpDocs = lists:keydelete(Worker, 1, GrpDocs),
89-
skip_message(Acc0#acc{waiting_count = WC - 1, grouped_docs = NewGrpDocs});
93+
Acc1 = Acc0#acc{waiting_count = WC - 1, grouped_docs = NewGrpDocs},
94+
Acc2 = start_followers(Worker, Acc1),
95+
skip_message(Acc2);
9096
handle_message(internal_server_error, Worker, #acc{} = Acc0) ->
9197
% happens when we fail to load validation functions in an RPC worker
9298
#acc{waiting_count = WC, grouped_docs = GrpDocs} = Acc0,
9399
NewGrpDocs = lists:keydelete(Worker, 1, GrpDocs),
94-
skip_message(Acc0#acc{waiting_count = WC - 1, grouped_docs = NewGrpDocs});
100+
Acc1 = Acc0#acc{waiting_count = WC - 1, grouped_docs = NewGrpDocs},
101+
Acc2 = start_followers(Worker, Acc1),
102+
skip_message(Acc2);
95103
handle_message(attachment_chunk_received, _Worker, #acc{} = Acc0) ->
96104
{ok, Acc0};
97105
handle_message({ok, Replies}, Worker, #acc{} = Acc0) ->

0 commit comments

Comments
 (0)