Search in sources :

Example 1 with GridTimeoutObject

use of org.apache.ignite.internal.processors.timeout.GridTimeoutObject in project ignite by apache.

the class GridDhtPartitionDemander method addAssignments.

/**
 * Initiates new rebalance process from given {@code assignments}.
 * If previous rebalance is not finished method cancels it.
 * In case of delayed rebalance method schedules new with configured delay.
 *
 * @param assignments Assignments.
 * @param force {@code True} if dummy reassign.
 * @param rebalanceId Rebalance id.
 * @param next Runnable responsible for cache rebalancing start.
 * @param forcedRebFut External future for forced rebalance.
 * @return Rebalancing runnable.
 */
Runnable addAssignments(final GridDhtPreloaderAssignments assignments, boolean force, long rebalanceId, final Runnable next, @Nullable final GridCompoundFuture<Boolean, Boolean> forcedRebFut) {
    if (log.isDebugEnabled())
        log.debug("Adding partition assignments: " + assignments);
    assert force == (forcedRebFut != null);
    long delay = grp.config().getRebalanceDelay();
    if ((delay == 0 || force) && assignments != null) {
        final RebalanceFuture oldFut = rebalanceFut;
        final RebalanceFuture fut = new RebalanceFuture(grp, assignments, log, rebalanceId);
        if (!oldFut.isInitial())
            oldFut.cancel();
        else
            fut.listen(f -> oldFut.onDone(f.result()));
        if (forcedRebFut != null)
            forcedRebFut.add(fut);
        rebalanceFut = fut;
        for (final GridCacheContext cctx : grp.caches()) {
            if (cctx.statisticsEnabled()) {
                final CacheMetricsImpl metrics = cctx.cache().metrics0();
                metrics.clearRebalanceCounters();
                metrics.startRebalance(0);
                rebalanceFut.listen(f -> metrics.clearRebalanceCounters());
            }
        }
        fut.sendRebalanceStartedEvent();
        if (assignments.cancelled()) {
            // Pending exchange.
            if (log.isDebugEnabled())
                log.debug("Rebalancing skipped due to cancelled assignments.");
            fut.onDone(false);
            fut.sendRebalanceFinishedEvent();
            return null;
        }
        if (assignments.isEmpty()) {
            // Nothing to rebalance.
            if (log.isDebugEnabled())
                log.debug("Rebalancing skipped due to empty assignments.");
            fut.onDone(true);
            ((GridFutureAdapter) grp.preloader().syncFuture()).onDone();
            fut.sendRebalanceFinishedEvent();
            return null;
        }
        return () -> {
            if (next != null)
                fut.listen(f -> {
                    try {
                        if (// Not cancelled.
                        f.get())
                            // Starts next cache rebalancing (according to the order).
                            next.run();
                    } catch (IgniteCheckedException e) {
                        if (log.isDebugEnabled())
                            log.debug(e.getMessage());
                    }
                });
            requestPartitions(fut, assignments);
        };
    } else if (delay > 0) {
        for (GridCacheContext cctx : grp.caches()) {
            if (cctx.statisticsEnabled()) {
                final CacheMetricsImpl metrics = cctx.cache().metrics0();
                metrics.startRebalance(delay);
            }
        }
        GridTimeoutObject obj = lastTimeoutObj.get();
        if (obj != null)
            ctx.time().removeTimeoutObject(obj);
        final GridDhtPartitionsExchangeFuture exchFut = lastExchangeFut;
        assert exchFut != null : "Delaying rebalance process without topology event.";
        obj = new GridTimeoutObjectAdapter(delay) {

            @Override
            public void onTimeout() {
                exchFut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {

                    @Override
                    public void apply(IgniteInternalFuture<AffinityTopologyVersion> f) {
                        ctx.exchange().forceRebalance(exchFut.exchangeId());
                    }
                });
            }
        };
        lastTimeoutObj.set(obj);
        ctx.time().addTimeoutObject(obj);
    }
    return null;
}
Also used : IgniteInternalFuture(org.apache.ignite.internal.IgniteInternalFuture) GridFutureAdapter(org.apache.ignite.internal.util.future.GridFutureAdapter) GridFinishedFuture(org.apache.ignite.internal.util.future.GridFinishedFuture) GridDhtLocalPartition(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition) CacheRebalanceMode(org.apache.ignite.cache.CacheRebalanceMode) EVT_CACHE_REBALANCE_STARTED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_STARTED) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) EVT_CACHE_REBALANCE_STOPPED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_STOPPED) EVT_CACHE_REBALANCE_PART_LOADED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_PART_LOADED) GridCacheEntryInfo(org.apache.ignite.internal.processors.cache.GridCacheEntryInfo) IgniteInClosure(org.apache.ignite.lang.IgniteInClosure) GridToStringExclude(org.apache.ignite.internal.util.tostring.GridToStringExclude) Collection(java.util.Collection) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) DR_PRELOAD(org.apache.ignite.internal.processors.dr.GridDrType.DR_PRELOAD) Set(java.util.Set) UUID(java.util.UUID) GridCacheEntryRemovedException(org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException) Nullable(org.jetbrains.annotations.Nullable) List(java.util.List) IgniteConfiguration(org.apache.ignite.configuration.IgniteConfiguration) GridCacheContext(org.apache.ignite.internal.processors.cache.GridCacheContext) GridCacheEntryEx(org.apache.ignite.internal.processors.cache.GridCacheEntryEx) EVT_CACHE_REBALANCE_OBJECT_LOADED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_OBJECT_LOADED) GridCachePartitionExchangeManager(org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager) MOVING(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.MOVING) DR_NONE(org.apache.ignite.internal.processors.dr.GridDrType.DR_NONE) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent) IgniteSpiException(org.apache.ignite.spi.IgniteSpiException) CacheEntryInfoCollection(org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection) GridCompoundFuture(org.apache.ignite.internal.util.future.GridCompoundFuture) U(org.apache.ignite.internal.util.typedef.internal.U) HashMap(java.util.HashMap) IgniteLogger(org.apache.ignite.IgniteLogger) AtomicReference(java.util.concurrent.atomic.AtomicReference) CacheGroupContext(org.apache.ignite.internal.processors.cache.CacheGroupContext) LT(org.apache.ignite.internal.util.typedef.internal.LT) ArrayList(java.util.ArrayList) AffinityAssignment(org.apache.ignite.internal.processors.affinity.AffinityAssignment) GridDhtPartitionTopology(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology) HashSet(java.util.HashSet) ClusterNode(org.apache.ignite.cluster.ClusterNode) CI1(org.apache.ignite.internal.util.typedef.CI1) GridTimeoutObjectAdapter(org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter) IgnitePredicate(org.apache.ignite.lang.IgnitePredicate) S(org.apache.ignite.internal.util.typedef.internal.S) IgniteInterruptedCheckedException(org.apache.ignite.internal.IgniteInterruptedCheckedException) Iterator(java.util.Iterator) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) ClusterTopologyCheckedException(org.apache.ignite.internal.cluster.ClusterTopologyCheckedException) GridToStringInclude(org.apache.ignite.internal.util.tostring.GridToStringInclude) T2(org.apache.ignite.internal.util.typedef.T2) GridCacheSharedContext(org.apache.ignite.internal.processors.cache.GridCacheSharedContext) CacheConfiguration(org.apache.ignite.configuration.CacheConfiguration) CacheMetricsImpl(org.apache.ignite.internal.processors.cache.CacheMetricsImpl) IgniteUuid(org.apache.ignite.lang.IgniteUuid) GridDhtInvalidPartitionException(org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException) GridCacheContext(org.apache.ignite.internal.processors.cache.GridCacheContext) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) CacheMetricsImpl(org.apache.ignite.internal.processors.cache.CacheMetricsImpl) IgniteInternalFuture(org.apache.ignite.internal.IgniteInternalFuture) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridTimeoutObjectAdapter(org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter) GridFutureAdapter(org.apache.ignite.internal.util.future.GridFutureAdapter)

