Search in sources :

Example 1 with IgniteStripedThreadPoolExecutor

use of org.apache.ignite.thread.IgniteStripedThreadPoolExecutor in project ignite by apache.

the class CacheContinuousQueryHandler method notifyCallback.

/**
 * {@inheritDoc}
 */
@SuppressWarnings("unchecked")
@Override
public void notifyCallback(final UUID nodeId, final UUID routineId, Collection<?> objs, final GridKernalContext ctx) {
    assert nodeId != null;
    assert routineId != null;
    assert objs != null;
    assert ctx != null;
    if (objs.isEmpty())
        return;
    if (asyncCb) {
        final List<CacheContinuousQueryEntry> entries = objs instanceof List ? (List) objs : new ArrayList(objs);
        IgniteStripedThreadPoolExecutor asyncPool = ctx.pools().asyncCallbackPool();
        int threadId = asyncPool.threadId(entries.get(0).partition());
        int startIdx = 0;
        if (entries.size() != 1) {
            for (int i = 1; i < entries.size(); i++) {
                int curThreadId = asyncPool.threadId(entries.get(i).partition());
                // If all entries from one partition avoid creation new collections.
                if (curThreadId == threadId)
                    continue;
                final int i0 = i;
                final int startIdx0 = startIdx;
                asyncPool.execute(new Runnable() {

                    @Override
                    public void run() {
                        notifyCallback0(nodeId, ctx, entries.subList(startIdx0, i0));
                    }
                }, threadId);
                startIdx = i0;
                threadId = curThreadId;
            }
        }
        final int startIdx0 = startIdx;
        asyncPool.execute(new Runnable() {

            @Override
            public void run() {
                notifyCallback0(nodeId, ctx, startIdx0 == 0 ? entries : entries.subList(startIdx0, entries.size()));
            }
        }, threadId);
    } else
        notifyCallback0(nodeId, ctx, (Collection) objs);
}
Also used : IgniteStripedThreadPoolExecutor(org.apache.ignite.thread.IgniteStripedThreadPoolExecutor) GridPlainRunnable(org.apache.ignite.internal.util.lang.GridPlainRunnable) ArrayList(java.util.ArrayList) Collection(java.util.Collection) List(java.util.List) ArrayList(java.util.ArrayList)

Example 2 with IgniteStripedThreadPoolExecutor

use of org.apache.ignite.thread.IgniteStripedThreadPoolExecutor in project ignite by apache.

the class PoolProcessor method start.

/**
 * {@inheritDoc}
 */
