From c0278c6ec468fc23e6dab78f39661b2fe0d5f219 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 10 Jun 2026 13:13:33 -0400 Subject: [PATCH 01/11] feat(bigquery-jdbc): support connection-scoped executor isolation and dynamic queue warnings --- .../bigquery/jdbc/BigQueryConnection.java | 27 +++ .../cloud/bigquery/jdbc/BigQueryJdbcMdc.java | 43 ++++- .../bigquery/jdbc/BigQueryJdbcUrlUtility.java | 8 + .../cloud/bigquery/jdbc/DataSource.java | 33 ++++ .../bigquery/jdbc/BigQueryJdbcMdcTest.java | 156 +++++++++++++++++- 5 files changed, 261 insertions(+), 6 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 07c95236c020..4c185295c8ba 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -62,6 +62,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; /** @@ -173,6 +174,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { boolean useQueryCache; String queryDialect; int metadataFetchThreadCount; + int queryExecutionThreadCount; boolean allowLargeResults; String destinationTable; String destinationDataset; @@ -209,6 +211,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { Boolean reqGoogleDriveScope; private final Properties clientInfo = new Properties(); private boolean isReadOnlyTokenUsed = false; + private final ExecutorService metadataExecutor; + private final ExecutorService queryExecutor; BigQueryConnection(String url) throws IOException { this(url, DataSource.fromUrl(url)); @@ -337,6 +341,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.filterTablesOnDefaultDataset = ds.getFilterTablesOnDefaultDataset(); this.requestGoogleDriveScope = ds.getRequestGoogleDriveScope(); this.metadataFetchThreadCount = ds.getMetadataFetchThreadCount(); + this.queryExecutionThreadCount = ds.getQueryExecutionThreadCount(); this.requestReason = ds.getRequestReason(); this.connectionPoolSize = ds.getConnectionPoolSize(); this.listenerPoolSize = ds.getListenerPoolSize(); @@ -344,6 +349,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.headerProvider = createHeaderProvider(); this.bigQuery = getBigQueryConnection(); + this.metadataExecutor = BigQueryJdbcMdc.newFixedThreadPool(this.metadataFetchThreadCount); + this.queryExecutor = BigQueryJdbcMdc.newFixedThreadPool(this.queryExecutionThreadCount); } } @@ -954,6 +961,18 @@ private void closeImpl() throws SQLException { statement.close(); } this.openStatements.clear(); + + if (this.metadataExecutor != null) { + this.metadataExecutor.shutdown(); + this.metadataExecutor.awaitTermination(10, TimeUnit.SECONDS); + this.metadataExecutor.shutdownNow(); + } + + if (this.queryExecutor != null) { + this.queryExecutor.shutdown(); + this.queryExecutor.awaitTermination(10, TimeUnit.SECONDS); + this.queryExecutor.shutdownNow(); + } } catch (ConcurrentModificationException ex) { throw new BigQueryJdbcException("Concurrent modification during close", ex); } catch (InterruptedException e) { @@ -965,6 +984,14 @@ private void closeImpl() throws SQLException { this.isClosed = true; } + ExecutorService getExecutorService() { + return this.queryExecutor; + } + + ExecutorService getMetadataExecutor() { + return this.metadataExecutor; + } + @Override public boolean isClosed() { return this.isClosed; diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java index 1e3287b8b2fc..ba04918cc62b 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java @@ -26,9 +26,13 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; /** Lightweight MDC implementation for the BigQuery JDBC driver using InheritableThreadLocal. */ class BigQueryJdbcMdc { + private static final BigQueryJdbcCustomLogger LOG = + new BigQueryJdbcCustomLogger(BigQueryJdbcMdc.class.getName()); + private static final InheritableThreadLocal currentConnectionId = new InheritableThreadLocal<>(); @@ -82,11 +86,16 @@ public MdcThreadFactory(ThreadFactory delegate) { @Override public Thread newThread(Runnable r) { - return delegate.newThread( - () -> { - clear(); - r.run(); - }); + Thread t = + delegate.newThread( + () -> { + clear(); + r.run(); + }); + if (t != null) { + t.setDaemon(true); + } + return t; } } @@ -102,11 +111,35 @@ public MdcThreadPoolExecutor( super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory); } + private final AtomicBoolean warningLogged = new AtomicBoolean(false); + + private void monitorQueueSaturation(int queueSize) { + int corePoolSize = getCorePoolSize(); + // Warn when queue size is >= corePoolSize * 5, with a minimum of 10 tasks to avoid false + // alerts for tiny pools + int warnThreshold = Math.max(10, corePoolSize * 5); + // Recovery reset threshold is corePoolSize * 2, with a minimum of 4 tasks + int recoveryThreshold = Math.max(4, corePoolSize * 2); + + if (queueSize >= warnThreshold) { + if (warningLogged.compareAndSet(false, true)) { + LOG.warning( + "Thread pool is saturating. Core pool size: %d, Active threads: %d, Queued tasks: %d. Consider increasing the thread count property.", + corePoolSize, getActiveCount(), queueSize); + } + } else if (queueSize <= recoveryThreshold) { + warningLogged.set(false); + } + } + @Override public void execute(Runnable command) { if (command == null) { throw new NullPointerException(); } + + monitorQueueSaturation(getQueue().size()); + if (command instanceof MdcFutureTask) { super.execute(command); } else { diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index 0a19bed7a2c8..5d65be2eea2b 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -142,6 +142,8 @@ protected boolean removeEldestEntry(Map.Entry> eldes Pattern.CASE_INSENSITIVE); static final String METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME = "MetaDataFetchThreadCount"; static final int DEFAULT_METADATA_FETCH_THREAD_COUNT_VALUE = 32; + static final String QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME = "QueryExecutionThreadCount"; + static final int DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE = 4; static final String RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME = "Timeout"; static final long DEFAULT_RETRY_TIMEOUT_IN_SECS_VALUE = 0L; static final String JOB_TIMEOUT_PROPERTY_NAME = "JobTimeout"; @@ -540,6 +542,12 @@ protected boolean removeEldestEntry(Map.Entry> eldes "The number of threads used to call a DatabaseMetaData method.") .setDefaultValue(String.valueOf(DEFAULT_METADATA_FETCH_THREAD_COUNT_VALUE)) .build(), + BigQueryConnectionProperty.newBuilder() + .setName(QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME) + .setDescription( + "The number of threads used for executing queries in background tasks.") + .setDefaultValue(String.valueOf(DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE)) + .build(), BigQueryConnectionProperty.newBuilder() .setName(ENABLE_WRITE_API_PROPERTY_NAME) .setDescription( diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index c97da7bd9ee3..e6677dd16932 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -86,6 +86,7 @@ public class DataSource implements javax.sql.DataSource { private Boolean filterTablesOnDefaultDataset; private Integer requestGoogleDriveScope; private Integer metadataFetchThreadCount; + private Integer queryExecutionThreadCount; private String sslTrustStorePath; private String sslTrustStorePassword; private Map labels; @@ -248,6 +249,9 @@ public class DataSource implements javax.sql.DataSource { .put( BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME, (ds, val) -> ds.setMetadataFetchThreadCount(Integer.parseInt(val))) + .put( + BigQueryJdbcUrlUtility.QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME, + (ds, val) -> ds.setQueryExecutionThreadCount(Integer.parseInt(val))) .put( BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME, DataSource::setSSLTrustStorePath) @@ -565,6 +569,11 @@ Properties createProperties() { BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME, String.valueOf(this.metadataFetchThreadCount)); } + if (this.queryExecutionThreadCount != null) { + connectionProperties.setProperty( + BigQueryJdbcUrlUtility.QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME, + String.valueOf(this.queryExecutionThreadCount)); + } if (this.sslTrustStorePath != null) { connectionProperties.setProperty( BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME, @@ -1084,6 +1093,22 @@ public void setMetadataFetchThreadCount(Integer metadataFetchThreadCount) { this.metadataFetchThreadCount = metadataFetchThreadCount; } + public Integer getQueryExecutionThreadCount() { + return queryExecutionThreadCount != null + ? queryExecutionThreadCount + : BigQueryJdbcUrlUtility.DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE; + } + + public void setQueryExecutionThreadCount(Integer queryExecutionThreadCount) { + if (queryExecutionThreadCount != null) { + validateMin( + queryExecutionThreadCount, + 2, + BigQueryJdbcUrlUtility.QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME); + } + this.queryExecutionThreadCount = queryExecutionThreadCount; + } + public String getSSLTrustStorePath() { return sslTrustStorePath; } @@ -1387,4 +1412,12 @@ private static void validateNonNegative(long val, String propertyName) { "Invalid value for %s. It must be greater than or equal to 0.", propertyName)); } } + + private static void validateMin(long val, long min, String propertyName) { + if (val < min) { + throw new BigQueryJdbcRuntimeException( + String.format( + "Invalid value for %s. It must be greater than or equal to %d.", propertyName, min)); + } + } } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java index 56662c4efc3a..b7b03e79cdf6 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java @@ -26,12 +26,13 @@ import java.util.concurrent.Future; import java.util.concurrent.FutureTask; import java.util.concurrent.RunnableFuture; +import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; -public class BigQueryJdbcMdcTest { +public class BigQueryJdbcMdcTest extends BigQueryJdbcLoggingBaseTest { @AfterEach public void tearDown() { @@ -251,4 +252,157 @@ public void testPoolThreadInheritanceSevered() throws Exception { executor.shutdownNow(); } } + + @Test + public void testConnectionScopedExecutorLifecycle() throws Exception { + String url1 = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "OAuthType=2;ProjectId=Proj1;" + + "OAuthAccessToken=redacted;OAuthClientId=redacted;OAuthClientSecret=redacted;" + + "metadataFetchThreadCount=5;queryExecutionThreadCount=6;"; + String url2 = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "OAuthType=2;ProjectId=Proj2;" + + "OAuthAccessToken=redacted;OAuthClientId=redacted;OAuthClientSecret=redacted;" + + "metadataFetchThreadCount=10;queryExecutionThreadCount=12;"; + + BigQueryConnection conn1 = new BigQueryConnection(url1); + BigQueryConnection conn2 = new BigQueryConnection(url2); + + try { + ExecutorService exec1 = conn1.getExecutorService(); + ExecutorService exec2 = conn2.getExecutorService(); + ExecutorService metadataExec1 = conn1.getMetadataExecutor(); + ExecutorService metadataExec2 = conn2.getMetadataExecutor(); + + assertTrue(exec1 != exec2); + assertTrue(exec1 instanceof ThreadPoolExecutor); + assertTrue(exec2 instanceof ThreadPoolExecutor); + assertTrue(metadataExec1 instanceof ThreadPoolExecutor); + assertTrue(metadataExec2 instanceof ThreadPoolExecutor); + + assertEquals(6, ((ThreadPoolExecutor) exec1).getCorePoolSize()); + assertEquals(12, ((ThreadPoolExecutor) exec2).getCorePoolSize()); + assertEquals(5, ((ThreadPoolExecutor) metadataExec1).getCorePoolSize()); + assertEquals(10, ((ThreadPoolExecutor) metadataExec2).getCorePoolSize()); + + try (BigQueryJdbcMdc.MdcCloseable mdc = + BigQueryJdbcMdc.registerInstance(conn1.getConnectionId())) { + CountDownLatch latch = new CountDownLatch(1); + AtomicReference workerMdc = new AtomicReference<>(); + exec1.execute( + () -> { + workerMdc.set(BigQueryJdbcMdc.getConnectionId()); + latch.countDown(); + }); + assertTrue(latch.await(5, TimeUnit.SECONDS)); + assertEquals(conn1.getConnectionId(), workerMdc.get()); + } + } finally { + conn1.close(); + conn2.close(); + } + + assertTrue(conn1.getExecutorService().isShutdown()); + assertTrue(conn1.getMetadataExecutor().isShutdown()); + assertTrue(conn2.getExecutorService().isShutdown()); + assertTrue(conn2.getMetadataExecutor().isShutdown()); + } + + @Test + public void testThreadPoolSaturatingWarning() throws Exception { + ExecutorService executor = BigQueryJdbcMdc.newFixedThreadPool(1); + try { + CountDownLatch blockLatch = new CountDownLatch(1); + + // 1. Submit a task to occupy the single thread + executor.execute( + () -> { + try { + blockLatch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + // 2. Submit 11 tasks to fill the queue and trigger the warning threshold of 10 (Math.max(10, + // 1 * 5)) + for (int i = 0; i < 11; i++) { + executor.execute(() -> {}); + } + + blockLatch.countDown(); + + // Verify that warning was logged + assertTrue( + assertLogContains("Thread pool is saturating"), + "Warning message about thread pool saturation was not logged"); + } finally { + executor.shutdownNow(); + } + } + + @Test + public void testThreadPoolHysteresisWarning() throws Exception { + ExecutorService executor = BigQueryJdbcMdc.newFixedThreadPool(1); + try { + CountDownLatch blockLatch1 = new CountDownLatch(1); + + // 1. Submit a task to occupy the single thread + executor.execute( + () -> { + try { + blockLatch1.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + // 2. Submit 11 tasks (queue size becomes 10 upon 11th task submission) + for (int i = 0; i < 11; i++) { + executor.execute(() -> {}); + } + + // Verify that warning was logged + assertTrue( + assertLogContains("Thread pool is saturating"), + "Warning message about thread pool saturation was not logged"); + + // Clear the captured logs + capturedLogs.clear(); + + // Release the latch and wait for all tasks to complete, draining the queue to 0 (which is <= + // recovery threshold) + blockLatch1.countDown(); + + // To ensure all tasks have finished, we submit a final task and wait for its completion + CountDownLatch syncLatch = new CountDownLatch(1); + executor.execute(syncLatch::countDown); + assertTrue(syncLatch.await(5, TimeUnit.SECONDS)); + + // Now the queue is empty. Let's block the thread again and submit 11 tasks. + CountDownLatch blockLatch2 = new CountDownLatch(1); + executor.execute( + () -> { + try { + blockLatch2.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + }); + + for (int i = 0; i < 11; i++) { + executor.execute(() -> {}); + } + + // Verify warning was logged a second time because the flag was reset + assertTrue( + assertLogContains("Thread pool is saturating"), + "Warning message about thread pool saturation was not logged after recovery"); + + blockLatch2.countDown(); + } finally { + executor.shutdownNow(); + } + } } From 6765ee775d4bf9f335d05ef00b640abf8fc98bb8 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 10 Jun 2026 13:22:41 -0400 Subject: [PATCH 02/11] fix shutdown --- .../bigquery/jdbc/BigQueryConnection.java | 34 ++++++++++++++++--- .../cloud/bigquery/jdbc/DataSource.java | 5 +++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 4c185295c8ba..676edc7212d7 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -964,14 +964,38 @@ private void closeImpl() throws SQLException { if (this.metadataExecutor != null) { this.metadataExecutor.shutdown(); - this.metadataExecutor.awaitTermination(10, TimeUnit.SECONDS); - this.metadataExecutor.shutdownNow(); } - if (this.queryExecutor != null) { this.queryExecutor.shutdown(); - this.queryExecutor.awaitTermination(10, TimeUnit.SECONDS); - this.queryExecutor.shutdownNow(); + } + + boolean interrupted = false; + + if (this.metadataExecutor != null) { + try { + if (!this.metadataExecutor.awaitTermination(10, TimeUnit.SECONDS)) { + this.metadataExecutor.shutdownNow(); + } + } catch (InterruptedException e) { + this.metadataExecutor.shutdownNow(); + interrupted = true; + } + } + + if (this.queryExecutor != null) { + try { + if (!this.queryExecutor.awaitTermination(10, TimeUnit.SECONDS)) { + this.queryExecutor.shutdownNow(); + } + } catch (InterruptedException e) { + this.queryExecutor.shutdownNow(); + interrupted = true; + } + } + + if (interrupted) { + Thread.currentThread().interrupt(); + throw new InterruptedException("Interrupted awaiting executor termination"); } } catch (ConcurrentModificationException ex) { throw new BigQueryJdbcException("Concurrent modification during close", ex); diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index e6677dd16932..45356ac33c16 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -1413,6 +1413,11 @@ private static void validateNonNegative(long val, String propertyName) { } } + /** + * Validates that a property value is greater than or equal to a minimum threshold. + * For thread pools, a minimum of 2 is enforced to ensure there are enough threads + * to handle concurrent coordination and avoid deadlock or thread starvation. + */ private static void validateMin(long val, long min, String propertyName) { if (val < min) { throw new BigQueryJdbcRuntimeException( From 22defa29a1ed1d5047de69b7b9865b42f22a9963 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 10 Jun 2026 14:43:35 -0400 Subject: [PATCH 03/11] address comments --- .../google/cloud/bigquery/jdbc/BigQueryConnection.java | 8 +++++--- .../com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java | 4 +++- .../java/com/google/cloud/bigquery/jdbc/DataSource.java | 6 +++--- .../google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java | 7 +++++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 676edc7212d7..a993faf7d89f 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -969,27 +969,29 @@ private void closeImpl() throws SQLException { this.queryExecutor.shutdown(); } - boolean interrupted = false; + boolean interrupted = Thread.currentThread().isInterrupted(); if (this.metadataExecutor != null) { try { - if (!this.metadataExecutor.awaitTermination(10, TimeUnit.SECONDS)) { + if (interrupted || !this.metadataExecutor.awaitTermination(10, TimeUnit.SECONDS)) { this.metadataExecutor.shutdownNow(); } } catch (InterruptedException e) { this.metadataExecutor.shutdownNow(); interrupted = true; + Thread.currentThread().interrupt(); } } if (this.queryExecutor != null) { try { - if (!this.queryExecutor.awaitTermination(10, TimeUnit.SECONDS)) { + if (interrupted || !this.queryExecutor.awaitTermination(10, TimeUnit.SECONDS)) { this.queryExecutor.shutdownNow(); } } catch (InterruptedException e) { this.queryExecutor.shutdownNow(); interrupted = true; + Thread.currentThread().interrupt(); } } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java index ba04918cc62b..823f014cfde5 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java @@ -128,7 +128,9 @@ private void monitorQueueSaturation(int queueSize) { corePoolSize, getActiveCount(), queueSize); } } else if (queueSize <= recoveryThreshold) { - warningLogged.set(false); + if (warningLogged.get()) { + warningLogged.set(false); + } } } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index 45356ac33c16..a9619293fe5d 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -1414,9 +1414,9 @@ private static void validateNonNegative(long val, String propertyName) { } /** - * Validates that a property value is greater than or equal to a minimum threshold. - * For thread pools, a minimum of 2 is enforced to ensure there are enough threads - * to handle concurrent coordination and avoid deadlock or thread starvation. + * Validates that a property value is greater than or equal to a minimum threshold. For thread + * pools, a minimum of 2 is enforced to ensure there are enough threads to handle concurrent + * coordination and avoid deadlock or thread starvation. */ private static void validateMin(long val, long min, String propertyName) { if (val < min) { diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java index b7b03e79cdf6..2e5ed8d4cb5e 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java @@ -299,8 +299,11 @@ public void testConnectionScopedExecutorLifecycle() throws Exception { assertEquals(conn1.getConnectionId(), workerMdc.get()); } } finally { - conn1.close(); - conn2.close(); + try { + conn1.close(); + } finally { + conn2.close(); + } } assertTrue(conn1.getExecutorService().isShutdown()); From b0021adb1b3f987f99e9a08aeb1f26dc01944cec Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 10 Jun 2026 16:59:53 -0400 Subject: [PATCH 04/11] update default count --- .../bigquery/jdbc/BigQueryConnection.java | 4 +++ .../bigquery/jdbc/BigQueryJdbcUrlUtility.java | 2 +- .../bigquery/jdbc/BigQueryConnectionTest.java | 30 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index a993faf7d89f..2094f91cb67f 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -706,6 +706,10 @@ int getMetadataFetchThreadCount() { return this.metadataFetchThreadCount; } + int getQueryExecutionThreadCount() { + return this.queryExecutionThreadCount; + } + boolean isEnableWriteAPI() { return enableWriteAPI; } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index 5d65be2eea2b..7a52481a1a3a 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -143,7 +143,7 @@ protected boolean removeEldestEntry(Map.Entry> eldes static final String METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME = "MetaDataFetchThreadCount"; static final int DEFAULT_METADATA_FETCH_THREAD_COUNT_VALUE = 32; static final String QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME = "QueryExecutionThreadCount"; - static final int DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE = 4; + static final int DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE = 32; static final String RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME = "Timeout"; static final long DEFAULT_RETRY_TIMEOUT_IN_SECS_VALUE = 0L; static final String JOB_TIMEOUT_PROPERTY_NAME = "JobTimeout"; diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 94cde20fa400..970e97dfdf86 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -375,6 +375,36 @@ public void testMetaDataFetchThreadCountProperty() throws SQLException, IOExcept } } + @Test + public void testQueryExecutionThreadCountProperty() throws SQLException, IOException { + // Test Case 1: Should use the default value when the property is not specified. + String urlDefault = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "OAuthType=2;ProjectId=MyBigQueryProject;" + + "OAuthAccessToken=redactedToken;OAuthClientId=redactedToken;" + + "OAuthClientSecret=redactedToken;"; + try (BigQueryConnection connectionDefault = new BigQueryConnection(urlDefault)) { + assertEquals( + BigQueryJdbcUrlUtility.DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE, + connectionDefault.getQueryExecutionThreadCount(), + "Should use the default value when the property is not set"); + } + + // Test Case 2: Should use the custom value when a valid integer is provided. + String urlCustom = + "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + + "OAuthType=2;ProjectId=MyBigQueryProject;" + + "OAuthAccessToken=redactedToken;OAuthClientId=redactedToken;" + + "OAuthClientSecret=redactedToken;" + + "QueryExecutionThreadCount=16;"; + try (BigQueryConnection connectionCustom = new BigQueryConnection(urlCustom)) { + assertEquals( + 16, + connectionCustom.getQueryExecutionThreadCount(), + "Should use the custom value when a valid integer is provided"); + } + } + @Test public void testBigQueryReadClientKeepAliveSettings() throws SQLException, IOException { String url = From 513a3eb4b83a29e771dac734db65f9dbe7649363 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Wed, 10 Jun 2026 17:03:29 -0400 Subject: [PATCH 05/11] cached thread pool --- .../bigquery/jdbc/BigQueryConnection.java | 4 ++-- .../cloud/bigquery/jdbc/BigQueryJdbcMdc.java | 22 +++++++++++++++++++ .../bigquery/jdbc/BigQueryJdbcMdcTest.java | 12 ++++++---- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 2094f91cb67f..997ecbd3b25f 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -349,8 +349,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.headerProvider = createHeaderProvider(); this.bigQuery = getBigQueryConnection(); - this.metadataExecutor = BigQueryJdbcMdc.newFixedThreadPool(this.metadataFetchThreadCount); - this.queryExecutor = BigQueryJdbcMdc.newFixedThreadPool(this.queryExecutionThreadCount); + this.metadataExecutor = BigQueryJdbcMdc.newCachedThreadPool(); + this.queryExecutor = BigQueryJdbcMdc.newCachedThreadPool(); } } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java index 823f014cfde5..b3e79973a4e7 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdc.java @@ -77,6 +77,28 @@ static ExecutorService newFixedThreadPool(int nThreads) { return newFixedThreadPool(nThreads, Executors.defaultThreadFactory()); } + /** + * Creates a new cached thread pool ExecutorService that automatically propagates MDC connection + * context from the submitting thread to the executing thread. + */ + static ExecutorService newCachedThreadPool(ThreadFactory threadFactory) { + return new MdcThreadPoolExecutor( + 0, + Integer.MAX_VALUE, + 60L, + TimeUnit.SECONDS, + new java.util.concurrent.SynchronousQueue<>(), + new MdcThreadFactory(threadFactory)); + } + + /** + * Creates a new cached thread pool ExecutorService that automatically propagates MDC connection + * context from the submitting thread to the executing thread. + */ + static ExecutorService newCachedThreadPool() { + return newCachedThreadPool(Executors.defaultThreadFactory()); + } + private static class MdcThreadFactory implements ThreadFactory { private final ThreadFactory delegate; diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java index 2e5ed8d4cb5e..c5d2e0919903 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java @@ -281,10 +281,14 @@ public void testConnectionScopedExecutorLifecycle() throws Exception { assertTrue(metadataExec1 instanceof ThreadPoolExecutor); assertTrue(metadataExec2 instanceof ThreadPoolExecutor); - assertEquals(6, ((ThreadPoolExecutor) exec1).getCorePoolSize()); - assertEquals(12, ((ThreadPoolExecutor) exec2).getCorePoolSize()); - assertEquals(5, ((ThreadPoolExecutor) metadataExec1).getCorePoolSize()); - assertEquals(10, ((ThreadPoolExecutor) metadataExec2).getCorePoolSize()); + assertEquals(0, ((ThreadPoolExecutor) exec1).getCorePoolSize()); + assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) exec1).getMaximumPoolSize()); + assertEquals(0, ((ThreadPoolExecutor) exec2).getCorePoolSize()); + assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) exec2).getMaximumPoolSize()); + assertEquals(0, ((ThreadPoolExecutor) metadataExec1).getCorePoolSize()); + assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) metadataExec1).getMaximumPoolSize()); + assertEquals(0, ((ThreadPoolExecutor) metadataExec2).getCorePoolSize()); + assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) metadataExec2).getMaximumPoolSize()); try (BigQueryJdbcMdc.MdcCloseable mdc = BigQueryJdbcMdc.registerInstance(conn1.getConnectionId())) { From aea274d3f6c14de1949680bf9df2f8e270a4a86c Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 11 Jun 2026 11:40:23 -0400 Subject: [PATCH 06/11] clean up unused connection property --- .../bigquery/jdbc/BigQueryConnection.java | 8 +---- .../bigquery/jdbc/BigQueryJdbcUrlUtility.java | 8 ----- .../cloud/bigquery/jdbc/DataSource.java | 25 ---------------- .../bigquery/jdbc/BigQueryConnectionTest.java | 30 ------------------- .../bigquery/jdbc/BigQueryJdbcMdcTest.java | 4 +-- 5 files changed, 3 insertions(+), 72 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 997ecbd3b25f..7ce19195bc17 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -174,7 +174,6 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { boolean useQueryCache; String queryDialect; int metadataFetchThreadCount; - int queryExecutionThreadCount; boolean allowLargeResults; String destinationTable; String destinationDataset; @@ -341,7 +340,6 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.filterTablesOnDefaultDataset = ds.getFilterTablesOnDefaultDataset(); this.requestGoogleDriveScope = ds.getRequestGoogleDriveScope(); this.metadataFetchThreadCount = ds.getMetadataFetchThreadCount(); - this.queryExecutionThreadCount = ds.getQueryExecutionThreadCount(); this.requestReason = ds.getRequestReason(); this.connectionPoolSize = ds.getConnectionPoolSize(); this.listenerPoolSize = ds.getListenerPoolSize(); @@ -349,7 +347,7 @@ public class BigQueryConnection extends BigQueryNoOpsConnection { this.headerProvider = createHeaderProvider(); this.bigQuery = getBigQueryConnection(); - this.metadataExecutor = BigQueryJdbcMdc.newCachedThreadPool(); + this.metadataExecutor = BigQueryJdbcMdc.newFixedThreadPool(metadataFetchThreadCount); this.queryExecutor = BigQueryJdbcMdc.newCachedThreadPool(); } } @@ -706,10 +704,6 @@ int getMetadataFetchThreadCount() { return this.metadataFetchThreadCount; } - int getQueryExecutionThreadCount() { - return this.queryExecutionThreadCount; - } - boolean isEnableWriteAPI() { return enableWriteAPI; } diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java index 7a52481a1a3a..0a19bed7a2c8 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java @@ -142,8 +142,6 @@ protected boolean removeEldestEntry(Map.Entry> eldes Pattern.CASE_INSENSITIVE); static final String METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME = "MetaDataFetchThreadCount"; static final int DEFAULT_METADATA_FETCH_THREAD_COUNT_VALUE = 32; - static final String QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME = "QueryExecutionThreadCount"; - static final int DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE = 32; static final String RETRY_TIMEOUT_IN_SECS_PROPERTY_NAME = "Timeout"; static final long DEFAULT_RETRY_TIMEOUT_IN_SECS_VALUE = 0L; static final String JOB_TIMEOUT_PROPERTY_NAME = "JobTimeout"; @@ -542,12 +540,6 @@ protected boolean removeEldestEntry(Map.Entry> eldes "The number of threads used to call a DatabaseMetaData method.") .setDefaultValue(String.valueOf(DEFAULT_METADATA_FETCH_THREAD_COUNT_VALUE)) .build(), - BigQueryConnectionProperty.newBuilder() - .setName(QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME) - .setDescription( - "The number of threads used for executing queries in background tasks.") - .setDefaultValue(String.valueOf(DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE)) - .build(), BigQueryConnectionProperty.newBuilder() .setName(ENABLE_WRITE_API_PROPERTY_NAME) .setDescription( diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java index a9619293fe5d..5c377775368f 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java @@ -86,7 +86,6 @@ public class DataSource implements javax.sql.DataSource { private Boolean filterTablesOnDefaultDataset; private Integer requestGoogleDriveScope; private Integer metadataFetchThreadCount; - private Integer queryExecutionThreadCount; private String sslTrustStorePath; private String sslTrustStorePassword; private Map labels; @@ -249,9 +248,6 @@ public class DataSource implements javax.sql.DataSource { .put( BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME, (ds, val) -> ds.setMetadataFetchThreadCount(Integer.parseInt(val))) - .put( - BigQueryJdbcUrlUtility.QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME, - (ds, val) -> ds.setQueryExecutionThreadCount(Integer.parseInt(val))) .put( BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME, DataSource::setSSLTrustStorePath) @@ -569,11 +565,6 @@ Properties createProperties() { BigQueryJdbcUrlUtility.METADATA_FETCH_THREAD_COUNT_PROPERTY_NAME, String.valueOf(this.metadataFetchThreadCount)); } - if (this.queryExecutionThreadCount != null) { - connectionProperties.setProperty( - BigQueryJdbcUrlUtility.QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME, - String.valueOf(this.queryExecutionThreadCount)); - } if (this.sslTrustStorePath != null) { connectionProperties.setProperty( BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROPERTY_NAME, @@ -1093,22 +1084,6 @@ public void setMetadataFetchThreadCount(Integer metadataFetchThreadCount) { this.metadataFetchThreadCount = metadataFetchThreadCount; } - public Integer getQueryExecutionThreadCount() { - return queryExecutionThreadCount != null - ? queryExecutionThreadCount - : BigQueryJdbcUrlUtility.DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE; - } - - public void setQueryExecutionThreadCount(Integer queryExecutionThreadCount) { - if (queryExecutionThreadCount != null) { - validateMin( - queryExecutionThreadCount, - 2, - BigQueryJdbcUrlUtility.QUERY_EXECUTION_THREAD_COUNT_PROPERTY_NAME); - } - this.queryExecutionThreadCount = queryExecutionThreadCount; - } - public String getSSLTrustStorePath() { return sslTrustStorePath; } diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java index 970e97dfdf86..94cde20fa400 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryConnectionTest.java @@ -375,36 +375,6 @@ public void testMetaDataFetchThreadCountProperty() throws SQLException, IOExcept } } - @Test - public void testQueryExecutionThreadCountProperty() throws SQLException, IOException { - // Test Case 1: Should use the default value when the property is not specified. - String urlDefault = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;" - + "OAuthAccessToken=redactedToken;OAuthClientId=redactedToken;" - + "OAuthClientSecret=redactedToken;"; - try (BigQueryConnection connectionDefault = new BigQueryConnection(urlDefault)) { - assertEquals( - BigQueryJdbcUrlUtility.DEFAULT_QUERY_EXECUTION_THREAD_COUNT_VALUE, - connectionDefault.getQueryExecutionThreadCount(), - "Should use the default value when the property is not set"); - } - - // Test Case 2: Should use the custom value when a valid integer is provided. - String urlCustom = - "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" - + "OAuthType=2;ProjectId=MyBigQueryProject;" - + "OAuthAccessToken=redactedToken;OAuthClientId=redactedToken;" - + "OAuthClientSecret=redactedToken;" - + "QueryExecutionThreadCount=16;"; - try (BigQueryConnection connectionCustom = new BigQueryConnection(urlCustom)) { - assertEquals( - 16, - connectionCustom.getQueryExecutionThreadCount(), - "Should use the custom value when a valid integer is provided"); - } - } - @Test public void testBigQueryReadClientKeepAliveSettings() throws SQLException, IOException { String url = diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java index c5d2e0919903..6f3daaca1b94 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java @@ -259,12 +259,12 @@ public void testConnectionScopedExecutorLifecycle() throws Exception { "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "OAuthType=2;ProjectId=Proj1;" + "OAuthAccessToken=redacted;OAuthClientId=redacted;OAuthClientSecret=redacted;" - + "metadataFetchThreadCount=5;queryExecutionThreadCount=6;"; + + "metadataFetchThreadCount=5;"; String url2 = "jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" + "OAuthType=2;ProjectId=Proj2;" + "OAuthAccessToken=redacted;OAuthClientId=redacted;OAuthClientSecret=redacted;" - + "metadataFetchThreadCount=10;queryExecutionThreadCount=12;"; + + "metadataFetchThreadCount=10;"; BigQueryConnection conn1 = new BigQueryConnection(url1); BigQueryConnection conn2 = new BigQueryConnection(url2); From 41e00f366f226765047f5e973f6e05431e49f9d6 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 11 Jun 2026 12:11:02 -0400 Subject: [PATCH 07/11] fix test --- .../bigquery/jdbc/BigQueryJdbcMdcTest.java | 8 ++++---- .../src/test/resources/fake.p12 | Bin 5223 -> 2479 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java index 6f3daaca1b94..5acbe218e474 100644 --- a/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java +++ b/java-bigquery-jdbc/src/test/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcMdcTest.java @@ -285,10 +285,10 @@ public void testConnectionScopedExecutorLifecycle() throws Exception { assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) exec1).getMaximumPoolSize()); assertEquals(0, ((ThreadPoolExecutor) exec2).getCorePoolSize()); assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) exec2).getMaximumPoolSize()); - assertEquals(0, ((ThreadPoolExecutor) metadataExec1).getCorePoolSize()); - assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) metadataExec1).getMaximumPoolSize()); - assertEquals(0, ((ThreadPoolExecutor) metadataExec2).getCorePoolSize()); - assertEquals(Integer.MAX_VALUE, ((ThreadPoolExecutor) metadataExec2).getMaximumPoolSize()); + assertEquals(5, ((ThreadPoolExecutor) metadataExec1).getCorePoolSize()); + assertEquals(5, ((ThreadPoolExecutor) metadataExec1).getMaximumPoolSize()); + assertEquals(10, ((ThreadPoolExecutor) metadataExec2).getCorePoolSize()); + assertEquals(10, ((ThreadPoolExecutor) metadataExec2).getMaximumPoolSize()); try (BigQueryJdbcMdc.MdcCloseable mdc = BigQueryJdbcMdc.registerInstance(conn1.getConnectionId())) { diff --git a/java-bigquery-jdbc/src/test/resources/fake.p12 b/java-bigquery-jdbc/src/test/resources/fake.p12 index d9e064411d4f7a6e831e96a468ebd3ec1c35abc3..b4becf11b59a31e53f1d7cc3cbf8b179344e65e3 100644 GIT binary patch delta 2444 zcmV;733K-6D6bQLFoFrI0s#Xsf(c{>2`Yw2hW8Bt2LYgh2~`Aw2~jYD2~9A91#t!m zDuzgg_YDCD0ic2fVg!N(UNC|MS}=kIRt5_yhDe6@4FL=a0Ro_c1p6?81otp01_~;M zNQUHM*^UgOO3}vB@Rc+CC*CJ~R)FxAQ=D1biA}aJe!03+pYdEYvai+)3)pb>uBi zLt6H)81l4#3Nrw$T@caNki4Nx=t28B1=WyA>i-d!L&M%L7o0T>u7Ug-1q(M zw?}VU&eyn8SIpYT=bbW-Ry*oGf?S)yGQn*UU!=#^f}~PD3RV-(1@K`ap4^?!Ky}nk zGXyD-MO(Tde{4#BYSJh;pHwLQnu21_dk=tsVu$a4?EGEIQC+kc<@_cV0+t)t2q&A! zK@4c@^=&5mtO(L(k7;9m^sUyyo&yN0)-C>~c1An5@ON~eu!iibs*EuAG)hEc#kCn4eeokF%T0k?}0l8Cn#)FD=9 zw2=qN$PS~&OOwsF5_MX!o&8)sr=qH3nlVP?3BxDM%16%sb?f?{{>H{@4$A2i^-FT# zt(*(;NMS?4Am`Yz;azsdGxwMTDcO}jP-5X==o?q zN@aK@h~99A+*ePfxl2}G9wfA#abVm1xZ2x{%0rmb<4_&^eHIRyLR|jERKd5((JUl? z4;FtYdsZitZaGYc9O%=#da$EHupKhSd0>P@9a+qH?}uzto54StMcN0%B(q81gShq- z?co^T8cXLz(#+^h7GhS2htbJDT17E*IdiqpICCZ{Y=JNqShu41NQRS^eKEFa3Ue{; z^iV5N7@PQ9?Cgd<(nK$>g3;VFpAC0^kAtFVVi-#Ey|voRZ8Q888IjO5^f9fJIv2W7 zGyXZn_dbTD?uC6WmBv49f_j#~GFdfFenW)!-@r#R?iQ+xM8Z$K`C3Nhr_H%eX|Yx@ z$;!9)>E^MXnuhJO2|BI*J@j?gbsW)guw{NM1TCE@xjUcm<5O(@%M9vNiHNFy1`UGG zb1S)jcB66bk;qRka%JB=8@DZ0=a)#h8&8x>7POF*`D@<`OP42kt z2scRSPp}~Ay{{sjYxa@%alrd~6_U!>hESPrzJ!y*`P_;wV}Ygh9;NcKYj1nl0|=VU zxZ38rpc*z+%-)Hu-q~q6Kh0r(vd1=E5s!RNk{m%FU)Y$t&B&jd!`J6)U+G;x)er9< zY^@cG`#~r93p#l}4v9}3qWDAXI*=)9uRA1a({=WZDy`1`*5XK_F7dMQ}-|9 zWeg+~Kk2f1VN?*2w%b+?+j*TqOWm?7ihIq(=ShGa0t9m@YBTZfPd)cTgfXeBtQmWU zV#*%czz{SjSY6xm-+FMa+3d%lHK;oRZ>(lqW;&b){htP~v2kIbUyyTEnJC%z=1A zQ1v z9z%IryOyRo-bR{_!zxM2ezFlY)3F@i$D4?)^3`}k$kWyji39d5InO;l{``!`UM$Ve zH9<=_(NcU{BSjDJm}vQmmv6PKmDgC@T4X}FUDN`#ZLt)@$s&WcYyDykyG`s2BxDtPG1IxT?t|B6=R8miuam3g+awrJ=Qj=AX@YfGNEf%H#5y*wvTbuKY^{~&%a*=mO zR|m7+eH^>;*yxnw1vJ60H4+NzMy*nRxMdv?99(|UArv!D#euXugE*r?~w_?`j`A;@fi7?>~w83c?AMJgjNAsE;g`3TZG5Q6j? zh9JFwA@I!qM+omZ2!W^iAS=NTScPD`e`Vo6!T{zYuw))Y37GxAGq4~qW0>gQS9}-` zi0sP`K@uDD_O;gu3Q`I}M!N@f1NA^4ClL^X35E~G`R|HATr2>L9*k>+RK~Ew1Ytly zMAq6F7bW*9y$WXH{!dVamLLRZENZxBb0*D8-}dawC$_zp6#Yg{-aoVxV!MMxM$U%c z4pLlU?MXg!d5k7pOQ7Eiqb<2V?j0(4bR;JcM73Ue0GFwx{Nd%730IkrQkUd|-FW=f z#xQC}chFzOd_Kd@jV()Mx`hm$?x!Fx4s}=yw6ma96$4;!LLPLktmRchOD5<0+PN+v)AhJSpuAMt|a_nxW79ftbY;>eNX zn@)qKf)*-+L30I>@Do*HEXCi3yXwB>N^V2Zo0TgJtVc2^x@Q)CQaJMsqe15Zp|tL^ z`o@;&bY8YPXhEJB*`aRF=#4QQ1uk`>QS1f(TMhJQ!&YkM+^Nr0hlBK50?j(ST2G}_ zMxxZaFPp4(%YW0&+9tjpfXv*giEgUg>$-}~RGCrOVV?-e_a@wCWw~XHM~NsZ|B5$v zT%$L4!}=p@0T#4Y@|fX4Wkx~pm>2d&&w5xVoU_~_zI1(BdYisTe^9j0Ga~9DWifnL zENSZi;gV%|f+>(GHe00or^sIbKj3X*rY&s%7Pss7=fboz-cpS;`V_Whdzd@?S9Gsr z@m-ya$8)%1gg;f4)ASSI8q_)we3t9r*bJNOtF8ln0TX5LJ$LD|yK&cU61|bmHTt!r!;RM5v*G1WyzKIiwxgjl9UUqF*o)Y+1#=hX9)-2im&@`?gzFlt@4e4YB*?<&0OXIYP*08WJE^cg z9K?H1VbG>Jo+yQ}b_J6qd`^tSc|(j0Z9biqFpI=Jaa2D(R{IMq&Sq6@h+SqgDrzsKuw4_U08$nk4!*%z)Td z4X6^sI{NS1%rOrq?ywo}2vAT;A z8EmDbIj3>-fNQ~c{*6mqGB^VR9l##o4R8Y30o(z$09QaDz!LD{!8<)z9~krBkICU= zAQC+%H#;V{h!9K+1{V<%;pZ24Aac(C3)2~X>Abt;2=rZqq@3P;(9pLJw4(nBrUiOh zw87C6*IM^+2~@un2)#7#D(lB!u(RdQ`aVJ25x!#kA7kGn*x(CjMVEninCHOpR8beXs6H?97B zE?hl9UOUdKEo8Z~?fmW=7rU*<G_jw-v9ghAxmqD^&I%7h%1<8wiK-L=?p%-vU)x|_2zCt)z;hr0Q6 z!1-tgsw@!ZrYk?)75|0=+2hqN1wXbH@W#M)xZBxD6$6D%?FLZ#Yf3BIPh~P684g*e ziTVsWyy8?K3~-Q+g%>*+j`tBA758 z6~mY|2`Z^iJYEKwI%;5;e^o*xT!9%&c1nh|LMIOCm`EzJcX?RLKwqHv*2vr`{hoEw z=8fjikgUyxZm^z1k#N0zWDub23A}CguZ~m7+mix0;*voggyq!sixdKjw?+4x@U7hu zWHW}?F$Wy@(4itbV?S@JAucc^$ z#juG-RdjQeT&1TzT5gKo@Ef;e-TqlFhe_N0jz$7GAYp^(?DOjq>w~D7*ZKqEu{Fme zID0ix$8@$tms`w%w>Rw}-*qgfVwwRbj2UNvs%$IrRa&F5joue_2XFiY_yrH$D zfnl=pH*`-~YChQ)VU2P+yxAZ9FhS;Yi@9~C+tP}`6+QZ%oHCiFQ&G4kXc(rl2IRA~ zqUUz(Dm*&yd8YzaUY_kumJ~kRw5gssm-v;}2GY*-Ey5H|?;y;qit}9268;h}|B13L zcSY;xQ;q@|t%X~?6zAz4*?REgiR>M&6`63E)aS}at-@rGl?Zfj6x zEcavAilKnPF%29NoD_Znqy@_JNmG{7(B-Yid#GJy}Y%isnOU1)~ehJUobI_lmVHLj7hJh06v=e>I z^pALr!oGd{0bxFCuA!hx4-HQdaQ2_O|zxaEB0~Uv^QGC18^29yN*!F zxE6_ZQQrwZJ;5WXkkHMX_mZ4x@~uP5zn|& zB>fPvi3!0_q=@FrOWSSXK%J6P-|_iUrmQDk8N++QEG87ISybOZ$D-e7GwSSa*&=g{ zZ@9_>TQ)%X^;_L6iYQfv4?ixx7^(lJ?x3#IbJ;nhpE;fhdd%g}E>Vpy^Udxg;WM}p zt_)-So4jOj3I;NO=YL_^{{hRs53qK5ID!8wp2he@`QZn1mpjjst2swA{5%KeR8NW=c06TFQ4c;1^g$tJ|K!NY>@euz9J$PrOW+@F9LxB zn4aSk_u$XCiv9G9n?*QjLgzwzItSXC$fhchiQ5_l@vmqjAzqTL16<3JWBU-^mG#8D z^5vbvPVOzHox1IsqV7Bq z5hP`(XOq6PUAJ1@f$U=N^@i&jIKEjW@8o`pZ=2t9sN#k7gs7KA>MPP8dPoBr8$3ge z_qV^E>q7igEI1<~&70a;E8pI6f2%?DqMAbo4n=qn5vaoyUlrkcMIM{_OP-XuNk|b( z7P_yoyA=tIvZ9J9;76tfGj9d_xj)G&atN+jWqn(^J|V&Y1~Y5`6rTp@J;Qb$UBca9 z*W)9{ch^i8b|ILvWT&a==lFwi+i?7yAyEFZ{W)X>?Akq(r9}nWKbbPB^IM!96_5+( z?kCtRG>j3?^4~_7`xxp^FY&3({blu@<;FbOu$c})DC@7h#%-`a;>{JBGJ|x8)_Zq-~2*}t(R9oyeiTDrSGox zWYDsHW2%e~ZO7ChYje-o@fzd1*fnl`0GM-&rX0b)2hDq7TkK4T<6ozI(dVFyg z8HEzNr57&OqcXkU7+aCX@Md_ajLsMhSQAVcuy_(kO;fmHU9Xjd_n@A5#Vq@j*LAuHg*8N4Ljn z=HmC%j~SJBJ(cZn#AVGePH`>?1D)kAH-HR%D7Oa=qwlC>_d&%`0QFV4XpKMXbvBQMBkTHnkl;Sb5tH*$r5N8>^F_^fHBb5ncB9~9ED9EOS zwF|v{Ih#n4WW-kz`W_V&X5biDOf5&X>QF<@gn`~*^@u9@OQb6 zo1ttiEJig*mWZfiH`z9Rr6$P5^ulbOkQjAbMbuC6afhy9i+KV^ommlogIb|cq4sO`0dwJ$z-1iT4FGnsr$obg{bYF&XUM;ipC9Z+T-$F14s zv=pys`*!@6@EX8utfEN6oc)S}ui3_Fu$kvBC@6DNzZa;k-${17-XHl^iLgL3L1WiB zvz3|6_}(+E=-_*MQYqzwbhb(?}i*0{vShjbq>0vfBQ-_}~O@WFPG9Rt8?XPJEZe9P!C zQ_LIHF-M|Hn7?0-> zTOWDw*8#;thAF9XUT0c5yCu3VKRh*B0NcXyFkOq|fqIm}RIr%%;$JMR`0>z9*{yr) zD%g#JVVDIju^9T)jfpXwV#)C6xS`9p&-w;MvKq?Wb<2OZt~D7_a#S5j>K%->T5O zdt7ny?YVz5gs9%bTT&<^)-6i(L{>YrbbNd0xMAyF;< zo(AcMD6iymo;{&+@rIIDOp#W!55v36njS6cAsMW+y}wFQVZ;xl^Absdr8JFVaAWyn zD Date: Thu, 11 Jun 2026 12:46:59 -0400 Subject: [PATCH 08/11] refactor close --- .../bigquery/jdbc/BigQueryConnection.java | 81 +++++++++++++------ 1 file changed, 57 insertions(+), 24 deletions(-) diff --git a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java index 7ce19195bc17..586a5c329405 100644 --- a/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java +++ b/java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java @@ -942,24 +942,14 @@ public void close() throws SQLException { } private void closeImpl() throws SQLException { + SQLException exceptionToThrow = null; try { if (this.bigQueryReadClient != null) { this.bigQueryReadClient.shutdown(); - this.bigQueryReadClient.awaitTermination(1, TimeUnit.MINUTES); - this.bigQueryReadClient.close(); } - if (this.bigQueryWriteClient != null) { this.bigQueryWriteClient.shutdown(); - this.bigQueryWriteClient.awaitTermination(1, TimeUnit.MINUTES); - this.bigQueryWriteClient.close(); } - - for (Statement statement : this.openStatements) { - statement.close(); - } - this.openStatements.clear(); - if (this.metadataExecutor != null) { this.metadataExecutor.shutdown(); } @@ -967,29 +957,69 @@ private void closeImpl() throws SQLException { this.queryExecutor.shutdown(); } + for (Statement statement : this.openStatements) { + try { + statement.close(); + } catch (SQLException e) { + if (exceptionToThrow == null) { + exceptionToThrow = e; + } else { + exceptionToThrow.addSuppressed(e); + } + } + } + this.openStatements.clear(); + boolean interrupted = Thread.currentThread().isInterrupted(); - if (this.metadataExecutor != null) { - try { + try { + if (this.bigQueryReadClient != null) { + if (interrupted) { + this.bigQueryReadClient.shutdownNow(); + } else { + this.bigQueryReadClient.awaitTermination(1, TimeUnit.MINUTES); + } + } + if (this.bigQueryWriteClient != null) { + if (interrupted) { + this.bigQueryWriteClient.shutdownNow(); + } else { + this.bigQueryWriteClient.awaitTermination(1, TimeUnit.MINUTES); + } + } + if (this.metadataExecutor != null) { if (interrupted || !this.metadataExecutor.awaitTermination(10, TimeUnit.SECONDS)) { this.metadataExecutor.shutdownNow(); } - } catch (InterruptedException e) { - this.metadataExecutor.shutdownNow(); - interrupted = true; - Thread.currentThread().interrupt(); } - } - - if (this.queryExecutor != null) { - try { + if (this.queryExecutor != null) { if (interrupted || !this.queryExecutor.awaitTermination(10, TimeUnit.SECONDS)) { this.queryExecutor.shutdownNow(); } - } catch (InterruptedException e) { + } + } catch (InterruptedException e) { + interrupted = true; + if (this.bigQueryReadClient != null) { + this.bigQueryReadClient.shutdownNow(); + } + if (this.bigQueryWriteClient != null) { + this.bigQueryWriteClient.shutdownNow(); + } + if (this.metadataExecutor != null) { + this.metadataExecutor.shutdownNow(); + } + if (this.queryExecutor != null) { this.queryExecutor.shutdownNow(); - interrupted = true; - Thread.currentThread().interrupt(); + } + } finally { + try { + if (this.bigQueryReadClient != null) { + this.bigQueryReadClient.close(); + } + } finally { + if (this.bigQueryWriteClient != null) { + this.bigQueryWriteClient.close(); + } } } @@ -1005,6 +1035,9 @@ private void closeImpl() throws SQLException { BigQueryJdbcMdc.clear(); BigQueryJdbcRootLogger.closeConnectionHandler(this.connectionId); } + if (exceptionToThrow != null) { + throw exceptionToThrow; + } this.isClosed = true; } From afad269ac405372a5411d0779a5cc9e957d43817 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 11 Jun 2026 12:49:43 -0400 Subject: [PATCH 09/11] remove fake.p12 --- java-bigquery-jdbc/src/test/resources/fake.p12 | Bin 2479 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 java-bigquery-jdbc/src/test/resources/fake.p12 diff --git a/java-bigquery-jdbc/src/test/resources/fake.p12 b/java-bigquery-jdbc/src/test/resources/fake.p12 deleted file mode 100644 index b4becf11b59a31e53f1d7cc3cbf8b179344e65e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2479 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 From 992d4dd41f033a251d0c51159e418633a7895571 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 11 Jun 2026 13:43:48 -0400 Subject: [PATCH 10/11] add agents to gitignore --- java-bigquery-jdbc/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/java-bigquery-jdbc/.gitignore b/java-bigquery-jdbc/.gitignore index 76cba4530b64..bcad69d78e7c 100644 --- a/java-bigquery-jdbc/.gitignore +++ b/java-bigquery-jdbc/.gitignore @@ -3,6 +3,7 @@ target-it/** **/*logs*/** **/ITBigQueryJDBCLocalTest.java **/BigQueryStatementE2EBenchmark.java +.agents/ tools/**/*.class tools/**/drivers/** From 95ab1dd28ca0c896d8484c72bbeebdddb7b85a27 Mon Sep 17 00:00:00 2001 From: Neenu1995 Date: Thu, 11 Jun 2026 13:48:56 -0400 Subject: [PATCH 11/11] chore: restore fake.p12 --- java-bigquery-jdbc/src/test/resources/fake.p12 | Bin 0 -> 5223 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 java-bigquery-jdbc/src/test/resources/fake.p12 diff --git a/java-bigquery-jdbc/src/test/resources/fake.p12 b/java-bigquery-jdbc/src/test/resources/fake.p12 new file mode 100644 index 0000000000000000000000000000000000000000..d9e064411d4f7a6e831e96a468ebd3ec1c35abc3 GIT binary patch literal 5223 zcmbW5Ra6_?vd2RR0Sdw0T|y}d4#ll#ao6JRQXE1XT0FS5P^4&ar$BM5;98sy2u`sA z1rF!lv(C5f%e`mahds0QfA-AV{>`j`A;@fi7?>~w83c?AMJgjNAsE;g`3TZG5Q6j? zh9JFwA@I!qM+omZ2!W^iAS=NTScPD`e`Vo6!T{zYuw))Y37GxAGq4~qW0>gQS9}-` zi0sP`K@uDD_O;gu3Q`I}M!N@f1NA^4ClL^X35E~G`R|HATr2>L9*k>+RK~Ew1Ytly zMAq6F7bW*9y$WXH{!dVamLLRZENZxBb0*D8-}dawC$_zp6#Yg{-aoVxV!MMxM$U%c z4pLlU?MXg!d5k7pOQ7Eiqb<2V?j0(4bR;JcM73Ue0GFwx{Nd%730IkrQkUd|-FW=f z#xQC}chFzOd_Kd@jV()Mx`hm$?x!Fx4s}=yw6ma96$4;!LLPLktmRchOD5<0+PN+v)AhJSpuAMt|a_nxW79ftbY;>eNX zn@)qKf)*-+L30I>@Do*HEXCi3yXwB>N^V2Zo0TgJtVc2^x@Q)CQaJMsqe15Zp|tL^ z`o@;&bY8YPXhEJB*`aRF=#4QQ1uk`>QS1f(TMhJQ!&YkM+^Nr0hlBK50?j(ST2G}_ zMxxZaFPp4(%YW0&+9tjpfXv*giEgUg>$-}~RGCrOVV?-e_a@wCWw~XHM~NsZ|B5$v zT%$L4!}=p@0T#4Y@|fX4Wkx~pm>2d&&w5xVoU_~_zI1(BdYisTe^9j0Ga~9DWifnL zENSZi;gV%|f+>(GHe00or^sIbKj3X*rY&s%7Pss7=fboz-cpS;`V_Whdzd@?S9Gsr z@m-ya$8)%1gg;f4)ASSI8q_)we3t9r*bJNOtF8ln0TX5LJ$LD|yK&cU61|bmHTt!r!;RM5v*G1WyzKIiwxgjl9UUqF*o)Y+1#=hX9)-2im&@`?gzFlt@4e4YB*?<&0OXIYP*08WJE^cg z9K?H1VbG>Jo+yQ}b_J6qd`^tSc|(j0Z9biqFpI=Jaa2D(R{IMq&Sq6@h+SqgDrzsKuw4_U08$nk4!*%z)Td z4X6^sI{NS1%rOrq?ywo}2vAT;A z8EmDbIj3>-fNQ~c{*6mqGB^VR9l##o4R8Y30o(z$09QaDz!LD{!8<)z9~krBkICU= zAQC+%H#;V{h!9K+1{V<%;pZ24Aac(C3)2~X>Abt;2=rZqq@3P;(9pLJw4(nBrUiOh zw87C6*IM^+2~@un2)#7#D(lB!u(RdQ`aVJ25x!#kA7kGn*x(CjMVEninCHOpR8beXs6H?97B zE?hl9UOUdKEo8Z~?fmW=7rU*<G_jw-v9ghAxmqD^&I%7h%1<8wiK-L=?p%-vU)x|_2zCt)z;hr0Q6 z!1-tgsw@!ZrYk?)75|0=+2hqN1wXbH@W#M)xZBxD6$6D%?FLZ#Yf3BIPh~P684g*e ziTVsWyy8?K3~-Q+g%>*+j`tBA758 z6~mY|2`Z^iJYEKwI%;5;e^o*xT!9%&c1nh|LMIOCm`EzJcX?RLKwqHv*2vr`{hoEw z=8fjikgUyxZm^z1k#N0zWDub23A}CguZ~m7+mix0;*voggyq!sixdKjw?+4x@U7hu zWHW}?F$Wy@(4itbV?S@JAucc^$ z#juG-RdjQeT&1TzT5gKo@Ef;e-TqlFhe_N0jz$7GAYp^(?DOjq>w~D7*ZKqEu{Fme zID0ix$8@$tms`w%w>Rw}-*qgfVwwRbj2UNvs%$IrRa&F5joue_2XFiY_yrH$D zfnl=pH*`-~YChQ)VU2P+yxAZ9FhS;Yi@9~C+tP}`6+QZ%oHCiFQ&G4kXc(rl2IRA~ zqUUz(Dm*&yd8YzaUY_kumJ~kRw5gssm-v;}2GY*-Ey5H|?;y;qit}9268;h}|B13L zcSY;xQ;q@|t%X~?6zAz4*?REgiR>M&6`63E)aS}at-@rGl?Zfj6x zEcavAilKnPF%29NoD_Znqy@_JNmG{7(B-Yid#GJy}Y%isnOU1)~ehJUobI_lmVHLj7hJh06v=e>I z^pALr!oGd{0bxFCuA!hx4-HQdaQ2_O|zxaEB0~Uv^QGC18^29yN*!F zxE6_ZQQrwZJ;5WXkkHMX_mZ4x@~uP5zn|& zB>fPvi3!0_q=@FrOWSSXK%J6P-|_iUrmQDk8N++QEG87ISybOZ$D-e7GwSSa*&=g{ zZ@9_>TQ)%X^;_L6iYQfv4?ixx7^(lJ?x3#IbJ;nhpE;fhdd%g}E>Vpy^Udxg;WM}p zt_)-So4jOj3I;NO=YL_^{{hRs53qK5ID!8wp2he@`QZn1mpjjst2swA{5%KeR8NW=c06TFQ4c;1^g$tJ|K!NY>@euz9J$PrOW+@F9LxB zn4aSk_u$XCiv9G9n?*QjLgzwzItSXC$fhchiQ5_l@vmqjAzqTL16<3JWBU-^mG#8D z^5vbvPVOzHox1IsqV7Bq z5hP`(XOq6PUAJ1@f$U=N^@i&jIKEjW@8o`pZ=2t9sN#k7gs7KA>MPP8dPoBr8$3ge z_qV^E>q7igEI1<~&70a;E8pI6f2%?DqMAbo4n=qn5vaoyUlrkcMIM{_OP-XuNk|b( z7P_yoyA=tIvZ9J9;76tfGj9d_xj)G&atN+jWqn(^J|V&Y1~Y5`6rTp@J;Qb$UBca9 z*W)9{ch^i8b|ILvWT&a==lFwi+i?7yAyEFZ{W)X>?Akq(r9}nWKbbPB^IM!96_5+( z?kCtRG>j3?^4~_7`xxp^FY&3({blu@<;FbOu$c})DC@7h#%-`a;>{JBGJ|x8)_Zq-~2*}t(R9oyeiTDrSGox zWYDsHW2%e~ZO7ChYje-o@fzd1*fnl`0GM-&rX0b)2hDq7TkK4T<6ozI(dVFyg z8HEzNr57&OqcXkU7+aCX@Md_ajLsMhSQAVcuy_(kO;fmHU9Xjd_n@A5#Vq@j*LAuHg*8N4Ljn z=HmC%j~SJBJ(cZn#AVGePH`>?1D)kAH-HR%D7Oa=qwlC>_d&%`0QFV4XpKMXbvBQMBkTHnkl;Sb5tH*$r5N8>^F_^fHBb5ncB9~9ED9EOS zwF|v{Ih#n4WW-kz`W_V&X5biDOf5&X>QF<@gn`~*^@u9@OQb6 zo1ttiEJig*mWZfiH`z9Rr6$P5^ulbOkQjAbMbuC6afhy9i+KV^ommlogIb|cq4sO`0dwJ$z-1iT4FGnsr$obg{bYF&XUM;ipC9Z+T-$F14s zv=pys`*!@6@EX8utfEN6oc)S}ui3_Fu$kvBC@6DNzZa;k-${17-XHl^iLgL3L1WiB zvz3|6_}(+E=-_*MQYqzwbhb(?}i*0{vShjbq>0vfBQ-_}~O@WFPG9Rt8?XPJEZe9P!C zQ_LIHF-M|Hn7?0-> zTOWDw*8#;thAF9XUT0c5yCu3VKRh*B0NcXyFkOq|fqIm}RIr%%;$JMR`0>z9*{yr) zD%g#JVVDIju^9T)jfpXwV#)C6xS`9p&-w;MvKq?Wb<2OZt~D7_a#S5j>K%->T5O zdt7ny?YVz5gs9%bTT&<^)-6i(L{>YrbbNd0xMAyF;< zo(AcMD6iymo;{&+@rIIDOp#W!55v36njS6cAsMW+y}wFQVZ;xl^Absdr8JFVaAWyn zD