Search in sources :

Example 1 with Heartbeat

use of org.apache.nifi.cluster.protocol.Heartbeat in project nifi by apache.

the class ClusterProtocolHeartbeatMonitor method handleHeartbeat.

private ProtocolMessage handleHeartbeat(final HeartbeatMessage msg) {
    final HeartbeatMessage heartbeatMsg = msg;
    final Heartbeat heartbeat = heartbeatMsg.getHeartbeat();
    final NodeIdentifier nodeId = heartbeat.getNodeIdentifier();
    final NodeConnectionStatus connectionStatus = heartbeat.getConnectionStatus();
    final byte[] payloadBytes = heartbeat.getPayload();
    final HeartbeatPayload payload = HeartbeatPayload.unmarshal(payloadBytes);
    final int activeThreadCount = payload.getActiveThreadCount();
    final int flowFileCount = (int) payload.getTotalFlowFileCount();
    final long flowFileBytes = payload.getTotalFlowFileBytes();
    final long systemStartTime = payload.getSystemStartTime();
    final NodeHeartbeat nodeHeartbeat = new StandardNodeHeartbeat(nodeId, System.currentTimeMillis(), connectionStatus, flowFileCount, flowFileBytes, activeThreadCount, systemStartTime);
    heartbeatMessages.put(heartbeat.getNodeIdentifier(), nodeHeartbeat);
    logger.debug("Received new heartbeat from {}", nodeId);
    // Formulate a List of differences between our view of the cluster topology and the node's view
    // and send that back to the node so that it is in-sync with us
    List<NodeConnectionStatus> nodeStatusList = payload.getClusterStatus();
    if (nodeStatusList == null) {
        nodeStatusList = Collections.emptyList();
    }
    final List<NodeConnectionStatus> updatedStatuses = getUpdatedStatuses(nodeStatusList);
    final HeartbeatResponseMessage responseMessage = new HeartbeatResponseMessage();
    responseMessage.setUpdatedNodeStatuses(updatedStatuses);
    if (!getClusterCoordinator().isFlowElectionComplete()) {
        responseMessage.setFlowElectionMessage(getClusterCoordinator().getFlowElectionStatus());
    }
    return responseMessage;
}
Also used : HeartbeatResponseMessage(org.apache.nifi.cluster.protocol.message.HeartbeatResponseMessage) HeartbeatMessage(org.apache.nifi.cluster.protocol.message.HeartbeatMessage) Heartbeat(org.apache.nifi.cluster.protocol.Heartbeat) NodeIdentifier(org.apache.nifi.cluster.protocol.NodeIdentifier) HeartbeatPayload(org.apache.nifi.cluster.protocol.HeartbeatPayload) NodeConnectionStatus(org.apache.nifi.cluster.coordination.node.NodeConnectionStatus)

Example 2 with Heartbeat

use of org.apache.nifi.cluster.protocol.Heartbeat in project nifi by apache.

the class TestJaxbProtocolUtils method testRoundTripHeartbeat.

@Test
public void testRoundTripHeartbeat() throws JAXBException {
    final NodeIdentifier nodeId = new NodeIdentifier("id", "localhost", 8000, "localhost", 8001, "localhost", 8002, 8003, true);
    final NodeConnectionStatus nodeStatus = new NodeConnectionStatus(nodeId, DisconnectionCode.NOT_YET_CONNECTED);
    final HeartbeatPayload payload = new HeartbeatPayload();
    payload.setActiveThreadCount(1);
    payload.setSystemStartTime(System.currentTimeMillis());
    payload.setTotalFlowFileBytes(83L);
    payload.setTotalFlowFileCount(4);
    final List<NodeConnectionStatus> clusterStatus = Collections.singletonList(nodeStatus);
    payload.setClusterStatus(clusterStatus);
    final Heartbeat heartbeat = new Heartbeat(nodeId, nodeStatus, payload.marshal());
    final HeartbeatMessage msg = new HeartbeatMessage();
    msg.setHeartbeat(heartbeat);
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    JaxbProtocolUtils.JAXB_CONTEXT.createMarshaller().marshal(msg, baos);
    final Object unmarshalled = JaxbProtocolUtils.JAXB_CONTEXT.createUnmarshaller().unmarshal(new ByteArrayInputStream(baos.toByteArray()));
    assertTrue(unmarshalled instanceof HeartbeatMessage);
}
Also used : HeartbeatMessage(org.apache.nifi.cluster.protocol.message.HeartbeatMessage) ByteArrayInputStream(java.io.ByteArrayInputStream) NodeIdentifier(org.apache.nifi.cluster.protocol.NodeIdentifier) Heartbeat(org.apache.nifi.cluster.protocol.Heartbeat) HeartbeatPayload(org.apache.nifi.cluster.protocol.HeartbeatPayload) ByteArrayOutputStream(java.io.ByteArrayOutputStream) NodeConnectionStatus(org.apache.nifi.cluster.coordination.node.NodeConnectionStatus) Test(org.junit.Test)

