Hi all, me again :-)

I have debugged this issue further and have probably found a simple fix. 
I've migrated from 2.0.x to 2.1.x in the mean time and both version are 
affected by this issue.

The "Unable to establish loopback connection" problem surfaces when 
using resources that return WritableRepresentation objects. In the stack 
trace below, ChannelRepresentation.write(OutputStream) converts the 
writable channel to a readable one through 
WritableRepresentation.getChannel() and 
NioUtils.getReadableByteChannel(...). This last method uses a 
java.nio.channels.Pipe as a buffer between the writer and reader. 
Because this pipe isn't closed/released in time, the system will run out 
of available ports under high load, resulting in the shown stack trace.

Making sure that the reader-side of the pipe is always closed could help 
to resolve this issue, but there's a more elegant solution that doesn't 
use ports. This solution is to override write(OutputStream) in 
WritableRepresentation, wrap the OutputStream in a WritableByteChannel 
using e.g. java.nio.channels.Channels.newChannel(...) and pass that to 
WritableRepresentation.write(WritableByteChannel). Gut feeling is that 
this might even improve the performance as it feels like a lighter 
weight approach than using the system's pipes.

WDYT? Can we get this fix?

Cheers,

Arjohn



On 20/04/2012 10:01, Arjohn Kampman wrote:
> Hi all,
>
> My restlet server is running into the error mentioned in the subject
> after a couple of minutes of moderate load. After this error, the server
> stops responding. Does anyone know what causes this error and how it can
> be fixed?
>
> The full stack trace looks like this:
>
> org.restlet.engine.http.adapter.ServerAdapter commit
> SEVERE: An exception occured writing the response entity
> java.io.IOException: Unable to establish loopback connection
>       at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:106)
>       at java.security.AccessController.doPrivileged(Native Method)
>       at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:122)
>       at 
> sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:27)
>       at java.nio.channels.Pipe.open(Pipe.java:133)
>       at org.restlet.engine.io.NioUtils.getChannel(NioUtils.java:160)
>       at
> org.restlet.representation.WritableRepresentation.getChannel(WritableRepresentation.java:65)
>       at
> org.restlet.representation.ChannelRepresentation.write(ChannelRepresentation.java:71)
>       at
> org.restlet.engine.application.EncodeRepresentation.write(EncodeRepresentation.java:304)
>       at
> org.restlet.engine.http.ServerCall.writeResponseBody(ServerCall.java:550)
>       at org.restlet.engine.http.ServerCall.sendResponse(ServerCall.java:488)
>       at
> org.restlet.ext.jetty.internal.JettyCall.sendResponse(JettyCall.java:327)
>       at
> org.restlet.engine.http.adapter.ServerAdapter.commit(ServerAdapter.java:197)
>       at
> org.restlet.engine.http.HttpServerHelper.handle(HttpServerHelper.java:151)
>       at
> org.restlet.ext.jetty.JettyServerHelper$WrappedServer.handle(JettyServerHelper.java:167)
>       at
> org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:594)
>       at
> org.eclipse.jetty.server.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:1042)
>       at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:549)
>       at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:211)
>       at 
> org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:424)
>       at
> org.eclipse.jetty.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:506)
>       at
> org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:436)
>       at java.lang.Thread.run(Thread.java:662)
> Caused by: java.net.SocketException: No buffer space available (maximum
> connections reached?): connect
>       at sun.nio.ch.Net.connect(Native Method)
>       at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:500)
>       at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
>       at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:78)
>
>
> Any help would be highly appreciated. Thanks in advance!
>

-- 
Arjohn Kampman - www.aduna-software.com

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2952569

Reply via email to