Skip to content

Commit 5b0d4f8

Browse files
DaveCTurnerGurkan Kaymak
authored and
Gurkan Kaymak
committed
Test that join validation checks the cluster UUID (elastic#41250)
This is a forward-port of parts of elastic#41063 to `master`, adding a test to show that join validation does indeed verify that the cluster UUIDs match. Relates elastic#37775
1 parent 488d1e9 commit 5b0d4f8

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,18 @@
2020

2121
import org.apache.logging.log4j.Level;
2222
import org.elasticsearch.Version;
23+
import org.elasticsearch.action.ActionListenerResponseHandler;
24+
import org.elasticsearch.action.support.PlainActionFuture;
25+
import org.elasticsearch.cluster.ClusterName;
26+
import org.elasticsearch.cluster.ClusterState;
2327
import org.elasticsearch.cluster.NotMasterException;
28+
import org.elasticsearch.cluster.metadata.MetaData;
2429
import org.elasticsearch.cluster.node.DiscoveryNode;
2530
import org.elasticsearch.common.settings.Settings;
2631
import org.elasticsearch.test.ESTestCase;
2732
import org.elasticsearch.test.transport.CapturingTransport;
2833
import org.elasticsearch.test.transport.CapturingTransport.CapturedRequest;
34+
import org.elasticsearch.test.transport.MockTransport;
2935
import org.elasticsearch.transport.RemoteTransportException;
3036
import org.elasticsearch.transport.TransportException;
3137
import org.elasticsearch.transport.TransportResponse;
@@ -35,6 +41,7 @@
3541
import java.util.Optional;
3642

3743
import static org.elasticsearch.node.Node.NODE_NAME_SETTING;
44+
import static org.hamcrest.Matchers.containsString;
3845
import static org.hamcrest.Matchers.equalTo;
3946
import static org.hamcrest.core.Is.is;
4047

@@ -131,4 +138,40 @@ public void testFailedJoinAttemptLogLevel() {
131138
new RemoteTransportException("caused by NotMasterException",
132139
new NotMasterException("test"))), is(Level.DEBUG));
133140
}
141+
142+
public void testJoinValidationRejectsMismatchedClusterUUID() {
143+
DeterministicTaskQueue deterministicTaskQueue = new DeterministicTaskQueue(
144+
Settings.builder().put(NODE_NAME_SETTING.getKey(), "node0").build(), random());
145+
MockTransport mockTransport = new MockTransport();
146+
DiscoveryNode localNode = new DiscoveryNode("node0", buildNewFakeTransportAddress(), Version.CURRENT);
147+
148+
final ClusterState localClusterState = ClusterState.builder(ClusterName.DEFAULT).metaData(MetaData.builder()
149+
.generateClusterUuidIfNeeded().clusterUUIDCommitted(true)).build();
150+
151+
TransportService transportService = mockTransport.createTransportService(Settings.EMPTY,
152+
deterministicTaskQueue.getThreadPool(), TransportService.NOOP_TRANSPORT_INTERCEPTOR,
153+
x -> localNode, null, Collections.emptySet());
154+
new JoinHelper(Settings.EMPTY, null, null, transportService, () -> 0L, () -> localClusterState,
155+
(joinRequest, joinCallback) -> { throw new AssertionError(); }, startJoinRequest -> { throw new AssertionError(); },
156+
Collections.emptyList()); // registers request handler
157+
transportService.start();
158+
transportService.acceptIncomingRequests();
159+
160+
final ClusterState otherClusterState = ClusterState.builder(ClusterName.DEFAULT).metaData(MetaData.builder()
161+
.generateClusterUuidIfNeeded()).build();
162+
163+
final PlainActionFuture<TransportResponse.Empty> future = new PlainActionFuture<>();
164+
transportService.sendRequest(localNode, JoinHelper.VALIDATE_JOIN_ACTION_NAME,
165+
new ValidateJoinRequest(otherClusterState),
166+
new ActionListenerResponseHandler<>(future, in -> TransportResponse.Empty.INSTANCE));
167+
deterministicTaskQueue.runAllTasks();
168+
169+
final CoordinationStateRejectedException coordinationStateRejectedException
170+
= expectThrows(CoordinationStateRejectedException.class, future::actionGet);
171+
assertThat(coordinationStateRejectedException.getMessage(),
172+
containsString("join validation on cluster state with a different cluster uuid"));
173+
assertThat(coordinationStateRejectedException.getMessage(), containsString(localClusterState.metaData().clusterUUID()));
174+
assertThat(coordinationStateRejectedException.getMessage(), containsString(otherClusterState.metaData().clusterUUID()));
175+
}
176+
134177
}

0 commit comments

Comments
 (0)