Skip to content

Commit c5d0731

Browse files
authored
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 ba431a0 commit c5d0731

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,18 @@ public final class RemoteClusterService extends RemoteClusterAware implements Cl
116116
(ns, key) -> boolSetting(key, TransportSettings.TRANSPORT_COMPRESS,
117117
new RemoteConnectionEnabled<>(ns, key), Setting.Property.Dynamic, Setting.Property.NodeScope));
118118

119+
private final boolean enabled;
120+
121+
public boolean isEnabled() {
122+
return enabled;
123+
}
124+
119125
private final TransportService transportService;
120126
private final Map<String, RemoteClusterConnection> remoteClusters = ConcurrentCollections.newConcurrentMap();
121127

122128
RemoteClusterService(Settings settings, TransportService transportService) {
123129
super(settings);
130+
this.enabled = ENABLE_REMOTE_CLUSTERS.get(settings);
124131
this.transportService = transportService;
125132
}
126133

@@ -200,6 +207,9 @@ public Transport.Connection getConnection(String cluster) {
200207
}
201208

202209
RemoteClusterConnection getRemoteClusterConnection(String cluster) {
210+
if (enabled == false) {
211+
throw new IllegalArgumentException("remote cluster service is not enabled");
212+
}
203213
RemoteClusterConnection connection = remoteClusters.get(cluster);
204214
if (connection == null) {
205215
throw new NoSuchRemoteClusterException(cluster);
@@ -336,6 +346,9 @@ public Stream<RemoteConnectionInfo> getRemoteConnectionInfos() {
336346
* function on success.
337347
*/
338348
public void collectNodes(Set<String> clusters, ActionListener<BiFunction<String, String, DiscoveryNode>> listener) {
349+
if (enabled == false) {
350+
throw new IllegalArgumentException("remote cluster service is not enabled");
351+
}
339352
Map<String, RemoteClusterConnection> remoteClusters = this.remoteClusters;
340353
for (String cluster : clusters) {
341354
if (remoteClusters.containsKey(cluster) == false) {
@@ -379,6 +392,9 @@ public void onFailure(Exception e) {
379392
* @throws IllegalArgumentException if the given clusterAlias doesn't exist
380393
*/
381394
public Client getRemoteClusterClient(ThreadPool threadPool, String clusterAlias) {
395+
if (transportService.getRemoteClusterService().isEnabled() == false) {
396+
throw new IllegalArgumentException("remote cluster service is not enabled");
397+
}
382398
if (transportService.getRemoteClusterService().getRemoteClusterNames().contains(clusterAlias) == false) {
383399
throw new NoSuchRemoteClusterException(clusterAlias);
384400
}

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

Lines changed: 14 additions & 0 deletions
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

Lines changed: 25 additions & 0 deletions
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;
@@ -843,10 +844,34 @@ public void testSkipUnavailable() {
843844
}
844845
}
845846

847+
public void testRemoteClusterServiceNotEnabledGetRemoteClusterConnection() {
848+
final Settings settings = Settings.builder().put(RemoteClusterService.ENABLE_REMOTE_CLUSTERS.getKey(), false).build();
849+
try (MockTransportService service = MockTransportService.createNewService(settings, Version.CURRENT, threadPool, null)) {
850+
service.start();
851+
service.acceptIncomingRequests();
852+
final IllegalArgumentException e =
853+
expectThrows(IllegalArgumentException.class, () -> service.getRemoteClusterService().getRemoteClusterConnection("test"));
854+
assertThat(e.getMessage(), equalTo("remote cluster service is not enabled"));
855+
}
856+
}
857+
858+
public void testRemoteClusterServiceNotEnabledGetCollectNodes() {
859+
final Settings settings = Settings.builder().put(RemoteClusterService.ENABLE_REMOTE_CLUSTERS.getKey(), false).build();
860+
try (MockTransportService service = MockTransportService.createNewService(settings, Version.CURRENT, threadPool, null)) {
861+
service.start();
862+
service.acceptIncomingRequests();
863+
final IllegalArgumentException e = expectThrows(
864+
IllegalArgumentException.class,
865+
() -> service.getRemoteClusterService().collectNodes(Set.of(), ActionListener.wrap(r -> {}, r -> {})));
866+
assertThat(e.getMessage(), equalTo("remote cluster service is not enabled"));
867+
}
868+
}
869+
846870
private static Settings createSettings(String clusterAlias, List<String> seeds) {
847871
Settings.Builder builder = Settings.builder();
848872
builder.put(SniffConnectionStrategy.REMOTE_CLUSTER_SEEDS.getConcreteSettingForNamespace(clusterAlias).getKey(),
849873
Strings.collectionToCommaDelimitedString(seeds));
850874
return builder.build();
851875
}
876+
852877
}

0 commit comments

Comments
 (0)