Allow to filter client and "just" data nodes from controlling elected master (default client to true), closes #2014.

This commit is contained in:
Shay Banon 2012-06-09 01:28:02 +02:00
parent 6c67570589
commit 726ec8b9ff
1 changed files with 37 additions and 5 deletions

View File

@ -19,6 +19,7 @@
package org.elasticsearch.discovery.zen; package org.elasticsearch.discovery.zen;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import org.elasticsearch.ElasticSearchException; import org.elasticsearch.ElasticSearchException;
import org.elasticsearch.ElasticSearchIllegalStateException; import org.elasticsearch.ElasticSearchIllegalStateException;
@ -96,6 +97,9 @@ public class ZenDiscovery extends AbstractLifecycleComponent<Discovery> implemen
private final ElectMasterService electMaster; private final ElectMasterService electMaster;
private final boolean masterElectionFilterClientNodes;
private final boolean masterElectionFilterDataNodes;
private DiscoveryNode localNode; private DiscoveryNode localNode;
@ -128,7 +132,10 @@ public class ZenDiscovery extends AbstractLifecycleComponent<Discovery> implemen
this.pingTimeout = settings.getAsTime("discovery.zen.ping.timeout", settings.getAsTime("discovery.zen.ping_timeout", componentSettings.getAsTime("ping_timeout", componentSettings.getAsTime("initial_ping_timeout", timeValueSeconds(3))))); this.pingTimeout = settings.getAsTime("discovery.zen.ping.timeout", settings.getAsTime("discovery.zen.ping_timeout", componentSettings.getAsTime("ping_timeout", componentSettings.getAsTime("initial_ping_timeout", timeValueSeconds(3)))));
this.sendLeaveRequest = componentSettings.getAsBoolean("send_leave_request", true); this.sendLeaveRequest = componentSettings.getAsBoolean("send_leave_request", true);
logger.debug("using ping.timeout [{}]", pingTimeout); this.masterElectionFilterClientNodes = settings.getAsBoolean("discovery.zen.master_election.filter_client", true);
this.masterElectionFilterDataNodes = settings.getAsBoolean("discovery.zen.master_election.filter_data", false);
logger.debug("using ping.timeout [{}], master_election.filter_client [{}], master_election.filter_data [{}]", pingTimeout, masterElectionFilterClientNodes, masterElectionFilterDataNodes);
this.electMaster = new ElectMasterService(settings, nodeSettingsService); this.electMaster = new ElectMasterService(settings, nodeSettingsService);
@ -550,13 +557,38 @@ public class ZenDiscovery extends AbstractLifecycleComponent<Discovery> implemen
} }
private DiscoveryNode findMaster() { private DiscoveryNode findMaster() {
ZenPing.PingResponse[] pingResponses = pingService.pingAndWait(pingTimeout); ZenPing.PingResponse[] fullPingResponses = pingService.pingAndWait(pingTimeout);
if (pingResponses == null) { if (fullPingResponses == null) {
return null; return null;
} }
if (logger.isTraceEnabled()) {
StringBuilder sb = new StringBuilder("full ping responses:");
if (fullPingResponses.length == 0) {
sb.append(" {none}");
} else {
for (ZenPing.PingResponse pingResponse : fullPingResponses) {
sb.append("\n\t--> ").append("target [").append(pingResponse.target()).append("], master [").append(pingResponse.master()).append("]");
}
}
logger.trace(sb.toString());
}
// filter responses
List<ZenPing.PingResponse> pingResponses = Lists.newArrayList();
for (ZenPing.PingResponse pingResponse : fullPingResponses) {
DiscoveryNode node = pingResponse.target();
if (masterElectionFilterClientNodes && (node.clientNode() || (!node.masterNode() && !node.dataNode()))) {
// filter out the client node, which is a client node, or also one that is not data and not master (effectively, client)
} else if (masterElectionFilterDataNodes && (!node.masterNode() && node.dataNode())) {
// filter out data node that is not also master
} else {
pingResponses.add(pingResponse);
}
}
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
StringBuilder sb = new StringBuilder("ping responses:"); StringBuilder sb = new StringBuilder("filtered ping responses: (filter_client[").append(masterElectionFilterClientNodes).append("], filter_data[").append(masterElectionFilterDataNodes).append("])");
if (pingResponses.length == 0) { if (pingResponses.isEmpty()) {
sb.append(" {none}"); sb.append(" {none}");
} else { } else {
for (ZenPing.PingResponse pingResponse : pingResponses) { for (ZenPing.PingResponse pingResponse : pingResponses) {