Talk about NodeSelector of Elasticsearch RestClient

Keywords: Programming ElasticSearch Java REST

order

This paper mainly studies NodeSelector of Elasticsearch RestClient

NodeSelector

elasticsearch-7.0.1/client/rest/src/main/java/org/elasticsearch/client/NodeSelector.java

public interface NodeSelector {
    /**
     * Select the {@link Node}s to which to send requests. This is called with
     * a mutable {@link Iterable} of {@linkplain Node}s in the order that the
     * rest client would prefer to use them and implementers should remove
     * nodes from the that should not receive the request. Implementers may
     * iterate the nodes as many times as they need.
     * <p>
     * This may be called twice per request: first for "living" nodes that
     * have not been blacklisted by previous errors. If the selector removes
     * all nodes from the list or if there aren't any living nodes then the
     * {@link RestClient} will call this method with a list of "dead" nodes.
     * <p>
     * Implementers should not rely on the ordering of the nodes.
     */
    void select(Iterable<Node> nodes);
    /*
     * We were fairly careful with our choice of Iterable here. The caller has
     * a List but reordering the list is likely to break round robin. Luckily
     * Iterable doesn't allow any reordering.
     */

    /**
     * Selector that matches any node.
     */
    NodeSelector ANY = new NodeSelector() {
        @Override
        public void select(Iterable<Node> nodes) {
            // Intentionally does nothing
        }

        @Override
        public String toString() {
            return "ANY";
        }
    };

    /**
     * Selector that matches any node that has metadata and doesn't
     * have the {@code master} role OR it has the data {@code data}
     * role.
     */
    NodeSelector SKIP_DEDICATED_MASTERS = new NodeSelector() {
        @Override
        public void select(Iterable<Node> nodes) {
            for (Iterator<Node> itr = nodes.iterator(); itr.hasNext();) {
                Node node = itr.next();
                if (node.getRoles() == null) continue;
                if (node.getRoles().isMasterEligible()
                        && false == node.getRoles().isData()
                        && false == node.getRoles().isIngest()) {
                    itr.remove();
                }
            }
        }

        @Override
        public String toString() {
            return "SKIP_DEDICATED_MASTERS";
        }
    };
}
  • The NodeSelector interface defines the select method, which receives the Iterable of mutable, and then the specific implementation will selectively delete the node; it defines two anonymous implementation classes, namely ANY and skip  dedicated  masters, in which the select method of ANY does nothing; the select method of skip  dedicated  masters will delete the master node with date of false and ingest of false; in addition, hasattributenod Two implementation classes: eselector and PreferHasAttributeNodeSelector

HasAttributeNodeSelector

elasticsearch-7.0.1/client/rest/src/main/java/org/elasticsearch/client/HasAttributeNodeSelector.java

public final class HasAttributeNodeSelector implements NodeSelector {
    private final String key;
    private final String value;

    public HasAttributeNodeSelector(String key, String value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public void select(Iterable<Node> nodes) {
        Iterator<Node> itr = nodes.iterator();
        while (itr.hasNext()) {
            Map<String, List<String>> allAttributes = itr.next().getAttributes();
            if (allAttributes == null) continue;
            List<String> values = allAttributes.get(key);
            if (values == null || false == values.contains(value)) {
                itr.remove();
            }
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        HasAttributeNodeSelector that = (HasAttributeNodeSelector) o;
        return Objects.equals(key, that.key) &&
                Objects.equals(value, that.value);
    }

    @Override
    public int hashCode() {
        return Objects.hash(key, value);
    }

    @Override
    public String toString() {
        return key + "=" + value;
    }
}
  • HasAttributeNodeSelector implements NodeSelector interface. Its constructor receives key and value parameters, and its select method will delete nodes whose attributes do not have the key or whose value is null

PreferHasAttributeNodeSelector

elasticsearch-7.0.1/client/rest/src/main/java/org/elasticsearch/client/PreferHasAttributeNodeSelector.java

public final class PreferHasAttributeNodeSelector implements NodeSelector {
    private final String key;
    private final String value;

    public PreferHasAttributeNodeSelector(String key, String value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public void select(Iterable<Node> nodes) {
        boolean foundAtLeastOne = false;

        for (Node node : nodes) {
            Map<String, List<String>> attributes = node.getAttributes();

            if (attributes == null) {
                continue;
            }

            List<String> values = attributes.get(key);

            if (values == null) {
                continue;
            }

            if (values.contains(value)) {
                foundAtLeastOne = true;
                break;
            }
        }

        if (foundAtLeastOne) {
            Iterator<Node> nodeIterator = nodes.iterator();
            while (nodeIterator.hasNext()) {
                Map<String, List<String>> attributes = nodeIterator.next().getAttributes();

                if (attributes == null) {
                    continue;
                }

                List<String> values = attributes.get(key);

                if (values == null || !values.contains(value)) {
                    nodeIterator.remove();
                }
            }
        }
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        PreferHasAttributeNodeSelector that = (PreferHasAttributeNodeSelector) o;
        return Objects.equals(key, that.key) &&
            Objects.equals(value, that.value);
    }

    @Override
    public int hashCode() {
        return Objects.hash(key, value);
    }

    @Override
    public String toString() {
        return key + "=" + value;
    }
}
  • The PreferHasAttributeNodeSelector implements the NodeSelector interface. Its constructor receives the key and value parameters. Its select method will first traverse the nodes and set foundAtLeastOne. If foundAtLeastOne is true, the attributes of the node will be deleted if there is no such key or the node with null value corresponding to the key

Summary

  • The NodeSelector interface defines the select method, which receives the Iterable of mutable, and then the specific implementation will selectively delete the node; it defines two anonymous implementation classes, namely ANY and skip  dedicated  masters, in which the select method of ANY does nothing; the select method of skip  dedicated  masters will delete the master node whose date is false and ingest is false
  • HasAttributeNodeSelector implements NodeSelector interface. Its constructor receives key and value parameters, and its select method will delete nodes whose attributes do not have the key or whose value is null
  • The PreferHasAttributeNodeSelector implements the NodeSelector interface. Its constructor receives the key and value parameters. Its select method will first traverse the nodes and set foundAtLeastOne. If foundAtLeastOne is true, the attributes of the node will be deleted if there is no such key or the node with null value corresponding to the key

doc

Posted by mitcho on Sun, 10 Nov 2019 11:12:40 -0800