You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2003/10/31 21:03:53 UTC

DO NOT REPLY [Bug 24302] New: - Threading issue using Templates object and user-defined functions causes random Exceptions

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24302>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24302

Threading issue using Templates object and user-defined functions causes random Exceptions

           Summary: Threading issue using Templates object and user-defined
                    functions causes random Exceptions
           Product: XalanJ2
           Version: 2.5
          Platform: PC
               URL: http://www.davidtiller.com/xalan/xalan-j_2_5_2-
                    threadbug-DET.jar
        OS/Version: Windows XP
            Status: NEW
          Severity: Blocker
          Priority: Other
         Component: org.apache.xalan.templates
        AssignedTo: xalan-dev@xml.apache.org
        ReportedBy: David.Tiller@CircuitCity.com


Using a Templates object that involves user-defined functions in a multi-
threaded program generates frequent but random Exceptions. This problem has 
been reproduced under Win XP (Sun JVM 1.4.2_b28) and HP/UX 11.11 (build 
1.4.1.02-030502-13:44).

Full details, stack traces, sample program, sample xml, sample xsl can be found 
in the jar at http://www.davidtiller.com/xalan/xalan-j_2_5_2-threadbug-DET.jar

This problem prevents the efficient use of xalan-j_2.5.x in any EJB unless 
every EJB in the pool creates its own Transformer object from the same XSL. 
That is a very time-consuming and memory-intensive proposition.

The following xsl (copy of ThreadTest.xsl from the above url) exhibits the 
problem:


Dear Xalan developer,

Please find attached a jar file containing a simple Java program and associated 
XML/XSLT
that seem to expose a threading issue in xalan-J version 2.5.2. The 
enclosed .log files
show stack traces from a Windows 2000 platform running Sun's J2SDK-1.4.2_b28 
and from an
HP/UX platform running HP's "build 1.4.1.02-030502-13:44" JVM.

The program does the following:

1) Create a TransformerFactory using TransformerFactory.newInstance();
2) Use #1 to create a static instance of a Templates object using the supplied 
ThreadTest.xsl
3) Spin 'n' threads, each of which creates its own transformer from #2, creates 
a StreamSource
   representing the supplied ThreadTest.xml, and a StreamResult file (with a 
unique filename).
4) Each thread uses its local transformer to transform the source into the 
result 'm' times.
5) The main() routine waits to join() back with all the non-daemon threads.

This problem seems to manifest itself when a user-defined function evaluates a 
statement that
involves xsl variables. The following xsl (ThreadTest.xsl) exhibits the problem 
when used in
a multi-threaded program:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:func="http://exslt.org/functions" 
                version="1.0">

<xsl:output method="xml" indent="yes" standalone="yes"/>

<func:function name="func:eval">
    <xsl:param name="expr" />
    <xsl:choose>
        <xsl:when test="$expr">
            <func:result>1</func:result>       
        </xsl:when>
        <xsl:otherwise>
            <func:result>0</func:result> 
        </xsl:otherwise>
    </xsl:choose>
</func:function>

<xsl:template match="/testxml">
    <foobar>
    <xsl:apply-templates select="foo"/>
    </foobar>
</xsl:template>

<xsl:template match="foo">
    <xsl:variable name="first" select="@first"/>
    <xsl:variable name="second" select="@second"/>
    <match>
    <xsl:value-of select="func:eval($first = $second)"/>
    <xsl:value-of select="func:eval($first != $second)"/>
    <xsl:value-of select="func:eval($first &gt; $second)"/>
    <xsl:value-of select="func:eval($first &lt; $second)"/>
    <xsl:value-of select="func:eval($first &gt;= $second)"/>
    <xsl:value-of select="func:eval($first &lt;= $second)"/>
    </match>
</xsl:template>

</xsl:stylesheet>