Example 2 with GridTimeoutObject

use of org.apache.ignite.internal.processors.timeout.GridTimeoutObject in project ignite by apache.

the class GridDhtPartitionDemander method addAssignments.

/**
 * This method initiates new rebalance process from given {@code assignments} by creating new rebalance
 * future based on them. Cancels previous rebalance future and sends rebalance started event.
 * In case of delayed rebalance method schedules the new one with configured delay based on {@code lastExchangeFut}.
 *
 * @param assignments Assignments to process.
 * @param force {@code True} if preload request by {@link ForceRebalanceExchangeTask}.
 * @param rebalanceId Rebalance id generated from exchange thread.
 * @param next A next rebalance routine in chain.
 * @param forcedRebFut External future for forced rebalance.
 * @param compatibleRebFut Future for waiting for compatible rebalances.
 *
 * @return Rebalancing future or {@code null} to exclude an assignment from a chain.
 */
@Nullable
RebalanceFuture addAssignments(final GridDhtPreloaderAssignments assignments, boolean force, long rebalanceId, final RebalanceFuture next, @Nullable final GridCompoundFuture<Boolean, Boolean> forcedRebFut, GridCompoundFuture<Boolean, Boolean> compatibleRebFut) {
    if (log.isDebugEnabled())
        log.debug("Adding partition assignments: " + assignments);
    assert force == (forcedRebFut != null);
    long delay = grp.config().getRebalanceDelay();
    if (delay == 0 || force) {
        assert assignments != null;
        final RebalanceFuture oldFut = rebalanceFut;
        if (assignments.cancelled()) {
            // Pending exchange.
            if (log.isDebugEnabled())
                log.debug("Rebalancing skipped due to cancelled assignments.");
            return null;
        }
        if (assignments.isEmpty()) {
            // Nothing to rebalance.
            if (log.isDebugEnabled())
                log.debug("Rebalancing skipped due to empty assignments.");
            if (oldFut.isInitial())
                oldFut.onDone(true);
            else if (!oldFut.isDone())
                oldFut.tryCancel();
            ((GridFutureAdapter) grp.preloader().syncFuture()).onDone();
            return null;
        }
        // Check if ongoing rebalancing is compatible with a new assignment.
        if (!force && (!oldFut.isDone() || oldFut.result()) && oldFut.compatibleWith(assignments)) {
            if (!oldFut.isDone())
                compatibleRebFut.add(oldFut);
            return null;
        }
        // Cancel ongoing rebalancing.
        if (!oldFut.isDone() && !oldFut.isInitial())
            oldFut.tryCancel();
        // Partition states cannot be changed from now on by previous incompatible rebalancing.
        // Retain only moving partitions. Assignment can become empty as a result.
        // Delayed partition owning happens in the exchange worker as well, so no race with delayed owning here.
        assignments.retainMoving(grp.topology());
        // Skip rebalanced group.
        if (assignments.isEmpty())
            return null;
        final RebalanceFuture fut = new RebalanceFuture(grp, lastExchangeFut, assignments, log, rebalanceId, next, lastCancelledTime);
        if (oldFut.isInitial())
            fut.listen(f -> oldFut.onDone(f.result()));
        if (forcedRebFut != null)
            forcedRebFut.add(fut);
        rebalanceFut = fut;
        for (final GridCacheContext cctx : grp.caches()) {
            if (cctx.statisticsEnabled()) {
                final CacheMetricsImpl metrics = cctx.cache().metrics0();
                metrics.clearRebalanceCounters();
                for (GridDhtPartitionDemandMessage msg : assignments.values()) {
                    for (Integer partId : msg.partitions().fullSet()) metrics.onRebalancingKeysCountEstimateReceived(grp.topology().globalPartSizes().get(partId));
                    CachePartitionPartialCountersMap histMap = msg.partitions().historicalMap();
                    for (int i = 0; i < histMap.size(); i++) {
                        long from = histMap.initialUpdateCounterAt(i);
                        long to = histMap.updateCounterAt(i);
                        metrics.onRebalancingKeysCountEstimateReceived(to - from);
                    }
                }
                metrics.startRebalance(0);
            }
        }
        fut.sendRebalanceStartedEvent();
        return fut;
    } else if (delay > 0) {
        for (GridCacheContext cctx : grp.caches()) {
            if (cctx.statisticsEnabled()) {
                final CacheMetricsImpl metrics = cctx.cache().metrics0();
                metrics.startRebalance(delay);
            }
        }
        GridTimeoutObject obj = lastTimeoutObj.get();
        if (obj != null)
            ctx.time().removeTimeoutObject(obj);
        final GridDhtPartitionsExchangeFuture exchFut = lastExchangeFut;
        assert exchFut != null : "Delaying rebalance process without topology event.";
        obj = new GridTimeoutObjectAdapter(delay) {

            @Override
            public void onTimeout() {
                exchFut.listen(new CI1<IgniteInternalFuture<AffinityTopologyVersion>>() {

                    @Override
                    public void apply(IgniteInternalFuture<AffinityTopologyVersion> f) {
                        ctx.exchange().forceRebalance(exchFut.exchangeId());
                    }
                });
            }
        };
        lastTimeoutObj.set(obj);
        ctx.time().addTimeoutObject(obj);
    }
    return null;
}
Also used : IgniteInternalFuture(org.apache.ignite.internal.IgniteInternalFuture) GridFutureAdapter(org.apache.ignite.internal.util.future.GridFutureAdapter) GridFinishedFuture(org.apache.ignite.internal.util.future.GridFinishedFuture) Collectors.counting(java.util.stream.Collectors.counting) IteratorWrapper(org.apache.ignite.internal.util.lang.GridIterableAdapter.IteratorWrapper) CacheRebalanceMode(org.apache.ignite.cache.CacheRebalanceMode) EVT_CACHE_REBALANCE_STARTED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_STARTED) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) EVT_CACHE_REBALANCE_STOPPED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_STOPPED) EVT_CACHE_REBALANCE_PART_LOADED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_PART_LOADED) MetricUtils.metricName(org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName) Collectors.toSet(java.util.stream.Collectors.toSet) CACHE_GROUP_METRICS_PREFIX(org.apache.ignite.internal.processors.cache.CacheGroupMetricsImpl.CACHE_GROUP_METRICS_PREFIX) GridCacheEntryInfo(org.apache.ignite.internal.processors.cache.GridCacheEntryInfo) IgniteInClosure(org.apache.ignite.lang.IgniteInClosure) AtomicReferenceFieldUpdater(java.util.concurrent.atomic.AtomicReferenceFieldUpdater) GridToStringExclude(org.apache.ignite.internal.util.tostring.GridToStringExclude) Collection(java.util.Collection) IgniteCheckedException(org.apache.ignite.IgniteCheckedException) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) DR_PRELOAD(org.apache.ignite.internal.processors.dr.GridDrType.DR_PRELOAD) Set(java.util.Set) NavigableSet(java.util.NavigableSet) UUID(java.util.UUID) GridCacheEntryRemovedException(org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException) CacheDataRow(org.apache.ignite.internal.processors.cache.persistence.CacheDataRow) Collectors(java.util.stream.Collectors) Nullable(org.jetbrains.annotations.Nullable) List(java.util.List) IgniteConfiguration(org.apache.ignite.configuration.IgniteConfiguration) Stream(java.util.stream.Stream) GridDhtPartitionTopology(org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionTopology) CU(org.apache.ignite.internal.util.typedef.internal.CU) GridCacheContext(org.apache.ignite.internal.processors.cache.GridCacheContext) IntHashMap(org.apache.ignite.internal.util.collection.IntHashMap) Objects.nonNull(java.util.Objects.nonNull) GridCacheEntryEx(org.apache.ignite.internal.processors.cache.GridCacheEntryEx) EVT_CACHE_REBALANCE_OBJECT_LOADED(org.apache.ignite.events.EventType.EVT_CACHE_REBALANCE_OBJECT_LOADED) GridCachePartitionExchangeManager(org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager) LongAdder(java.util.concurrent.atomic.LongAdder) DR_NONE(org.apache.ignite.internal.processors.dr.GridDrType.DR_NONE) DiscoveryEvent(org.apache.ignite.events.DiscoveryEvent) Collectors.partitioningBy(java.util.stream.Collectors.partitioningBy) IgniteSpiException(org.apache.ignite.spi.IgniteSpiException) CacheEntryInfoCollection(org.apache.ignite.internal.processors.cache.CacheEntryInfoCollection) CheckpointProgress(org.apache.ignite.internal.processors.cache.persistence.checkpoint.CheckpointProgress) GridCompoundFuture(org.apache.ignite.internal.util.future.GridCompoundFuture) IgnitePredicateX(org.apache.ignite.internal.util.lang.IgnitePredicateX) U(org.apache.ignite.internal.util.typedef.internal.U) HashMap(java.util.HashMap) IgniteLogger(org.apache.ignite.IgniteLogger) ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) AtomicReference(java.util.concurrent.atomic.AtomicReference) CacheGroupContext(org.apache.ignite.internal.processors.cache.CacheGroupContext) LT(org.apache.ignite.internal.util.typedef.internal.LT) ArrayList(java.util.ArrayList) AffinityAssignment(org.apache.ignite.internal.processors.affinity.AffinityAssignment) HashSet(java.util.HashSet) ClusterNode(org.apache.ignite.cluster.ClusterNode) CI1(org.apache.ignite.internal.util.typedef.CI1) GridTimeoutObjectAdapter(org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter) S(org.apache.ignite.internal.util.typedef.internal.S) MOVING(org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState.MOVING) IgniteInterruptedCheckedException(org.apache.ignite.internal.IgniteInterruptedCheckedException) PAGE_SNAPSHOT_TAKEN(org.apache.ignite.internal.processors.cache.persistence.CheckpointState.PAGE_SNAPSHOT_TAKEN) FINISHED(org.apache.ignite.internal.processors.cache.persistence.CheckpointState.FINISHED) F(org.apache.ignite.internal.util.typedef.F) GridIterableAdapter(org.apache.ignite.internal.util.lang.GridIterableAdapter) Iterator(java.util.Iterator) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) ClusterTopologyCheckedException(org.apache.ignite.internal.cluster.ClusterTopologyCheckedException) TTL_ETERNAL(org.apache.ignite.internal.processors.cache.GridCacheUtils.TTL_ETERNAL) GridMutableLong(org.apache.ignite.internal.util.GridMutableLong) GridDhtInvalidPartitionException(org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtInvalidPartitionException) MetricRegistry(org.apache.ignite.internal.processors.metric.MetricRegistry) GridToStringInclude(org.apache.ignite.internal.util.tostring.GridToStringInclude) TimeUnit(java.util.concurrent.TimeUnit) AtomicLong(java.util.concurrent.atomic.AtomicLong) GridDhtLocalPartition(org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtLocalPartition) GridCacheSharedContext(org.apache.ignite.internal.processors.cache.GridCacheSharedContext) CacheConfiguration(org.apache.ignite.configuration.CacheConfiguration) WalStateManager(org.apache.ignite.internal.processors.cache.WalStateManager) GridPlainRunnable(org.apache.ignite.internal.util.lang.GridPlainRunnable) CacheMetricsImpl(org.apache.ignite.internal.processors.cache.CacheMetricsImpl) GridCacheMvccEntryInfo(org.apache.ignite.internal.processors.cache.GridCacheMvccEntryInfo) Collections(java.util.Collections) TxState(org.apache.ignite.internal.processors.cache.mvcc.txlog.TxState) PRELOAD_SIZE_UNDER_CHECKPOINT_LOCK(org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl.PRELOAD_SIZE_UNDER_CHECKPOINT_LOCK) GridCacheContext(org.apache.ignite.internal.processors.cache.GridCacheContext) AffinityTopologyVersion(org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion) CacheMetricsImpl(org.apache.ignite.internal.processors.cache.CacheMetricsImpl) IgniteInternalFuture(org.apache.ignite.internal.IgniteInternalFuture) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) GridTimeoutObjectAdapter(org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter) GridFutureAdapter(org.apache.ignite.internal.util.future.GridFutureAdapter) Nullable(org.jetbrains.annotations.Nullable)

