DatagramPacketEncoder is not @Sharable when using EpollChannelOption.SO_REUSEPORT

189 views
Skip to first unread message

Joseph Madden

unread,
Feb 21, 2017, 12:52:45 PM2/21/17
to Netty discussions
Hi,

When binding an Epoll Datagram Bootstrap, if EpollChannelOption.SO_REUSEPORT is enabled and the epoll eventLoopGroup thread count is set to > 1,  the following warning and exception is observed in my application log.

2017-02-21 17:34:19.367  WARN 31685 --- [ntLoopGroup-2-2] io.netty.channel.ChannelInitializer      : Failed to initialize a channel. Closing: [id: 0xfc5ace34]

io.netty.channel.ChannelPipelineException: io.netty.handler.codec.DatagramPacketEncoder is not a @Sharable handler, so can't be added or removed multiple times.
 at io.netty.channel.DefaultChannelPipeline.checkMultiplicity(DefaultChannelPipeline.java:587) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:199) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:392) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline.addLast(DefaultChannelPipeline.java:379) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at MyChannelInitializer.initChannel()
 at io.netty.channel.ChannelInitializer.initChannel(ChannelInitializer.java:113) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.ChannelInitializer.handlerAdded(ChannelInitializer.java:105) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:597) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline.access$000(DefaultChannelPipeline.java:44) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask.execute(DefaultChannelPipeline.java:1387) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline.callHandlerAddedForAllHandlers(DefaultChannelPipeline.java:1122) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.DefaultChannelPipeline.invokeHandlerAddedIfNeeded(DefaultChannelPipeline.java:647) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:506) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:419) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:478) [netty-all-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) [netty-common-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:403) [netty-common-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:304) [netty-transport-native-epoll-4.1.8.Final-linux-x86_64.jar!/:4.1.8.Final]
 at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) [netty-common-4.1.8.Final.jar!/:4.1.8.Final]
 at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) [netty-common-4.1.8.Final.jar!/:4.1.8.Final]
 at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]

I have a single ChannelInitializer (MyChannelInitializer).  The initChannel method is invoked by each thread in the EventLoopGroup.  It succeeds for thread eventLoopGroup-2-1 but appears to fail for eventLoopGroup-2-2.

java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

Netty : 4.1.8.Final

Is this expected behaviour?

Regards,

Joe




Norman Maurer

unread,
Feb 22, 2017, 2:29:02 AM2/22/17
to ne...@googlegroups.com
If the wrapped MessageToMessageEncoder is sharable it should work. Let me fix this. In the meantime you can just create a new instance every time. 

--
You received this message because you are subscribed to the Google Groups "Netty discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email to netty+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/netty/c76e9e07-862b-44b5-ae4e-4c2c70cd9864%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Norman Maurer

unread,
Feb 22, 2017, 2:47:14 AM2/22/17
to ne...@googlegroups.com

Joseph Madden

unread,
Feb 22, 2017, 4:35:07 AM2/22/17
to Netty discussions
Thanks Norman.
Reply all
Reply to author
Forward
0 new messages