J'utilise Cassandra 3.11 sur RHEL. J'ai défini un UDF exactement comme décrit here.Cassandra 3.11 Débordement de la pile du système d'exploitation UDF
CREATE OR REPLACE FUNCTION maxOf(current int, testvalue int)
CALLED ON NULL INPUT
RETURNS int
LANGUAGE java
AS $$return Math.max(current,testvalue);$$;
Je suis capable de créer l'UDF. Mais quand je lance la requête suivante:
SELECT id,val1,val2,maxOf(val1,val2) FROM test WHERE id IN(1,2,3);
Je reçois l'erreur suivante:
com.datastax.driver.core.exceptions.FunctionExecutionException: execution of 'srm.maxof[int, int]'
failed: java.lang.RuntimeException: java.lang.StackOverflowError: operating system stack overflow
Je l'ai déjà mis enable_user_defined_functions: true
dans cassandra.yaml
sur tous les nœuds.
Voici un extrait de system.log qui comprend les paramètres JVM -X:
-XX:+UseThreadPriorities, -XX:ThreadPriorityPolicy=42, -XX:+HeapDumpOnOutOfMemoryError, -Xss512k, -XX:StringTableSize=1000003, -XX:+AlwaysPreTouch, -XX:-UseBiasedLocking, -XX:+UseTLAB, -XX:+ResizeTLAB, -XX:+UseNUMA, -XX:+PerfDisableSharedMem, -Djava.net.preferIPv4Stack=true, -XX:+UseParNewGC, -XX:+UseConcMarkSweepGC, -XX:+CMSParallelRemarkEnabled, -XX:SurvivorRatio=8, -XX:MaxTenuringThreshold=1, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:CMSWaitDuration=10000, -XX:+CMSParallelInitialMarkEnabled, -XX:+CMSEdenChunksRecordAlways, -XX:+CMSClassUnloadingEnabled, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintHeapAtGC, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -XX:+PrintPromotionFailure, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=10, -XX:GCLogFileSize=10M, -Xms8192M, -Xmx8192M, -Xmn2048M
Cela se produit uniquement lorsque vous utilisez le JRE IBM. Fonctionne très bien avec Oracle JRE.
Voici la trace de pile dans debug.log:
java.lang.RuntimeException: java.lang.StackOverflowError at org.apache.cassandra.cql3.functions.UDFunction.async(UDFunction.java:453) ~[apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.functions.UDFunction.executeAsync(UDFunction.java:398) ~[apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.functions.UDFunction.execute(UDFunction.java:298) ~[apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.selection.ScalarFunctionSelector.getOutput(ScalarFunctionSelector.java:61) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.selection.Selection$SelectionWithProcessing$1.getOutputRow(Selection.java:592) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.selection.Selection$ResultSetBuilder.getOutputRow(Selection.java:430) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.selection.Selection$ResultSetBuilder.build(Selection.java:417) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.statements.SelectStatement.process(SelectStatement.java:763) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.statements.SelectStatement.processResults(SelectStatement.java:400) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:378) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:251) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.statements.SelectStatement.execute(SelectStatement.java:79) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:217) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:248) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:233) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.transport.messages.QueryMessage.execute(QueryMessage.java:116) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:517) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:410) [apache-cassandra-3.11.0.jar:3.11.0] at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [netty-all-4.0.44.Final.jar:4.0.44.Final] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:357) [netty-all-4.0.44.Final.jar:4.0.44.Final] at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:35) [netty-all-4.0.44.Final.jar:4.0.44.Final] at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:348) [netty-all-4.0.44.Final.jar:4.0.44.Final] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:522) [na:1.8.0] at org.apache.cassandra.concurrent.AbstractLocalAwareExecutorService$FutureTask.run(AbstractLocalAwareExecutorService.java:162) [apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:109) [apache-cassandra-3.11.0.jar:3.11.0] at java.lang.Thread.run(Thread.java:795) [na:2.9 (09-01-2017)] Caused by: java.lang.StackOverflowError: null at java.lang.String.substring(String.java:2637) ~[na:2.9 (09-01-2017)] at java.lang.Class.getNonArrayClassPackageName(Class.java:1531) ~[na:2.9 (09-01-2017)] at java.lang.Class.getPackageName(Class.java:1546) ~[na:2.9 (09-01-2017)] at java.lang.J9VMInternals$2.run(J9VMInternals.java:252) ~[na:2.9 (09-01-2017)] at java.security.AccessController.doPrivileged(AccessController.java:647) ~[na:1.8.0] at java.lang.J9VMInternals.checkPackageAccess(J9VMInternals.java:250) ~[na:2.9 (09-01-2017)] at org.apache.cassandra.cql3.functions.ThreadAwareSecurityManager.isSecuredThread(ThreadAwareSecurityManager.java:210) ~[apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.cql3.functions.ThreadAwareSecurityManager.checkPackageAccess(ThreadAwareSecurityManager.java:259) ~[apache-cassandra-3.11.0.jar:3.11.0] [Previous 5 lines repeat many times] at java.lang.J9VMInternals$2.run(J9VMInternals.java:254) ~[na:2.9 (09-01-2017)] at java.security.AccessController.doPrivileged(AccessController.java:647) ~[na:1.8.0] at java.lang.J9VMInternals.checkPackageAccess(J9VMInternals.java:250) ~[na:2.9 (09-01-2017)] at org.apache.cassandra.cql3.functions.UDFunction$$Lambda$277.00000000154A7350.call(Unknown Source) ~[na:na] at java.util.concurrent.FutureTask.run(FutureTask.java:277) ~[na:1.8.0] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1160) ~[na:1.8.0] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:1.8.0] at org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:81) ~[apache-cassandra-3.11.0.jar:3.11.0] at org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$12.0000000013A22FB0.run(Unknown Source) ~[na:na] ... 1 common frames omitted
Y at-il une configuration que je suis absent? Dois-je augmenter certains paramètres de taille de pile?
Modifier: un problème survient uniquement avec IBM JRE. Fonctionne très bien avec Oracle JRE. – sumantp