[ 
https://issues.apache.org/jira/browse/WW-4062?focusedWorklogId=929993&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-929993
 ]

ASF GitHub Bot logged work on WW-4062:
--------------------------------------

                Author: ASF GitHub Bot
            Created on: 13/Aug/24 08:36
            Start Date: 13/Aug/24 08:36
    Worklog Time Spent: 10m 
      Work Description: kusalk opened a new pull request, #1021:
URL: https://github.com/apache/struts/pull/1021

   WW-4062
   --
   Follow-up for #1013 - I was looking at the flame graph for this particular 
code flow (this is before the previous PR was merged) and observed that filling 
the stack trace is the largest contributor. Thus, we can gain more performance 
here by not refreshing the stack trace for cached exceptions. Given most of 
these exceptions are caught silently I don't expect the lack of stack trace to 
be an issue. If the stack trace is necessary for debugging purposes, then we 
can temporarily disable caching using `struts.ognl.enableExpressionCache=false`.
   
   
![image](https://github.com/user-attachments/assets/7c08053b-dd5e-4a02-9adc-dbd98e679031)
   




Issue Time Tracking
-------------------

    Worklog Id:     (was: 929993)
    Time Spent: 50m  (was: 40m)

> Invalid OGNL expressions are not cached
> ---------------------------------------
>
>                 Key: WW-4062
>                 URL: https://issues.apache.org/jira/browse/WW-4062
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Value Stack
>    Affects Versions: 2.3.14
>            Reporter: Saulius Tvarijonas
>            Priority: Major
>             Fix For: 6.7.0
>
>         Attachments: WW-4062.PNG
>
>          Time Spent: 50m
>  Remaining Estimate: 0h
>
> I am using velocity to render results page. During performance optimizations 
> I noticed significant memory usage from 
> *com.opensymphony.xwork2.ognl.OgnlUtil#compile*. There is caching implemented 
> in OgnlUtil, but if expression compilation fails, it is not cached.
> I am not really sure if this problem is in struts or velocity engine. But 
> situation is following:
> # In velocity template trying to render string *<p>$!foo</p>*
> # If value is null, velocity calls 
> *org.apache.velocity.runtime.parser.node.ASTReference#getNullString*
> # Internally there is call to *context.get(".literal." + nullString)*
> # And this ".literal." expression always reaches *OgnlUtil#compile* and 
> compilation fails.
> Below is stacktrace for more details:
> {code}
> at com.opensymphony.xwork2.ognl.OgnlUtil.compile(OgnlUtil.java:248)
> at com.opensymphony.xwork2.ognl.OgnlUtil.getValue(OgnlUtil.java:236)
> at 
> com.opensymphony.xwork2.ognl.OgnlValueStack.getValueUsingOgnl(OgnlValueStack.java:291)
> at 
> com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValue(OgnlValueStack.java:274)
> at 
> com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValueWhenExpressionIsNotNull(OgnlValueStack.java:256)
> at 
> com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:236)
> at 
> com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:298)
> at 
> org.apache.struts2.dispatcher.StrutsRequestWrapper.getAttribute(StrutsRequestWrapper.java:82)
> at org.apache.velocity.tools.view.context.ChainedContext.getAttribute(Unknown 
> Source:-1)
> at org.apache.velocity.tools.view.context.ChainedContext.internalGet(Unknown 
> Source:-1)
> at org.apache.velocity.context.AbstractContext.get(AbstractContext.java:193)
> at 
> org.apache.velocity.context.InternalContextAdapterImpl.get(InternalContextAdapterImpl.java:267)
> at 
> org.apache.velocity.runtime.parser.node.ASTReference.getNullString(ASTReference.java:510)
> at 
> org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:465)
> at 
> org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
> at 
> org.apache.velocity.runtime.parser.node.ASTStringLiteral.value(ASTStringLiteral.java:330)
> at 
> org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71)
> at 
> org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142)
> at 
> org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
> at org.apache.velocity.runtime.directive.Parse.render(Parse.java:260)
> at 
> org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
> at 
> org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
> at org.apache.velocity.Template.merge(Template.java:356)
> at org.apache.velocity.Template.merge(Template.java:260)
> at 
> org.apache.struts2.dispatcher.VelocityResult.doExecute(VelocityResult.java:156)
> at 
> org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to