From a389056afa93cd64c1d97f23198aadf2a8107def Mon Sep 17 00:00:00 2001 From: Jason Lowe Date: Mon, 26 Jan 2015 16:56:14 +0000 Subject: [PATCH] HADOOP-11499. Check of executorThreadsStarted in ValueQueue#submitRefillTask() evades lock acquisition. Contributed by Ted Yu (cherry picked from commit 7574df1bba33919348d3009f2578d6a81b5818e6) --- hadoop-common-project/hadoop-common/CHANGES.txt | 3 +++ .../org/apache/hadoop/crypto/key/kms/ValueQueue.java | 12 +++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index b38d733ac35..0bfd02a513a 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -408,6 +408,9 @@ Release 2.7.0 - UNRELEASED HADOOP-11482. Use correct UGI when KMSClientProvider is called by a proxy user. Contributed by Arun Suresh. + HADOOP-11499. Check of executorThreadsStarted in + ValueQueue#submitRefillTask() evades lock acquisition (Ted Yu via jlowe) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/ValueQueue.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/ValueQueue.java index 8e67eccf84a..32451d8360d 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/ValueQueue.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/ValueQueue.java @@ -308,11 +308,13 @@ private void submitRefillTask(final String keyName, final Queue keyQueue) throws InterruptedException { if (!executorThreadsStarted) { synchronized (this) { - // To ensure all requests are first queued, make coreThreads = - // maxThreads - // and pre-start all the Core Threads. - executor.prestartAllCoreThreads(); - executorThreadsStarted = true; + if (!executorThreadsStarted) { + // To ensure all requests are first queued, make coreThreads = + // maxThreads + // and pre-start all the Core Threads. + executor.prestartAllCoreThreads(); + executorThreadsStarted = true; + } } } // The submit/execute method of the ThreadPoolExecutor is bypassed and