/** * @param e Entry. * @return Continuous query entry. */ private CacheContinuousQueryEntry skipEntry(CacheContinuousQueryEntry e) { if (lastFiredCntr.get() > e.updateCounter() || e.updateCounter() == 1) { e.markFiltered(); return e; } else { buf.add(e.updateCounter()); // Double check. If another thread sent a event with counter higher than this event. if (lastFiredCntr.get() > e.updateCounter() && buf.contains(e.updateCounter())) { buf.remove(e.updateCounter()); e.markFiltered(); return e; } else return null; } }
/** * Add continuous entry. * * @param e Cache continuous query entry. * @return Collection entries which will be fired. */ public CacheContinuousQueryEntry handle(CacheContinuousQueryEntry e) { assert e != null; if (e.isFiltered()) { Long last = buf.lastx(); Long first = buf.firstx(); if (last != null && first != null && last - first >= MAX_BUFF_SIZE) { NavigableSet<Long> prevHoles = buf.subSet(first, true, last, true); GridLongList filteredEvts = new GridLongList((int) (last - first)); int size = 0; Long cntr; while ((cntr = prevHoles.pollFirst()) != null) { filteredEvts.add(cntr); ++size; } filteredEvts.truncate(size, true); e.filteredEvents(filteredEvts); return e; } if (lastFiredCntr.get() > e.updateCounter() || e.updateCounter() == 1) return e; else { buf.add(e.updateCounter()); // Double check. If another thread sent a event with counter higher than this event. if (lastFiredCntr.get() > e.updateCounter() && buf.contains(e.updateCounter())) { buf.remove(e.updateCounter()); return e; } else return null; } } else { long prevVal = updateFiredCounter(e.updateCounter()); if (prevVal == -1) return e; else { NavigableSet<Long> prevHoles = buf.subSet(prevVal, true, e.updateCounter(), true); GridLongList filteredEvts = new GridLongList((int) (e.updateCounter() - prevVal)); int size = 0; Long cntr; while ((cntr = prevHoles.pollFirst()) != null) { filteredEvts.add(cntr); ++size; } filteredEvts.truncate(size, true); e.filteredEvents(filteredEvts); return e; } } }