From 9c893b8b38425671c7e567cb56f5855003eb8193 Mon Sep 17 00:00:00 2001 From: Hoan Xuan Le Date: Wed, 25 Jul 2018 14:08:25 +0700 Subject: [PATCH] fix issue #445 : https://github.com/influxdata/influxdb-java/issues/445 --- .../java/org/influxdb/impl/InfluxDBImpl.java | 6 +- src/test/java/org/influxdb/InfluxDBTest.java | 86 +++++++++++++++---- 2 files changed, 75 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/influxdb/impl/InfluxDBImpl.java b/src/main/java/org/influxdb/impl/InfluxDBImpl.java index 8a238d499..912cc0996 100644 --- a/src/main/java/org/influxdb/impl/InfluxDBImpl.java +++ b/src/main/java/org/influxdb/impl/InfluxDBImpl.java @@ -100,9 +100,10 @@ public InfluxDBImpl(final String url, final String username, final String passwo setLogLevel(LOG_LEVEL); this.gzipRequestInterceptor = new GzipRequestInterceptor(); + OkHttpClient.Builder clonedBuilder = client.build().newBuilder(); this.retrofit = new Retrofit.Builder() .baseUrl(url) - .client(client.addInterceptor(loggingInterceptor).addInterceptor(gzipRequestInterceptor).build()) + .client(clonedBuilder.addInterceptor(loggingInterceptor).addInterceptor(gzipRequestInterceptor).build()) .addConverterFactory(MoshiConverterFactory.create()) .build(); this.influxDBService = this.retrofit.create(InfluxDBService.class); @@ -120,9 +121,10 @@ public InfluxDBImpl(final String url, final String username, final String passwo setLogLevel(LOG_LEVEL); this.gzipRequestInterceptor = new GzipRequestInterceptor(); + OkHttpClient.Builder clonedBuilder = client.build().newBuilder(); this.retrofit = new Retrofit.Builder() .baseUrl(url) - .client(client.addInterceptor(loggingInterceptor).addInterceptor(gzipRequestInterceptor).build()) + .client(clonedBuilder.addInterceptor(loggingInterceptor).addInterceptor(gzipRequestInterceptor).build()) .addConverterFactory(MoshiConverterFactory.create()) .build(); this.influxDBService = influxDBService; diff --git a/src/test/java/org/influxdb/InfluxDBTest.java b/src/test/java/org/influxdb/InfluxDBTest.java index c80ea0cd1..2a25218ab 100644 --- a/src/test/java/org/influxdb/InfluxDBTest.java +++ b/src/test/java/org/influxdb/InfluxDBTest.java @@ -1,5 +1,24 @@ package org.influxdb; +import java.io.IOException; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.Callable; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + import org.influxdb.InfluxDB.LogLevel; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.BoundParameterQuery.QueryBuilder; @@ -16,21 +35,7 @@ import org.junit.platform.runner.JUnitPlatform; import org.junit.runner.RunWith; -import java.io.IOException; -import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; +import okhttp3.OkHttpClient; /** * Test the InfluxDB API. @@ -882,4 +887,55 @@ public void testIsBatchEnabledWithConsistency() { }, InfluxDB.ConsistencyLevel.ALL); Assertions.assertTrue(this.influxDB.isBatchEnabled()); } + + /** + * test for issue #445 + * make sure reusing of OkHttpClient.Builder causes no error + * @throws InterruptedException + */ + @Test + public void testIssue445() throws InterruptedException { + ExecutorService executor = Executors.newFixedThreadPool(100); + + final int maxCallables = 10_000; + List> callableList = new ArrayList<>(maxCallables); + for (int i = 0; i < maxCallables; i++) { + callableList.add(new Callable() { + @Override + public String call() throws Exception { + MyInfluxDBBean myBean = new MyInfluxDBBean(); + return myBean.connectAndDoNothing1(); + } + }); + } + System.out.println("Invoking all callableList (size()=" + callableList.size() + ")"); + executor.invokeAll(callableList); + System.out.println("Shutting down..."); + executor.shutdown(); + System.out.println("Shutdown requested and waiting for termination..."); + if (!executor.awaitTermination(20, TimeUnit.SECONDS)) { + executor.shutdownNow(); + } + + //assert that MyInfluxDBBean.OKHTTP_BUILDER stay untouched (no interceptor added) + Assertions.assertTrue(MyInfluxDBBean.OKHTTP_BUILDER.interceptors().isEmpty()); + } + + private static final class MyInfluxDBBean { + + static final OkHttpClient.Builder OKHTTP_BUILDER = new OkHttpClient.Builder(); + + InfluxDB influxClient; + + String connectAndDoNothing1() { + try { + influxClient = InfluxDBFactory.connect("http://127.0.0.1:8086", "admin", "supersecretpassword", OKHTTP_BUILDER); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); // OPS! + } + return null; + } + + } }