From 487a1c4f71262123136dd0f5e6a5cbf0f2696399 Mon Sep 17 00:00:00 2001 From: Yannick Welsch Date: Wed, 19 Dec 2018 13:26:04 +0100 Subject: [PATCH] Fix cluster state persistence for single-node discovery (#36825) Single-node discovery is not persisting cluster states, which was caused by a recent 7.0-only refactoring. This commit ensures that the cluster state is properly persisted when using single-node discovery and adds a corresponding test. --- .../org/elasticsearch/discovery/DiscoveryModule.java | 3 ++- .../discovery/single/SingleNodeDiscovery.java | 9 ++++++++- .../discovery/single/SingleNodeDiscoveryIT.java | 6 ++++++ .../discovery/single/SingleNodeDiscoveryTests.java | 2 +- .../java/org/elasticsearch/test/InternalTestCluster.java | 3 ++- 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/discovery/DiscoveryModule.java b/server/src/main/java/org/elasticsearch/discovery/DiscoveryModule.java index f4a44a75789..1572548b1b1 100644 --- a/server/src/main/java/org/elasticsearch/discovery/DiscoveryModule.java +++ b/server/src/main/java/org/elasticsearch/discovery/DiscoveryModule.java @@ -132,7 +132,8 @@ public class DiscoveryModule { transportService, namedWriteableRegistry, allocationService, masterService, () -> gatewayMetaState.getPersistedState(settings, (ClusterApplierService) clusterApplier), hostsProvider, clusterApplier, Randomness.get())); - discoveryTypes.put("single-node", () -> new SingleNodeDiscovery(settings, transportService, masterService, clusterApplier)); + discoveryTypes.put("single-node", () -> new SingleNodeDiscovery(settings, transportService, masterService, clusterApplier, + gatewayMetaState)); for (DiscoveryPlugin plugin : plugins) { plugin.getDiscoveryTypes(threadPool, transportService, namedWriteableRegistry, masterService, clusterApplier, clusterSettings, hostsProvider, allocationService, gatewayMetaState).forEach((key, value) -> { diff --git a/server/src/main/java/org/elasticsearch/discovery/single/SingleNodeDiscovery.java b/server/src/main/java/org/elasticsearch/discovery/single/SingleNodeDiscovery.java index c759fbf4d15..238f72f72f4 100644 --- a/server/src/main/java/org/elasticsearch/discovery/single/SingleNodeDiscovery.java +++ b/server/src/main/java/org/elasticsearch/discovery/single/SingleNodeDiscovery.java @@ -31,12 +31,14 @@ import org.elasticsearch.cluster.node.DiscoveryNode; import org.elasticsearch.cluster.node.DiscoveryNodes; import org.elasticsearch.cluster.service.ClusterApplier; import org.elasticsearch.cluster.service.ClusterApplier.ClusterApplyListener; +import org.elasticsearch.cluster.service.ClusterApplierService; import org.elasticsearch.cluster.service.MasterService; import org.elasticsearch.common.component.AbstractLifecycleComponent; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.discovery.Discovery; import org.elasticsearch.discovery.DiscoveryStats; +import org.elasticsearch.gateway.GatewayMetaState; import org.elasticsearch.transport.TransportService; import java.util.Objects; @@ -55,12 +57,17 @@ public class SingleNodeDiscovery extends AbstractLifecycleComponent implements D private volatile ClusterState clusterState; public SingleNodeDiscovery(final Settings settings, final TransportService transportService, - final MasterService masterService, final ClusterApplier clusterApplier) { + final MasterService masterService, final ClusterApplier clusterApplier, + final GatewayMetaState gatewayMetaState) { super(Objects.requireNonNull(settings)); this.clusterName = ClusterName.CLUSTER_NAME_SETTING.get(settings); this.transportService = Objects.requireNonNull(transportService); masterService.setClusterStateSupplier(() -> clusterState); this.clusterApplier = clusterApplier; + + if (clusterApplier instanceof ClusterApplierService) { + ((ClusterApplierService) clusterApplier).addLowPriorityApplier(gatewayMetaState); + } } @Override diff --git a/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryIT.java b/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryIT.java index c2a61263d3a..31005ea83cd 100644 --- a/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryIT.java +++ b/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryIT.java @@ -167,4 +167,10 @@ public class SingleNodeDiscoveryIT extends ESIntegTestCase { } } + public void testStatePersistence() throws Exception { + createIndex("test"); + internalCluster().fullRestart(); + assertTrue(client().admin().indices().prepareExists("test").get().isExists()); + } + } diff --git a/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryTests.java b/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryTests.java index d34d3e9d6a7..c3dfad2d437 100644 --- a/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryTests.java +++ b/server/src/test/java/org/elasticsearch/discovery/single/SingleNodeDiscoveryTests.java @@ -69,7 +69,7 @@ public class SingleNodeDiscoveryTests extends ESTestCase { clusterState.set(clusterStateSupplier.get()); listener.onSuccess(source); } - }); + }, null); discovery.start(); discovery.startInitialJoin(); final DiscoveryNodes nodes = clusterState.get().nodes(); diff --git a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java index 246e0f555b1..db719389665 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java +++ b/test/framework/src/main/java/org/elasticsearch/test/InternalTestCluster.java @@ -961,7 +961,8 @@ public final class InternalTestCluster extends TestCluster { .put(newSettings) .put(NodeEnvironment.NODE_ID_SEED_SETTING.getKey(), newIdSeed) .build(); - if (DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.exists(finalSettings) == false) { + final boolean usingSingleNodeDiscovery = DiscoveryModule.DISCOVERY_TYPE_SETTING.get(finalSettings).equals("single-node"); + if (usingSingleNodeDiscovery == false && DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.exists(finalSettings) == false) { throw new IllegalStateException(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey() + " is not configured after restart of [" + name + "]"); }