422723 - Dispatch failed callbacks to avoid blocking selector

This commit is contained in:
Greg Wilkins 2013-11-28 10:04:08 +11:00
parent b6c0fe2cd6
commit 1b30b0f9a8
2 changed files with 53 additions and 10 deletions

View File

@ -538,12 +538,12 @@ public abstract class AbstractConnection implements Connection
@Override
public void run()
{
while(true)
{
State state=_state.get();
if (next(state,state.onFailed()))
break;
}
while(true)
{
State state=_state.get();
if (next(state,state.onFailed()))
break;
}
onFillInterestedFailed(x);
}
});

View File

@ -37,6 +37,7 @@ import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.EofException;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.IteratingCallback;
import org.eclipse.jetty.util.IteratingNestedCallback;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
@ -466,19 +467,20 @@ public class HttpConnection extends AbstractConnection implements Runnable, Http
}
}
private class CommitCallback extends IteratingNestedCallback
private class CommitCallback extends IteratingCallback
{
final ByteBuffer _content;
final boolean _lastContent;
final ResponseInfo _info;
final Callback _callback;
ByteBuffer _header;
CommitCallback(ResponseInfo info, ByteBuffer content, boolean last, Callback callback)
{
super(callback);
_info=info;
_content=content;
_lastContent=last;
_callback=callback;
}
@Override
@ -586,18 +588,39 @@ public class HttpConnection extends AbstractConnection implements Runnable, Http
}
}
}
@Override
protected void completed()
{
_callback.succeeded();
}
@Override
public void failed(final Throwable x)
{
super.failed(x);
getExecutor().execute(new Runnable()
{
@Override
public void run()
{
_callback.failed(x);
}
});
}
}
private class ContentCallback extends IteratingNestedCallback
private class ContentCallback extends IteratingCallback
{
final ByteBuffer _content;
final boolean _lastContent;
final Callback _callback;
ContentCallback(ByteBuffer content, boolean last, Callback callback)
{
super(callback);
_content=content;
_lastContent=last;
_callback=callback;
}
@Override
@ -668,6 +691,26 @@ public class HttpConnection extends AbstractConnection implements Runnable, Http
}
}
}
@Override
protected void completed()
{
_callback.succeeded();
}
@Override
public void failed(final Throwable x)
{
super.failed(x);
getExecutor().execute(new Runnable()
{
@Override
public void run()
{
_callback.failed(x);
}
});
}
}
}