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.
This commit is contained in:
parent
216b154107
commit
487a1c4f71
|
@ -132,7 +132,8 @@ public class DiscoveryModule {
|
||||||
transportService, namedWriteableRegistry, allocationService, masterService,
|
transportService, namedWriteableRegistry, allocationService, masterService,
|
||||||
() -> gatewayMetaState.getPersistedState(settings, (ClusterApplierService) clusterApplier), hostsProvider, clusterApplier,
|
() -> gatewayMetaState.getPersistedState(settings, (ClusterApplierService) clusterApplier), hostsProvider, clusterApplier,
|
||||||
Randomness.get()));
|
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) {
|
for (DiscoveryPlugin plugin : plugins) {
|
||||||
plugin.getDiscoveryTypes(threadPool, transportService, namedWriteableRegistry, masterService, clusterApplier, clusterSettings,
|
plugin.getDiscoveryTypes(threadPool, transportService, namedWriteableRegistry, masterService, clusterApplier, clusterSettings,
|
||||||
hostsProvider, allocationService, gatewayMetaState).forEach((key, value) -> {
|
hostsProvider, allocationService, gatewayMetaState).forEach((key, value) -> {
|
||||||
|
|
|
@ -31,12 +31,14 @@ import org.elasticsearch.cluster.node.DiscoveryNode;
|
||||||
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
import org.elasticsearch.cluster.node.DiscoveryNodes;
|
||||||
import org.elasticsearch.cluster.service.ClusterApplier;
|
import org.elasticsearch.cluster.service.ClusterApplier;
|
||||||
import org.elasticsearch.cluster.service.ClusterApplier.ClusterApplyListener;
|
import org.elasticsearch.cluster.service.ClusterApplier.ClusterApplyListener;
|
||||||
|
import org.elasticsearch.cluster.service.ClusterApplierService;
|
||||||
import org.elasticsearch.cluster.service.MasterService;
|
import org.elasticsearch.cluster.service.MasterService;
|
||||||
import org.elasticsearch.common.component.AbstractLifecycleComponent;
|
import org.elasticsearch.common.component.AbstractLifecycleComponent;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.unit.TimeValue;
|
import org.elasticsearch.common.unit.TimeValue;
|
||||||
import org.elasticsearch.discovery.Discovery;
|
import org.elasticsearch.discovery.Discovery;
|
||||||
import org.elasticsearch.discovery.DiscoveryStats;
|
import org.elasticsearch.discovery.DiscoveryStats;
|
||||||
|
import org.elasticsearch.gateway.GatewayMetaState;
|
||||||
import org.elasticsearch.transport.TransportService;
|
import org.elasticsearch.transport.TransportService;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
@ -55,12 +57,17 @@ public class SingleNodeDiscovery extends AbstractLifecycleComponent implements D
|
||||||
private volatile ClusterState clusterState;
|
private volatile ClusterState clusterState;
|
||||||
|
|
||||||
public SingleNodeDiscovery(final Settings settings, final TransportService transportService,
|
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));
|
super(Objects.requireNonNull(settings));
|
||||||
this.clusterName = ClusterName.CLUSTER_NAME_SETTING.get(settings);
|
this.clusterName = ClusterName.CLUSTER_NAME_SETTING.get(settings);
|
||||||
this.transportService = Objects.requireNonNull(transportService);
|
this.transportService = Objects.requireNonNull(transportService);
|
||||||
masterService.setClusterStateSupplier(() -> clusterState);
|
masterService.setClusterStateSupplier(() -> clusterState);
|
||||||
this.clusterApplier = clusterApplier;
|
this.clusterApplier = clusterApplier;
|
||||||
|
|
||||||
|
if (clusterApplier instanceof ClusterApplierService) {
|
||||||
|
((ClusterApplierService) clusterApplier).addLowPriorityApplier(gatewayMetaState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,7 @@ public class SingleNodeDiscoveryTests extends ESTestCase {
|
||||||
clusterState.set(clusterStateSupplier.get());
|
clusterState.set(clusterStateSupplier.get());
|
||||||
listener.onSuccess(source);
|
listener.onSuccess(source);
|
||||||
}
|
}
|
||||||
});
|
}, null);
|
||||||
discovery.start();
|
discovery.start();
|
||||||
discovery.startInitialJoin();
|
discovery.startInitialJoin();
|
||||||
final DiscoveryNodes nodes = clusterState.get().nodes();
|
final DiscoveryNodes nodes = clusterState.get().nodes();
|
||||||
|
|
|
@ -961,7 +961,8 @@ public final class InternalTestCluster extends TestCluster {
|
||||||
.put(newSettings)
|
.put(newSettings)
|
||||||
.put(NodeEnvironment.NODE_ID_SEED_SETTING.getKey(), newIdSeed)
|
.put(NodeEnvironment.NODE_ID_SEED_SETTING.getKey(), newIdSeed)
|
||||||
.build();
|
.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() +
|
throw new IllegalStateException(DISCOVERY_ZEN_MINIMUM_MASTER_NODES_SETTING.getKey() +
|
||||||
" is not configured after restart of [" + name + "]");
|
" is not configured after restart of [" + name + "]");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue