diff --git a/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java b/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java index bb91c4f6cbab2..d387ba5e27460 100644 --- a/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java +++ b/server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java @@ -651,6 +651,13 @@ public RemoteClusterClient getRemoteClusterClient( DisconnectedStrategy disconnectedStrategy ) { ensureClientIsEnabled(); + if (isStateless && disconnectedStrategy == DisconnectedStrategy.RECONNECT_UNLESS_SKIP_UNAVAILABLE) { + final var message = "DisconnectedStrategy [" + + DisconnectedStrategy.RECONNECT_UNLESS_SKIP_UNAVAILABLE + + "] is not supported in stateless environments"; + assert false : message; + throw new IllegalArgumentException(message); + } if (transportService.getRemoteClusterService().getRegisteredRemoteClusterNames().contains(clusterAlias) == false) { throw new NoSuchRemoteClusterException(clusterAlias); } diff --git a/server/src/test/java/org/elasticsearch/transport/RemoteClusterClientTests.java b/server/src/test/java/org/elasticsearch/transport/RemoteClusterClientTests.java index 362ae54c8611d..cab6a1df72986 100644 --- a/server/src/test/java/org/elasticsearch/transport/RemoteClusterClientTests.java +++ b/server/src/test/java/org/elasticsearch/transport/RemoteClusterClientTests.java @@ -244,6 +244,34 @@ public void testRemoteClusterServiceNotEnabled() { } } + public void testGetRemoteClusterClientRejectsReconnectUnlessSkipUnavailableInStateless() { + final var settings = Settings.builder().put("stateless.enabled", true).putList("node.roles", "remote_cluster_client").build(); + try ( + MockTransportService service = MockTransportService.createNewService( + settings, + VersionInformation.CURRENT, + TransportVersion.current(), + threadPool, + null + ) + ) { + final var remoteClusterService = service.getRemoteClusterService(); + final var unsupportedDisconnectedStrategy = RemoteClusterService.DisconnectedStrategy.RECONNECT_UNLESS_SKIP_UNAVAILABLE; + final var error = expectThrows( + AssertionError.class, + () -> remoteClusterService.getRemoteClusterClient( + "test", + EsExecutors.DIRECT_EXECUTOR_SERVICE, + unsupportedDisconnectedStrategy + ) + ); + assertThat( + error.getMessage(), + equalTo("DisconnectedStrategy [" + unsupportedDisconnectedStrategy + "] is not supported in stateless environments") + ); + } + } + public void testQuicklySkipUnavailableClusters() throws Exception { Settings remoteSettings = Settings.builder().put(ClusterName.CLUSTER_NAME_SETTING.getKey(), "foo_bar_cluster").build(); try (