Mateusz Nowakowski created XERCESJ-1647:
-------------------------------------------
Summary: RegularExpression blocks thread under heavy use
Key: XERCESJ-1647
URL: https://issues.apache.org/jira/browse/XERCESJ-1647
Project: Xerces2-J
Issue Type: Improvement
Components: XML Schema API
Affects Versions: 2.11.0
Reporter: Mateusz Nowakowski
When xml schema contains many references to the same simple type or it is very
heavily used the threads blocks on:
{code}
"http-bio-8089-exec-18" daemon prio=10 tid=0x00002ba3943ce800 nid=0x3a56
waiting for monitor entry [0x00002ba393de4000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.xerces.impl.xpath.regex.RegularExpression.matches(Unknown
Source)
- locked <0x000000073564bd00> (a
org.apache.xerces.impl.xpath.regex.RegularExpression$Context)
at org.apache.xerces.impl.xpath.regex.RegularExpression.matches(Unknown
Source)
at org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl.getActualValue(Unknown
Source)
at org.apache.xerces.impl.dv.xs.XSSimpleTypeDecl.validate(Unknown
Source)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.processOneAttribute(Unknown Source)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.processAttributes(Unknown Source)
at
org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown
Source)
at
org.apache.xerces.jaxp.validation.DOMValidatorHelper.beginNode(Unknown Source)
at
org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at
org.apache.xerces.jaxp.validation.DOMValidatorHelper.validate(Unknown Source)
at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown
Source)
{code}
The easiest way is to stop reusing Context object.
XERCESJ-1377 mention about it, but different approach was chosen:
A third possibility would be to dispense with the approach of re-using Context
objects via an instance variable reference, and always allocate a Context on
the stack. I also note that if this was done, and if the "prepare" method was
not invoked lazily on the first match but was invoked up front as part of
setting the pattern, there would be no need for any kind of synchronization
within the "matches" methods. This could give the optimum for heavy concurrent
use of a common pattern in highly-multithreaded environment, but of course has
trade-offs in other regards.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]