Search in sources :

Example 1 with VisorGridEventsLost

use of org.apache.ignite.internal.visor.event.VisorGridEventsLost in project ignite by apache.

the class VisorTaskUtils method collectEvents.

/**
 * Grabs local events and detects if events was lost since last poll.
 *
 * @param ignite Target grid.
 * @param evtOrderKey Unique key to take last order key from node local map.
 * @param evtThrottleCntrKey Unique key to take throttle count from node local map.
 * @param evtTypes Event types to collect.
 * @param evtMapper Closure to map grid events to Visor data transfer objects.
 * @return Collections of node events
 */
public static List<VisorGridEvent> collectEvents(Ignite ignite, String evtOrderKey, String evtThrottleCntrKey, int[] evtTypes, IgniteClosure<Event, VisorGridEvent> evtMapper) {
    assert ignite != null;
    assert evtTypes != null && evtTypes.length > 0;
    ConcurrentMap<String, Long> nl = ignite.cluster().nodeLocalMap();
    final long lastOrder = getOrElse(nl, evtOrderKey, -1L);
    final long throttle = getOrElse(nl, evtThrottleCntrKey, 0L);
    // When we first time arrive onto a node to get its local events,
    // we'll grab only last those events that not older than given period to make sure we are
    // not grabbing GBs of data accidentally.
    final long notOlderThan = System.currentTimeMillis() - EVENTS_COLLECT_TIME_WINDOW;
    // Flag for detecting gaps between events.
    final AtomicBoolean lastFound = new AtomicBoolean(lastOrder < 0);
    IgnitePredicate<Event> p = new IgnitePredicate<Event>() {

        /**
         */
        private static final long serialVersionUID = 0L;

        @Override
        public boolean apply(Event e) {
            // Detects that events were lost.
            if (!lastFound.get() && (lastOrder == e.localOrder()))
                lastFound.set(true);
            // Retains events by lastOrder, period and type.
            return e.localOrder() > lastOrder && e.timestamp() > notOlderThan;
        }
    };
    Collection<Event> evts = ignite.configuration().getEventStorageSpi() instanceof NoopEventStorageSpi ? Collections.<Event>emptyList() : ignite.events().localQuery(p, evtTypes);
    // Update latest order in node local, if not empty.
    if (!evts.isEmpty()) {
        Event maxEvt = Collections.max(evts, EVTS_ORDER_COMPARATOR);
        nl.put(evtOrderKey, maxEvt.localOrder());
    }
    // Update throttle counter.
    if (!lastFound.get())
        nl.put(evtThrottleCntrKey, throttle == 0 ? EVENTS_LOST_THROTTLE : throttle - 1);
    boolean lost = !lastFound.get() && throttle == 0;
    List<VisorGridEvent> res = new ArrayList<>(evts.size() + (lost ? 1 : 0));
    if (lost)
        res.add(new VisorGridEventsLost(ignite.cluster().localNode().id()));
    for (Event e : evts) {
        VisorGridEvent visorEvt = evtMapper.apply(e);
        if (visorEvt != null)
            res.add(visorEvt);
    }
    return res;
}
Also used : IgnitePredicate(org.apache.ignite.lang.IgnitePredicate) ArrayList(java.util.ArrayList) VisorGridEventsLost(org.apache.ignite.internal.visor.event.VisorGridEventsLost) NoopEventStorageSpi(org.apache.ignite.spi.eventstorage.NoopEventStorageSpi) VisorGridEvent(org.apache.ignite.internal.visor.event.VisorGridEvent) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Event(org.apache.ignite.events.Event) VisorGridEvent(org.apache.ignite.internal.visor.event.VisorGridEvent)

Aggregations

ArrayList (java.util.ArrayList)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 Event (org.apache.ignite.events.Event)1 VisorGridEvent (org.apache.ignite.internal.visor.event.VisorGridEvent)1 VisorGridEventsLost (org.apache.ignite.internal.visor.event.VisorGridEventsLost)1 IgnitePredicate (org.apache.ignite.lang.IgnitePredicate)1 NoopEventStorageSpi (org.apache.ignite.spi.eventstorage.NoopEventStorageSpi)1