/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.discovery;
import java.io.IOException;
import java.net.InetAddress;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.elasticsearch.cluster.ClusterChangedEvent;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.block.ClusterBlock;
import org.elasticsearch.cluster.node.DiscoveryNode;
import org.elasticsearch.cluster.routing.ShardRoutingState;
import org.elasticsearch.common.Strings;
import org.elasticsearch.common.component.AbstractLifecycleComponent;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue;
/**
*
*/
public class DiscoveryService extends AbstractLifecycleComponent<DiscoveryService> {
public static final String SETTING_INITIAL_STATE_TIMEOUT = "discovery.initial_state_timeout";
public static final String SETTING_DISCOVERY_SEED = "discovery.id.seed";
private final TimeValue initialStateTimeout;
private final Discovery discovery;
private final DiscoverySettings discoverySettings;
@Inject
public DiscoveryService(Settings settings, DiscoverySettings discoverySettings, Discovery discovery) {
super(settings);
this.discoverySettings = discoverySettings;
this.discovery = discovery;
this.initialStateTimeout = settings.getAsTime(SETTING_INITIAL_STATE_TIMEOUT, TimeValue.timeValueSeconds(30));
}
public ClusterBlock getNoMasterBlock() {
return discoverySettings.getNoMasterBlock();
}
@Override
protected void doStart() {
//initialStateListener = new InitialStateListener();
//discovery.addListener(initialStateListener);
discovery.start();
logger.info(discovery.nodeDescription());
}
@Override
protected void doStop() {
discovery.stop();
}
@Override
protected void doClose() {
discovery.close();
}
public DiscoveryNode localNode() {
return discovery.localNode();
}
public String nodeDescription() {
return discovery.nodeDescription();
}
public static String generateNodeId(Settings settings) {
String seed = settings.get(DiscoveryService.SETTING_DISCOVERY_SEED);
if (seed != null) {
return Strings.randomBase64UUID(new Random(Long.parseLong(seed)));
}
return Strings.randomBase64UUID();
}
/**
* Set index shard state in the gossip endpoint map (must be synchronized).
* @param index
* @param shardRoutingState
* @throws JsonGenerationException
* @throws JsonMappingException
* @throws IOException
*/
public void putShardRoutingState(final String index, final ShardRoutingState shardRoutingState) throws JsonGenerationException, JsonMappingException, IOException {
this.discovery.putShardRoutingState(index, shardRoutingState);
}
public Map<UUID, ShardRoutingState> getShardRoutingStates(String index) {
return this.discovery.getShardRoutingStates(index);
}
public void removeIndexShardState(final String index) throws JsonGenerationException, JsonMappingException, IOException {
this.discovery.putShardRoutingState(index, null);
}
/**
* Publish cluster metadata uuid and version in gossip state.
* @param clusterState
*/
public void publishX2(final ClusterState clusterState) {
this.discovery.publishX2(clusterState);
}
/**
* Publish local routingShard state in gossip state.
* @param clusterState
*/
public void publishX1(final ClusterState clusterState) {
this.discovery.publishX1(clusterState);
}
public boolean awaitMetaDataVersion(long version, TimeValue ackTimeout) throws Exception {
return this.discovery.awaitMetaDataVersion(version, ackTimeout);
}
public void connectToNodes() {
this.discovery.connectToNodes();
}
}