@Override
public void start() throws IgniteCheckedException {
    super.start();
    IgniteConfiguration cfg = ctx.config();
    UncaughtExceptionHandler oomeHnd = ctx.uncaughtExceptionHandler();
    UncaughtExceptionHandler excHnd = new UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            ctx.failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e));
        }
    };
    validateThreadPoolSize(cfg.getPublicThreadPoolSize(), "public");
    execSvc = createExecutorService("pub", cfg.getIgniteInstanceName(), cfg.getPublicThreadPoolSize(), cfg.getPublicThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.PUBLIC_POOL, oomeHnd);
    execSvc.allowCoreThreadTimeOut(true);
    validateThreadPoolSize(cfg.getServiceThreadPoolSize(), "service");
    svcExecSvc = createExecutorService("svc", cfg.getIgniteInstanceName(), cfg.getServiceThreadPoolSize(), cfg.getServiceThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.SERVICE_POOL, oomeHnd);
    svcExecSvc.allowCoreThreadTimeOut(true);
    validateThreadPoolSize(cfg.getSystemThreadPoolSize(), "system");
    sysExecSvc = createExecutorService("sys", cfg.getIgniteInstanceName(), cfg.getSystemThreadPoolSize(), cfg.getSystemThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.SYSTEM_POOL, oomeHnd);
    sysExecSvc.allowCoreThreadTimeOut(true);
    validateThreadPoolSize(cfg.getStripedPoolSize(), "stripedPool");
    WorkersRegistry workerRegistry = ctx.workersRegistry();
    stripedExecSvc = createStripedExecutor(cfg.getStripedPoolSize(), cfg.getIgniteInstanceName(), "sys", log, new IgniteInClosure<Throwable>() {

        @Override
        public void apply(Throwable t) {
            ctx.failure().process(new FailureContext(SYSTEM_WORKER_TERMINATION, t));
        }
    }, false, workerRegistry, cfg.getFailureDetectionTimeout());
    // Note that since we use 'LinkedBlockingQueue', number of
    // maximum threads has no effect.
    // Note, that we do not pre-start threads here as management pool may
    // not be needed.
    validateThreadPoolSize(cfg.getManagementThreadPoolSize(), "management");
    mgmtExecSvc = createExecutorService("mgmt", cfg.getIgniteInstanceName(), cfg.getManagementThreadPoolSize(), cfg.getManagementThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.MANAGEMENT_POOL, oomeHnd);
    mgmtExecSvc.allowCoreThreadTimeOut(true);
    // Note that since we use 'LinkedBlockingQueue', number of
    // maximum threads has no effect.
    // Note, that we do not pre-start threads here as class loading pool may
    // not be needed.
    validateThreadPoolSize(cfg.getPeerClassLoadingThreadPoolSize(), "peer class loading");
    p2pExecSvc = createExecutorService("p2p", cfg.getIgniteInstanceName(), cfg.getPeerClassLoadingThreadPoolSize(), cfg.getPeerClassLoadingThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.P2P_POOL, oomeHnd);
    p2pExecSvc.allowCoreThreadTimeOut(true);
    dataStreamerExecSvc = createStripedExecutor(cfg.getDataStreamerThreadPoolSize(), cfg.getIgniteInstanceName(), "data-streamer", log, new IgniteInClosure<Throwable>() {

        @Override
        public void apply(Throwable t) {
            ctx.failure().process(new FailureContext(SYSTEM_WORKER_TERMINATION, t));
        }
    }, true, workerRegistry, cfg.getFailureDetectionTimeout());
    // Note that we do not pre-start threads here as this pool may not be needed.
    validateThreadPoolSize(cfg.getAsyncCallbackPoolSize(), "async callback");
    callbackExecSvc = new IgniteStripedThreadPoolExecutor(cfg.getAsyncCallbackPoolSize(), cfg.getIgniteInstanceName(), "callback", oomeHnd, false, 0);
    if (cfg.getConnectorConfiguration() != null) {
        validateThreadPoolSize(cfg.getConnectorConfiguration().getThreadPoolSize(), "connector");
        restExecSvc = createExecutorService("rest", cfg.getIgniteInstanceName(), cfg.getConnectorConfiguration().getThreadPoolSize(), cfg.getConnectorConfiguration().getThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.UNDEFINED, oomeHnd);
        restExecSvc.allowCoreThreadTimeOut(true);
    }
    validateThreadPoolSize(cfg.getUtilityCacheThreadPoolSize(), "utility cache");
    utilityCacheExecSvc = createExecutorService("utility", cfg.getIgniteInstanceName(), cfg.getUtilityCacheThreadPoolSize(), cfg.getUtilityCacheThreadPoolSize(), cfg.getUtilityCacheKeepAliveTime(), new LinkedBlockingQueue<>(), GridIoPolicy.UTILITY_CACHE_POOL, oomeHnd);
    utilityCacheExecSvc.allowCoreThreadTimeOut(true);
    affExecSvc = createExecutorService("aff", cfg.getIgniteInstanceName(), 1, 1, DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.AFFINITY_POOL, oomeHnd);
    affExecSvc.allowCoreThreadTimeOut(true);
    if (IgniteComponentType.INDEXING.inClassPath()) {
        int cpus = Runtime.getRuntime().availableProcessors();
        idxExecSvc = createExecutorService("idx", cfg.getIgniteInstanceName(), cpus, cpus * 2, 3000L, new LinkedBlockingQueue<>(1000), GridIoPolicy.IDX_POOL, oomeHnd);
        int buildIdxThreadPoolSize = cfg.getBuildIndexThreadPoolSize();
        validateThreadPoolSize(buildIdxThreadPoolSize, "build-idx");
        buildIdxExecSvc = createExecutorService("build-idx-runner", cfg.getIgniteInstanceName(), buildIdxThreadPoolSize, buildIdxThreadPoolSize, DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.UNDEFINED, oomeHnd);
        buildIdxExecSvc.allowCoreThreadTimeOut(true);
    }
    validateThreadPoolSize(cfg.getQueryThreadPoolSize(), "query");
    qryExecSvc = createExecutorService("query", cfg.getIgniteInstanceName(), cfg.getQueryThreadPoolSize(), cfg.getQueryThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.QUERY_POOL, oomeHnd);
    qryExecSvc.allowCoreThreadTimeOut(true);
    schemaExecSvc = createExecutorService("schema", cfg.getIgniteInstanceName(), 2, 2, DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.SCHEMA_POOL, oomeHnd);
    schemaExecSvc.allowCoreThreadTimeOut(true);
    validateThreadPoolSize(cfg.getRebalanceThreadPoolSize(), "rebalance");
    rebalanceExecSvc = createExecutorService("rebalance", cfg.getIgniteInstanceName(), cfg.getRebalanceThreadPoolSize(), cfg.getRebalanceThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.UNDEFINED, excHnd);
    rebalanceExecSvc.allowCoreThreadTimeOut(true);
    if (CU.isPersistenceEnabled(ctx.config())) {
        snpExecSvc = createExecutorService(SNAPSHOT_RUNNER_THREAD_PREFIX, cfg.getIgniteInstanceName(), cfg.getSnapshotThreadPoolSize(), cfg.getSnapshotThreadPoolSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.UNDEFINED, excHnd);
        snpExecSvc.allowCoreThreadTimeOut(true);
        reencryptExecSvc = createExecutorService("reencrypt", ctx.igniteInstanceName(), 1, 1, DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.UNDEFINED, oomeHnd);
        reencryptExecSvc.allowCoreThreadTimeOut(true);
    }
    if (cfg.getClientConnectorConfiguration() != null) {
        thinClientExec = new IgniteThreadPoolExecutor("client-connector", cfg.getIgniteInstanceName(), cfg.getClientConnectorConfiguration().getThreadPoolSize(), cfg.getClientConnectorConfiguration().getThreadPoolSize(), 0, new LinkedBlockingQueue<>(), GridIoPolicy.UNDEFINED, oomeHnd);
    }
    rebalanceStripedExecSvc = createStripedThreadPoolExecutor(cfg.getRebalanceThreadPoolSize(), cfg.getIgniteInstanceName(), "rebalance-striped", excHnd, true, DFLT_THREAD_KEEP_ALIVE_TIME);
    if (!F.isEmpty(cfg.getExecutorConfiguration())) {
        validateCustomExecutorsConfiguration(cfg.getExecutorConfiguration());
        customExecs = new HashMap<>();
        for (ExecutorConfiguration execCfg : cfg.getExecutorConfiguration()) {
            ThreadPoolExecutor exec = createExecutorService(execCfg.getName(), cfg.getIgniteInstanceName(), execCfg.getSize(), execCfg.getSize(), DFLT_THREAD_KEEP_ALIVE_TIME, new LinkedBlockingQueue<>(), GridIoPolicy.UNDEFINED, oomeHnd);
            customExecs.put(execCfg.getName(), exec);
        }
    }
}
Also used : IgniteStripedThreadPoolExecutor(org.apache.ignite.thread.IgniteStripedThreadPoolExecutor) WorkersRegistry(org.apache.ignite.internal.worker.WorkersRegistry) IgniteThreadPoolExecutor(org.apache.ignite.thread.IgniteThreadPoolExecutor) LinkedBlockingQueue(java.util.concurrent.LinkedBlockingQueue) ExecutorConfiguration(org.apache.ignite.configuration.ExecutorConfiguration) IgniteConfiguration(org.apache.ignite.configuration.IgniteConfiguration) FailureContext(org.apache.ignite.failure.FailureContext) IgniteInClosure(org.apache.ignite.lang.IgniteInClosure) SecurityAwareStripedThreadPoolExecutor(org.apache.ignite.internal.processors.security.thread.SecurityAwareStripedThreadPoolExecutor) SecurityAwareThreadPoolExecutor(org.apache.ignite.internal.processors.security.thread.SecurityAwareThreadPoolExecutor) IgniteStripedThreadPoolExecutor(org.apache.ignite.thread.IgniteStripedThreadPoolExecutor) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) IgniteThreadPoolExecutor(org.apache.ignite.thread.IgniteThreadPoolExecutor) UncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler)

