From 4213afcf9df0b297752182131262a3f46d5c4f3c Mon Sep 17 00:00:00 2001 From: Michael Newcomb Date: Fri, 1 Sep 2017 16:50:21 -0400 Subject: [PATCH 1/2] TimeoutTimer: Check for destroyed TheadGroup Running a query that uses a timer can cause an IllegalThreadStateException if the underlying ThreadGroup has been destroyed --- .../com/microsoft/sqlserver/jdbc/IOBuffer.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index e70f04bbf..9fcf57bfe 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -7122,13 +7122,21 @@ final class TimeoutTimer implements Runnable { private volatile Future task; private static final ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() { - private final ThreadGroup tg = new ThreadGroup(threadGroupName); - private final String threadNamePrefix = tg.getName() + "-"; + private final AtomicReference tgr = new AtomicReference<>(); private final AtomicInteger threadNumber = new AtomicInteger(0); @Override - public Thread newThread(Runnable r) { - Thread t = new Thread(tg, r, threadNamePrefix + threadNumber.incrementAndGet()); + public Thread newThread(Runnable r) + { + ThreadGroup tg = tgr.get(); + + if (tg == null || tg.isDestroyed()) + { + tg = new ThreadGroup(threadGroupName); + tgr.set(tg); + } + + Thread t = new Thread(tg, r, tg.getName() + "-" + threadNumber.incrementAndGet()); t.setDaemon(true); return t; } From 9da95c5ac9134ce2717900d36806fdd08d0b84c1 Mon Sep 17 00:00:00 2001 From: Michael Newcomb Date: Fri, 1 Sep 2017 17:04:07 -0400 Subject: [PATCH 2/2] TimeoutTimer: Forgot reference Forgot to add AtomicReference --- src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index 9fcf57bfe..4c0aed0fa 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -64,6 +64,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.logging.Logger;