2017-09-12 2 views
0

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?

+0

Modifier: un problème survient uniquement avec IBM JRE. Fonctionne très bien avec Oracle JRE. – sumantp

Répondre

0

Les fonctions UDF sont désactivées par défaut depuis Cassandra 3.0. Pour les activer, vous devez définir enable_user_defined_functions: true dans le fichier cassandra.yaml.

+0

Merci pour la réponse. Comme je l'ai mentionné dans mon post, il est défini sur true sur tous les nœuds. – sumantp

+0

Je vois. Il est possible que la taille de la pile soit petite lorsque C * démarre le jvm. Pourriez-vous poster les paramètres de mémoire de Java? – saitejalakkimsetty

+0

J'ai modifié le message d'origine pour inclure les paramètres JVM -X. – sumantp