Skip to content

Commit 3cb7951

Browse files
author
oleksiys
committed
[1.8.x] + minor threads cleanup, use ioThreads config value, fix tests
1 parent 7373be5 commit 3cb7951

File tree

6 files changed

+139
-87
lines changed

6 files changed

+139
-87
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@
591591
<compiler.exclude>com/ning/http/client/providers/grizzly/*.java</compiler.exclude>
592592
<test.compiler.exclude>com/ning/http/client/async/grizzly/*.java</test.compiler.exclude>
593593
<javadoc.package.exclude>com.ning.http.client.providers.grizzly</javadoc.package.exclude>
594-
<grizzly.version>2.3.14</grizzly.version>
594+
<grizzly.version>2.3.16</grizzly.version>
595595
<source.property>1.5</source.property>
596596
<target.property>1.5</target.property>
597597
<surefire.version>2.12</surefire.version>

src/main/java/com/ning/http/client/providers/grizzly/GrizzlyAsyncHttpProvider.java

Lines changed: 70 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,57 @@
1313

1414
package com.ning.http.client.providers.grizzly;
1515

16+
import com.ning.http.client.AsyncHandler;
17+
import com.ning.http.client.AsyncHandlerExtensions;
18+
import com.ning.http.client.AsyncHttpClient;
19+
import com.ning.http.client.AsyncHttpClientConfig;
20+
import com.ning.http.client.AsyncHttpProvider;
21+
import com.ning.http.client.AsyncHttpProviderConfig;
22+
import com.ning.http.client.Body;
23+
import com.ning.http.client.BodyGenerator;
24+
import com.ning.http.client.ConnectionsPool;
25+
import com.ning.http.client.FluentCaseInsensitiveStringsMap;
26+
import com.ning.http.client.FluentStringsMap;
27+
import com.ning.http.client.HttpResponseBodyPart;
28+
import com.ning.http.client.HttpResponseHeaders;
29+
import com.ning.http.client.HttpResponseStatus;
30+
import com.ning.http.client.ListenableFuture;
31+
import com.ning.http.client.MaxRedirectException;
32+
import com.ning.http.client.Part;
33+
import com.ning.http.client.PerRequestConfig;
34+
import com.ning.http.client.ProxyServer;
35+
import com.ning.http.client.Realm;
36+
import com.ning.http.client.Request;
37+
import com.ning.http.client.RequestBuilder;
38+
import com.ning.http.client.Response;
39+
import com.ning.http.client.UpgradeHandler;
40+
import com.ning.http.client.cookie.Cookie;
41+
import com.ning.http.client.cookie.CookieDecoder;
42+
import com.ning.http.client.filter.FilterContext;
43+
import com.ning.http.client.filter.ResponseFilter;
44+
import com.ning.http.client.listener.TransferCompletionHandler;
45+
import com.ning.http.client.ntlm.NTLMEngine;
1646
import static com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProviderConfig.Property.BUFFER_WEBSOCKET_FRAGMENTS;
1747
import static com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProviderConfig.Property.MAX_HTTP_PACKET_HEADER_SIZE;
1848
import static com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProviderConfig.Property.TRANSPORT_CUSTOMIZER;
49+
import com.ning.http.client.websocket.WebSocket;
50+
import com.ning.http.client.websocket.WebSocketByteListener;
51+
import com.ning.http.client.websocket.WebSocketCloseCodeReasonListener;
52+
import com.ning.http.client.websocket.WebSocketListener;
53+
import com.ning.http.client.websocket.WebSocketPingListener;
54+
import com.ning.http.client.websocket.WebSocketPongListener;
55+
import com.ning.http.client.websocket.WebSocketTextListener;
56+
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
57+
import com.ning.http.multipart.MultipartBody;
58+
import com.ning.http.multipart.MultipartRequestEntity;
59+
import com.ning.http.util.AsyncHttpProviderUtils;
60+
import com.ning.http.util.AuthenticatorUtils;
61+
import static com.ning.http.util.MiscUtil.isNonEmpty;
62+
import static com.ning.http.util.MiscUtil.isNonEmpty;
1963
import static com.ning.http.util.MiscUtil.isNonEmpty;
2064

65+
import com.ning.http.util.ProxyUtils;
66+
import com.ning.http.util.SslUtils;
2167
import java.io.ByteArrayOutputStream;
2268
import java.io.File;
2369
import java.io.FileInputStream;
@@ -42,10 +88,11 @@
4288
import java.util.concurrent.TimeoutException;
4389
import java.util.concurrent.atomic.AtomicInteger;
4490
import java.util.concurrent.atomic.AtomicLong;
45-
4691
import javax.net.ssl.SSLContext;
47-
4892
import org.glassfish.grizzly.Buffer;
93+
import org.glassfish.grizzly.CloseListener;
94+
import org.glassfish.grizzly.CloseType;
95+
import org.glassfish.grizzly.Closeable;
4996
import org.glassfish.grizzly.CompletionHandler;
5097
import org.glassfish.grizzly.Connection;
5198
import org.glassfish.grizzly.EmptyCompletionHandler;
@@ -80,13 +127,15 @@
80127
import org.glassfish.grizzly.impl.SafeFutureImpl;
81128
import org.glassfish.grizzly.memory.Buffers;
82129
import org.glassfish.grizzly.memory.MemoryManager;
130+
import org.glassfish.grizzly.nio.RoundRobinConnectionDistributor;
83131
import org.glassfish.grizzly.nio.transport.TCPNIOConnectorHandler;
84132
import org.glassfish.grizzly.nio.transport.TCPNIOTransport;
85133
import org.glassfish.grizzly.nio.transport.TCPNIOTransportBuilder;
86134
import org.glassfish.grizzly.ssl.SSLEngineConfigurator;
87135
import org.glassfish.grizzly.ssl.SSLFilter;
88136
import org.glassfish.grizzly.strategies.SameThreadIOStrategy;
89137
import org.glassfish.grizzly.strategies.WorkerThreadIOStrategy;
138+
import org.glassfish.grizzly.threadpool.ThreadPoolConfig;
90139
import org.glassfish.grizzly.utils.BufferOutputStream;
91140
import org.glassfish.grizzly.utils.Charsets;
92141
import org.glassfish.grizzly.utils.DelayedExecutor;
@@ -103,54 +152,6 @@
103152
import org.slf4j.Logger;
104153
import org.slf4j.LoggerFactory;
105154

106-
import com.ning.http.client.AsyncHandler;
107-
import com.ning.http.client.AsyncHandlerExtensions;
108-
import com.ning.http.client.AsyncHttpClient;
109-
import com.ning.http.client.AsyncHttpClientConfig;
110-
import com.ning.http.client.AsyncHttpProvider;
111-
import com.ning.http.client.AsyncHttpProviderConfig;
112-
import com.ning.http.client.Body;
113-
import com.ning.http.client.BodyGenerator;
114-
import com.ning.http.client.ConnectionsPool;
115-
import com.ning.http.client.FluentCaseInsensitiveStringsMap;
116-
import com.ning.http.client.FluentStringsMap;
117-
import com.ning.http.client.HttpResponseBodyPart;
118-
import com.ning.http.client.HttpResponseHeaders;
119-
import com.ning.http.client.HttpResponseStatus;
120-
import com.ning.http.client.ListenableFuture;
121-
import com.ning.http.client.MaxRedirectException;
122-
import com.ning.http.client.Part;
123-
import com.ning.http.client.PerRequestConfig;
124-
import com.ning.http.client.ProxyServer;
125-
import com.ning.http.client.Realm;
126-
import com.ning.http.client.Request;
127-
import com.ning.http.client.RequestBuilder;
128-
import com.ning.http.client.Response;
129-
import com.ning.http.client.UpgradeHandler;
130-
import com.ning.http.client.cookie.Cookie;
131-
import com.ning.http.client.cookie.CookieDecoder;
132-
import com.ning.http.client.filter.FilterContext;
133-
import com.ning.http.client.filter.ResponseFilter;
134-
import com.ning.http.client.listener.TransferCompletionHandler;
135-
import com.ning.http.client.ntlm.NTLMEngine;
136-
import com.ning.http.client.websocket.WebSocket;
137-
import com.ning.http.client.websocket.WebSocketByteListener;
138-
import com.ning.http.client.websocket.WebSocketCloseCodeReasonListener;
139-
import com.ning.http.client.websocket.WebSocketListener;
140-
import com.ning.http.client.websocket.WebSocketPingListener;
141-
import com.ning.http.client.websocket.WebSocketPongListener;
142-
import com.ning.http.client.websocket.WebSocketTextListener;
143-
import com.ning.http.client.websocket.WebSocketUpgradeHandler;
144-
import com.ning.http.multipart.MultipartBody;
145-
import com.ning.http.multipart.MultipartRequestEntity;
146-
import com.ning.http.util.AsyncHttpProviderUtils;
147-
import com.ning.http.util.AuthenticatorUtils;
148-
import com.ning.http.util.ProxyUtils;
149-
import com.ning.http.util.SslUtils;
150-
import org.glassfish.grizzly.CloseListener;
151-
import org.glassfish.grizzly.CloseType;
152-
import org.glassfish.grizzly.Closeable;
153-
154155
/**
155156
* A Grizzly 2.0-based implementation of {@link AsyncHttpProvider}.
156157
*
@@ -420,6 +421,24 @@ public void onTimeout(Connection connection) {
420421
fcb.add(clientFilter);
421422
clientTransport.getAsyncQueueIO().getWriter()
422423
.setMaxPendingBytesPerConnection(AsyncQueueWriter.AUTO_SIZE);
424+
425+
clientTransport.setNIOChannelDistributor(
426+
new RoundRobinConnectionDistributor(clientTransport, false, false));
427+
428+
final int kernelThreadsCount =
429+
clientConfig.getIoThreadMultiplier() *
430+
Runtime.getRuntime().availableProcessors();
431+
432+
clientTransport.setSelectorRunnersCount(kernelThreadsCount);
433+
clientTransport.setKernelThreadPoolConfig(
434+
ThreadPoolConfig.defaultConfig()
435+
.setCorePoolSize(kernelThreadsCount)
436+
.setMaxPoolSize(kernelThreadsCount)
437+
.setPoolName("grizzly-ahc-kernel")
438+
// .setPoolName(discoverTestName("grizzly-ahc-kernel")) // uncomment for tests to track down the leaked threads
439+
);
440+
441+
423442
final TransportCustomizer customizer = (TransportCustomizer)
424443
providerConfig.getProperty(TRANSPORT_CUSTOMIZER);
425444
if (customizer != null) {
@@ -428,7 +447,7 @@ public void onTimeout(Connection connection) {
428447
doDefaultTransportConfig();
429448
}
430449
fcb.add(new WebSocketFilter());
431-
450+
432451
clientTransport.setProcessor(fcb.build());
433452

434453
}

src/main/java/com/ning/http/client/providers/grizzly/GrizzlyConnectionsPool.java

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012 Sonatype, Inc. All rights reserved.
2+
* Copyright (c) 2012-2014 Sonatype, Inc. All rights reserved.
33
*
44
* This program is licensed to you under the Apache License Version 2.0,
55
* and you may not use this file except in compliance with the Apache License Version 2.0.
@@ -13,8 +13,6 @@
1313

1414
package com.ning.http.client.providers.grizzly;
1515

16-
import static com.ning.http.util.DateUtil.millisTime;
17-
1816
import com.ning.http.client.AsyncHttpClientConfig;
1917
import com.ning.http.client.ConnectionsPool;
2018

@@ -40,6 +38,9 @@
4038
import java.util.concurrent.atomic.AtomicBoolean;
4139
import java.util.concurrent.atomic.AtomicInteger;
4240

41+
import static com.ning.http.util.DateUtil.millisTime;
42+
import static com.ning.http.client.providers.grizzly.Utils.*;
43+
4344
/**
4445
* {@link ConnectionsPool} implementation.
4546
*
@@ -269,16 +270,6 @@ public void destroy() {
269270
}
270271

271272

272-
// --------------------------------------------------------- Private Methods
273-
274-
275-
private boolean isSecure(String uri) {
276-
277-
return (uri.startsWith("https") || uri.startsWith("wss"));
278-
279-
}
280-
281-
282273
// ---------------------------------------------------------- Nested Classes
283274

284275

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright (c) 2013-2014 Sonatype, Inc. All rights reserved.
3+
*
4+
* This program is licensed to you under the Apache License Version 2.0,
5+
* and you may not use this file except in compliance with the Apache License Version 2.0.
6+
* You may obtain a copy of the Apache License Version 2.0 at http://www.apache.org/licenses/LICENSE-2.0.
7+
*
8+
* Unless required by applicable law or agreed to in writing,
9+
* software distributed under the Apache License Version 2.0 is distributed on an
10+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
* See the Apache License Version 2.0 for the specific language governing permissions and limitations there under.
12+
*/
13+
14+
package com.ning.http.client.providers.grizzly;
15+
16+
17+
public class Utils {
18+
// ------------------------------------------------------------ Constructors
19+
20+
private Utils() {
21+
}
22+
23+
// ---------------------------------------------------------- Public Methods
24+
25+
public static boolean isSecure(final String uri) {
26+
return (uri.startsWith("https") || uri.startsWith("wss"));
27+
}
28+
29+
static String discoverTestName(final String defaultName) {
30+
final StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
31+
final int strackTraceLen = stackTrace.length;
32+
33+
if (stackTrace[strackTraceLen - 1].getClassName().contains("surefire")) {
34+
for (int i = strackTraceLen - 2; i >= 0; i--) {
35+
if (stackTrace[i].getClassName().contains("com.ning.http.client.async")) {
36+
return "grizzly-kernel-" +
37+
stackTrace[i].getClassName() + "." + stackTrace[i].getMethodName();
38+
}
39+
}
40+
}
41+
42+
return defaultName;
43+
}
44+
}

