Nikolay Izhikov created IGNITE-6221: ---------------------------------------
Summary: ContinuousQuery. Local listener notified if filter throws exception Key: IGNITE-6221 URL: https://issues.apache.org/jira/browse/IGNITE-6221 Project: Ignite Issue Type: Bug Components: cache Affects Versions: 2.1 Reporter: Nikolay Izhikov Priority: Minor Fix For: 2.2 Local listener of continuous query receives event if filter throw exception from `evaluate`. Steps to reproduce the bug: 1. Run continuous query with remote filter. 2. Throw exception from filter. Current behavior: 3. Local listener notified. Expected behavior: 3. Local listener doesn't notify. [Mail-list discussion|http://apache-ignite-developers.2346864.n4.nabble.com/ContinuousQueryWithTransformer-implementation-questions-2-td21418.html] Filter description from [jcache Javadoc|https://static.javadoc.io/javax.cache/cache-api/1.0.0/javax/cache/event/CacheEntryEventFilter.html#evaluate(javax.cache.event.CacheEntryEvent)]: {noformat} Returns: true if the evaluation passes, otherwise false. The effect of returning true is that listener will be invoked {noformat} Test to reproduce error: {code:java} package org.apache.ignite.internal.processors.cache.query.continuous; import java.io.Serializable; import javax.cache.Cache; import javax.cache.event.CacheEntryEvent; import javax.cache.event.CacheEntryUpdatedListener; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheEntryEventSerializableFilter; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.query.ContinuousQuery; import org.apache.ignite.cache.query.QueryCursor; public class GridCacheContinuousQueryFilterExceptionTest extends GridCacheContinuousQueryAbstractSelfTest implements Serializable { /** * @throws Exception If failed. */ public void testListenerAfterFilterException() throws Exception { IgniteCache<Integer, Integer> cache = grid(0).cache(DEFAULT_CACHE_NAME); ContinuousQuery<Integer, Integer> qry = new ContinuousQuery<>(); qry.setLocalListener(new CacheEntryUpdatedListener<Integer, Integer>() { @Override public void onUpdated(Iterable<CacheEntryEvent<? extends Integer, ? extends Integer>> evts) { fail("Listener shouldn't be called"); } }); qry.setRemoteFilter(new CacheEntryEventSerializableFilter<Integer, Integer>() { @Override public boolean evaluate(CacheEntryEvent<? extends Integer, ? extends Integer> evt) { throw new RuntimeException("Test error."); } }); try (QueryCursor<Cache.Entry<Integer, Integer>> ignored = cache.query(qry)) { for (int i = 0; i < 100; i++) cache.put(i, i); } } @Override protected CacheMode cacheMode() { return CacheMode.REPLICATED; } @Override protected int gridCount() { return 1; } } {code} -- This message was sent by Atlassian JIRA (v6.4.14#64029)