Skip to content

Commit f2dd5dd

Browse files
authored
Remove DiscoveryPlugin#getDiscoveryTypes (#38414)
With this change we no longer support pluggable discovery implementations. No known implementations of `DiscoveryPlugin` actually override this method, so in practice this should have no effect on the wider world. However, we were using this rather extensively in tests to provide the `test-zen` discovery type. We no longer need a separate discovery type for tests as we no longer need to customise its behaviour. Relates #38410
1 parent 963b474 commit f2dd5dd

File tree

23 files changed

+44
-373
lines changed

23 files changed

+44
-373
lines changed

docs/reference/migration/migrate_7_0/plugins.asciidoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,8 @@ The `RealmSettings.simpleString` method can be used as a convenience for the abo
7070
Tribe node functionality has been removed in favor of
7171
<<modules-cross-cluster-search,Cross Cluster Search>>.
7272

73+
[float]
74+
==== Discovery implementations are no longer pluggable
75+
76+
* The method `DiscoveryPlugin#getDiscoveryTypes()` was removed, so that plugins
77+
can no longer provide their own discovery implementations.

modules/transport-netty4/src/test/java/org/elasticsearch/rest/discovery/Zen2RestApiIT.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import org.elasticsearch.http.HttpServerTransport;
3737
import org.elasticsearch.test.ESIntegTestCase;
3838
import org.elasticsearch.test.InternalTestCluster;
39-
import org.elasticsearch.test.discovery.TestZenDiscovery;
4039
import org.hamcrest.Matchers;
4140

