Search in sources :

Example 6 with IgniteDeploymentCheckedException

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

the class GridContinuousProcessor method processStartRequest.

/**
     * @param node Sender.
     * @param req Start request.
     */
private void processStartRequest(ClusterNode node, StartRoutineDiscoveryMessage req) {
    UUID routineId = req.routineId();
    StartRequestData data = req.startRequestData();
    GridContinuousHandler hnd = data.handler();
    if (req.keepBinary()) {
        assert hnd instanceof CacheContinuousQueryHandler;
        ((CacheContinuousQueryHandler) hnd).keepBinary(true);
    }
    IgniteCheckedException err = null;
    try {
        if (ctx.config().isPeerClassLoadingEnabled()) {
            String clsName = data.className();
            if (clsName != null) {
                GridDeploymentInfo depInfo = data.deploymentInfo();
                GridDeployment dep = ctx.deploy().getGlobalDeployment(depInfo.deployMode(), clsName, clsName, depInfo.userVersion(), node.id(), depInfo.classLoaderId(), depInfo.participants(), null);
                if (dep == null)
                    throw new IgniteDeploymentCheckedException("Failed to obtain deployment for class: " + clsName);
                data.p2pUnmarshal(marsh, U.resolveClassLoader(dep.classLoader(), ctx.config()));
            }
            hnd.p2pUnmarshal(node.id(), ctx);
        }
    } catch (IgniteCheckedException e) {
        err = e;
        U.error(log, "Failed to register handler [nodeId=" + node.id() + ", routineId=" + routineId + ']', e);
    }
    GridContinuousHandler hnd0 = hnd instanceof GridMessageListenHandler ? new GridMessageListenHandler((GridMessageListenHandler) hnd) : hnd;
    if (node.isClient()) {
        Map<UUID, LocalRoutineInfo> clientRoutineMap = clientInfos.get(node.id());
        if (clientRoutineMap == null) {
            clientRoutineMap = new HashMap<>();
            Map<UUID, LocalRoutineInfo> old = clientInfos.put(node.id(), clientRoutineMap);
            assert old == null;
        }
        clientRoutineMap.put(routineId, new LocalRoutineInfo(data.projectionPredicate(), hnd0, data.bufferSize(), data.interval(), data.autoUnsubscribe()));
    }
    if (err == null) {
        try {
            IgnitePredicate<ClusterNode> prjPred = data.projectionPredicate();
            if (prjPred != null)
                ctx.resource().injectGeneric(prjPred);
            if ((prjPred == null || prjPred.apply(ctx.discovery().node(ctx.localNodeId()))) && !locInfos.containsKey(routineId))
                registerHandler(node.id(), routineId, hnd0, data.bufferSize(), data.interval(), data.autoUnsubscribe(), false);
            if (!data.autoUnsubscribe())
                // Register routine locally.
                locInfos.putIfAbsent(routineId, new LocalRoutineInfo(prjPred, hnd0, data.bufferSize(), data.interval(), data.autoUnsubscribe()));
        } catch (IgniteCheckedException e) {
            err = e;
            U.error(log, "Failed to register handler [nodeId=" + node.id() + ", routineId=" + routineId + ']', e);
        }
    }
    // Load partition counters.
    if (hnd0.isQuery()) {
        GridCacheProcessor proc = ctx.cache();
        if (proc != null) {
            GridCacheAdapter cache = ctx.cache().internalCache(hnd0.cacheName());
            if (cache != null && !cache.isLocal() && cache.context().userCache())
                req.addUpdateCounters(ctx.localNodeId(), cache.context().topology().updateCounters(false));
        }
    }
    if (err != null)
        req.addError(ctx.localNodeId(), err);
}
Also used : ClusterNode(org.apache.ignite.cluster.ClusterNode) IgniteDeploymentCheckedException(org.apache.ignite.internal.IgniteDeploymentCheckedException) CacheContinuousQueryHandler(org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler) GridDeploymentInfo(org.apache.ignite.internal.managers.deployment.GridDeploymentInfo) GridCacheProcessor(org.apache.ignite.internal.processors.cache.GridCacheProcessor) GridDeployment(org.apache.ignite.internal.managers.deployment.GridDeployment) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridMessageListenHandler(org.apache.ignite.internal.GridMessageListenHandler) GridCacheAdapter(org.apache.ignite.internal.processors.cache.GridCacheAdapter) UUID(java.util.UUID)