Example 3 with GridTimeoutObject

use of org.apache.ignite.internal.processors.timeout.GridTimeoutObject in project ignite by apache.

the class GridDhtAtomicCache method sendDeferredUpdateResponse.

/**
 * @param primaryId Primary ID.
 * @param msg Message.
 */
private void sendDeferredUpdateResponse(UUID primaryId, GridDhtAtomicDeferredUpdateResponse msg) {
    try {
        GridTimeoutObject timeoutSnd = msg.timeoutSender();
        if (timeoutSnd != null)
            ctx.time().removeTimeoutObject(timeoutSnd);
        ctx.io().send(primaryId, msg, ctx.ioPolicy());
        if (msgLog.isDebugEnabled()) {
            msgLog.debug("Sent deferred DHT update response [futIds=" + msg.futureIds() + ", node=" + primaryId + ']');
        }
    } catch (ClusterTopologyCheckedException ignored) {
        if (msgLog.isDebugEnabled()) {
            msgLog.debug("Failed to send deferred DHT update response, node left [" + "futIds=" + msg.futureIds() + ", node=" + primaryId + ']');
        }
    } catch (IgniteCheckedException e) {
        U.error(log, "Failed to send deferredDHT  update response to remote node [" + "futIds=" + msg.futureIds() + ", node=" + primaryId + ']', e);
    }
}
Also used : IgniteCheckedException(org.apache.ignite.IgniteCheckedException) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject) ClusterTopologyCheckedException(org.apache.ignite.internal.cluster.ClusterTopologyCheckedException)

