Hello!

Did you enable peer class loading? You need to either enable peer class
loading, or put your filter class(es) to all server nodes.

Regards,
-- 
Ilya Kasnacheev


чт, 2 июл. 2020 г. в 15:09, Rafael Troilo <rafael.tro...@heigit.org>:

> Hi Denis,
>
> thank you for your quick response. Unfortunately even avoiding lambdas or
> anonymous classes didn't solve this problem.
> And was my first thought for this problem too.
>
> With:
>
> MyFilter.java
>
> import org.apache.ignite.lang.IgniteClosure;
>
> public class MyFilter<T> implements IgniteClosure<T, Long> {
>
>   private static final long serialVersionUID = 1L;
>   private final long l;
>
>   public MyFilter(long l) {
>     this.l = l;
>   }
>
>   @Override
>   public Long apply(T e) {
>     return l;
>   }
>
> }
>
>
> and
>
> try (Ignite ignite = Ignition.start("ignite.xml")) {
>    IgniteCache<Integer, String> cache =
> ignite.getOrCreateCache("ScanTransformTest");
>   ...
>    // 2 Running the ScanQuery on the remote server. Works!
>   compute.broadcast(() -> {
>     try (QueryCursor<Long> cursor = cache.query(new
> ScanQuery<>().setLocal(true), new MyFilter<>(234))) {
>       for (Long row : cursor) {
>         return row;
>       }
>     }
>     return 0;
>   })
>
>   // 3 Still does not work.
>   try (QueryCursor<Long> cursor = cache.query(new ScanQuery<>(), new
> MyFilter<>(345L))) {
>     for (Long row : cursor) {
>       System.out.println(row);
>       break;
>     }
>   }
> }
>
> Still does not work, this time complaining that the MyFilter class is not
> found.
> PeerClassLoading is active as far as I can tell. At least in both
> server/client ignite config
> ...
> <property name="peerClassLoadingEnabled" value="true"/>
> ...
> it is enabled.
>
> I'm also not sure why the same class (IgniteClosure) works in the other
> case but not in the Transformer or whats the differnt in case 2 to 3.
> I guess making the MyFilter class available on the server will solve this
> problem, but should not peerClassLoading work here?
>
> Is there any information  I can provide or test I should do to help to
> solve this problem.
>
> Thank you very much.
>
>
> Stack Trace:
> Exception in thread "main" javax.cache.CacheException: class
> org.apache.ignite.IgniteCheckedException: MyFilter
>         at
> org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1317)
>         at
> org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:173)
>         at
> org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:645)
>         at
> org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
>         at
> org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
>         at
> org.apache.ignite.internal.processors.cache.AutoClosableCursorIterator.hasNext(AutoClosableCursorIterator.java:49)
>         at ScanQueryTest.main(ScanQueryTest.java:57)
> Caused by: class org.apache.ignite.IgniteCheckedException: MyFilter
>         at
> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10310)
>         at
> org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest.finishUnmarshal(GridCacheQueryRequest.java:389)
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.unmarshall(GridCacheIoManager.java:1625)
>         at
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:586)
>         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:1843)
>         at
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
>         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:1365)
>         at
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
>         at
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
>         at java.base/java.lang.Thread.run(Thread.java:834)
> Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
> MyFilter
>         at
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
>         at
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
>         at
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1757)
>         at
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
>         at
> org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:307)
>         at
> org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0(BinaryMarshaller.java:101)
>         at
> org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:81)
>         at
> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10304)
>         ... 14 more
> Caused by: java.lang.ClassNotFoundException: MyFilter
>         at
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
>         at
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
>         at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
>         at java.base/java.lang.Class.forName0(Native Method)
>         at java.base/java.lang.Class.forName(Class.java:398)
>         at
> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
>         at
> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
>         at
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
>         ... 21 more
>
>
>
> On 7/1/20 7:09 PM, Denis Magda wrote:
> > Hi Rafael,
> >
> > Lamdas and anonymous classes capture and serialize their Inner/OuterClass
> > with all the fields, and classes of the fields of those fields, etc. In
> > your case, ScanQueryClass was captured during the lamda serialization and
> > that class was not found during deserialization on the other side:
> >
> > Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed
> to
> > read field [name=capturingClass]
> >         at
> >
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:874)
> >         ... 20 more
> > Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
> > ScanQueryTest
> >         at
> >
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1638)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1575)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1552)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:383)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:907)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:703)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:188)
> >         ... 21 more
> > *Caused by: java.lang.ClassNotFoundException: ScanQueryTest*
> >         at
> >
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
> >         at
> >
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
> >         at
> java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
> >         at java.base/java.lang.Class.forName0(Native Method)
> >         at java.base/java.lang.Class.forName(Class.java:398)
> >         at
> >
> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
> >         at
> >
> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
> >         at
> >
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
> >         ... 29 more
> >
> > My advice is to avoid using lambdas and anonymous classes due to this
> > specificity. Instead, you can create "private static classes" and Ignite
> > will be serializing an instance of that class only:
> >
> > private static class MyFilter implements IgniteClosure {
> > ....
> > }
> >
> > Lamdas are nice for demos and simple code samples where
> Inner/OuterClasses
> > are simple Java classes. While in real production environments, things
> can
> > get messy.
> >
> > -
> > Denis
> >
> >
> > On Wed, Jul 1, 2020 at 9:36 AM Rafael Troilo <rafael.tro...@heigit.org>
> > wrote:
> >
> >> Hey Guys,
> >>
> >> I have a strange problem with the Transform part of a ScanQuery that I
> get
> >> a deserialize object exception for the SerializedLambda.
> >>> javax.cache.CacheException: class
> >> org.apache.ignite.IgniteCheckedException: Failed to deserialize object
> >> [typeName=java.lang.invoke.SerializedLambda]
> >>
> >> Strange is that it works very well in other cases like:
> >>
> >> try (Ignite ignite = Ignition.start("ignite.xml")) {
> >>   IgniteCache<Integer,String> cache =
> >> ignite.createCache("ScanTransformTest");
> >>   cache.put(1, "Hello");
> >>
> >>   // 1  Just a broadcast with a IgniteClosure works!
> >>   compute.broadcast((a) -> 123L, "Hello").forEach(System.out::println);
> >>
> >>   // 2 Running the ScanQuery on the remote server. Works too!
> >>   compute.broadcast(() -> {
> >>     try(QueryCursor<Long> cursor = cache.query(new
> >> ScanQuery<>().setLocal(true), (a) -> 234L)){
> >>       for( Long row : cursor) {
> >>         return row;
> >>       }
> >>     }
> >>     return 0;
> >>   }).forEach(System.out::println);
> >>
> >>
> >>   // 3 But running it from the client side it fails!
> >>   try(QueryCursor<Long> cursor = cache.query(new ScanQuery<>(), (a) ->
> >> 345L)){
> >>     for( Long row : cursor) {
> >>       System.out.println(row);
> >>       break;
> >>     }
> >>   }
> >>
> >> }
> >>
> >> Also changing the Lambda to a actually class implementing IgniteClosure
> >> results in the same problem.
> >>
> >> Any idea what I'm doing wrong?
> >>
> >> We are running ignite ver. 2.8.0#20200226-sha1:341b01df
> >> With java openjdk 11.0.7 2020-04-14
> >>
> >> Thank you!
> >>
> >> Best,
> >> Rafael
> >>
> >>
> >> Error Log:
> >> Exception in thread "main" javax.cache.CacheException: class
> >> org.apache.ignite.IgniteCheckedException: Failed to deserialize object
> >> [typeName=java.lang.invoke.SerializedLambda]
> >>         at
> >>
> org.apache.ignite.internal.processors.cache.GridCacheUtils.convertToCacheException(GridCacheUtils.java:1317)
> >>         at
> >>
> org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:173)
> >>         at
> >>
> org.apache.ignite.internal.processors.cache.query.GridCacheDistributedQueryManager$5.onHasNext(GridCacheDistributedQueryManager.java:645)
> >>         at
> >>
> org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
> >>         at
> >>
> org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
> >>         at
> >>
> org.apache.ignite.internal.processors.cache.AutoClosableCursorIterator.hasNext(AutoClosableCursorIterator.java:49)
> >>         at ScanQueryTest.main(ScanQueryTest.java:49)
> >> Caused by: class org.apache.ignite.IgniteCheckedException: Failed to
> >> deserialize object [typeName=java.lang.invoke.SerializedLambda]
> >>         at
> >>
> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10310)
> >>         at
> >>
> org.apache.ignite.internal.processors.cache.query.GridCacheQueryRequest.finishUnmarshal(GridCacheQueryRequest.java:389)
> >>         at
> >>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.unmarshall(GridCacheIoManager.java:1625)
> >>         at
> >>
> org.apache.ignite.internal.processors.cache.GridCacheIoManager.onMessage0(GridCacheIoManager.java:586)
> >>         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:1843)
> >>         at
> >>
> org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1468)
> >>         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:1365)
> >>         at
> >>
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
> >>         at
> >>
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
> >>         at java.base/java.lang.Thread.run(Thread.java:834)
> >> Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed
> to
> >> deserialize object [typeName=java.lang.invoke.SerializedLambda]
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:913)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1764)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1716)
> >>         at
> >>
> org.apache.ignite.internal.binary.GridBinaryMarshaller.deserialize(GridBinaryMarshaller.java:307)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryMarshaller.unmarshal0(BinaryMarshaller.java:101)
> >>         at
> >>
> org.apache.ignite.marshaller.AbstractNodeNameAwareMarshaller.unmarshal(AbstractNodeNameAwareMarshaller.java:81)
> >>         at
> >>
> org.apache.ignite.internal.util.IgniteUtils.unmarshal(IgniteUtils.java:10304)
> >>         ... 14 more
> >> Caused by: class org.apache.ignite.binary.BinaryObjectException: Failed
> to
> >> read field [name=capturingClass]
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:874)
> >>         ... 20 more
> >> Caused by: class org.apache.ignite.binary.BinaryInvalidTypeException:
> >> ScanQueryTest
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:724)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:721)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1638)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1575)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryUtils.doReadClass(BinaryUtils.java:1552)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryReaderExImpl.readClass(BinaryReaderExImpl.java:383)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:907)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read0(BinaryFieldAccessor.java:703)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:188)
> >>         ... 21 more
> >> Caused by: java.lang.ClassNotFoundException: ScanQueryTest
> >>         at
> >>
> java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
> >>         at
> >>
> java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
> >>         at
> java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
> >>         at java.base/java.lang.Class.forName0(Native Method)
> >>         at java.base/java.lang.Class.forName(Class.java:398)
> >>         at
> >>
> org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8828)
> >>         at
> >>
> org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:374)
> >>         at
> >>
> org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:715)
> >>         ... 29 more
> >>
> >>
> >>
> >>
> >>
> >> --
> >> Rafael Troilo
> >> HeiGIT gGmbH
> >> Heidelberg Institute for Geoinformation Technology at Heidelberg
> University
> >>
> >> https://heigit.org | rafael.tro...@heigit.org | phone +49-6221-533 484
> >>
> >> Postal address: Schloss-Wolfsbrunnenweg 33 | 69118 Heidelberg | Germany
> >> Offices: Berliner Str. 45 | 69120 Heidelberg | Germany
> >>
> >> Amtsgericht Mannheim | HRB 733765
> >> Managing Directors: Prof. Dr. Alexander Zipf | Dr. Gesa Schönberger
> >>
> >
>
> --
> Rafael Troilo
> HeiGIT gGmbH
> Heidelberg Institute for Geoinformation Technology at Heidelberg University
>
> https://heigit.org | rafael.tro...@heigit.org | phone +49-6221-533 484
>
> Postal address: Schloss-Wolfsbrunnenweg 33 | 69118 Heidelberg | Germany
> Offices: Berliner Str. 45 | 69120 Heidelberg | Germany
>
> Amtsgericht Mannheim | HRB 733765
> Managing Directors: Prof. Dr. Alexander Zipf | Dr. Gesa Schönberger
>

Reply via email to