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.