protected String[] filterNodeIds(DiscoveryNodes nodes, String[] nodesIds) { // Filter out all old nodes that don't support task management API List<String> supportedNodes = new ArrayList<>(nodesIds.length); for (String nodeId : nodesIds) { DiscoveryNode node = nodes.get(nodeId); if(node != null && node.version().onOrAfter(Version.V_2_3_0)) { supportedNodes.add(nodeId); } } return supportedNodes.toArray(new String[supportedNodes.size()]); }
private void sendClusterStateDiff(ClusterState clusterState, Diff diff, Map<Version, BytesReference> serializedDiffs, DiscoveryNode node, AtomicBoolean timedOutWaitingForNodes, TimeValue publishTimeout, BlockingClusterStatePublishResponseHandler publishResponseHandler) { BytesReference bytes = serializedDiffs.get(node.version()); if (bytes == null) { try { bytes = serializeDiffClusterState(diff, node.version()); serializedDiffs.put(node.version(), bytes); } catch (Throwable e) { logger.warn("failed to serialize diff of cluster_state before publishing it to node {}", e, node); publishResponseHandler.onFailure(node, e); return; } } publishClusterStateToNode(clusterState, bytes, node, timedOutWaitingForNodes, publishTimeout, publishResponseHandler, true); }
private Decision isVersionCompatible(final RoutingNodes routingNodes, final String sourceNodeId, final RoutingNode target, RoutingAllocation allocation) { final RoutingNode source = routingNodes.node(sourceNodeId); if (target.node().version().onOrAfter(source.node().version())) { /* we can allocate if we can recover from a node that is younger or on the same version * if the primary is already running on a newer version that won't work due to possible * differences in the lucene index format etc.*/ return allocation.decision(Decision.YES, NAME, "target node version [%s] is same or newer than source node version [%s]", target.node().version(), source.node().version()); } else { return allocation.decision(Decision.NO, NAME, "target node version [%s] is older than source node version [%s]", target.node().version(), source.node().version()); } }
private void sendFullClusterState(ClusterState clusterState, @Nullable Map<Version, BytesReference> serializedStates, DiscoveryNode node, AtomicBoolean timedOutWaitingForNodes, TimeValue publishTimeout, BlockingClusterStatePublishResponseHandler publishResponseHandler) { BytesReference bytes = null; if (serializedStates != null) { bytes = serializedStates.get(node.version()); } if (bytes == null) { try { bytes = serializeFullClusterState(clusterState, node.version()); if (serializedStates != null) { serializedStates.put(node.version(), bytes); } } catch (Throwable e) { logger.warn("failed to serialize cluster_state before publishing it to node {}", e, node); publishResponseHandler.onFailure(node, e); return; } } publishClusterStateToNode(clusterState, bytes, node, timedOutWaitingForNodes, publishTimeout, publishResponseHandler, false); }
private Decision isVersionCompatible(RestoreSource restoreSource, final RoutingNode target, RoutingAllocation allocation) { if (target.node().version().onOrAfter(restoreSource.version())) { /* we can allocate if we can restore from a snapshot that is older or on the same version */ return allocation.decision(Decision.YES, NAME, "target node version [%s] is same or newer than snapshot version [%s]", target.node().version(), restoreSource.version()); } else { return allocation.decision(Decision.NO, NAME, "target node version [%s] is older than snapshot version [%s]", target.node().version(), restoreSource.version()); } } }
@Override public void serialize(ESNode value, com.fasterxml.jackson.core.JsonGenerator jgen, SerializerProvider provider) throws IOException, com.fasterxml.jackson.core.JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("id", value.getId()); jgen.writeStringField("agent", System.getProperty("runtime.id")); if (value.isMaster()) { jgen.writeArrayFieldStart("services"); jgen.writeString("elasticsearch"); jgen.writeEndArray(); } jgen.writeStringField("nodeName", value.getNode().name()); jgen.writeStringField("nodeId", value.getNode().id()); jgen.writeStringField("address", value.getNode().address().toString()); jgen.writeStringField("version", value.getNode().version().toString()); jgen.writeFieldName("attributes"); jgen.writeStartObject(); for (Map.Entry<String, String> entry : value.getNode().attributes().entrySet()) { jgen.writeStringField(entry.getKey(), entry.getValue()); } jgen.writeEndObject(); jgen.writeStringField("binary", Base64.encodeObject(value.getNode())); jgen.writeEndObject(); } }
@Override public void serialize(ESNode value, com.fasterxml.jackson.core.JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeStringField("id", value.getId()); jgen.writeStringField("agent", System.getProperty("runtime.id")); if (value.isMaster()) { jgen.writeArrayFieldStart("services"); jgen.writeString("elasticsearch"); jgen.writeEndArray(); } jgen.writeStringField("nodeName", value.getNode().name()); jgen.writeStringField("nodeId", value.getNode().id()); jgen.writeStringField("address", value.getNode().address().toString()); jgen.writeStringField("version", value.getNode().version().toString()); jgen.writeFieldName("attributes"); jgen.writeStartObject(); for (Map.Entry<String, String> entry : value.getNode().attributes().entrySet()) { jgen.writeStringField(entry.getKey(), entry.getValue()); } jgen.writeEndObject(); jgen.writeStringField("binary", Base64.encodeObject(value.getNode())); jgen.writeEndObject(); } }
@Override public void serialize(ESNode value, com.fasterxml.jackson.core.JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeStartObject(); jgen.writeStringField("id", value.getId()); jgen.writeStringField("agent", System.getProperty("runtime.id")); if (value.isMaster()) { jgen.writeArrayFieldStart("services"); jgen.writeString("elasticsearch"); jgen.writeEndArray(); } jgen.writeStringField("nodeName", value.getNode().name()); jgen.writeStringField("nodeId", value.getNode().id()); jgen.writeStringField("address", value.getNode().address().toString()); jgen.writeStringField("version", value.getNode().version().toString()); jgen.writeFieldName("attributes"); jgen.writeStartObject(); for (Map.Entry<String, String> entry : value.getNode().attributes().entrySet()) { jgen.writeStringField(entry.getKey(), entry.getValue()); } jgen.writeEndObject(); jgen.writeStringField("binary", Base64.encodeObject(value.getNode())); jgen.writeEndObject(); } }
public DiscoveryNodes build() { ImmutableOpenMap.Builder<String, DiscoveryNode> dataNodesBuilder = ImmutableOpenMap.builder(); ImmutableOpenMap.Builder<String, DiscoveryNode> masterNodesBuilder = ImmutableOpenMap.builder(); Version minNodeVersion = Version.CURRENT; Version minNonClientNodeVersion = Version.CURRENT; for (ObjectObjectCursor<String, DiscoveryNode> nodeEntry : nodes) { if (nodeEntry.value.dataNode()) { dataNodesBuilder.put(nodeEntry.key, nodeEntry.value); minNonClientNodeVersion = Version.smallest(minNonClientNodeVersion, nodeEntry.value.version()); } if (nodeEntry.value.masterNode()) { masterNodesBuilder.put(nodeEntry.key, nodeEntry.value); minNonClientNodeVersion = Version.smallest(minNonClientNodeVersion, nodeEntry.value.version()); } minNodeVersion = Version.smallest(minNodeVersion, nodeEntry.value.version()); } return new DiscoveryNodes(nodes.build(), dataNodesBuilder.build(), masterNodesBuilder.build(), masterNodeId, localNodeId, minNodeVersion, minNonClientNodeVersion); }
private void sendRemoveBanRequest(Set<String> nodes, BanParentTaskRequest request) { ClusterState clusterState = clusterService.state(); for (String node : nodes) { DiscoveryNode discoveryNode = clusterState.getNodes().get(node); if (discoveryNode != null && discoveryNode.version().onOrAfter(Version.V_2_3_0)) { // Check if node still in the cluster logger.debug("Sending remove ban for tasks with the parent [{}] to the node [{}]", request.parentTaskId, node); transportService.sendRequest(discoveryNode, BAN_PARENT_ACTION_NAME, request, EmptyTransportResponseHandler .INSTANCE_SAME); } else { logger.debug("Cannot send remove ban request for tasks with the parent [{}] to the node [{}] - the node no longer in " + "the cluster or has an old version", request.parentTaskId, node); } } }
DiscoveryNode tempNode = new DiscoveryNode("", UNICAST_NODE_PREFIX + unicastNodeIdGenerator.incrementAndGet() + "_" + nodeToSend.id() + "#", nodeToSend.getHostName(), nodeToSend.getHostAddress(), nodeToSend.address(), nodeToSend.attributes(), nodeToSend.version() ); logger.trace("replacing {} with temp node {}", nodeToSend, tempNode);
private void sendSetBanRequest(Set<String> nodes, BanParentTaskRequest request, final BanLock banLock) { ClusterState clusterState = clusterService.state(); for (String node : nodes) { DiscoveryNode discoveryNode = clusterState.getNodes().get(node); if (discoveryNode != null && discoveryNode.version().onOrAfter(Version.V_2_3_0)) { // Check if node still in the cluster logger.debug("Sending ban for tasks with the parent [{}] to the node [{}], ban [{}]", request.parentTaskId, node, request.ban); transportService.sendRequest(discoveryNode, BAN_PARENT_ACTION_NAME, request, new EmptyTransportResponseHandler(ThreadPool.Names.SAME) { @Override public void handleResponse(TransportResponse.Empty response) { banLock.onBanSet(); } @Override public void handleException(TransportException exp) { banLock.onBanSet(); } }); } else { banLock.onBanSet(); logger.debug("Cannot send ban for tasks with the parent [{}] to the node [{}] - the node no longer in the cluster or has an old version", request.parentTaskId, node); } } }
@Override public void sendRequest(final DiscoveryNode node, final long requestId, final String action, final TransportRequest request, TransportRequestOptions options) throws IOException, TransportException { final Version version = Version.smallest(node.version(), this.version); try (BytesStreamOutput stream = new BytesStreamOutput()) { stream.setVersion(version); stream.writeLong(requestId); byte status = 0; status = TransportStatus.setRequest(status); stream.writeByte(status); // 0 for request, 1 for response. stream.writeString(action); request.writeTo(stream); stream.close(); final LocalTransport targetTransport = connectedNodes.get(node); if (targetTransport == null) { throw new NodeNotConnectedException(node, "Node not connected"); } final byte[] data = stream.bytes().toBytes(); transportServiceAdapter.sent(data.length); transportServiceAdapter.onRequestSent(node, requestId, action, request, options); targetTransport.workers().execute(new Runnable() { @Override public void run() { targetTransport.messageReceived(data, action, LocalTransport.this, version, requestId); } }); } }
new BytesTransportRequest(bytes, node.version()),
newNodes.add(new DiscoveryNode(nodeWithInfo.name(), nodeWithInfo.id(), nodeWithInfo.getHostName(), nodeWithInfo.getHostAddress(), listedNode.address(), nodeWithInfo.attributes(), nodeWithInfo.version())); } else {
@Override public void serialize(ESNode value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("id", value.id()); jgen.writeStringField("nodeName", value.node().name()); jgen.writeStringField("nodeId", value.node().id()); jgen.writeStringField("address", value.node().address().toString()); jgen.writeStringField("version", value.node().version().toString()); jgen.writeFieldName("attributes"); jgen.writeStartObject(); for (Map.Entry<String, String> entry : value.node().attributes().entrySet()) { jgen.writeStringField(entry.getKey(), entry.getValue()); } jgen.writeEndObject(); jgen.writeStringField("binary", Base64.encodeObject(value.node())); jgen.writeEndObject(); } }
@Override public void sendRequest(final DiscoveryNode node, final long requestId, final String action, final TransportRequest request, TransportRequestOptions options) throws IOException, TransportException { Channel targetChannel = nodeChannel(node, options); if (compress) { options.withCompress(true); } byte status = 0; status = TransportStatus.setRequest(status); BytesStreamOutput bStream = new BytesStreamOutput(); bStream.skip(NettyHeader.HEADER_SIZE); StreamOutput stream = bStream; stream = new HandlesStreamOutput(stream); // we pick the smallest of the 2, to support both backward and forward compatibility // note, this is the only place we need to do this, since from here on, we use the serialized version // as the version to use also when the node receiving this request will send the response with Version version = Version.smallest(this.version, node.version()); stream.setVersion(version); stream.writeString(action); ChannelBuffer buffer; request.writeTo(stream); stream.close(); buffer = bStream.ourBytes().toChannelBuffer(); NettyHeader.writeHeader(buffer, requestId, status, version); targetChannel.write(buffer); }
DiscoveryNode discoNode = new DiscoveryNode(tribe.name(), tribe.id(), tribe.getHostName(), tribe.getHostAddress(), tribe.address(), tribeAttr, tribe.version()); clusterStateChanged = true; logger.info("[{}] adding node [{}]", tribeName, discoNode);