Example 7 with IgniteDeploymentCheckedException

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

the class GridContinuousProcessor method startRoutine.

/**
     * @param hnd Handler.
     * @param bufSize Buffer size.
     * @param interval Time interval.
     * @param autoUnsubscribe Automatic unsubscribe flag.
     * @param locOnly Local only flag.
     * @param prjPred Projection predicate.
     * @return Future.
     */
@SuppressWarnings("TooBroadScope")
public IgniteInternalFuture<UUID> startRoutine(GridContinuousHandler hnd, boolean locOnly, int bufSize, long interval, boolean autoUnsubscribe, @Nullable IgnitePredicate<ClusterNode> prjPred) {
    assert hnd != null;
    assert bufSize > 0;
    assert interval >= 0;
    // Generate ID.
    final UUID routineId = UUID.randomUUID();
    // Register routine locally.
    locInfos.put(routineId, new LocalRoutineInfo(prjPred, hnd, bufSize, interval, autoUnsubscribe));
    if (locOnly) {
        try {
            registerHandler(ctx.localNodeId(), routineId, hnd, bufSize, interval, autoUnsubscribe, true);
            return new GridFinishedFuture<>(routineId);
        } catch (IgniteCheckedException e) {
            unregisterHandler(routineId, hnd, true);
            return new GridFinishedFuture<>(e);
        }
    }
    // Whether local node is included in routine.
    boolean locIncluded = prjPred == null || prjPred.apply(ctx.discovery().localNode());
    StartRequestData reqData = new StartRequestData(prjPred, hnd.clone(), bufSize, interval, autoUnsubscribe);
    try {
        if (ctx.config().isPeerClassLoadingEnabled()) {
            // Handle peer deployment for projection predicate.
            if (prjPred != null && !U.isGrid(prjPred.getClass())) {
                Class cls = U.detectClass(prjPred);
                String clsName = cls.getName();
                GridDeployment dep = ctx.deploy().deploy(cls, U.detectClassLoader(cls));
                if (dep == null)
                    throw new IgniteDeploymentCheckedException("Failed to deploy projection predicate: " + prjPred);
                reqData.className(clsName);
                reqData.deploymentInfo(new GridDeploymentInfoBean(dep));
                reqData.p2pMarshal(marsh);
            }
            // Handle peer deployment for other handler-specific objects.
            reqData.handler().p2pMarshal(ctx);
        }
    } catch (IgniteCheckedException e) {
        return new GridFinishedFuture<>(e);
    }
    // Register per-routine notifications listener if ordered messaging is used.
    registerMessageListener(hnd);
    StartFuture fut = new StartFuture(ctx, routineId);
    startFuts.put(routineId, fut);
    try {
        if (locIncluded || hnd.isQuery())
            registerHandler(ctx.localNodeId(), routineId, hnd, bufSize, interval, autoUnsubscribe, true);
        ctx.discovery().sendCustomEvent(new StartRoutineDiscoveryMessage(routineId, reqData, reqData.handler().keepBinary()));
    } catch (IgniteCheckedException e) {
        startFuts.remove(routineId);
        locInfos.remove(routineId);
        unregisterHandler(routineId, hnd, true);
        fut.onDone(e);
        return fut;
    }
    // Handler is registered locally.
    fut.onLocalRegistered();
    return fut;
}
Also used : IgniteDeploymentCheckedException(org.apache.ignite.internal.IgniteDeploymentCheckedException) GridFinishedFuture(org.apache.ignite.internal.util.future.GridFinishedFuture) GridDeployment(org.apache.ignite.internal.managers.deployment.GridDeployment) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridDeploymentInfoBean(org.apache.ignite.internal.managers.deployment.GridDeploymentInfoBean) UUID(java.util.UUID)

Example 8 with IgniteDeploymentCheckedException

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

the class GridTaskProcessor method startTask.

/**
     * @param taskName Task name.
     * @param taskCls Task class.
     * @param task Task.
     * @param sesId Task session ID.
     * @param arg Optional task argument.
     * @param sys If {@code true}, then system pool will be used.
     * @param execName Name of the custom executor.
     * @return Task future.
     */
