Go to file
Ivan Bahdanau 5d011b8895 Improve the logic around acquire channel function is improved.
Motivation:
The acquire channel function resulted in calling itself several times in case when channel polled from the pool queue was unhealthy, which resulted FixedChannelPool to be called several times which in it's turn caused FixedChannelPool.acquire() to be called and resulted into acquireChannelCount to be unnecessary increased.
Example use case:
1) Create FixedChannelPool instance with one channel in the pool: new FixedChannelPool(cb, handler, 1)
2) Acquire channel A from the pool
3) close the channel A
4) Return it back to the pool
5) Acquire channel from the same pool again
Expected result:
new channel created and acquired, channel A that has been closed discarded and removed from the pool from being unhealthy
Actual result:
Channel A had been removed from the pool, how ever the new channel had never be acquired, instead the request to acquire had been added to the pending queue in FixedChannelPool and the acquireChannelCount is increased by one. The reason is that at the time when SimpleChannelPool figured out that the channel was unhealthy called FixedChannelPool.acquire to try to acquire new channel, how ever the request was added to the pendingTakQueue because by the time when FixedChannelPool.acquire was called, the acquireChannelCount was already "1" so new channel ould not be created cause of maxChannelsLimit=1.

Modifications:
The suggested approach modifies the SimpleChannelPool in a way so that when channel detected to be unhealthy it calls private method SimpleChannelPool.acquireHealthyFromPoolOrNew() which guarantees that SimpleChannelPool actually either finds a healthy channel in the pool and returns it or causes the promise.cause() in case when new channel was failed to be created.

 Result:
The  ```acquiredChannelCount``` is now calculated correctly as a result of SimpleChannelPool.acquire() of not being recursive on overridable acquire method.
2015-08-12 06:35:56 +02:00
all [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
buffer MemoryRegionCache$Entry objects are not recycled 2015-08-10 21:29:25 +02:00
codec Faster and more memory efficient headers for HTTP, HTTP/2, STOMP and SPYD. Fixes #3600 2015-08-04 17:12:24 -07:00
codec-dns maxBytesPerRead channel configuration 2015-08-05 23:59:54 -07:00
codec-haproxy Add ProtocolDetectionResult and use it in HAProxyMessageDecoder for allow detect HAProxy protocol. 2015-06-23 08:59:07 +02:00
codec-http HttpObjectDecoder half close behavior 2015-08-05 09:04:59 -07:00
codec-http2 Faster and more memory efficient headers for HTTP, HTTP/2, STOMP and SPYD. Fixes #3600 2015-08-04 17:12:24 -07:00
codec-memcache [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
codec-mqtt MqttEncoder build failure 2015-07-30 10:20:01 -07:00
codec-socks [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
codec-stomp Faster and more memory efficient headers for HTTP, HTTP/2, STOMP and SPYD. Fixes #3600 2015-08-04 17:12:24 -07:00
codec-xml [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
common Faster and more memory efficient headers for HTTP, HTTP/2, STOMP and SPYD. Fixes #3600 2015-08-04 17:12:24 -07:00
example Faster and more memory efficient headers for HTTP, HTTP/2, STOMP and SPYD. Fixes #3600 2015-08-04 17:12:24 -07:00
handler [#3968] Disallow pass-through of non ByteBufs in SslHandler 2015-07-22 13:31:33 +02:00
handler-proxy [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
license Let PoolThreadCache work even if allocation and deallocation Thread are different 2015-05-27 14:38:11 +02:00
microbench Faster and more memory efficient headers for HTTP, HTTP/2, STOMP and SPYD. Fixes #3600 2015-08-04 17:12:24 -07:00
resolver [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
resolver-dns DnsResolver.resolve(...) fails when ipaddress is used. 2015-07-18 17:14:05 +02:00
tarball [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
testsuite [#3987] Remove RC4 from default ciphers. 2015-07-22 13:29:43 +02:00
testsuite-osgi [maven-release-plugin] prepare for next development iteration 2015-05-07 14:21:08 -04:00
transport Improve the logic around acquire channel function is improved. 2015-08-12 06:35:56 +02:00
transport-native-epoll maxBytesPerRead channel configuration 2015-08-05 23:59:54 -07:00
transport-rxtx maxBytesPerRead channel configuration 2015-08-05 23:59:54 -07:00
transport-sctp maxBytesPerRead channel configuration 2015-08-05 23:59:54 -07:00
transport-udt maxBytesPerRead channel configuration 2015-08-05 23:59:54 -07:00
.fbprefs Updated Find Bugs configuration 2009-03-04 10:33:09 +00:00
.gitignore Add JVM crash logs to .gitignore 2014-05-18 21:36:54 +09:00
.travis.yml Travis CI branch whitelisting 2013-03-11 09:55:43 +09:00
CONTRIBUTING.md Move the pull request guide to the developer guide 2014-03-12 13:13:58 +09:00
LICENSE.txt Relicensed to Apache License v2 2009-08-28 07:15:49 +00:00
NOTICE.txt Let PoolThreadCache work even if allocation and deallocation Thread are different 2015-05-27 14:38:11 +02:00
pom.xml Correctly handle errors when using OpenSSL 2015-06-21 21:06:42 +02:00
README.md Add a link to the 'native transports' page 2014-07-21 12:54:24 -07:00
run-example.sh Add HTTP/2 Netty tiles example 2015-05-18 14:16:54 -07:00

Netty Project

Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.

How to build

For the detailed information about building and developing Netty, please visit the developer guide. This page only gives very basic information.

You require the following to build Netty:

Note that this is build-time requirement. JDK 5 (for 3.x) or 6 (for 4.0+) is enough to run your Netty-based application.

Branches to look

The 'master' branch is where the development of the latest major version lives on. The development of all other versions takes place in each branch whose name is identical to <majorVersion>.<minorVersion>. For example, the development of 3.9 and 4.0 resides in the branch '3.9' and the branch '4.0' respectively.