Skip to content

Commit d3cc5bf

Browse files
committed
Give helpful message on remote connections disabled (#53690)
Today when cluster.remote.connect is set to false, and some aspect of the codebase tries to get a remote client, today we return a no such remote cluster exception. This can be quite perplexing to users, especially if the remote cluster is actually defined in their cluster state, it is only that the local node is not a remote cluter client. This commit addresses this by providing a dedicated error message when a remote cluster is not available because the local node is not a remote cluster client.
1 parent 70cfedf commit d3cc5bf

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

server/src/main/java/org/elasticsearch/transport/RemoteClusterService.java

+16
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,18 @@ public String getKey(final String key) {
164164
(ns, key) -> boolSetting(key, TransportSettings.TRANSPORT_COMPRESS,
165165
new RemoteConnectionEnabled<>(ns, key), Setting.Property.Dynamic, Setting.Property.NodeScope));
166166

167+
private final boolean enabled;
168+
169+
public boolean isEnabled() {
170+
return enabled;
171+
}
172+
167173
private final TransportService transportService;
168174
private final Map<String, RemoteClusterConnection> remoteClusters = ConcurrentCollections.newConcurrentMap();
169175

170176
RemoteClusterService(Settings settings, TransportService transportService) {
171177
super(settings);
178+
this.enabled = ENABLE_REMOTE_CLUSTERS.get(settings);
172179
this.transportService = transportService;
173180
}
174181

@@ -248,6 +255,9 @@ public Transport.Connection getConnection(String cluster) {
248255
}
249256

250257
RemoteClusterConnection getRemoteClusterConnection(String cluster) {
258+
if (enabled == false) {
259+
throw new IllegalArgumentException("remote cluster service is not enabled");
260+
}
251261
RemoteClusterConnection connection = remoteClusters.get(cluster);
252262
if (connection == null) {
253263
throw new NoSuchRemoteClusterException(cluster);
@@ -385,6 +395,9 @@ public Stream<RemoteConnectionInfo> getRemoteConnectionInfos() {
385395
* function on success.
386396
*/
387397
public void collectNodes(Set<String> clusters, ActionListener<BiFunction<String, String, DiscoveryNode>> listener) {
398+
if (enabled == false) {
399+
throw new IllegalArgumentException("remote cluster service is not enabled");
400+
}
388401
Map<String, RemoteClusterConnection> remoteClusters = this.remoteClusters;
389402
for (String cluster : clusters) {
390403
if (remoteClusters.containsKey(cluster) == false) {
@@ -428,6 +441,9 @@ public void onFailure(Exception e) {
428441
* @throws IllegalArgumentException if the given clusterAlias doesn't exist
429442
*/
430443
public Client getRemoteClusterClient(ThreadPool threadPool, String clusterAlias) {
444+
if (transportService.getRemoteClusterService().isEnabled() == false) {
445+
throw new IllegalArgumentException("remote cluster service is not enabled");
446+
}
431447
if (transportService.getRemoteClusterService().getRemoteClusterNames().contains(clusterAlias) == false) {
432448
throw new NoSuchRemoteClusterException(clusterAlias);
433449
}

server/src/test/java/org/elasticsearch/transport/RemoteClusterClientTests.java

+14
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.util.concurrent.TimeUnit;
3535

3636
import static org.elasticsearch.transport.RemoteClusterConnectionTests.startTransport;
37+
import static org.hamcrest.Matchers.equalTo;
3738

3839
public class RemoteClusterClientTests extends ESTestCase {
3940
private final ThreadPool threadPool = new TestThreadPool(getClass().getName());
@@ -119,4 +120,17 @@ public void onNodeDisconnected(DiscoveryNode node, Transport.Connection connecti
119120
}
120121
}
121122
}
123+
124+
public void testRemoteClusterServiceNotEnabled() {
125+
final Settings settings = Settings.builder().put(RemoteClusterService.ENABLE_REMOTE_CLUSTERS.getKey(), false).build();
126+
try (MockTransportService service = MockTransportService.createNewService(settings, Version.CURRENT, threadPool, null)) {
127+
service.start();
128+
service.acceptIncomingRequests();
129+
final RemoteClusterService remoteClusterService = service.getRemoteClusterService();
130+
final IllegalArgumentException e =
131+
expectThrows(IllegalArgumentException.class, () -> remoteClusterService.getRemoteClusterClient(threadPool, "test"));
132+
assertThat(e.getMessage(), equalTo("remote cluster service is not enabled"));
133+
}
134+
}
135+
122136
}

server/src/test/java/org/elasticsearch/transport/RemoteClusterServiceTests.java

+25
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import java.util.HashSet;
4343
import java.util.List;
4444
import java.util.Map;
45+
import java.util.Set;
4546
import java.util.concurrent.CopyOnWriteArrayList;
4647
import java.util.concurrent.CountDownLatch;
4748
import java.util.concurrent.TimeUnit;
@@ -850,10 +851,34 @@ public void testSkipUnavailable() {
850851
}
851852
}
852853

854+
public void testRemoteClusterServiceNotEnabledGetRemoteClusterConnection() {
855+
final Settings settings = Settings.builder().put(RemoteClusterService.ENABLE_REMOTE_CLUSTERS.getKey(), false).build();
856+
try (MockTransportService service = MockTransportService.createNewService(settings, Version.CURRENT, threadPool, null)) {
857+
service.start();
858+
service.acceptIncomingRequests();
859+
final IllegalArgumentException e =
860+
expectThrows(IllegalArgumentException.class, () -> service.getRemoteClusterService().getRemoteClusterConnection("test"));
861+
assertThat(e.getMessage(), equalTo("remote cluster service is not enabled"));
862+
}
863+
}
864+
865+
public void testRemoteClusterServiceNotEnabledGetCollectNodes() {
866+
final Settings settings = Settings.builder().put(RemoteClusterService.ENABLE_REMOTE_CLUSTERS.getKey(), false).build();
867+
try (MockTransportService service = MockTransportService.createNewService(settings, Version.CURRENT, threadPool, null)) {
868+
service.start();
869+
service.acceptIncomingRequests();
870+
final IllegalArgumentException e = expectThrows(
871+
IllegalArgumentException.class,
872+
() -> service.getRemoteClusterService().collectNodes(Set.of(), ActionListener.wrap(r -> {}, r -> {})));
873+
assertThat(e.getMessage(), equalTo("remote cluster service is not enabled"));
874+
}
875+
}
876+
853877
private static Settings createSettings(String clusterAlias, List<String> seeds) {
854878
Settings.Builder builder = Settings.builder();
855879
builder.put(SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS.getConcreteSettingForNamespace(clusterAlias).getKey(),
856880
Strings.collectionToCommaDelimitedString(seeds));
857881
return builder.build();
858882
}
883+
859884
}

0 commit comments

Comments
 (0)