484718 - Review idle timeout handling.

Introduced Connection.onIdleExpired().
This commit is contained in:
Simone Bordet 2015-12-19 12:01:40 +01:00
parent bcd282a8dd
commit 35c4c24099
4 changed files with 50 additions and 15 deletions

View File

@ -220,6 +220,12 @@ public abstract class AbstractConnection implements Connection
getEndPoint().close();
}
@Override
public boolean onIdleExpired()
{
return true;
}
@Override
public int getMessagesIn()
{

View File

@ -158,6 +158,10 @@ public abstract class AbstractEndPoint extends IdleTimeout implements EndPoint
@Override
protected void onIdleExpired(TimeoutException timeout)
{
Connection connection = _connection;
if (connection != null && !_connection.onIdleExpired())
return;
boolean output_shutdown=isOutputShutdown();
boolean input_shutdown=isInputShutdown();
boolean fillFailed = _fillInterest.onFail(timeout);

View File

@ -73,6 +73,19 @@ public interface Connection extends Closeable
@Override
public void close();
/**
* <p>Callback method invoked upon an idle timeout event.</p>
* <p>Implementations of this method may return true to indicate that the idle timeout
* handling should proceed normally, typically failing the EndPoint and causing it to
* be closed.</p>
* <p>When false is returned, the handling of the idle timeout event is halted
* immediately and the EndPoint left in the state it was before the idle timeout event.</p>
*
* @return true to let the EndPoint handle the idle timeout,
* false to tell the EndPoint to halt the handling of the idle timeout.
*/
public boolean onIdleExpired();
public int getMessagesIn();
public int getMessagesOut();
public long getBytesIn();

View File

@ -171,6 +171,12 @@ public class SslConnection extends AbstractConnection
getDecryptedEndPoint().getConnection().close();
}
@Override
public boolean onIdleExpired()
{
return getDecryptedEndPoint().getConnection().onIdleExpired();
}
@Override
public void onFillable()
{
@ -328,17 +334,29 @@ public class SslConnection extends AbstractConnection
public DecryptedEndPoint()
{
super(null,getEndPoint().getLocalAddress(), getEndPoint().getRemoteAddress());
setIdleTimeout(getEndPoint().getIdleTimeout());
// Disable idle timeout checking: no scheduler and -1 timeout for this instance.
super(null, getEndPoint().getLocalAddress(), getEndPoint().getRemoteAddress());
super.setIdleTimeout(-1);
}
@Override
public long getIdleTimeout()
{
return getEndPoint().getIdleTimeout();
}
@Override
public void setIdleTimeout(long idleTimeout)
{
super.setIdleTimeout(idleTimeout);
getEndPoint().setIdleTimeout(idleTimeout);
}
@Override
public boolean isOpen()
{
return getEndPoint().isOpen();
}
@Override
protected WriteFlusher getWriteFlusher()
{
@ -443,10 +461,10 @@ public class SslConnection extends AbstractConnection
}
}
}
if (fillable)
getExecutor().execute(_runFillable);
else
else
ensureFillInterested();
}
}
@ -710,13 +728,13 @@ public class SslConnection extends AbstractConnection
// will return 0 (even if some handshake bytes were flushed and filled).
// it is the applications responsibility to call flush again - either in a busy loop
// or better yet by using EndPoint#write to do the flushing.
if (DEBUG)
{
for (ByteBuffer b : appOuts)
LOG.debug("{} flush {}", SslConnection.this, BufferUtil.toHexSummary(b));
}
try
{
if (_cannotAcceptMoreAppDataToFlush)
@ -746,7 +764,7 @@ public class SslConnection extends AbstractConnection
}
if (DEBUG)
LOG.debug("{} wrap {}", SslConnection.this, wrapResult.toString().replace('\n',' '));
Status wrapResultStatus = wrapResult.getStatus();
boolean allConsumed=true;
@ -906,7 +924,7 @@ public class SslConnection extends AbstractConnection
if (!SslConnection.this.isFillInterested())
SslConnection.this.fillInterested();
}
@Override
public boolean isOutputShutdown()
{
@ -922,12 +940,6 @@ public class SslConnection extends AbstractConnection
super.close();
}
@Override
public boolean isOpen()
{
return getEndPoint().isOpen();
}
@Override
public Object getTransport()
{