Skip to content

Commit bd242ed

Browse files
committed
simplify cases
1 parent 7dcd656 commit bd242ed

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

server/src/main/java/org/elasticsearch/cluster/coordination/Coordinator.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,23 @@ private void handleJoinRequestUnderLock(JoinRequest joinRequest, JoinCallback jo
107107
}
108108
}
109109

110-
if (prevElectionWon == false && coordState.electionWon()) {
111-
joinHelper.addPendingJoin(joinRequest, joinCallback);
112-
becomeLeader("handleJoin");
113-
joinHelper.clearAndSubmitPendingJoins();
114-
} else if (mode == Mode.LEADER) {
115-
joinHelper.joinLeader(joinRequest, joinCallback);
116-
} else if (mode == Mode.FOLLOWER) {
117-
joinCallback.onFailure(new CoordinationStateRejectedException("join target is a follower"));
118-
} else {
119-
assert mode == Mode.CANDIDATE;
120-
joinHelper.addPendingJoin(joinRequest, joinCallback);
110+
switch (mode) {
111+
case LEADER:
112+
joinHelper.joinLeader(joinRequest, joinCallback);
113+
break;
114+
case FOLLOWER:
115+
assert joinRequest.getOptionalJoin().isPresent() == false : "follower should not have solicited join " + joinRequest;
116+
joinCallback.onFailure(new CoordinationStateRejectedException("join target is a follower"));
117+
break;
118+
case CANDIDATE:
119+
joinHelper.addPendingJoin(joinRequest, joinCallback);
120+
if (prevElectionWon == false && coordState.electionWon()) {
121+
becomeLeader("handleJoin");
122+
joinHelper.clearAndSubmitPendingJoins();
123+
}
124+
break;
125+
default:
126+
throw new AssertionError("unexpected mode when handling join: " + mode);
121127
}
122128
}
123129

server/src/test/java/org/elasticsearch/cluster/coordination/NodeJoinTests.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,25 @@ public void testJoinAccumulation() {
279279
FutureUtils.get(fut);
280280
}
281281

282+
public void testJoinFollowerWithHigherTerm() {
283+
DiscoveryNode node0 = newNode(0, true);
284+
DiscoveryNode node1 = newNode(1, true);
285+
long initialTerm = randomLongBetween(1, 10);
286+
long initialVersion = randomLongBetween(1, 10);
287+
setupFakeMasterServiceAndCoordinator(initialTerm, initialState(false, node0, initialTerm, initialVersion,
288+
new VotingConfiguration(Collections.singleton(node0.getId()))));
289+
long newTerm = initialTerm + randomLongBetween(1, 10);
290+
coordinator.coordinationState.get().handleStartJoin(new StartJoinRequest(node1, newTerm));
291+
synchronized (coordinator.mutex) {
292+
coordinator.becomeFollower("test", node1);
293+
}
294+
assertFalse(isLocalNodeElectedMaster());
295+
long newerTerm = newTerm + randomLongBetween(1, 10);
296+
joinNodeAndRun(new JoinRequest(node1,
297+
Optional.of(new Join(node1, node0, newerTerm, initialTerm, initialVersion))));
298+
assertTrue(isLocalNodeElectedMaster());
299+
}
300+
282301
public void testJoinFollowerFails() {
283302
DiscoveryNode node0 = newNode(0, true);
284303
DiscoveryNode node1 = newNode(1, true);
@@ -293,8 +312,7 @@ public void testJoinFollowerFails() {
293312
}
294313
assertFalse(isLocalNodeElectedMaster());
295314
assertThat(expectThrows(CoordinationStateRejectedException.class,
296-
() -> joinNodeAndRun(new JoinRequest(node1,
297-
Optional.of(new Join(node1, node0, newTerm, initialTerm, initialVersion))))).getMessage(),
315+
() -> joinNodeAndRun(new JoinRequest(node1, Optional.empty()))).getMessage(),
298316
containsString("join target is a follower"));
299317
assertFalse(isLocalNodeElectedMaster());
300318
}

0 commit comments

Comments
 (0)