[
https://issues.apache.org/jira/browse/AVRO-1001?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13190801#comment-13190801
]
James Baldassari commented on AVRO-1001:
----------------------------------------
Thanks for the patch. I was surprised to see this issue because when the
NettyServer is initialized it actually passes two different thread pools to the
NioServerSocketChannelFactory:
{code}
public NettyServer(Responder responder, InetSocketAddress addr) {
this(responder, addr, new NioServerSocketChannelFactory
(Executors .newCachedThreadPool(), Executors.newCachedThreadPool()));
}
{code}
The first thread pool is for the Netty "boss" threads, and the second is for
the Netty "worker" threads. When I dug into the Netty code I found that Netty
only starts a single pair of boss and worker threads for each Netty channel.
The worker thread sits in a for (;; ) loop selecting on the channel and then
processing each message it receives in order. So you're correct that only one
RPC can be executing concurrently on a per-channel basis. I was also able to
reproduce this issue in a unit test.
Given how Netty works, one work-around is to create a new client for each
concurrent RPC that you want to execute. This is not an ideal long-term
solution, and I think your idea to add a new thread pool in NettyServer is a
good fix. However, the cached thread pool might not be the best implementation
for all use cases. For example, cached thread pools can be problematic in
high-throughput environments because they are unbounded by definition. So
let's allow the ExecutorService to be passed into the NettyServer constructor
if the user wants to specify a different/custom implementation. As the default
implementation, the cached thread pool should be fine, as long as it can be
changed if necessary.
I'll add my unit test to your patch to verify that this change fixes the issue.
> Adding thread pool to NettyServerAvroHandler
> --------------------------------------------
>
> Key: AVRO-1001
> URL: https://issues.apache.org/jira/browse/AVRO-1001
> Project: Avro
> Issue Type: Improvement
> Components: java
> Affects Versions: 1.6.1
> Reporter: Shaun Williams
> Labels: patch
> Attachments: AVRO-1001.patch
>
>
> Request code review.
> The current NettyServer implementation processes each request/response
> sequentially on a single channel. Thus in the case where a second request is
> received from the same client while a request is still being processed, the
> behavior is undefined.
> This patch updates NettyServerAvroHandler.messageReceived() to process each
> request in a separate thread using an ExecutorService.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira