#2041: More robust closing code

This commit is contained in:
md_5 2017-01-16 10:11:17 +11:00
parent c1bdbef9cf
commit 81de9d5a63
4 changed files with 37 additions and 47 deletions

View File

@ -52,17 +52,7 @@ public class ServerConnection implements Server
{
Preconditions.checkArgument( reason.length == 0, "Server cannot have disconnect reason" );
if ( !ch.isClosed() )
{
ch.getHandle().eventLoop().schedule( new Runnable()
{
@Override
public void run()
{
ch.getHandle().close();
}
}, 100, TimeUnit.MILLISECONDS );
}
ch.delayedClose( null );
}
@Override

View File

@ -368,15 +368,7 @@ public final class UserConnection implements ProxiedPlayer
getName(), BaseComponent.toLegacyText( reason )
} );
ch.delayedClose( new Runnable()
{
@Override
public void run()
{
unsafe().sendPacket( new Kick( ComponentSerializer.toString( reason ) ) );
}
} );
ch.delayedClose( new Kick( ComponentSerializer.toString( reason ) ) );
if ( server != null )
{
@ -614,7 +606,7 @@ public final class UserConnection implements ProxiedPlayer
public void setCompressionThreshold(int compressionThreshold)
{
if ( ch.getHandle().isActive() && this.compressionThreshold == -1 && compressionThreshold >= 0 )
if ( !ch.isClosing() && this.compressionThreshold == -1 && compressionThreshold >= 0 )
{
this.compressionThreshold = compressionThreshold;
unsafe.sendPacket( new SetCompression( compressionThreshold ) );

View File

@ -140,8 +140,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection
public void handle(LegacyHandshake legacyHandshake) throws Exception
{
this.legacy = true;
ch.getHandle().writeAndFlush( bungee.getTranslation( "outdated_client" ) );
ch.close();
ch.close( bungee.getTranslation( "outdated_client" ) );
}
@Override
@ -492,7 +491,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection
@Override
public void run()
{
if ( ch.getHandle().isActive() )
if ( !ch.isClosing() )
{
UserConnection userCon = new UserConnection( bungee, ch, getName(), InitialHandler.this );
userCon.setCompressionThreshold( BungeeCord.getInstance().config.getCompressionThreshold() );
@ -537,20 +536,15 @@ public class InitialHandler extends PacketHandler implements PendingConnection
@Override
public void disconnect(final BaseComponent... reason)
{
ch.delayedClose( new Runnable()
{
@Override
public void run()
{
if ( thisState != State.STATUS && thisState != State.PING )
{
unsafe().sendPacket( new Kick( ComponentSerializer.toString( reason ) ) );
ch.delayedClose( new Kick( ComponentSerializer.toString( reason ) ) );
} else
{
ch.close();
}
}
} );
}
@Override
public void disconnect(BaseComponent reason)

View File

@ -2,6 +2,7 @@ package net.md_5.bungee.netty;
import com.google.common.base.Preconditions;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import java.util.concurrent.TimeUnit;
@ -12,6 +13,7 @@ import net.md_5.bungee.protocol.MinecraftDecoder;
import net.md_5.bungee.protocol.MinecraftEncoder;
import net.md_5.bungee.protocol.PacketWrapper;
import net.md_5.bungee.protocol.Protocol;
import net.md_5.bungee.protocol.packet.Kick;
public class ChannelWrapper
{
@ -56,19 +58,37 @@ public class ChannelWrapper
}
public void close()
{
close( null );
}
public void close(Object packet)
{
if ( !closed )
{
closed = closing = true;
if ( packet != null && ch.isActive() )
{
ch.writeAndFlush( packet ).addListeners( ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE, ChannelFutureListener.CLOSE );
ch.eventLoop().schedule( new Runnable()
{
@Override
public void run()
{
ch.close();
}
}, 250, TimeUnit.MILLISECONDS );
} else
{
ch.flush();
ch.close();
}
}
}
public void delayedClose(final Runnable runnable)
public void delayedClose(final Kick kick)
{
Preconditions.checkArgument( runnable != null, "runnable" );
if ( !closing )
{
closing = true;
@ -82,13 +102,7 @@ public class ChannelWrapper
@Override
public void run()
{
try
{
runnable.run();
} finally
{
ChannelWrapper.this.close();
}
close( kick );
}
}, 250, TimeUnit.MILLISECONDS );
}