src/test/java/com/ning/http/client/async/grizzly/GrizzlyFeedableBodyGeneratorTest.java

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013 Sonatype, Inc. All rights reserved.
2+
* Copyright (c) 2013-2014 Sonatype, Inc. All rights reserved.
33
*
44
* This program is licensed to you under the Apache License Version 2.0,
55
* and you may not use this file except in compliance with the Apache License Version 2.0.
@@ -20,20 +20,6 @@
2020
import com.ning.http.client.providers.grizzly.FeedableBodyGenerator;
2121
import com.ning.http.client.providers.grizzly.FeedableBodyGenerator.NonBlockingFeeder;
2222
import com.ning.http.client.providers.grizzly.GrizzlyAsyncHttpProvider;
23-
import org.glassfish.grizzly.Buffer;
24-
import org.glassfish.grizzly.http.server.HttpHandler;
25-
import org.glassfish.grizzly.http.server.HttpServer;
26-
import org.glassfish.grizzly.http.server.NetworkListener;
27-
import org.glassfish.grizzly.http.server.Request;
28-
import org.glassfish.grizzly.http.server.Response;
29-
import org.glassfish.grizzly.memory.Buffers;
30-
import org.glassfish.grizzly.ssl.SSLContextConfigurator;
31-
import org.glassfish.grizzly.ssl.SSLEngineConfigurator;
32-
import org.glassfish.grizzly.utils.Charsets;
33-
import org.testng.annotations.AfterTest;
34-
import org.testng.annotations.BeforeTest;
35-
import org.testng.annotations.Test;
36-
3723
import java.io.File;
3824
import java.io.FileInputStream;
3925
import java.io.FileOutputStream;
@@ -45,12 +31,24 @@
4531
import java.util.concurrent.ExecutorService;
4632
import java.util.concurrent.Executors;
4733
import java.util.concurrent.TimeUnit;
48-
34+
import org.glassfish.grizzly.Buffer;
35+
import org.glassfish.grizzly.http.server.HttpHandler;
36+
import org.glassfish.grizzly.http.server.HttpServer;
37+
import org.glassfish.grizzly.http.server.NetworkListener;
4938
import static org.glassfish.grizzly.http.server.NetworkListener.DEFAULT_NETWORK_HOST;
39+
import org.glassfish.grizzly.http.server.Request;
40+
import org.glassfish.grizzly.http.server.Response;
41+
import org.glassfish.grizzly.memory.Buffers;
5042
import static org.glassfish.grizzly.memory.MemoryManager.DEFAULT_MEMORY_MANAGER;
43+
import org.glassfish.grizzly.ssl.SSLContextConfigurator;
44+
import org.glassfish.grizzly.ssl.SSLEngineConfigurator;
45+
import org.glassfish.grizzly.utils.Charsets;
5146
import static org.testng.Assert.assertNull;
5247
import static org.testng.Assert.fail;
5348
import static org.testng.AssertJUnit.assertEquals;
49+
import org.testng.annotations.AfterMethod;
50+
import org.testng.annotations.BeforeMethod;
51+
import org.testng.annotations.Test;
5452

