Semyon, Yakov,

Here is ticket - https://issues.apache.org/jira/browse/IGNITE-6221

Thank you.

Can we now return to my questions about IGNITE-425?

1. I introduce new query class - ContinuousQueryWithTransformer [3].
Reasons:
* ContinuousQuery is final so user can't extends it. I don't want to
change that.
* ContinuousQuery contains some deprecated methods(setRemoteFilter) so
with new class we can get rid of them.
* Such public API design disallow usage of existing localEventListener
with new transformedEventListenr in compile time.

Thoughts?

2. What behavior is expected if transformer throws exception for some
event? I see following options:

* Pass `null` to listener(pull request implementation).
* Skip event. Don't call listener.
* Introduce special callback. onTransformError?

Thoughts?


30.08.2017 10:38, Semyon Boikov пишет:
Hi,

I had an impression that current behavior is required by jcache, but now I
can not find anything about this neither in spec nor in jcache tck tests.
So I think we can change current behavior.

Thanks

On Tue, Aug 29, 2017 at 9:48 PM, Nikolay Izhikov <nizhikov....@gmail.com>
wrote:

Yakov.

I found following description in jcache javadoc [1] -

===
Returns:
    true if the evaluation passes, otherwise false.
    *The effect of returning true is that listener will be invoked*
===

JSR doesn't specify how filter exception has to be handled.
As far as I can understand *only* way to pass filter is return true from
`evaluate`.

I think we has to change current behavior.

Should I file a ticket?

[1] https://static.javadoc.io/javax.cache/cache-api/1.0.0/javax/
cache/event/CacheEntryEventFilter.html#evaluate(javax.cache.
event.CacheEntryEvent)


29.08.2017 17:09, Yakov Zhdanov пишет:

Igniters,

Does anyone else see potential issues on user side with current approach?

Sam, is this JCache requirement?

--Yakov

2017-08-29 15:16 GMT+03:00 Nikolay Izhikov <nizhikov....@gmail.com>:

Yakov.

I think exception equals `true` is intended behavior.

Filter evaluation implementation from master - [1]
Test from master to check filter exception(without explicit asserts
checking listeners call) - [2]

Here is my quick test with asserts on listener call after filter
exception:

```
package org.apache.ignite.internal.processors.cache.query.continuous;

//... imports

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<>();

          final CountDownLatch latch = new CountDownLatch(100);

          qry.setLocalListener(new CacheEntryUpdatedListener<Integer,
Integer>() {
              @Override public void onUpdated(Iterable<CacheEntryEvent<?
extends Integer, ? extends Integer>> evts) {
                  for (CacheEntryEvent<? extends Integer, ? extends
Integer>
evt : evts)
                      latch.countDown();
              }
          });

          qry.setRemoteFilter(new CacheEntryEventSerializableFil
ter<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);

              assertTrue(latch.await(10, SECONDS));
          }
      }

      @Override protected CacheMode cacheMode() {
          return CacheMode.REPLICATED;
      }

      @Override protected int gridCount() {
          return 1;
      }
}
```

[1] https://github.com/apache/ignite/blob/master/modules/core/
src/main/java/org/apache/ignite/internal/processors/cache/
query/continuous/CacheContinuousQueryHandler.java#L791

[2] https://github.com/apache/ignite/blob/master/modules/core/
src/test/java/org/apache/ignite/internal/processors/cache/
query/continuous/GridCacheContinuousQueryAbstractSelfTest.java#L359


29.08.2017 14:46, Yakov Zhdanov пишет:

If filter throws exception entry would be passed to listener.



this is strange. Imagine a filter that very rarely throws some runtime
exception due to external or environmental reasons, but in case of
normal
execution filter evaluates to false. In case of error entry is passed
to a
local listener which can lead to some serious consequences and
inconsistencies in business logic. We probably need to send entry with a
notion that there was an error on server.

--Yakov





Reply via email to