ChannelUpstreamHandler.handleUpstream bug - InterestOps changed

grhwood at gmail.com grhwood at gmail.com
Thu Sep 15 14:37:17 EDT 2011


Hi,

messageReceived and channelInterestChanged are for different events, so you cannot expect them to be called in same thread.


On 9/15/2011 8:13 PM, Kr0e wrote:
> Hi,
>
> I think I found a bug:
>
> The Doc of the ChannelUpstreamHandler says:
>
>   * {@link #handleUpstream(ChannelHandlerContext, ChannelEvent)
> handleUpstream}
>   * will be invoked sequentially by the same thread (i.e. an I/O thread) and
>   * therefore a handler does not need to worry about being invoked with a new
>   * upstream event before the previous upstream event is finished.
>
> But I've found that this does not apply:
>
>      @Override
>      public void channelInterestChanged(ChannelHandlerContext ctx,
> 	    ChannelStateEvent e) throws Exception {
>
> 	System.out.println("INTER : " + Thread.currentThread());
>
> 	// Super
> 	super.channelInterestChanged(ctx, e);
>      }
>      @Override
>      public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
> 	    throws Exception {
>
> 	System.out.println("RECV : " + Thread.currentThread());
>      }
>
> RECV : Thread[New I/O server worker #1-1,5,main]
> INTER : Thread[New I/O client worker #1-1,5,main]
> INTER : Thread[main,5,main]
> RECV : Thread[New I/O server worker #1-1,5,main]
> INTER : Thread[New I/O client worker #1-1,5,main]
> INTER : Thread[main,5,main]
> RECV : Thread[New I/O server worker #1-1,5,main]
> INTER : Thread[New I/O client worker #1-1,5,main]
> INTER : Thread[main,5,main]
> RECV : Thread[New I/O server worker #1-1,5,main]
> INTER : Thread[New I/O client worker #1-1,5,main]
>
>
> As you can see the super method handleUpstream is not always called by the
> same thread. This causes a race condition in our software.
>
> In our software the client sends as fast as possible data to the server. If
> the client channel is not writable the client waits until it is writable and
> continues. The server receives the data. The server handles the data in an
> extra thread pool. If the server receives data too fast it calls
> channel.setReadable(false);. But when the server is able to process more
> data and calls channel.setReadable(true); the method
> channelInterestChanged(...) is called concurrently which causes a race
> condition.
>
> Is this intended ?
>
> Regards,
>
> Chris
>
> --
> View this message in context: http://netty-forums-and-mailing-lists.685743.n2.nabble.com/ChannelUpstreamHandler-handleUpstream-bug-InterestOps-changed-tp6796758p6796758.html
> Sent from the Netty User Group mailing list archive at Nabble.com.
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users



More information about the netty-users mailing list