Example 4 with GridTimeoutObject

use of org.apache.ignite.internal.processors.timeout.GridTimeoutObject in project ignite by apache.

the class GridJobContextImpl method holdcc.

/**
 * {@inheritDoc}
 */
@Override
public <T> T holdcc(long timeout) {
    if (ctx != null) {
        if (job == null)
            job = ctx.job().activeJob(jobId);
        if (job != null) {
            if (!job.hold())
                throw new IllegalStateException("Job has already been hold [ctx=" + this + ']');
            assert timeoutObj == null;
            if (timeout <= 0)
                return null;
            final long endTime = U.currentTimeMillis() + timeout;
            // Overflow.
            if (endTime > 0) {
                timeoutObj = new GridTimeoutObject() {

                    private final IgniteUuid id = IgniteUuid.randomUuid();

                    @Override
                    public IgniteUuid timeoutId() {
                        return id;
                    }

                    @Override
                    public long endTime() {
                        return endTime;
                    }

                    @Override
                    public void onTimeout() {
                        try {
                            synchronized (mux) {
                                GridTimeoutObject timeoutObj0 = timeoutObj;
                                if (timeoutObj0 == null || timeoutObj0.timeoutId() != id)
                                    // The timer was canceled by explicit callcc() call.
                                    return;
                                timeoutObj = null;
                            }
                            ExecutorService execSvc = job.isInternal() ? ctx.pools().getManagementExecutorService() : ctx.pools().getExecutorService();
                            assert execSvc != null;
                            execSvc.execute(new Runnable() {

                                @Override
                                public void run() {
                                    callcc0();
                                }
                            });
                        } catch (RejectedExecutionException e) {
                            U.error(log(), "Failed to execute job (will execute synchronously).", e);
                            callcc0();
                        }
                    }
                };
                ctx.timeout().addTimeoutObject(timeoutObj);
            }
        }
    }
    return null;
}
Also used : IgniteUuid(org.apache.ignite.lang.IgniteUuid) ExecutorService(java.util.concurrent.ExecutorService) RejectedExecutionException(java.util.concurrent.RejectedExecutionException) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject)

