Hello!

Do you have a reproducer for this issue? I think I could validate it and
create an issue if you do.

Can you please also check if it works or not on e.g. Apache Ignite 2.9RC2?

Regards,
-- 
Ilya Kasnacheev


вт, 6 окт. 2020 г. в 14:30, <ivan.fedoren...@tdameritrade.com>:

> Hi everyone!
>
> I am getting the ClassCastException when a node from my cluster fails
> over. It looks like the root cause is that nodes are loading some keys from
> their backups and the CacheContinousQueryHandler is assuming that the
> entries are already converted by the remote side which is a false
> expectation.
>
> The stacktrace is:
>
> Caused by: java.lang.ClassCastException:
> org.apache.ignite.internal.binary.BinaryObjectImpl cannot be cast to
> java.lang.String
>
> ...
>
>         at
> org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler.notifyLocalListener(CacheContinuousQueryHandler.java:1114)
>
>         at
> org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler.notifyCallback0(CacheContinuousQueryHandler.java:940)
>
>         at
> org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler.notifyCallback(CacheContinuousQueryHandler.java:881)
>
>         at
> org.apache.ignite.internal.processors.continuous.GridContinuousProcessor.addBackupNotification(GridContinuousProcessor.java:1161)
>
>         at
> org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryHandler$2.flushBackupQueue(CacheContinuousQueryHandler.java:498)
>
>         at
> org.apache.ignite.internal.processors.cache.query.continuous.CacheContinuousQueryManager.flushBackupQueue(CacheContinuousQueryManager.java:687)
>
>         at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onDone(GridDhtPartitionsExchangeFuture.java:2261)
>
>         at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.processFullMessage(GridDhtPartitionsExchangeFuture.java:4375)
>
>         at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.access$1500(GridDhtPartitionsExchangeFuture.java:148)
>
>         at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$4.apply(GridDhtPartitionsExchangeFuture.java:4054)
>
>         at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture$4.apply(GridDhtPartitionsExchangeFuture.java:4042)
>
>         at
> org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:399)
>
>         at
> org.apache.ignite.internal.util.future.GridFutureAdapter.listen(GridFutureAdapter.java:354)
>
>         at
> org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsExchangeFuture.onReceiveFullMessage(GridDhtPartitionsExchangeFuture.java:4042)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager.processFullPartitionUpdate(GridCachePartitionExchangeManager.java:1886)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$3.onMessage(GridCachePartitionExchangeManager.java:429)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$3.onMessage(GridCachePartitionExchangeManager.java:416)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$MessageHandler.apply(GridCachePartitionExchangeManager.java:3667)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCachePartitionExchangeManager$MessageHandler.apply(GridCachePartitionExchangeManager.java:3646)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.processMessage(GridCacheIoManager.java:1142)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:591)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:392)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.handleMessage(GridCacheIoManager.java:318)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.access$100(GridCacheIoManager.java:109)
>
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager$1.onMessage(GridCacheIoManager.java:308)
>
>         at
> org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1847)
>
>         at
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1472)
>
>         at
> org.apache.ignite.internal.managers.communication.GridIoManager.access$5200(GridIoManager.java:229)
>
>         at
> org.apache.ignite.internal.managers.communication.GridIoManager$9.run(GridIoManager.java:1367)
>
> The workaround is:
>
> public abstract class CqWithTransformerLocalListenerAdapter<T>
>    implements ContinuousQueryWithTransformer.EventListener<T>
> {
>    private final Function<BinaryObject, T> localTransformer;
>
>    protected CqWithTransformerLocalListenerAdapter(Function<BinaryObject,
> T> localTransformer) {
>       this.localTransformer = localTransformer;
>    }
>
>    /**
>     * The same as {@link
> ContinuousQueryWithTransformer.EventListener#onUpdated(Iterable)},
>     * but guarantees that entities are transformed.
>     */
>    protected abstract void onUpdatedTransformed(Iterable<T> entities);
>
>    @Override
>    public final void onUpdated(Iterable entities) {
>       onUpdatedTransformed(new IterableAdapter(entities));
>    }
>
>    private class IterableAdapter implements Iterable<T> {
>       private final Iterable<?> entities;
>
>       public IterableAdapter(Iterable<?> entities) {
>          this.entities = entities;
>       }
>
>       @NotNull
>       @Override
>       public Iterator<T> iterator() {
>          return new IteratorWrapper(entities.iterator());
>       }
>    }
>
>    private class IteratorWrapper implements Iterator<T> {
>       private final Iterator<?> underlying;
>
>       public IteratorWrapper(Iterator<?> underlying) {
>          this.underlying = underlying;
>       }
>
>       @Override
>       public boolean hasNext() {
>          return underlying.hasNext();
>       }
>
>       @Override
>       public T next() {
>          Object o = underlying.next();
>          // Sometimes an entity may be in a binary form (see javadoc of
> the enclosing class).
>          if (o instanceof BinaryObject) {
>             return localTransformer.apply((BinaryObject) o);
>          }
>          // The entity has been converted by a remote transformer
>          return (T) o;
>       }
>    }
> }
>
> Best regards,
> Ivan Fedorenkov
>

Reply via email to