Example 3 with Heartbeat

use of org.apache.nifi.cluster.protocol.Heartbeat in project nifi by apache.

the class StandardNodeHeartbeat method fromHeartbeatMessage.

public static StandardNodeHeartbeat fromHeartbeatMessage(final HeartbeatMessage message, final long timestamp) {
    final Heartbeat heartbeat = message.getHeartbeat();
    final HeartbeatPayload payload = HeartbeatPayload.unmarshal(heartbeat.getPayload());
    return new StandardNodeHeartbeat(heartbeat.getNodeIdentifier(), timestamp, heartbeat.getConnectionStatus(), (int) payload.getTotalFlowFileCount(), payload.getTotalFlowFileBytes(), payload.getActiveThreadCount(), payload.getSystemStartTime());
}
Also used : Heartbeat(org.apache.nifi.cluster.protocol.Heartbeat) HeartbeatPayload(org.apache.nifi.cluster.protocol.HeartbeatPayload)

Example 4 with Heartbeat

use of org.apache.nifi.cluster.protocol.Heartbeat in project nifi by apache.

the class FlowController method createHeartbeatMessage.

HeartbeatMessage createHeartbeatMessage() {
    try {
        HeartbeatBean bean = heartbeatBeanRef.get();
        if (bean == null) {
            readLock.lock();
            try {
                bean = new HeartbeatBean(getGroup(getRootGroupId()), isPrimary());
            } finally {
                readLock.unlock();
            }
        }
        // create heartbeat payload
        final HeartbeatPayload hbPayload = new HeartbeatPayload();
        hbPayload.setSystemStartTime(systemStartTime);
        hbPayload.setActiveThreadCount(getActiveThreadCount());
        final QueueSize queueSize = getTotalFlowFileCount(bean.getRootGroup());
        hbPayload.setTotalFlowFileCount(queueSize.getObjectCount());
        hbPayload.setTotalFlowFileBytes(queueSize.getByteCount());
        hbPayload.setClusterStatus(clusterCoordinator.getConnectionStatuses());
        // create heartbeat message
        final NodeIdentifier nodeId = getNodeId();
        if (nodeId == null) {
            LOG.warn("Cannot create Heartbeat Message because node's identifier is not known at this time");
            return null;
        }
        final Heartbeat heartbeat = new Heartbeat(nodeId, connectionStatus, hbPayload.marshal());
        final HeartbeatMessage message = new HeartbeatMessage();
        message.setHeartbeat(heartbeat);
        LOG.debug("Generated heartbeat");
        return message;
    } catch (final Throwable ex) {
        LOG.warn("Failed to create heartbeat due to: " + ex, ex);
        return null;
    }
}
Also used : QueueSize(org.apache.nifi.controller.queue.QueueSize) HeartbeatMessage(org.apache.nifi.cluster.protocol.message.HeartbeatMessage) NodeIdentifier(org.apache.nifi.cluster.protocol.NodeIdentifier) Heartbeat(org.apache.nifi.cluster.protocol.Heartbeat) HeartbeatPayload(org.apache.nifi.cluster.protocol.HeartbeatPayload)

Aggregations

Heartbeat (org.apache.nifi.cluster.protocol.Heartbeat)4 HeartbeatPayload (org.apache.nifi.cluster.protocol.HeartbeatPayload)4 NodeIdentifier (org.apache.nifi.cluster.protocol.NodeIdentifier)3 HeartbeatMessage (org.apache.nifi.cluster.protocol.message.HeartbeatMessage)3 NodeConnectionStatus (org.apache.nifi.cluster.coordination.node.NodeConnectionStatus)2 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 HeartbeatResponseMessage (org.apache.nifi.cluster.protocol.message.HeartbeatResponseMessage)1 QueueSize (org.apache.nifi.controller.queue.QueueSize)1 Test (org.junit.Test)1