Hullo;

(Apologies, this is going to be a wide email, thanks to some JVM dumps.. suggest you stretch the window a bit.=)

Background I, version info:
Name : batik Relocations: (not relocatable)
Version     : 1.6                               Vendor: JPackage Project
Release : 3.svn495214.3 Build Date: Mon 15 Jan 2007 07:35:39 PM EET


Background II:
I load and initialize an SVG document, and ultimately render it:

        // public initializeDocument( ctx, svgDoc )
        UserAgent userAgent = new UserAgentAdapter();
        DocumentLoader loader = new DocumentLoader(userAgent);
        BridgeContext ctx = new BridgeContext(userAgent, loader);
        ctx.setDynamicState(BridgeContext.DYNAMIC);
        GVTBuilder builder = new GVTBuilder();
        GraphicsNode rootGN = builder.build(ctx, svgDoc);
        return rootGN
        ...
        
        // Elsewhere:
        // m_template = initializeDocument( ctx, someSVGTextDoc );
        // I do dynamic modifications to the SVG, so I clone the node,
        // do a bunch of stuff, and finally render:
        SVGDocument copy = (SVGDocument)m_template.cloneNode( true );
        GraphicsNode gvtRoot = initializeDocument( copy );
        Element root = copy.getRootElement();
        doABunchOfStuff( root );
        // ...and, finally, our goal:
        gvtRoot.paint( ctx );


All this works fine in my test environment. Now that I recently deployed it on a server with some load, I ran into weird rendering server hang-ups. Looks like when we get enough requests to render an SVG document at the same time, something inside Batik hangs on a block, and never recovers. The documents themselves should be different in each case; the only thing I can imagine is that the builder.build(...) call shares resources somewhere deep underneath.

Below is some JVM state dump that might help with this.
First a bit from a jammed server that may or not may be normal - I haven't been able to capture this in the case where nothing odd occurs:

2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - "SocketListener0-12" prio=10 tid=0x0000002b0a09f000 nid=0x7058 runnable [0x000000004a\
9cf000..0x000000004a9d1e30]
2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - java.lang.Thread.State: RUNNABLE 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.FileOutputStream.writeBytes(Native Method) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.FileOutputStream.write(FileOutputStream.java:260) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - - locked <0x0000002a9f2f5288> (a java.io.BufferedOutputStream) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.PrintStream.write (PrintStream.java:432) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - - locked <0x0000002a9f2f5250> (a java.io.PrintStream) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:202) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:272) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:85) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - - locked <0x0000002a9f2f53d0> (a java.io.OutputStreamWriter) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:168) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.PrintStream.write (PrintStream.java:477) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - - locked <0x0000002a9f2f5250> (a java.io.PrintStream) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.PrintStream.print (PrintStream.java:619) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.PrintStream.println(PrintStream.java:756) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - - locked <0x0000002a9f2f5250> (a java.io.PrintStream) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.getDestination(Unknown Source) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.getDestinationBounds (Unknown Source) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(Unknown Source) 2007-02-23 13:15:43,884 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(Unknown Source)
...


Then an example of one of several blocked threads, waiting on the same outputstream (0x0000002a9f2f5288, as locked above): 2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - "SocketListener0-10" prio=10 tid=0x0000002b0a09ec00 nid=0x7055 waiting for monitor en\
try [0x000000004a8ce000..0x000000004a8d0d30]
2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - java.lang.Thread.State: BLOCKED (on object monitor) 2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at java.io.PrintStream.println(PrintStream.java:756) 2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - - waiting to lock <0x0000002a9f2f5250> (a java.io.PrintStream) 2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.getDestination(Unknown Source) 2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.getDestinationColorModel (Unknown Source) 2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(Unknown Source) 2007-02-23 13:15:43,886 [dig.defaultdig output] DEBUG net.basen.appctl.ProcessRunner - at org.apache.batik.ext.awt.image.GraphicsUtil.drawImage(Unknown Source)
...


There are several of these last waiting in line, so obviously our rendering server will stop processing these requests. Seems to me that for some reason, Batik wants to internally use a certain PrintStream. Now, I can synchronize my calls to all SVG renders, but this doesn't really seem like the optimal solution, and happens to defeat the purpose of our whole rendering server farm concept. =)
So...
Is there something the Batik code might do to avoid this deadlock?
Is this something that might have been fixed in code since January?
Is there any further information anyone would like? Will gladly oblige.
Should I rather send this over to the developer list?

Thanks; would really appreciate your input.
//ebu






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to