Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit 1a3c51e

Browse files
Change executor service defaults
- Set the default core and maximum thread pool size to Runtime.getRuntime().availableProcessors() + 1. - Use a fixed thread pool using the larger of core or maximum thread pool, and an unbounded queue to prevent failures submitting work when all threads are in use. - Make HFClient.getExecutorService() public. The default (effectively) unlimited thread pool size with blocking queue could cause so many threads to be created under high event load that system failures could occur. Signed-off-by: Mark S. Lewis <[email protected]>
1 parent 2a77b64 commit 1a3c51e

File tree

2 files changed

+11
-20
lines changed

2 files changed

+11
-20
lines changed

src/main/java/org/hyperledger/fabric/sdk/HFClient.java

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@
2828
import java.util.Set;
2929
import java.util.concurrent.ExecutorService;
3030
import java.util.concurrent.Executors;
31-
import java.util.concurrent.SynchronousQueue;
3231
import java.util.concurrent.ThreadFactory;
33-
import java.util.concurrent.ThreadPoolExecutor;
3432
import java.util.concurrent.TimeUnit;
3533
import java.util.logging.Level;
3634
import java.util.logging.Logger;
@@ -66,18 +64,15 @@ public class HFClient {
6664
}
6765
}
6866

69-
ExecutorService getExecutorService() {
67+
public ExecutorService getExecutorService() {
7068
if (null == executorService) {
7169
synchronized (this) { //was null so lets get a lock for safe update.
7270
if (null == executorService) { // no other thread has done it ...
73-
executorService = new ThreadPoolExecutor(CLIENT_THREAD_EXECUTOR_COREPOOLSIZE, CLIENT_THREAD_EXECUTOR_MAXIMUMPOOLSIZE,
74-
CLIENT_THREAD_EXECUTOR_KEEPALIVETIME, CLIENT_THREAD_EXECUTOR_KEEPALIVETIMEUNIT,
75-
new SynchronousQueue<>(),
76-
r -> {
77-
Thread t = threadFactory.newThread(r);
78-
t.setDaemon(true);
79-
return t;
80-
});
71+
executorService = Executors.newFixedThreadPool(CLIENT_THREAD_EXECUTOR_POOLSIZE, r -> {
72+
Thread t = threadFactory.newThread(r);
73+
t.setDaemon(true);
74+
return t;
75+
});
8176
}
8277
}
8378

@@ -97,10 +92,7 @@ public User getUserContext() {
9792

9893
protected final ThreadFactory threadFactory = Executors.defaultThreadFactory();
9994

100-
private static final int CLIENT_THREAD_EXECUTOR_COREPOOLSIZE = config.getClientThreadExecutorCorePoolSize();
101-
private static final int CLIENT_THREAD_EXECUTOR_MAXIMUMPOOLSIZE = config.getClientThreadExecutorMaxiumPoolSize();
102-
private static final long CLIENT_THREAD_EXECUTOR_KEEPALIVETIME = config.getClientThreadExecutorKeepAliveTime();
103-
private static final TimeUnit CLIENT_THREAD_EXECUTOR_KEEPALIVETIMEUNIT = config.getClientThreadExecutorKeepAliveTimeUnit();
95+
private static final int CLIENT_THREAD_EXECUTOR_POOLSIZE = Math.max(config.getClientThreadExecutorCorePoolSize(), config.getClientThreadExecutorMaxiumPoolSize());
10496

10597
private HFClient() {
10698
}

src/main/java/org/hyperledger/fabric/sdk/helper/Config.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@
2525

2626
import io.opentelemetry.api.OpenTelemetry;
2727
import io.opentelemetry.sdk.OpenTelemetrySdk;
28-
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
2928
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
30-
import io.opentelemetry.sdk.trace.SdkTracerProvider;
3129
import org.apache.commons.logging.Log;
3230
import org.apache.commons.logging.LogFactory;
3331
import org.apache.log4j.Level;
@@ -182,9 +180,10 @@ private Config() {
182180
* Default HFClient thread executor settings.
183181
*/
184182

185-
defaultProperty(CLIENT_THREAD_EXECUTOR_COREPOOLSIZE, "0");
186-
defaultProperty(CLIENT_THREAD_EXECUTOR_MAXIMUMPOOLSIZE, "" + Integer.MAX_VALUE);
187-
defaultProperty(CLIENT_THREAD_EXECUTOR_KEEPALIVETIME, "" + "60");
183+
int availableProcessors = Runtime.getRuntime().availableProcessors();
184+
defaultProperty(CLIENT_THREAD_EXECUTOR_COREPOOLSIZE, Integer.toString(availableProcessors + 1));
185+
defaultProperty(CLIENT_THREAD_EXECUTOR_MAXIMUMPOOLSIZE, Integer.toString(availableProcessors + 1));
186+
defaultProperty(CLIENT_THREAD_EXECUTOR_KEEPALIVETIME, "60");
188187
defaultProperty(CLIENT_THREAD_EXECUTOR_KEEPALIVETIMEUNIT, "SECONDS");
189188

190189
/**

0 commit comments

Comments
 (0)