Bug 1035973

Summary: SmooksAction with XML-to-Java enum mapping may throw an exception under heavy load
Product: [JBoss] JBoss Enterprise SOA Platform 5 Reporter: Tadayoshi Sato <tasato>
Component: JBossESBAssignee: Nobody <nobody>
Status: NEW --- QA Contact:
Severity: high Docs Contact:
Priority: high    
Version: 5.3.1CC: laszlo.van.den.hoek, soa-p-jira
Target Milestone: ---   
Target Release: ---   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Attachments:
Description Flags
reproducer none

Description Tadayoshi Sato 2013-11-29 05:10:48 UTC
Created attachment 830475 [details]
reproducer

Platform BZ for https://issues.jboss.org/browse/JBESB-3961

Under heavy load (more that 10 requests per second), SmooksAction sometimes throws an exception like the following. Note that this error may occur only if SmooksAction has the Smooks config of XML-to-Java mapping which involves enum type mapping with default value specified (see attached reproducer project).

----------
org.milyn.SmooksException: Unable to filter InputStream for target profile [org.milyn.profile.Profile#default_profile].
	at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:294)
	at org.milyn.delivery.dom.SmooksDOMFilter.doFilter(SmooksDOMFilter.java:243)
	at org.milyn.delivery.dom.SmooksDOMFilter.doFilter(SmooksDOMFilter.java:216)
	at org.milyn.Smooks._filter(Smooks.java:516)
	at org.milyn.Smooks.filterSource(Smooks.java:475)
	at org.milyn.container.plugin.PayloadProcessor.process(PayloadProcessor.java:112)
	at org.jboss.soa.esb.smooks.SmooksAction.process(SmooksAction.java:217)
	at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:667)
	at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.processPipeline(ActionProcessingPipeline.java:614)
	at org.jboss.soa.esb.listeners.message.ActionProcessingPipeline.process(ActionProcessingPipeline.java:442)
	at org.jboss.soa.esb.listeners.message.MessageAwareListener$TransactionalRunner.run(MessageAwareListener.java:587)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)
Caused by: org.milyn.expression.ExpressionEvaluationException: Error evaluating MVEL expression 'this.type = (com.redhat.samples.esb.model.Type.X);' against object type 'com.redhat.samples.esb.model.Hello'. Common issues include:
		1. Referencing a variable that is not bound into the context. In this case use the 'isdef' operator to check if the variable is bound in the context.
		2. Invalid expression reference to a List/Array based variable token.  Example List/Array referencing expression token: 'order.orderItems[0].productId'.
	at org.milyn.expression.MVELExpressionEvaluator.exec(MVELExpressionEvaluator.java:110)
	at org.milyn.expression.MVELExpressionEvaluator.exec(MVELExpressionEvaluator.java:115)
	at org.milyn.javabean.BeanInstanceCreator.createAndSetBean(BeanInstanceCreator.java:269)
	at org.milyn.javabean.BeanInstanceCreator.visitBefore(BeanInstanceCreator.java:210)
	at org.milyn.delivery.dom.SmooksDOMFilter$ElementProcessor.processMapping(SmooksDOMFilter.java:759)
	at org.milyn.delivery.dom.SmooksDOMFilter$ElementProcessor.process(SmooksDOMFilter.java:710)
	at org.milyn.delivery.dom.SmooksDOMFilter$ElementProcessor.access$000(SmooksDOMFilter.java:666)
	at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:385)
	at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:317)
	at org.milyn.delivery.dom.SmooksDOMFilter.filter(SmooksDOMFilter.java:292)
	... 13 more
Caused by: [Error: value X]
[Near : {... this.type = (com.redhat.sample ....}]
             ^
[Line: 1, Column: 1]
	at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.compileAccessor(ASMAccessorOptimizer.java:883)
	at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.optimizeAccessor(ASMAccessorOptimizer.java:243)
	at org.mvel2.optimizers.dynamic.DynamicGetAccessor.optimize(DynamicGetAccessor.java:90)
	at org.mvel2.optimizers.dynamic.DynamicGetAccessor.getValue(DynamicGetAccessor.java:64)
	at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
	at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:38)
	at org.mvel2.ast.Substatement.getReducedValueAccelerated(Substatement.java:44)
	at org.mvel2.compiler.ExecutableAccessor.getValue(ExecutableAccessor.java:38)
	at org.mvel2.ast.DeepAssignmentNode.getReducedValueAccelerated(DeepAssignmentNode.java:92)
	at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
	at org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:126)
	at org.mvel2.MVEL.executeExpression(MVEL.java:930)
	at org.milyn.expression.MVELExpressionEvaluator.exec(MVELExpressionEvaluator.java:99)
	... 22 more
Caused by: java.lang.IllegalArgumentException: value X
	at org.mvel2.asm.ClassWriter.newConstItem(ClassWriter.java:906)
	at org.mvel2.asm.MethodWriter.visitLdcInsn(MethodWriter.java:1014)
	at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.getBeanProperty(ASMAccessorOptimizer.java:1229)
	at org.mvel2.optimizers.impl.asm.ASMAccessorOptimizer.compileAccessor(ASMAccessorOptimizer.java:758)
	... 34 more
----------

Comment 1 Tadayoshi Sato 2013-11-29 05:16:41 UTC
Comment on attachment 830475 [details]
reproducer

See README.md in the reproducer first for how to run it.

This reproduer uses Gatling (http://gatling-tool.org/) stress tool and runs 300 requests per second for 1 minute. In my environment, it always reproduces the issue in the first run.

Note that it requires huge thread resources so you may need to tune JBoss ESB server before running the reproducer. In my environment (Fedora 19), I've done the following performance tuning to run it:

- JAVA_OPTS="-Xms2048m -Xmx2048m -Xss256k ..." in bin/run.conf
- Configured HTTP/1.1 Connector's 'maxThreads' to 4096 in $PROFILE/deploy/jbossweb.sar/server.xml
- ulimit -s 1024

Comment 2 JBoss JIRA Server 2013-11-29 08:50:39 UTC
Tadayoshi Sato <tadayosi> made a comment on jira JBESB-3961

Just for information, I've tried upgrading Smooks from 1.4.2 to 1.5.1 ({{deployers/esb.deployer/lib/milyn-smooks-all-1.4.2.jar}} -> {{deployers/esb.deployer/lib/milyn-smooks-all-1.5.1.jar}}), but the same issue still happens.