Search in sources :

Example 1 with GridTaskSessionRequest

use of org.apache.ignite.internal.GridTaskSessionRequest in project ignite by apache.

the class GridJobProcessor method setAttributes.

/**
     * @param ses Session.
     * @param attrs Attributes.
     * @throws IgniteCheckedException If failed.
     */
public void setAttributes(GridJobSessionImpl ses, Map<?, ?> attrs) throws IgniteCheckedException {
    assert ses.isFullSupport();
    long timeout = ses.getEndTime() - U.currentTimeMillis();
    if (timeout <= 0) {
        U.warn(log, "Task execution timed out (remote session attributes won't be set): " + ses);
        return;
    }
    if (log.isDebugEnabled())
        log.debug("Setting session attribute(s) from job: " + ses);
    ClusterNode taskNode = ctx.discovery().node(ses.getTaskNodeId());
    if (taskNode == null)
        throw new IgniteCheckedException("Node that originated task execution has left grid: " + ses.getTaskNodeId());
    boolean loc = ctx.localNodeId().equals(taskNode.id()) && !ctx.config().isMarshalLocalJobs();
    GridTaskSessionRequest req = new GridTaskSessionRequest(ses.getId(), ses.getJobId(), loc ? null : U.marshal(marsh, attrs), attrs);
    Object topic = TOPIC_TASK.topic(ses.getJobId(), ctx.discovery().localNode().id());
    // Always go through communication to preserve order.
    ctx.io().sendOrderedMessage(taskNode, // Job topic.
    topic, req, SYSTEM_POOL, timeout, false);
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridTaskSessionRequest(org.apache.ignite.internal.GridTaskSessionRequest)

Example 2 with GridTaskSessionRequest

use of org.apache.ignite.internal.GridTaskSessionRequest in project ignite by apache.

the class GridTaskProcessor method sendSessionAttributes.

/**
     * This method will make the best attempt to send attributes to all jobs.
     *
     * @param attrs Deserialized session attributes.
     * @param ses Task session.
     * @throws IgniteCheckedException If send to any of the jobs failed.
     */
@SuppressWarnings({ "SynchronizationOnLocalVariableOrMethodParameter", "BusyWait" })
private void sendSessionAttributes(Map<?, ?> attrs, GridTaskSessionImpl ses) throws IgniteCheckedException {
    assert attrs != null;
    assert ses != null;
    Collection<ComputeJobSibling> siblings = ses.getJobSiblings();
    GridIoManager commMgr = ctx.io();
    long timeout = ses.getEndTime() - U.currentTimeMillis();
    if (timeout <= 0) {
        U.warn(log, "Session attributes won't be set due to task timeout: " + attrs);
        return;
    }
    Set<UUID> rcvrs = new HashSet<>();
    UUID locNodeId = ctx.localNodeId();
    synchronized (ses) {
        if (ses.isClosed()) {
            if (log.isDebugEnabled())
                log.debug("Setting session attributes on closed session (will ignore): " + ses);
            return;
        }
        ses.setInternal(attrs);
        // ID will be associated with a certain session state.
        for (ComputeJobSibling s : siblings) {
            GridJobSiblingImpl sib = (GridJobSiblingImpl) s;
            UUID nodeId = sib.nodeId();
            if (!nodeId.equals(locNodeId) && !sib.isJobDone() && !rcvrs.contains(nodeId))
                rcvrs.add(nodeId);
        }
    }
    if (ctx.event().isRecordable(EVT_TASK_SESSION_ATTR_SET)) {
        Event evt = new TaskEvent(ctx.discovery().localNode(), "Changed attributes: " + attrs, EVT_TASK_SESSION_ATTR_SET, ses.getId(), ses.getTaskName(), ses.getTaskClassName(), false, null);
        ctx.event().record(evt);
    }
    IgniteCheckedException ex = null;
    // Every job gets an individual message to keep track of ghost requests.
    for (ComputeJobSibling s : ses.getJobSiblings()) {
        GridJobSiblingImpl sib = (GridJobSiblingImpl) s;
        UUID nodeId = sib.nodeId();
        // Pair can be null if job is finished.
        if (rcvrs.remove(nodeId)) {
            ClusterNode node = ctx.discovery().node(nodeId);
            // Check that node didn't change (it could happen in case of failover).
            if (node != null) {
                boolean loc = node.id().equals(ctx.localNodeId()) && !ctx.config().isMarshalLocalJobs();
                GridTaskSessionRequest req = new GridTaskSessionRequest(ses.getId(), null, loc ? null : U.marshal(marsh, attrs), attrs);
                // should be preserved here.
                try {
                    commMgr.sendOrderedMessage(node, sib.jobTopic(), req, SYSTEM_POOL, timeout, false);
                } catch (IgniteCheckedException e) {
                    node = ctx.discovery().node(nodeId);
                    if (node != null) {
                        try {
                            // Since communication on remote node may stop before
                            // we get discovery notification, we give ourselves the
                            // best effort to detect it.
                            Thread.sleep(DISCO_TIMEOUT);
                        } catch (InterruptedException ignore) {
                            U.warn(log, "Got interrupted while sending session attributes.");
                        }
                        node = ctx.discovery().node(nodeId);
                    }
                    String err = "Failed to send session attribute request message to node " + "(normal case if node left grid) [node=" + node + ", req=" + req + ']';
                    if (node != null)
                        U.warn(log, err);
                    else if (log.isDebugEnabled())
                        log.debug(err);
                    if (ex == null)
                        ex = e;
                }
            }
        }
    }
    if (ex != null)
        throw ex;
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) GridJobSiblingImpl(org.apache.ignite.internal.GridJobSiblingImpl) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridIoManager(org.apache.ignite.internal.managers.communication.GridIoManager) GridTaskSessionRequest(org.apache.ignite.internal.GridTaskSessionRequest) TaskEvent(org.apache.ignite.events.TaskEvent) TaskEvent(org.apache.ignite.events.TaskEvent) Event(org.apache.ignite.events.Event) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent) ComputeJobSibling(org.apache.ignite.compute.ComputeJobSibling) UUID(java.util.UUID) HashSet(java.util.HashSet)

Aggregations

IgniteCheckedException (org.apache.ignite.IgniteCheckedException)2 ClusterNode (org.apache.ignite.cluster.ClusterNode)2 GridTaskSessionRequest (org.apache.ignite.internal.GridTaskSessionRequest)2 HashSet (java.util.HashSet)1 UUID (java.util.UUID)1 ComputeJobSibling (org.apache.ignite.compute.ComputeJobSibling)1 DiscoveryEvent (org.apache.ignite.events.DiscoveryEvent)1 Event (org.apache.ignite.events.Event)1 TaskEvent (org.apache.ignite.events.TaskEvent)1 GridJobSiblingImpl (org.apache.ignite.internal.GridJobSiblingImpl)1 GridIoManager (org.apache.ignite.internal.managers.communication.GridIoManager)1