Example 3 with IgniteStripedThreadPoolExecutor

use of org.apache.ignite.thread.IgniteStripedThreadPoolExecutor in project ignite by apache.

the class IgniteKernal method start.

/**
 * @param cfg Configuration to use.
 * @param utilityCachePool Utility cache pool.
 * @param execSvc Executor service.
 * @param sysExecSvc System executor service.
 * @param stripedExecSvc Striped executor.
 * @param p2pExecSvc P2P executor service.
 * @param mgmtExecSvc Management executor service.
 * @param igfsExecSvc IGFS executor service.
 * @param dataStreamExecSvc data stream executor service.
 * @param restExecSvc Reset executor service.
 * @param affExecSvc Affinity executor service.
 * @param idxExecSvc Indexing executor service.
 * @param callbackExecSvc Callback executor service.
 * @param qryExecSvc Query executor service.
 * @param schemaExecSvc Schema executor service.
 * @param customExecSvcs Custom named executors.
 * @param errHnd Error handler to use for notification about startup problems.
 * @throws IgniteCheckedException Thrown in case of any errors.
 */
@SuppressWarnings({ "CatchGenericClass", "unchecked" })
public void start(final IgniteConfiguration cfg, ExecutorService utilityCachePool, final ExecutorService execSvc, final ExecutorService svcExecSvc, final ExecutorService sysExecSvc, final StripedExecutor stripedExecSvc, ExecutorService p2pExecSvc, ExecutorService mgmtExecSvc, ExecutorService igfsExecSvc, StripedExecutor dataStreamExecSvc, ExecutorService restExecSvc, ExecutorService affExecSvc, @Nullable ExecutorService idxExecSvc, IgniteStripedThreadPoolExecutor callbackExecSvc, ExecutorService qryExecSvc, ExecutorService schemaExecSvc, @Nullable final Map<String, ? extends ExecutorService> customExecSvcs, GridAbsClosure errHnd) throws IgniteCheckedException {
    gw.compareAndSet(null, new GridKernalGatewayImpl(cfg.getIgniteInstanceName()));
    GridKernalGateway gw = this.gw.get();
    gw.writeLock();
    try {
        switch(gw.getState()) {
            case STARTED:
                {
                    U.warn(log, "Grid has already been started (ignored).");
                    return;
                }
            case STARTING:
                {
                    U.warn(log, "Grid is already in process of being started (ignored).");
                    return;
                }
            case STOPPING:
                {
                    throw new IgniteCheckedException("Grid is in process of being stopped");
                }
            case STOPPED:
                {
                    break;
                }
        }
        gw.setState(STARTING);
    } finally {
        gw.writeUnlock();
    }
    assert cfg != null;
    // Make sure we got proper configuration.
    validateCommon(cfg);
    igniteInstanceName = cfg.getIgniteInstanceName();
    this.cfg = cfg;
    log = (GridLoggerProxy) cfg.getGridLogger().getLogger(getClass().getName() + (igniteInstanceName != null ? '%' + igniteInstanceName : ""));
    RuntimeMXBean rtBean = ManagementFactory.getRuntimeMXBean();
    // Ack various information.
    ackAsciiLogo();
    ackConfigUrl();
    ackConfiguration(cfg);
    ackDaemon();
    ackOsInfo();
    ackLanguageRuntime();
    ackRemoteManagement();
    ackLogger();
    ackVmArguments(rtBean);
    ackClassPaths(rtBean);
    ackSystemProperties();
    ackEnvironmentVariables();
    ackMemoryConfiguration();
    ackCacheConfiguration();
    ackP2pConfiguration();
    ackRebalanceConfiguration();
    // Run background network diagnostics.
    GridDiagnostic.runBackgroundCheck(igniteInstanceName, execSvc, log);
    // Ack 3-rd party licenses location.
    if (log.isInfoEnabled() && cfg.getIgniteHome() != null)
        log.info("3-rd party licenses can be found at: " + cfg.getIgniteHome() + File.separatorChar + "libs" + File.separatorChar + "licenses");
    // with internally reserved names.
    for (String name : cfg.getUserAttributes().keySet()) if (name.startsWith(ATTR_PREFIX))
        throw new IgniteCheckedException("User attribute has illegal name: '" + name + "'. Note that all names " + "starting with '" + ATTR_PREFIX + "' are reserved for internal use.");
    // Ack local node user attributes.
    logNodeUserAttributes();
    // Ack configuration.
    ackSpis();
    List<PluginProvider> plugins = U.allPluginProviders();
    // Spin out SPIs & managers.
    try {
        ctx = new GridKernalContextImpl(log, this, cfg, gw, utilityCachePool, execSvc, svcExecSvc, sysExecSvc, stripedExecSvc, p2pExecSvc, mgmtExecSvc, igfsExecSvc, dataStreamExecSvc, restExecSvc, affExecSvc, idxExecSvc, callbackExecSvc, qryExecSvc, schemaExecSvc, customExecSvcs, plugins, classNameFilter());
        cfg.getMarshaller().setContext(ctx.marshallerContext());
        GridInternalSubscriptionProcessor subscriptionProc = new GridInternalSubscriptionProcessor(ctx);
        startProcessor(subscriptionProc);
        ClusterProcessor clusterProc = new ClusterProcessor(ctx);
        startProcessor(clusterProc);
        U.onGridStart();
        // Start and configure resource processor first as it contains resources used
        // by all other managers and processors.
        GridResourceProcessor rsrcProc = new GridResourceProcessor(ctx);
        rsrcProc.setSpringContext(rsrcCtx);
        scheduler = new IgniteSchedulerImpl(ctx);
        startProcessor(rsrcProc);
        // Inject resources into lifecycle beans.
        if (!cfg.isDaemon() && cfg.getLifecycleBeans() != null) {
            for (LifecycleBean bean : cfg.getLifecycleBeans()) {
                if (bean != null)
                    rsrcProc.inject(bean);
            }
        }
        // Lifecycle notification.
        notifyLifecycleBeans(BEFORE_NODE_START);
        // Starts lifecycle aware components.
        U.startLifecycleAware(lifecycleAwares(cfg));
        addHelper(IGFS_HELPER.create(F.isEmpty(cfg.getFileSystemConfiguration())));
        addHelper(HADOOP_HELPER.createIfInClassPath(ctx, false));
        startProcessor(new IgnitePluginProcessor(ctx, cfg, plugins));
        startProcessor(new PoolProcessor(ctx));
        // Closure processor should be started before all others
        // (except for resource processor), as many components can depend on it.
        startProcessor(new GridClosureProcessor(ctx));
        // Start some other processors (order & place is important).
        startProcessor(new GridPortProcessor(ctx));
        startProcessor(new GridJobMetricsProcessor(ctx));
        // Timeout processor needs to be started before managers,
        // as managers may depend on it.
        startProcessor(new GridTimeoutProcessor(ctx));
        // Start security processors.
        startProcessor(createComponent(GridSecurityProcessor.class, ctx));
        // Start SPI managers.
        // NOTE: that order matters as there are dependencies between managers.
        startManager(new GridIoManager(ctx));
        startManager(new GridCheckpointManager(ctx));
        startManager(new GridEventStorageManager(ctx));
        startManager(new GridDeploymentManager(ctx));
        startManager(new GridLoadBalancerManager(ctx));
        startManager(new GridFailoverManager(ctx));
        startManager(new GridCollisionManager(ctx));
        startManager(new GridIndexingManager(ctx));
        ackSecurity();
        // Assign discovery manager to context before other processors start so they
        // are able to register custom event listener.
        final GridManager discoMgr = new GridDiscoveryManager(ctx);
        ctx.add(discoMgr, false);
        // be able to start receiving messages once discovery completes.
        try {
            startProcessor(new PdsConsistentIdProcessor(ctx));
            startProcessor(createComponent(DiscoveryNodeValidationProcessor.class, ctx));
            startProcessor(new GridAffinityProcessor(ctx));
            startProcessor(createComponent(GridSegmentationProcessor.class, ctx));
            startProcessor(createComponent(IgniteCacheObjectProcessor.class, ctx));
            startProcessor(createComponent(IGridClusterStateProcessor.class, ctx));
            startProcessor(new IgniteAuthenticationProcessor(ctx));
            startProcessor(new GridCacheProcessor(ctx));
            startProcessor(new GridQueryProcessor(ctx));
            startProcessor(new ClientListenerProcessor(ctx));
            startProcessor(new GridServiceProcessor(ctx));
            startProcessor(new GridTaskSessionProcessor(ctx));
            startProcessor(new GridJobProcessor(ctx));
            startProcessor(new GridTaskProcessor(ctx));
            startProcessor((GridProcessor) SCHEDULE.createOptional(ctx));
            startProcessor(new GridRestProcessor(ctx));
            startProcessor(new DataStreamProcessor(ctx));
            startProcessor((GridProcessor) IGFS.create(ctx, F.isEmpty(cfg.getFileSystemConfiguration())));
            startProcessor(new GridContinuousProcessor(ctx));
            startProcessor(createHadoopComponent());
            startProcessor(new DataStructuresProcessor(ctx));
            startProcessor(createComponent(PlatformProcessor.class, ctx));
            startProcessor(new GridMarshallerMappingProcessor(ctx));
            // Start plugins.
            for (PluginProvider provider : ctx.plugins().allProviders()) {
                ctx.add(new GridPluginComponent(provider));
                provider.start(ctx.plugins().pluginContextForProvider(provider));
            }
            // Start platform plugins.
            if (ctx.config().getPlatformConfiguration() != null)
                startProcessor(new PlatformPluginProcessor(ctx));
            ctx.cluster().initDiagnosticListeners();
            fillNodeAttributes(clusterProc.updateNotifierEnabled());
        } catch (Throwable e) {
            U.error(log, "Exception during start processors, node will be stopped and close connections", e);
            // Stop discovery spi to close tcp socket.
            ctx.discovery().stop(true);
            throw e;
        }
        gw.writeLock();
        try {
            gw.setState(STARTED);
            // Start discovery manager last to make sure that grid is fully initialized.
            startManager(discoMgr);
        } finally {
            gw.writeUnlock();
        }
        // Check whether physical RAM is not exceeded.
        checkPhysicalRam();
        // Suggest configuration optimizations.
        suggestOptimizations(cfg);
        // Suggest JVM optimizations.
        ctx.performance().addAll(JvmConfigurationSuggestions.getSuggestions());
        // Suggest Operation System optimizations.
        ctx.performance().addAll(OsConfigurationSuggestions.getSuggestions());
        DiscoveryLocalJoinData joinData = ctx.discovery().localJoin();
        IgniteInternalFuture<Boolean> transitionWaitFut = joinData.transitionWaitFuture();
        boolean active;
        if (transitionWaitFut != null) {
            if (log.isInfoEnabled()) {
                log.info("Join cluster while cluster state transition is in progress, " + "waiting when transition finish.");
            }
            active = transitionWaitFut.get();
        } else
            active = joinData.active();
        // Notify discovery manager the first to make sure that topology is discovered.
        ctx.discovery().onKernalStart(active);
        // Notify IO manager the second so further components can send and receive messages.
        ctx.io().onKernalStart(active);
        boolean recon = false;
        // Callbacks.
        for (GridComponent comp : ctx) {
            // Skip discovery manager.
            if (comp instanceof GridDiscoveryManager)
                continue;
            // Skip IO manager.
            if (comp instanceof GridIoManager)
                continue;
            if (comp instanceof GridPluginComponent)
                continue;
            if (!skipDaemon(comp)) {
                try {
                    comp.onKernalStart(active);
                } catch (IgniteNeedReconnectException e) {
                    assert ctx.discovery().reconnectSupported();
                    if (log.isDebugEnabled())
                        log.debug("Failed to start node components on node start, will wait for reconnect: " + e);
                    recon = true;
                }
            }
        }
        // Start plugins.
        for (PluginProvider provider : ctx.plugins().allProviders()) provider.onIgniteStart();
        if (recon)
            reconnectState.waitFirstReconnect();
        // Register MBeans.
        mBeansMgr.registerAllMBeans(utilityCachePool, execSvc, svcExecSvc, sysExecSvc, stripedExecSvc, p2pExecSvc, mgmtExecSvc, igfsExecSvc, dataStreamExecSvc, restExecSvc, affExecSvc, idxExecSvc, callbackExecSvc, qryExecSvc, schemaExecSvc, customExecSvcs);
        // Lifecycle bean notifications.
        notifyLifecycleBeans(AFTER_NODE_START);
    } catch (Throwable e) {
        IgniteSpiVersionCheckException verCheckErr = X.cause(e, IgniteSpiVersionCheckException.class);
        if (verCheckErr != null)
            U.error(log, verCheckErr.getMessage());
        else if (X.hasCause(e, InterruptedException.class, IgniteInterruptedCheckedException.class))
            U.warn(log, "Grid startup routine has been interrupted (will rollback).");
        else
            U.error(log, "Got exception while starting (will rollback startup routine).", e);
        errHnd.apply();
        stop(true);
        if (e instanceof Error)
            throw e;
        else if (e instanceof IgniteCheckedException)
            throw (IgniteCheckedException) e;
        else
            throw new IgniteCheckedException(e);
    }
    // Mark start timestamp.
    startTime = U.currentTimeMillis();
    String intervalStr = IgniteSystemProperties.getString(IGNITE_STARVATION_CHECK_INTERVAL);
    // Start starvation checker if enabled.
    boolean starveCheck = !isDaemon() && !"0".equals(intervalStr);
    if (starveCheck) {
        final long interval = F.isEmpty(intervalStr) ? PERIODIC_STARVATION_CHECK_FREQ : Long.parseLong(intervalStr);
        starveTask = ctx.timeout().schedule(new Runnable() {

            /**
             * Last completed task count.
             */
            private long lastCompletedCntPub;

            /**
             * Last completed task count.
             */
            private long lastCompletedCntSys;

            @Override
            public void run() {
                if (execSvc instanceof ThreadPoolExecutor) {
                    ThreadPoolExecutor exec = (ThreadPoolExecutor) execSvc;
                    lastCompletedCntPub = checkPoolStarvation(exec, lastCompletedCntPub, "public");
                }
                if (sysExecSvc instanceof ThreadPoolExecutor) {
                    ThreadPoolExecutor exec = (ThreadPoolExecutor) sysExecSvc;
                    lastCompletedCntSys = checkPoolStarvation(exec, lastCompletedCntSys, "system");
                }
                if (stripedExecSvc != null)
                    stripedExecSvc.checkStarvation();
            }

            /**
             * @param exec Thread pool executor to check.
             * @param lastCompletedCnt Last completed tasks count.
             * @param pool Pool name for message.
             * @return Current completed tasks count.
             */
            private long checkPoolStarvation(ThreadPoolExecutor exec, long lastCompletedCnt, String pool) {
                long completedCnt = exec.getCompletedTaskCount();
                // at least one waiting request, then it is possible starvation.
                if (exec.getPoolSize() == exec.getActiveCount() && completedCnt == lastCompletedCnt && !exec.getQueue().isEmpty())
                    LT.warn(log, "Possible thread pool starvation detected (no task completed in last " + interval + "ms, is " + pool + " thread pool size large enough?)");
                return completedCnt;
            }
        }, interval, interval);
    }
    long metricsLogFreq = cfg.getMetricsLogFrequency();
    if (metricsLogFreq > 0) {
        metricsLogTask = ctx.timeout().schedule(new Runnable() {

            private final DecimalFormat dblFmt = new DecimalFormat("#.##");

            @Override
            public void run() {
                if (log.isInfoEnabled()) {
                    try {
                        ClusterMetrics m = cluster().localNode().metrics();
                        double cpuLoadPct = m.getCurrentCpuLoad() * 100;
                        double avgCpuLoadPct = m.getAverageCpuLoad() * 100;
                        double gcPct = m.getCurrentGcCpuLoad() * 100;
                        // Heap params
                        long heapUsed = m.getHeapMemoryUsed();
                        long heapMax = m.getHeapMemoryMaximum();
                        long heapUsedInMBytes = heapUsed / 1024 / 1024;
                        long heapCommInMBytes = m.getHeapMemoryCommitted() / 1024 / 1024;
                        double freeHeapPct = heapMax > 0 ? ((double) ((heapMax - heapUsed) * 100)) / heapMax : -1;
                        // Non heap params
                        long nonHeapUsed = m.getNonHeapMemoryUsed();
                        long nonHeapMax = m.getNonHeapMemoryMaximum();
                        long nonHeapUsedInMBytes = nonHeapUsed / 1024 / 1024;
                        long nonHeapCommInMBytes = m.getNonHeapMemoryCommitted() / 1024 / 1024;
                        double freeNonHeapPct = nonHeapMax > 0 ? ((double) ((nonHeapMax - nonHeapUsed) * 100)) / nonHeapMax : -1;
                        int hosts = 0;
                        int nodes = 0;
                        int cpus = 0;
                        try {
                            ClusterMetrics metrics = cluster().metrics();
                            Collection<ClusterNode> nodes0 = cluster().nodes();
                            hosts = U.neighborhood(nodes0).size();
                            nodes = metrics.getTotalNodes();
                            cpus = metrics.getTotalCpus();
                        } catch (IgniteException ignore) {
                        // No-op.
                        }
                        int loadedPages = 0;
                        Collection<DataRegion> policies = ctx.cache().context().database().dataRegions();
                        if (!F.isEmpty(policies)) {
                            for (DataRegion memPlc : policies) loadedPages += memPlc.pageMemory().loadedPages();
                        }
                        String id = U.id8(localNode().id());
                        String msg = NL + "Metrics for local node (to disable set 'metricsLogFrequency' to 0)" + NL + "    ^-- Node [id=" + id + (name() != null ? ", name=" + name() : "") + ", uptime=" + getUpTimeFormatted() + "]" + NL + "    ^-- H/N/C [hosts=" + hosts + ", nodes=" + nodes + ", CPUs=" + cpus + "]" + NL + "    ^-- CPU [cur=" + dblFmt.format(cpuLoadPct) + "%, avg=" + dblFmt.format(avgCpuLoadPct) + "%, GC=" + dblFmt.format(gcPct) + "%]" + NL + "    ^-- PageMemory [pages=" + loadedPages + "]" + NL + "    ^-- Heap [used=" + dblFmt.format(heapUsedInMBytes) + "MB, free=" + dblFmt.format(freeHeapPct) + "%, comm=" + dblFmt.format(heapCommInMBytes) + "MB]" + NL + "    ^-- Non heap [used=" + dblFmt.format(nonHeapUsedInMBytes) + "MB, free=" + dblFmt.format(freeNonHeapPct) + "%, comm=" + dblFmt.format(nonHeapCommInMBytes) + "MB]" + NL + "    ^-- Outbound messages queue [size=" + m.getOutboundMessagesQueueSize() + "]" + NL + "    ^-- " + createExecutorDescription("Public thread pool", execSvc) + NL + "    ^-- " + createExecutorDescription("System thread pool", sysExecSvc);
                        if (customExecSvcs != null) {
                            StringBuilder customSvcsMsg = new StringBuilder();
                            for (Map.Entry<String, ? extends ExecutorService> entry : customExecSvcs.entrySet()) {
                                customSvcsMsg.append(NL).append("    ^-- ").append(createExecutorDescription(entry.getKey(), entry.getValue()));
                            }
                            msg = msg + customSvcsMsg;
                        }
                        if (log.isInfoEnabled())
                            log.info(msg);
                        ctx.cache().context().database().dumpStatistics(log);
                    } catch (IgniteClientDisconnectedException ignore) {
                    // No-op.
                    }
                }
            }
        }, metricsLogFreq, metricsLogFreq);
    }
    final long longOpDumpTimeout = IgniteSystemProperties.getLong(IgniteSystemProperties.IGNITE_LONG_OPERATIONS_DUMP_TIMEOUT, 60_000);
    if (longOpDumpTimeout > 0) {
        longOpDumpTask = ctx.timeout().schedule(new Runnable() {

            @Override
            public void run() {
                GridKernalContext ctx = IgniteKernal.this.ctx;
                if (ctx != null)
                    ctx.cache().context().exchange().dumpLongRunningOperations(longOpDumpTimeout);
            }
        }, longOpDumpTimeout, longOpDumpTimeout);
    }
    ctx.performance().add("Disable assertions (remove '-ea' from JVM options)", !U.assertionsEnabled());
    ctx.performance().logSuggestions(log, igniteInstanceName);
    U.quietAndInfo(log, "To start Console Management & Monitoring run ignitevisorcmd.{sh|bat}");
    ackStart(rtBean);
    if (!isDaemon())
        ctx.discovery().ackTopology(localNode().order());
}
Also used : DataStructuresProcessor(org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridServiceProcessor(org.apache.ignite.internal.processors.service.GridServiceProcessor) IgniteException(org.apache.ignite.IgniteException) DiscoveryLocalJoinData(org.apache.ignite.internal.managers.discovery.DiscoveryLocalJoinData) IgniteSystemProperties.getBoolean(org.apache.ignite.IgniteSystemProperties.getBoolean) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) GridSecurityProcessor(org.apache.ignite.internal.processors.security.GridSecurityProcessor) GridCheckpointManager(org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager) ClusterNode(org.apache.ignite.cluster.ClusterNode) GridIndexingManager(org.apache.ignite.internal.managers.indexing.GridIndexingManager) GridInternalSubscriptionProcessor(org.apache.ignite.internal.processors.subscription.GridInternalSubscriptionProcessor) GridMarshallerMappingProcessor(org.apache.ignite.internal.processors.marshaller.GridMarshallerMappingProcessor) IgniteClientDisconnectedException(org.apache.ignite.IgniteClientDisconnectedException) GridTaskSessionProcessor(org.apache.ignite.internal.processors.session.GridTaskSessionProcessor) PlatformPluginProcessor(org.apache.ignite.internal.processors.platform.plugin.PlatformPluginProcessor) PluginProvider(org.apache.ignite.plugin.PluginProvider) IgniteAuthenticationProcessor(org.apache.ignite.internal.processors.authentication.IgniteAuthenticationProcessor) GridCacheProcessor(org.apache.ignite.internal.processors.cache.GridCacheProcessor) GridRestProcessor(org.apache.ignite.internal.processors.rest.GridRestProcessor) GridPortProcessor(org.apache.ignite.internal.processors.port.GridPortProcessor) GridDiscoveryManager(org.apache.ignite.internal.managers.discovery.GridDiscoveryManager) GridAffinityProcessor(org.apache.ignite.internal.processors.affinity.GridAffinityProcessor) GridJobMetricsProcessor(org.apache.ignite.internal.processors.jobmetrics.GridJobMetricsProcessor) GridQueryProcessor(org.apache.ignite.internal.processors.query.GridQueryProcessor) IgniteSpiVersionCheckException(org.apache.ignite.spi.IgniteSpiVersionCheckException) Map(java.util.Map) HashMap(java.util.HashMap) GridLoadBalancerManager(org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager) DataStreamProcessor(org.apache.ignite.internal.processors.datastreamer.DataStreamProcessor) DataRegion(org.apache.ignite.internal.processors.cache.persistence.DataRegion) GridEventStorageManager(org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager) IgnitePluginProcessor(org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor) PdsConsistentIdProcessor(org.apache.ignite.internal.processors.cache.persistence.filename.PdsConsistentIdProcessor) GridTimeoutProcessor(org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor) DecimalFormat(java.text.DecimalFormat) GridDeploymentManager(org.apache.ignite.internal.managers.deployment.GridDeploymentManager) GridManager(org.apache.ignite.internal.managers.GridManager) ClusterProcessor(org.apache.ignite.internal.processors.cluster.ClusterProcessor) OsDiscoveryNodeValidationProcessor(org.apache.ignite.internal.processors.nodevalidation.OsDiscoveryNodeValidationProcessor) DiscoveryNodeValidationProcessor(org.apache.ignite.internal.processors.nodevalidation.DiscoveryNodeValidationProcessor) ClientListenerProcessor(org.apache.ignite.internal.processors.odbc.ClientListenerProcessor) LifecycleBean(org.apache.ignite.lifecycle.LifecycleBean) IGridClusterStateProcessor(org.apache.ignite.internal.processors.cluster.IGridClusterStateProcessor) GridSegmentationProcessor(org.apache.ignite.internal.processors.segmentation.GridSegmentationProcessor) GridCollisionManager(org.apache.ignite.internal.managers.collision.GridCollisionManager) IgniteCacheObjectProcessor(org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor) GridTaskProcessor(org.apache.ignite.internal.processors.task.GridTaskProcessor) GridContinuousProcessor(org.apache.ignite.internal.processors.continuous.GridContinuousProcessor) RuntimeMXBean(java.lang.management.RuntimeMXBean) GridClosureProcessor(org.apache.ignite.internal.processors.closure.GridClosureProcessor) GridFailoverManager(org.apache.ignite.internal.managers.failover.GridFailoverManager) PlatformProcessor(org.apache.ignite.internal.processors.platform.PlatformProcessor) ClusterMetrics(org.apache.ignite.cluster.ClusterMetrics) GridIoManager(org.apache.ignite.internal.managers.communication.GridIoManager) GridResourceProcessor(org.apache.ignite.internal.processors.resource.GridResourceProcessor) PoolProcessor(org.apache.ignite.internal.processors.pool.PoolProcessor) GridJobProcessor(org.apache.ignite.internal.processors.job.GridJobProcessor) IgniteStripedThreadPoolExecutor(org.apache.ignite.thread.IgniteStripedThreadPoolExecutor) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor)

Aggregations

ThreadPoolExecutor (java.util.concurrent.ThreadPoolExecutor)2 IgniteStripedThreadPoolExecutor (org.apache.ignite.thread.IgniteStripedThreadPoolExecutor)2 UncaughtExceptionHandler (java.lang.Thread.UncaughtExceptionHandler)1 RuntimeMXBean (java.lang.management.RuntimeMXBean)1 DecimalFormat (java.text.DecimalFormat)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 LinkedBlockingQueue (java.util.concurrent.LinkedBlockingQueue)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 IgniteCheckedException (org.apache.ignite.IgniteCheckedException)1 IgniteClientDisconnectedException (org.apache.ignite.IgniteClientDisconnectedException)1 IgniteException (org.apache.ignite.IgniteException)1 IgniteSystemProperties.getBoolean (org.apache.ignite.IgniteSystemProperties.getBoolean)1 ClusterMetrics (org.apache.ignite.cluster.ClusterMetrics)1 ClusterNode (org.apache.ignite.cluster.ClusterNode)1 ExecutorConfiguration (org.apache.ignite.configuration.ExecutorConfiguration)1 IgniteConfiguration (org.apache.ignite.configuration.IgniteConfiguration)1