Skip to content

Commit 0d95609

Browse files
committed
Fix bug where a late written event could accidentally confirm
unwritten entries in a higher term.
1 parent 6189639 commit 0d95609

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

src/ra_server.erl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,14 +1346,17 @@ handle_follower(#heartbeat_rpc{leader_id = LeaderId,
13461346
cfg := #cfg{id = Id}} = State) ->
13471347
Reply = heartbeat_reply(CurTerm, QueryIndex),
13481348
{follower, State, [cast_reply(Id, LeaderId, Reply)]};
1349-
handle_follower({ra_log_event, {written, _, _} = Evt},
1349+
handle_follower({ra_log_event, {written, TERM, _} = Evt},
13501350
State0 = #{log := Log0,
13511351
cfg := #cfg{id = Id},
13521352
leader_id := LeaderId,
1353-
current_term := Term})
1353+
current_term := TERM = Term})
13541354
when LeaderId =/= undefined ->
13551355
{Log, Effects} = ra_log:handle_event(Evt, Log0),
13561356
State = State0#{log => Log},
1357+
%% only reply with success if the written event relates to the current
1358+
%% term. this avoids accidentally confirming overwritten indexes too
1359+
%% early
13571360
Reply = append_entries_reply(Term, true, State),
13581361
{follower, State, [cast_reply(Id, LeaderId, Reply) | Effects]};
13591362
handle_follower({ra_log_event, Evt}, State = #{log := Log0}) ->

0 commit comments

Comments
 (0)