Skip to content

Commit

Permalink
Add coordinating_only node selector (#30313)
Browse files Browse the repository at this point in the history
Today we can execute cluster API actions on only master, data or ingest nodes
using the `master:true`, `data:true` and `ingest:true` filters, but it is not
so easy to select coordinating-only nodes (i.e. those nodes that are neither
master nor data nor ingest nodes). This change fixes this by adding support for
a `coordinating_only` filter such that `coordinating_only:true` adds all
coordinating-only nodes to the set of selected nodes, and 
`coordinating_only:false` deletes them.

Resolves #28831.
  • Loading branch information
PnPie authored and DaveCTurner committed May 9, 2018
1 parent f8c1235 commit b1ad59d
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 4 deletions.
3 changes: 3 additions & 0 deletions docs/CHANGELOG.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,9 @@ started or stopped. ({pull}30118[#30118])

Added put index template API to the high level rest client ({pull}30400[#30400])

Add ability to filter coordinating-only nodes when interacting with cluster
APIs. ({pull}30313[#30313])

[float]
=== Bug Fixes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@
*/
public class DiscoveryNode implements Writeable, ToXContentFragment {

static final String COORDINATING_ONLY = "coordinating_only";

public static boolean nodeRequiresLocalStorage(Settings settings) {
boolean localStorageEnable = Node.NODE_LOCAL_STORAGE_SETTING.get(settings);
if (localStorageEnable == false &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,19 @@ public ImmutableOpenMap<String, DiscoveryNode> getMasterAndDataNodes() {
return nodes.build();
}

/**
* Get a {@link Map} of the coordinating only nodes (nodes which are neither master, nor data, nor ingest nodes) arranged by their ids
*
* @return {@link Map} of the coordinating only nodes arranged by their ids
*/
public ImmutableOpenMap<String, DiscoveryNode> getCoordinatingOnlyNodes() {
ImmutableOpenMap.Builder<String, DiscoveryNode> nodes = ImmutableOpenMap.builder(this.nodes);
nodes.removeAll(masterNodes.keys());
nodes.removeAll(dataNodes.keys());
nodes.removeAll(ingestNodes.keys());
return nodes.build();
}

/**
* Get a node by its id
*
Expand Down Expand Up @@ -294,7 +307,7 @@ public DiscoveryNode resolveNode(String node) {
* - "_local" or "_master" for the relevant nodes
* - a node id
* - a wild card pattern that will be matched against node names
* - a "attr:value" pattern, where attr can be a node role (master, data, ingest etc.) in which case the value can be true of false
* - a "attr:value" pattern, where attr can be a node role (master, data, ingest etc.) in which case the value can be true or false,
* or a generic node attribute name in which case value will be treated as a wildcard and matched against the node attribute values.
*/
public String[] resolveNodes(String... nodes) {
Expand Down Expand Up @@ -346,6 +359,12 @@ public String[] resolveNodes(String... nodes) {
} else {
resolvedNodesIds.removeAll(ingestNodes.keys());
}
} else if (DiscoveryNode.COORDINATING_ONLY.equals(matchAttrName)) {
if (Booleans.parseBoolean(matchAttrValue, true)) {
resolvedNodesIds.addAll(getCoordinatingOnlyNodes().keys());
} else {
resolvedNodesIds.removeAll(getCoordinatingOnlyNodes().keys());
}
} else {
for (DiscoveryNode node : this) {
for (Map.Entry<String, String> entry : node.getAttributes().entrySet()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,17 @@ public void testCoordinatorOnlyNodes() {
.map(DiscoveryNode::getId)
.toArray(String[]::new);

assertThat(
discoveryNodes.resolveNodes("_all", "data:false", "ingest:false", "master:false"),
arrayContainingInAnyOrder(coordinatorOnlyNodes));
final String[] nonCoordinatorOnlyNodes =
StreamSupport.stream(discoveryNodes.getNodes().values().spliterator(), false)
.map(n -> n.value)
.filter(n -> n.isMasterNode() || n.isDataNode() || n.isIngestNode())
.map(DiscoveryNode::getId)
.toArray(String[]::new);

assertThat(discoveryNodes.resolveNodes("coordinating_only:true"), arrayContainingInAnyOrder(coordinatorOnlyNodes));
assertThat(discoveryNodes.resolveNodes("_all", "data:false", "ingest:false", "master:false"),
arrayContainingInAnyOrder(coordinatorOnlyNodes));
assertThat(discoveryNodes.resolveNodes("_all", "coordinating_only:false"), arrayContainingInAnyOrder(nonCoordinatorOnlyNodes));
}

public void testResolveNodesIds() {
Expand Down Expand Up @@ -266,6 +274,13 @@ Set<String> matchingNodeIds(DiscoveryNodes nodes) {
nodes.getIngestNodes().keysIt().forEachRemaining(ids::add);
return ids;
}
}, COORDINATING_ONLY(DiscoveryNode.COORDINATING_ONLY + ":true") {
@Override
Set<String> matchingNodeIds(DiscoveryNodes nodes) {
Set<String> ids = new HashSet<>();
nodes.getCoordinatingOnlyNodes().keysIt().forEachRemaining(ids::add);
return ids;
}
}, CUSTOM_ATTRIBUTE("attr:value") {
@Override
Set<String> matchingNodeIds(DiscoveryNodes nodes) {
Expand Down

0 comments on commit b1ad59d

Please sign in to comment.