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)