Example 5 with GridTimeoutObject

use of org.apache.ignite.internal.processors.timeout.GridTimeoutObject in project ignite by apache.

the class StartNodeCallableImpl method shell.

/**
 * Executes command using {@code shell} channel.
 *
 * @param ses SSH session.
 * @param cmd Command.
 * @param regexp Regular expression to wait until it will be found in stream from node.
 * @throws JSchException In case of SSH error.
 * @throws IOException If IO error occurs.
 * @throws IgniteInterruptedCheckedException If thread was interrupted while waiting.
 */
private void shell(Session ses, String cmd, String regexp) throws JSchException, IOException, IgniteInterruptedCheckedException {
    ChannelShell ch = null;
    GridTimeoutObject to = null;
    try {
        ch = (ChannelShell) ses.openChannel("shell");
        ch.connect();
        try (PrintStream out = new PrintStream(ch.getOutputStream(), true)) {
            out.println(cmd);
        }
        if (regexp != null) {
            Pattern ptrn = Pattern.compile(regexp);
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(ch.getInputStream()))) {
                String line;
                boolean first = true;
                while ((line = reader.readLine()) != null) {
                    if (ptrn.matcher(line).find()) {
                        // Wait for a while until process from regexp really will be started.
                        U.sleep(50);
                        break;
                    } else if (first) {
                        to = initTimer(cmd);
                        first = false;
                    }
                }
            } catch (InterruptedIOException ignore) {
            // No-op.
            } finally {
                if (to != null) {
                    boolean r = proc.removeTimeoutObject(to);
                    assert r || to.endTime() <= U.currentTimeMillis() : "Timeout object was not removed: " + to;
                }
            }
        } else
            U.sleep(EXECUTE_WAIT_TIME);
    } finally {
        if (ch != null && ch.isConnected())
            ch.disconnect();
    }
}
Also used : PrintStream(java.io.PrintStream) Pattern(java.util.regex.Pattern) InterruptedIOException(java.io.InterruptedIOException) InputStreamReader(java.io.InputStreamReader) BufferedReader(java.io.BufferedReader) ChannelShell(com.jcraft.jsch.ChannelShell) GridTimeoutObject(org.apache.ignite.internal.processors.timeout.GridTimeoutObject)

