1
votes

Trying to develop a POC app using Ignite and everything is working up to the point I try to put some load on it using a simple JMeter test case.

I have a spring-boot app with a simple REST endpoint that calls ignite to do a ScanQuery against the cache. It works fine if I do it one a time, or while the test case is ramping up. But as soon as it get's to an actual load I get the following error:

2017-01-18 17:59:13.208 ERROR 80459 --- [io-12080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeExceptio
n: javax.cache.CacheException: class org.apache.ignite.IgniteCheckedException: Query execution failed: GridCacheQueryBean [qry=GridCacheQueryAdapter [type=SCAN, clsName=null, clause=null, filter=ignite.poc.query.IgniteQueryRunner$$Lambda$26/82502066
0@51ff3126, transform=ignite.poc.query.IgniteQueryRunner$$Lambda$27/572449976@6dfc4dd2, part=null, incMeta=false, metrics=GridCacheQueryMetricsAdapter [minTime=9223372036854775807, maxTime=0, sumTime=0, avgTime=0.0, execs=0, completed=0, fails=0], p
ageSize=1024, timeout=0, keepAll=true, incBackups=false, dedup=false, prj=null, keepBinary=false, subjId=ab624128-db6b-4e79-af5c-4bebe7c16a45, taskHash=0], rdc=null, trans=com.labnetwork.ignite.poc.query.IgniteQueryRunner$$Lambda$27/572449976@6dfc4dd2]] with root
cause

java.lang.ClassNotFoundException: sun.reflect.GeneratedConstructorAccessor72
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_91]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_91]
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[na:1.8.0_91]
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_91]
        at java.lang.Class.forName0(Native Method) ~[na:1.8.0_91]
        at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_91]
        at org.apache.ignite.internal.util.IgniteUtils.forName(IgniteUtils.java:8393) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.MarshallerContextAdapter.getClass(MarshallerContextAdapter.java:185) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:680) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:686) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1491) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1450) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.readField(BinaryReaderExImpl.java:1700) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read(BinaryFieldAccessor.java:639) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:829) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1498) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1450) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.readField(BinaryReaderExImpl.java:1700) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read(BinaryFieldAccessor.java:639) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:829) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1498) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1450) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryUtils.doReadObject(BinaryUtils.java:1634) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.readObject(BinaryReaderExImpl.java:1119) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.readFixedType(BinaryFieldAccessor.java:823) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryFieldAccessor$DefaultFinalClassAccessor.read(BinaryFieldAccessor.java:639) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:829) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1498) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1450) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryUtils.doReadObject(BinaryUtils.java:1634) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryUtils.deserializeOrUnmarshal(BinaryUtils.java:1981) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryUtils.doReadMap(BinaryUtils.java:1965) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1645) ~[ignite-core-1.8.0.jar:1.8.0]
        at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1450) ~[ignite-core-1.8.0.jar:1.8.0]

My ScanQuery looks like this:

    public List<Integer> idsForSmiles(final String smiles) {
        try {
            final IChemObjectBuilder objBuilder = DefaultChemObjectBuilder.getInstance();
            final SmilesParser smilesParser = new SmilesParser(objBuilder);
            final IAtomContainer givenAtom = smilesParser.parseSmiles(smiles);
            final QueryAtomContainer query = QueryAtomContainerCreator.createSymbolAndChargeQueryContainer(givenAtom);
            final Pattern pattern = VentoFoggia.findSubstructure(query, new WildCardAtomMatcher(), BondMatcher.forOrder());
            return cache.query(new ScanQuery<Integer, MoleculeCacheEntry>((id, entry) -> {
                return pattern.matches(entry.getAtom());
            }), Cache.Entry::getKey).getAll();
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

I have 3 local server nodes running, using the 'examples/config/example-ignite.xml' and the spring boot app is running in client mode. Peer class loading is disabled.

The client app loads up ignite and the cache instances with:

    @Bean
    public Ignite ignite() {
        IgniteConfiguration conf = new IgniteConfiguration();
        conf.setClientMode(true);
        Ignite ignite = Ignition.start(conf);
        return ignite;
    }

    @Bean
    public IgniteCache<Integer, MoleculeCacheEntry> cache() {
        CacheConfiguration<Integer, MoleculeCacheEntry> atomCache = new CacheConfiguration<>("atomCache");
        atomCache.setCacheMode(CacheMode.PARTITIONED);
        return ignite.getOrCreateCache(atomCache);
    }

As soon as the error happens, all subsequent queries also fail until I restart the client and reload the cache.

1

1 Answers

0
votes

First of all, I would recommend to implement filter as a static class instead of lambda. This class is executed on remote nodes and therefore serialized, and most likely it picks up something that you do not expect (and includes and instance of GeneratedConstructorAccessor72, whatever this is). If this doesn't help, than most likely one of your other serializable classes reference GeneratedConstructorAccessor72.