@SuppressWarnings("unchecked")
private <T, R> ComputeTaskInternalFuture<R> startTask(@Nullable String taskName, @Nullable Class<?> taskCls, @Nullable ComputeTask<T, R> task, IgniteUuid sesId, @Nullable T arg, boolean sys, @Nullable String execName) {
    assert sesId != null;
    String taskClsName;
    if (task != null)
        taskClsName = task.getClass().getName();
    else
        taskClsName = taskCls != null ? taskCls.getName() : taskName;
    // Get values from thread-local context.
    Map<GridTaskThreadContextKey, Object> map = thCtx.get();
    if (map == null)
        map = EMPTY_ENUM_MAP;
    else
        // Reset thread-local context.
        thCtx.set(null);
    if (map.get(TC_SKIP_AUTH) == null)
        ctx.security().authorize(taskClsName, SecurityPermission.TASK_EXECUTE, null);
    Long timeout = (Long) map.get(TC_TIMEOUT);
    long timeout0 = timeout == null || timeout == 0 ? Long.MAX_VALUE : timeout;
    long startTime = U.currentTimeMillis();
    long endTime = timeout0 + startTime;
    // Account for overflow.
    if (endTime < 0)
        endTime = Long.MAX_VALUE;
    IgniteCheckedException deployEx = null;
    GridDeployment dep = null;
    // User provided task name.
    if (taskName != null) {
        assert taskCls == null;
        assert task == null;
        try {
            dep = ctx.deploy().getDeployment(taskName);
            if (dep == null)
                throw new IgniteDeploymentCheckedException("Unknown task name or failed to auto-deploy " + "task (was task (re|un)deployed?): " + taskName);
            taskCls = dep.deployedClass(taskName);
            if (taskCls == null)
                throw new IgniteDeploymentCheckedException("Unknown task name or failed to auto-deploy " + "task (was task (re|un)deployed?) [taskName=" + taskName + ", dep=" + dep + ']');
            if (!ComputeTask.class.isAssignableFrom(taskCls))
                throw new IgniteCheckedException("Failed to auto-deploy task (deployed class is not a task) " + "[taskName=" + taskName + ", depCls=" + taskCls + ']');
        } catch (IgniteCheckedException e) {
            deployEx = e;
        }
    } else // Deploy user task class.
    if (taskCls != null) {
        assert task == null;
        try {
            // Implicit deploy.
            dep = ctx.deploy().deploy(taskCls, U.detectClassLoader(taskCls));
            if (dep == null)
                throw new IgniteDeploymentCheckedException("Failed to auto-deploy task " + "(was task (re|un)deployed?): " + taskCls);
            taskName = taskName(dep, taskCls, map);
        } catch (IgniteCheckedException e) {
            taskName = taskCls.getName();
            deployEx = e;
        }
    } else // Deploy user task.
    if (task != null) {
        try {
            ClassLoader ldr;
            Class<?> cls;
            if (task instanceof GridPeerDeployAware) {
                GridPeerDeployAware depAware = (GridPeerDeployAware) task;
                cls = depAware.deployClass();
                ldr = depAware.classLoader();
                // Set proper class name to make peer-loading possible.
                taskCls = cls;
            } else {
                taskCls = task.getClass();
                assert ComputeTask.class.isAssignableFrom(taskCls);
                cls = task.getClass();
                ldr = U.detectClassLoader(cls);
            }
            // Explicit deploy.
            dep = ctx.deploy().deploy(cls, ldr);
            if (dep == null)
                throw new IgniteDeploymentCheckedException("Failed to auto-deploy task " + "(was task (re|un)deployed?): " + cls);
            taskName = taskName(dep, taskCls, map);
        } catch (IgniteCheckedException e) {
            taskName = task.getClass().getName();
            deployEx = e;
        }
    }
    assert taskName != null;
    if (log.isDebugEnabled())
        log.debug("Task deployment: " + dep);
    boolean fullSup = dep != null && taskCls != null && dep.annotation(taskCls, ComputeTaskSessionFullSupport.class) != null;
    Collection<? extends ClusterNode> nodes = (Collection<? extends ClusterNode>) map.get(TC_SUBGRID);
    Collection<UUID> top = nodes != null ? F.nodeIds(nodes) : null;
    UUID subjId = getThreadContext(TC_SUBJ_ID);
    if (subjId == null)
        subjId = ctx.localNodeId();
    boolean internal = false;
    if (dep == null || taskCls == null)
        assert deployEx != null;
    else
        internal = dep.internalTask(task, taskCls);
    // Creates task session with task name and task version.
    GridTaskSessionImpl ses = ctx.session().createTaskSession(sesId, ctx.localNodeId(), taskName, dep, taskCls == null ? null : taskCls.getName(), top, startTime, endTime, Collections.<ComputeJobSibling>emptyList(), Collections.emptyMap(), fullSup, internal, subjId, execName);
    ComputeTaskInternalFuture<R> fut = new ComputeTaskInternalFuture<>(ses, ctx);
    IgniteCheckedException securityEx = null;
    if (ctx.security().enabled() && deployEx == null) {
        try {
            saveTaskMetadata(taskName);
        } catch (IgniteCheckedException e) {
            securityEx = e;
        }
    }
    if (deployEx == null && securityEx == null) {
        if (dep == null || !dep.acquire())
            handleException(new IgniteDeploymentCheckedException("Task not deployed: " + ses.getTaskName()), fut);
        else {
            GridTaskWorker<?, ?> taskWorker = new GridTaskWorker<>(ctx, arg, ses, fut, taskCls, task, dep, new TaskEventListener(), map, subjId);
            GridTaskWorker<?, ?> taskWorker0 = tasks.putIfAbsent(sesId, taskWorker);
            assert taskWorker0 == null : "Session ID is not unique: " + sesId;
            if (!ctx.clientDisconnected()) {
                if (dep.annotation(taskCls, ComputeTaskMapAsync.class) != null) {
                    try {
                        // Start task execution in another thread.
                        if (sys)
                            ctx.getSystemExecutorService().execute(taskWorker);
                        else
                            ctx.getExecutorService().execute(taskWorker);
                    } catch (RejectedExecutionException e) {
                        tasks.remove(sesId);
                        release(dep);
                        handleException(new ComputeExecutionRejectedException("Failed to execute task " + "due to thread pool execution rejection: " + taskName, e), fut);
                    }
                } else
                    taskWorker.run();
            } else
                taskWorker.finishTask(null, disconnectedError(null));
        }
    } else {
        if (deployEx != null)
            handleException(deployEx, fut);
        else
            handleException(securityEx, fut);
    }
    return fut;
}
Also used : ComputeTaskMapAsync(org.apache.ignite.compute.ComputeTaskMapAsync) ComputeTask(org.apache.ignite.compute.ComputeTask) GridPeerDeployAware(org.apache.ignite.internal.util.lang.GridPeerDeployAware) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridTaskSessionImpl(org.apache.ignite.internal.GridTaskSessionImpl) UUID(java.util.UUID) ClusterNode(org.apache.ignite.cluster.ClusterNode) IgniteDeploymentCheckedException(org.apache.ignite.internal.IgniteDeploymentCheckedException) RejectedExecutionException(java.util.concurrent.RejectedExecutionException) GridDeployment(org.apache.ignite.internal.managers.deployment.GridDeployment) ComputeTaskInternalFuture(org.apache.ignite.internal.ComputeTaskInternalFuture) Collection(java.util.Collection) ComputeExecutionRejectedException(org.apache.ignite.compute.ComputeExecutionRejectedException)