5553
public class GrizzlyFeedableBodyGeneratorTest {
5654

@@ -68,7 +66,7 @@ public class GrizzlyFeedableBodyGeneratorTest {
6866
// ------------------------------------------------------------------- Setup
6967

7068

71-
@BeforeTest
69+
@BeforeMethod
7270
public void setup() throws Exception {
7371
generateTempFile();
7472
server = new HttpServer();
@@ -92,7 +90,7 @@ public void setup() throws Exception {
9290
// --------------------------------------------------------------- Tear Down
9391

9492

95-
@AfterTest
93+
@AfterMethod
9694
public void tearDown() {
9795
if (!tempFile.delete()) {
9896
tempFile.deleteOnExit();

src/test/java/com/ning/http/client/async/grizzly/GrizzlyNoTransferEncodingTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
import org.glassfish.grizzly.http.server.Request;
2626
import org.glassfish.grizzly.http.server.Response;
2727
import org.testng.Assert;
28-
import org.testng.annotations.AfterTest;
29-
import org.testng.annotations.BeforeTest;
28+
import org.testng.annotations.AfterMethod;
29+
import org.testng.annotations.BeforeMethod;
3030
import org.testng.annotations.Test;
3131

3232
public class GrizzlyNoTransferEncodingTest {
@@ -37,7 +37,7 @@ public class GrizzlyNoTransferEncodingTest {
3737
// ------------------------------------------------------------------- Setup
3838

3939

40-
@BeforeTest
40+
@BeforeMethod
4141
public void setup() throws Exception {
4242
server = new HttpServer();
4343
final NetworkListener listener =
@@ -70,7 +70,7 @@ public void service(final Request request,
7070
// --------------------------------------------------------------- Tear Down
7171

7272

73-
@AfterTest
73+
@AfterMethod
7474
public void tearDown() {
7575
server.shutdownNow();
7676
server = null;

0 commit comments

Comments
 (0)