/** * @param ctx Context. * @param e entry. * @return Entry collection. */ private Collection<CacheContinuousQueryEntry> handleEvent( GridKernalContext ctx, CacheContinuousQueryEntry e) { assert e != null; if (internal) { if (e.isFiltered()) return Collections.emptyList(); else return F.asList(e); } // Initial query entry or evicted entry. These events should be fired immediately. if (e.updateCounter() == -1L) return F.asList(e); PartitionRecovery rec = rcvs.get(e.partition()); if (rec == null) { rec = new PartitionRecovery( ctx.log(getClass()), initTopVer, initUpdCntrs == null ? null : initUpdCntrs.get(e.partition())); PartitionRecovery oldRec = rcvs.putIfAbsent(e.partition(), rec); if (oldRec != null) rec = oldRec; } return rec.collectEntries(e); }
/** * @param ctx Context. * @param h2 H2 Indexing. * @throws IgniteCheckedException If failed. */ public void start(final GridKernalContext ctx, final IgniteH2Indexing h2) throws IgniteCheckedException { this.ctx = ctx; this.h2 = h2; log = ctx.log(GridReduceQueryExecutor.class); ctx.io() .addMessageListener( GridTopic.TOPIC_QUERY, new GridMessageListener() { @Override public void onMessage(UUID nodeId, Object msg) { if (!busyLock.enterBusy()) return; try { GridReduceQueryExecutor.this.onMessage(nodeId, msg); } finally { busyLock.leaveBusy(); } } }); ctx.event() .addLocalEventListener( new GridLocalEventListener() { @Override public void onEvent(final Event evt) { UUID nodeId = ((DiscoveryEvent) evt).eventNode().id(); for (QueryRun r : runs.values()) { for (GridMergeIndex idx : r.idxs) { if (idx.hasSource(nodeId)) { handleNodeLeft(r, nodeId); break; } } } } }, EventType.EVT_NODE_FAILED, EventType.EVT_NODE_LEFT); }
/** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public void notifyCallback( UUID nodeId, UUID routineId, Collection<?> objs, GridKernalContext ctx) { assert nodeId != null; assert routineId != null; assert objs != null; assert ctx != null; Collection<CacheContinuousQueryEntry> entries = (Collection<CacheContinuousQueryEntry>) objs; final GridCacheContext cctx = cacheContext(ctx); for (CacheContinuousQueryEntry e : entries) { GridCacheDeploymentManager depMgr = cctx.deploy(); ClassLoader ldr = depMgr.globalLoader(); if (ctx.config().isPeerClassLoadingEnabled()) { GridDeploymentInfo depInfo = e.deployInfo(); if (depInfo != null) { depMgr.p2pContext( nodeId, depInfo.classLoaderId(), depInfo.userVersion(), depInfo.deployMode(), depInfo.participants(), depInfo.localDeploymentOwner()); } } try { e.unmarshal(cctx, ldr); } catch (IgniteCheckedException ex) { U.error(ctx.log(getClass()), "Failed to unmarshal entry.", ex); } } final IgniteCache cache = cctx.kernalContext().cache().jcache(cctx.name()); Collection<CacheContinuousQueryEntry> entries0 = new ArrayList<>(); for (CacheContinuousQueryEntry e : entries) entries0.addAll(handleEvent(ctx, e)); Iterable<CacheEntryEvent<? extends K, ? extends V>> evts = F.viewReadOnly( entries0, new C1<CacheContinuousQueryEntry, CacheEntryEvent<? extends K, ? extends V>>() { @Override public CacheEntryEvent<? extends K, ? extends V> apply(CacheContinuousQueryEntry e) { return new CacheContinuousQueryEvent<>(cache, cctx, e); } }, new IgnitePredicate<CacheContinuousQueryEntry>() { @Override public boolean apply(CacheContinuousQueryEntry entry) { return !entry.isFiltered(); } }); locLsnr.onUpdated(evts); }