Aggregations

IgniteDeploymentCheckedException (org.apache.ignite.internal.IgniteDeploymentCheckedException)8 GridDeployment (org.apache.ignite.internal.managers.deployment.GridDeployment)7 IgniteCheckedException (org.apache.ignite.IgniteCheckedException)5 UUID (java.util.UUID)4 ClusterNode (org.apache.ignite.cluster.ClusterNode)4 Collection (java.util.Collection)3 ArrayList (java.util.ArrayList)1 HashSet (java.util.HashSet)1 LinkedList (java.util.LinkedList)1 RejectedExecutionException (java.util.concurrent.RejectedExecutionException)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 ComputeExecutionRejectedException (org.apache.ignite.compute.ComputeExecutionRejectedException)1 ComputeTask (org.apache.ignite.compute.ComputeTask)1 ComputeTaskMapAsync (org.apache.ignite.compute.ComputeTaskMapAsync)1 DiscoveryEvent (org.apache.ignite.events.DiscoveryEvent)1 Event (org.apache.ignite.events.Event)1 EVT_NODE_LEFT (org.apache.ignite.events.EventType.EVT_NODE_LEFT)1 ComputeTaskInternalFuture (org.apache.ignite.internal.ComputeTaskInternalFuture)1 GridMessageListenHandler (org.apache.ignite.internal.GridMessageListenHandler)1 GridTaskSessionImpl (org.apache.ignite.internal.GridTaskSessionImpl)1