4241
import java.io.IOException;
@@ -51,11 +50,6 @@
5150
@ESIntegTestCase.ClusterScope(scope = ESIntegTestCase.Scope.TEST, numDataNodes = 0, transportClientRatio = 0, autoMinMasterNodes = false)
5251
public class Zen2RestApiIT extends ESNetty4IntegTestCase {
5352

54-
@Override
55-
protected Settings nodeSettings(int nodeOrdinal) {
56-
return Settings.builder().put(super.nodeSettings(nodeOrdinal)).put(TestZenDiscovery.USE_ZEN2.getKey(), true).build();
57-
}
58-
5953
@Override
6054
protected boolean addMockHttpTransport() {
6155
return false; // enable http

server/src/main/java/org/elasticsearch/discovery/DiscoveryModule.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import java.util.List;
5656
import java.util.Map;
5757
import java.util.Objects;
58+
import java.util.Random;
5859
import java.util.Set;
5960
import java.util.function.BiConsumer;
6061
import java.util.function.Function;
@@ -69,8 +70,8 @@
6970
public class DiscoveryModule {
7071
private static final Logger logger = LogManager.getLogger(DiscoveryModule.class);
7172

72-
public static final String ZEN_DISCOVERY_TYPE = "zen";
73-
public static final String ZEN2_DISCOVERY_TYPE = "zen2";
73+
public static final String ZEN_DISCOVERY_TYPE = "legacy-zen";
74+
public static final String ZEN2_DISCOVERY_TYPE = "zen";
7475

7576
public static final Setting<String> DISCOVERY_TYPE_SETTING =
7677
new Setting<>("discovery.type", ZEN2_DISCOVERY_TYPE, Function.identity(), Property.NodeScope);
@@ -136,17 +137,9 @@ public DiscoveryModule(Settings settings, ThreadPool threadPool, TransportServic
136137
discoveryTypes.put(ZEN2_DISCOVERY_TYPE, () -> new Coordinator(NODE_NAME_SETTING.get(settings), settings, clusterSettings,
137138
transportService, namedWriteableRegistry, allocationService, masterService,
138139
() -> gatewayMetaState.getPersistedState(settings, (ClusterApplierService) clusterApplier), hostsProvider, clusterApplier,
139-
joinValidators, Randomness.get()));
140+
joinValidators, new Random(Randomness.get().nextLong())));
140141
discoveryTypes.put("single-node", () -> new SingleNodeDiscovery(settings, transportService, masterService, clusterApplier,
141142
gatewayMetaState));
142-
for (DiscoveryPlugin plugin : plugins) {
143-
plugin.getDiscoveryTypes(threadPool, transportService, namedWriteableRegistry, masterService, clusterApplier, clusterSettings,
144-
hostsProvider, allocationService, gatewayMetaState).forEach((key, value) -> {
145-
if (discoveryTypes.put(key, value) != null) {
146-
throw new IllegalArgumentException("Cannot register discovery type [" + key + "] twice");
147-
}
148-
});
149-
}
150143
String discoveryType = DISCOVERY_TYPE_SETTING.get(settings);
151144
Supplier<Discovery> discoverySupplier = discoveryTypes.get(discoveryType);
152145
if (discoverySupplier == null) {

server/src/main/java/org/elasticsearch/plugins/DiscoveryPlugin.java

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,18 @@
1919

2020
package org.elasticsearch.plugins;
2121

22-
import java.util.Collections;
23-
import java.util.Map;
24-
import java.util.function.BiConsumer;
25-
import java.util.function.Supplier;
26-
2722
import org.elasticsearch.cluster.ClusterState;
2823
import org.elasticsearch.cluster.node.DiscoveryNode;
29-
import org.elasticsearch.cluster.routing.allocation.AllocationService;
30-
import org.elasticsearch.cluster.service.ClusterApplier;
31-
import org.elasticsearch.cluster.service.MasterService;
32-
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
3324
import org.elasticsearch.common.network.NetworkService;
34-
import org.elasticsearch.common.settings.ClusterSettings;
3525
import org.elasticsearch.common.settings.Settings;
36-
import org.elasticsearch.discovery.Discovery;
3726
import org.elasticsearch.discovery.zen.UnicastHostsProvider;
38-
import org.elasticsearch.gateway.GatewayMetaState;
39-
import org.elasticsearch.threadpool.ThreadPool;
4027
import org.elasticsearch.transport.TransportService;
4128

29+
import java.util.Collections;
30+
import java.util.Map;
31+
import java.util.function.BiConsumer;
32+
import java.util.function.Supplier;
33+
4234
/**
4335
* An additional extension point for {@link Plugin}s that extends Elasticsearch's discovery functionality. To add an additional
4436
* {@link NetworkService.CustomNameResolver} just implement the interface and implement the {@link #getCustomNameResolver(Settings)} method:
@@ -53,32 +45,6 @@
5345
* }</pre>
5446
*/
5547
public interface DiscoveryPlugin {
56-
57-
/**
58-
* Returns custom discovery implementations added by this plugin.
59-
*
60-
* The key of the returned map is the name of the discovery implementation
61-
* (see {@link org.elasticsearch.discovery.DiscoveryModule#DISCOVERY_TYPE_SETTING}, and
62-
* the value is a supplier to construct the {@link Discovery}.
63-
*
64-
* @param threadPool Use to schedule ping actions
65-
* @param transportService Use to communicate with other nodes
66-
* @param masterService Use to submit cluster state update tasks
67-
* @param clusterApplier Use to locally apply cluster state updates
68-
* @param clusterSettings Use to get cluster settings
69-
* @param hostsProvider Use to find configured hosts which should be pinged for initial discovery
70-
*/
71-
default Map<String, Supplier<Discovery>> getDiscoveryTypes(ThreadPool threadPool, TransportService transportService,
72-
NamedWriteableRegistry namedWriteableRegistry,
73-
MasterService masterService,
74-
ClusterApplier clusterApplier,
75-
ClusterSettings clusterSettings,
76-
UnicastHostsProvider hostsProvider,
77-
AllocationService allocationService,
78-
GatewayMetaState gatewayMetaState) {
79-
return Collections.emptyMap();
80-
}
81-
8248
/**
8349
* Override to add additional {@link NetworkService.CustomNameResolver}s.
8450
* This can be handy if you want to provide your own Network interface name like _mycard_

server/src/test/java/org/elasticsearch/action/support/master/IndexingMasterFailoverIT.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import org.elasticsearch.common.settings.Settings;
2424
import org.elasticsearch.plugins.Plugin;
2525
import org.elasticsearch.test.ESIntegTestCase;
26-
import org.elasticsearch.test.discovery.TestZenDiscovery;
2726
import org.elasticsearch.test.disruption.NetworkDisruption;
2827
import org.elasticsearch.test.disruption.NetworkDisruption.NetworkDisconnect;
2928
import org.elasticsearch.test.disruption.NetworkDisruption.TwoPartitions;
@@ -50,12 +49,6 @@ protected Collection<Class<? extends Plugin>> nodePlugins() {
5049
return classes;
5150
}
5251

53-
@Override
54-
protected Settings nodeSettings(int nodeOrdinal) {
55-
return Settings.builder().put(super.nodeSettings(nodeOrdinal))
56-
.put(TestZenDiscovery.USE_MOCK_PINGS.getKey(), false).build();
57-
}
58-
5952
/**
6053
* Indexing operations which entail mapping changes require a blocking request to the master node to update the mapping.
6154
* If the master node is being disrupted or if it cannot commit cluster state changes, it needs to retry within timeout limits.

server/src/test/java/org/elasticsearch/client/transport/TransportClientIT.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.elasticsearch.test.ESIntegTestCase.ClusterScope;
3535
import org.elasticsearch.test.ESIntegTestCase.Scope;
3636
import org.elasticsearch.test.MockHttpTransport;
37-
import org.elasticsearch.test.discovery.TestZenDiscovery;
3837
import org.elasticsearch.transport.MockTransportClient;
3938
import org.elasticsearch.transport.TransportService;
4039

@@ -66,10 +65,8 @@ public void testNodeVersionIsUpdated() throws IOException, NodeValidationExcepti
6665
.put("transport.type", getTestTransportType())
6766
.put(Node.NODE_DATA_SETTING.getKey(), false)
6867
.put("cluster.name", "foobar")
69-
.put(TestZenDiscovery.USE_ZEN2.getKey(), getUseZen2())
7068
.putList(ClusterBootstrapService.INITIAL_MASTER_NODES_SETTING.getKey(), "testNodeVersionIsUpdated")
71-
.build(), Arrays.asList(getTestTransportPlugin(), TestZenDiscovery.TestPlugin.class,
72-
MockHttpTransport.TestPlugin.class)).start()) {
69+
.build(), Arrays.asList(getTestTransportPlugin(), MockHttpTransport.TestPlugin.class)).start()) {
7370
TransportAddress transportAddress = node.injector().getInstance(TransportService.class).boundAddress().publishAddress();
7471
client.addTransportAddress(transportAddress);
7572
// since we force transport clients there has to be one node started that we connect to.

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import org.elasticsearch.index.mapper.MapperService;
5050
import org.elasticsearch.indices.IndicesService;
5151
import org.elasticsearch.test.ESIntegTestCase;
52-
import org.elasticsearch.test.discovery.TestZenDiscovery;
5352
import org.elasticsearch.test.disruption.BlockClusterStateProcessing;
5453
import org.elasticsearch.test.junit.annotations.TestLogging;
5554

@@ -71,12 +70,6 @@
7170
@TestLogging("_root:DEBUG")
7271
public class RareClusterStateIT extends ESIntegTestCase {
7372

74-
@Override
75-
protected Settings nodeSettings(int nodeOrdinal) {
76-
return Settings.builder().put(super.nodeSettings(nodeOrdinal))
77-
.put(TestZenDiscovery.USE_MOCK_PINGS.getKey(), false).build();
78-
}
79-
8073
@Override
8174
protected int numberOfShards() {
8275
return 1;

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737
import org.elasticsearch.common.settings.Settings;
3838
import org.elasticsearch.common.unit.TimeValue;
3939
import org.elasticsearch.discovery.Discovery;
40+
import org.elasticsearch.discovery.DiscoveryModule;
4041
import org.elasticsearch.discovery.zen.ElectMasterService;
4142
import org.elasticsearch.env.NodeEnvironment;
4243
import org.elasticsearch.gateway.MetaStateService;
4344
import org.elasticsearch.plugins.Plugin;
4445
import org.elasticsearch.test.ESIntegTestCase;
4546
import org.elasticsearch.test.InternalTestCluster.RestartCallback;
46-
import org.elasticsearch.test.discovery.TestZenDiscovery;
4747
import org.elasticsearch.test.transport.MockTransportService;
4848
import org.elasticsearch.transport.TransportService;
4949

@@ -71,12 +71,10 @@
7171
public class Zen1IT extends ESIntegTestCase {
7272

7373
private static Settings ZEN1_SETTINGS = Coordinator.addZen1Attribute(true, Settings.builder()
74-
.put(TestZenDiscovery.USE_ZEN2.getKey(), false)
75-
.put(TestZenDiscovery.USE_MOCK_PINGS.getKey(), false)) // Zen2 does not know about mock pings
76-
.build();
74+
.put(DiscoveryModule.DISCOVERY_TYPE_SETTING.getKey(), DiscoveryModule.ZEN_DISCOVERY_TYPE)).build();
7775

7876
private static Settings ZEN2_SETTINGS = Settings.builder()
79-
.put(TestZenDiscovery.USE_ZEN2.getKey(), true)
77+
.put(DiscoveryModule.DISCOVERY_TYPE_SETTING.getKey(), DiscoveryModule.ZEN2_DISCOVERY_TYPE)
8078
.build();
8179

8280
protected Collection<Class<? extends Plugin>> nodePlugins() {

server/src/test/java/org/elasticsearch/cluster/routing/PrimaryAllocationIT.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import org.elasticsearch.plugins.Plugin;
4848
import org.elasticsearch.test.ESIntegTestCase;
4949
import org.elasticsearch.test.InternalTestCluster;
50-
import org.elasticsearch.test.discovery.TestZenDiscovery;
5150
import org.elasticsearch.test.disruption.NetworkDisruption;
5251
import org.elasticsearch.test.disruption.NetworkDisruption.NetworkDisconnect;
5352
import org.elasticsearch.test.disruption.NetworkDisruption.TwoPartitions;
@@ -88,12 +87,6 @@ protected Collection<Class<? extends Plugin>> nodePlugins() {
8887
return Arrays.asList(MockTransportService.TestPlugin.class);
8988
}
9089

91-
@Override
92-
protected Settings nodeSettings(int nodeOrdinal) {
93-
return Settings.builder().put(super.nodeSettings(nodeOrdinal))
94-
.put(TestZenDiscovery.USE_MOCK_PINGS.getKey(), false).build();
95-
}
96-
9790
public void testBulkWeirdScenario() throws Exception {
9891
String master = internalCluster().startMasterOnlyNode(Settings.EMPTY);
9992
internalCluster().startDataOnlyNodes(2);

server/src/test/java/org/elasticsearch/discovery/AbstractDisruptionTestCase.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,9 @@
3030
import org.elasticsearch.common.Nullable;
3131
import org.elasticsearch.common.settings.Settings;
3232
import org.elasticsearch.common.unit.TimeValue;
33-
import org.elasticsearch.discovery.zen.UnicastZenPing;
34-
import org.elasticsearch.discovery.zen.ZenPing;
3533
import org.elasticsearch.plugins.Plugin;
3634
import org.elasticsearch.test.ESIntegTestCase;
3735
import org.elasticsearch.test.InternalTestCluster;
38-
import org.elasticsearch.test.discovery.TestZenDiscovery;
3936
import org.elasticsearch.test.disruption.NetworkDisruption;
4037
import org.elasticsearch.test.disruption.NetworkDisruption.Bridge;
4138
import org.elasticsearch.test.disruption.NetworkDisruption.DisruptedLinks;
@@ -65,8 +62,7 @@ public abstract class AbstractDisruptionTestCase extends ESIntegTestCase {
6562

6663
@Override
6764
protected Settings nodeSettings(int nodeOrdinal) {
68-
return Settings.builder().put(super.nodeSettings(nodeOrdinal)).put(DEFAULT_SETTINGS)
69-
.put(TestZenDiscovery.USE_MOCK_PINGS.getKey(), false).build();
65+
return Settings.builder().put(super.nodeSettings(nodeOrdinal)).put(DEFAULT_SETTINGS).build();
7066
}
7167

7268
@Override
@@ -114,22 +110,9 @@ List<String> startCluster(int numberOfNodes) {
114110
InternalTestCluster internalCluster = internalCluster();
115111
List<String> nodes = internalCluster.startNodes(numberOfNodes);
116112
ensureStableCluster(numberOfNodes);
117-
118-
// TODO: this is a temporary solution so that nodes will not base their reaction to a partition based on previous successful results
119-
clearTemporalResponses();
120113
return nodes;
121114
}
122115

123-
protected void clearTemporalResponses() {
124-
final Discovery discovery = internalCluster().getInstance(Discovery.class);
125-
if (discovery instanceof TestZenDiscovery) {
126-
ZenPing zenPing = ((TestZenDiscovery) discovery).getZenPing();
127-
if (zenPing instanceof UnicastZenPing) {
128-
((UnicastZenPing) zenPing).clearTemporalResponses();
129-
}
130-
}
131-
}
132-
133116
static final Settings DEFAULT_SETTINGS = Settings.builder()
134117
.put(LeaderChecker.LEADER_CHECK_TIMEOUT_SETTING.getKey(), "1s") // for hitting simulated network failures quickly
135118
.put(LeaderChecker.LEADER_CHECK_RETRY_COUNT_SETTING.getKey(), 1) // for hitting simulated network failures quickly

server/src/test/java/org/elasticsearch/discovery/DiscoveryModuleTests.java

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.elasticsearch.cluster.ClusterState;
2323
import org.elasticsearch.cluster.coordination.Coordinator;
2424
import org.elasticsearch.cluster.node.DiscoveryNode;
25-
import org.elasticsearch.cluster.routing.allocation.AllocationService;
2625
import org.elasticsearch.cluster.service.ClusterApplier;
2726
import org.elasticsearch.cluster.service.MasterService;
2827
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
@@ -36,7 +35,6 @@
3635
import org.elasticsearch.gateway.GatewayMetaState;
3736
import org.elasticsearch.plugins.DiscoveryPlugin;
3837
import org.elasticsearch.test.ESTestCase;
39-
import org.elasticsearch.test.NoopDiscovery;
4038
import org.elasticsearch.test.transport.MockTransportService;
4139
import org.elasticsearch.threadpool.ThreadPool;
4240
import org.elasticsearch.transport.TransportService;
@@ -75,18 +73,6 @@ default Map<String, Supplier<UnicastHostsProvider>> getZenHostsProviders(Transpo
7573
}
7674
}
7775

78-
public interface DummyDiscoveryPlugin extends DiscoveryPlugin {
79-
Map<String, Supplier<Discovery>> impl();
80-
@Override
81-
default Map<String, Supplier<Discovery>> getDiscoveryTypes(ThreadPool threadPool, TransportService transportService,
82-
NamedWriteableRegistry namedWriteableRegistry,
83-
MasterService masterService, ClusterApplier clusterApplier,
84-
ClusterSettings clusterSettings, UnicastHostsProvider hostsProvider,
85-
AllocationService allocationService, GatewayMetaState gatewayMetaState) {
86-
return impl();
87-
}
88-
}
89-
9076
@Before
9177
public void setupDummyServices() {
9278
threadPool = mock(ThreadPool.class);
@@ -114,34 +100,13 @@ public void testDefaults() {
114100
assertTrue(module.getDiscovery() instanceof Coordinator);
115101
}
116102

117-
public void testLazyConstructionDiscovery() {
118-
DummyDiscoveryPlugin plugin = () -> Collections.singletonMap("custom",
119-
() -> { throw new AssertionError("created discovery type which was not selected"); });
120-
newModule(Settings.EMPTY, Collections.singletonList(plugin));
121-
}
122-
123-
public void testRegisterDiscovery() {
124-
Settings settings = Settings.builder().put(DiscoveryModule.DISCOVERY_TYPE_SETTING.getKey(), "custom").build();
125-
DummyDiscoveryPlugin plugin = () -> Collections.singletonMap("custom", NoopDiscovery::new);
126-
DiscoveryModule module = newModule(settings, Collections.singletonList(plugin));
127-
assertTrue(module.getDiscovery() instanceof NoopDiscovery);
128-
}
129-
130103
public void testUnknownDiscovery() {
131104
Settings settings = Settings.builder().put(DiscoveryModule.DISCOVERY_TYPE_SETTING.getKey(), "dne").build();
132105
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () ->
133106
newModule(settings, Collections.emptyList()));
134107
assertEquals("Unknown discovery type [dne]", e.getMessage());
135108
}
136109

137-
public void testDuplicateDiscovery() {
138-
DummyDiscoveryPlugin plugin1 = () -> Collections.singletonMap("dup", () -> null);
139-
DummyDiscoveryPlugin plugin2 = () -> Collections.singletonMap("dup", () -> null);
140-
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () ->
141-
newModule(Settings.EMPTY, Arrays.asList(plugin1, plugin2)));
142-
assertEquals("Cannot register discovery type [dup] twice", e.getMessage());
143-
}
144-
145110
public void testHostsProvider() {
146111
Settings settings = Settings.builder().put(DiscoveryModule.DISCOVERY_SEED_PROVIDERS_SETTING.getKey(), "custom").build();
147112
AtomicBoolean created = new AtomicBoolean(false);

server/src/test/java/org/elasticsearch/discovery/SnapshotDisruptionIT.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
*/
1919
package org.elasticsearch.discovery;
2020

21-
import java.util.Arrays;
22-
import java.util.Collection;
2321
import org.elasticsearch.action.ActionFuture;
2422
import org.elasticsearch.action.admin.cluster.snapshots.create.CreateSnapshotResponse;
2523
import org.elasticsearch.action.admin.cluster.snapshots.get.GetSnapshotsResponse;
@@ -38,17 +36,18 @@
3836
import org.elasticsearch.snapshots.SnapshotMissingException;
3937
import org.elasticsearch.snapshots.SnapshotState;
4038
import org.elasticsearch.test.ESIntegTestCase;
41-
import org.elasticsearch.test.discovery.TestZenDiscovery;
4239
import org.elasticsearch.test.disruption.NetworkDisruption;
4340
import org.elasticsearch.test.junit.annotations.TestLogging;
41+
import org.elasticsearch.test.transport.MockTransportService;
4442

43+
import java.util.Arrays;
44+
import java.util.Collection;
4545
import java.util.Collections;
4646
import java.util.HashSet;
4747
import java.util.List;
4848
import java.util.Set;
4949
import java.util.concurrent.CountDownLatch;
5050
import java.util.concurrent.TimeUnit;
51-
import org.elasticsearch.test.transport.MockTransportService;
5251

5352
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
5453

@@ -68,7 +67,6 @@ protected Collection<Class<? extends Plugin>> nodePlugins() {
6867
protected Settings nodeSettings(int nodeOrdinal) {
6968
return Settings.builder().put(super.nodeSettings(nodeOrdinal))
7069
.put(AbstractDisruptionTestCase.DEFAULT_SETTINGS)
71-
.put(TestZenDiscovery.USE_MOCK_PINGS.getKey(), false)
7270
.build();
7371
}
7472

0 commit comments

Comments
 (0)