Aggregations

GridTimeoutObject (org.apache.ignite.internal.processors.timeout.GridTimeoutObject)18 IgniteCheckedException (org.apache.ignite.IgniteCheckedException)7 IgniteInterruptedCheckedException (org.apache.ignite.internal.IgniteInterruptedCheckedException)5 ClusterTopologyCheckedException (org.apache.ignite.internal.cluster.ClusterTopologyCheckedException)4 IgniteUuid (org.apache.ignite.lang.IgniteUuid)4 IOException (java.io.IOException)3 Collection (java.util.Collection)3 HashMap (java.util.HashMap)3 Iterator (java.util.Iterator)3 Map (java.util.Map)3 UUID (java.util.UUID)3 IgniteEx (org.apache.ignite.internal.IgniteEx)3 IgniteInternalFuture (org.apache.ignite.internal.IgniteInternalFuture)3 AffinityTopologyVersion (org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion)3 GridCacheEntryRemovedException (org.apache.ignite.internal.processors.cache.GridCacheEntryRemovedException)3 GridTimeoutObjectAdapter (org.apache.ignite.internal.processors.timeout.GridTimeoutObjectAdapter)3 EOFException (java.io.EOFException)2 FileNotFoundException (java.io.FileNotFoundException)2 Time (java.sql.Time)2 ArrayList (java.util.ArrayList)2