You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by gt...@apache.org on 2018/08/20 11:24:12 UTC

activemq git commit: AMQ-5917 - fix sync on SslContext lazy initialisation

Repository: activemq
Updated Branches:
  refs/heads/master 50d27e7e5 -> 8bb3a7727


AMQ-5917 - fix sync on SslContext lazy initialisation


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/8bb3a772
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/8bb3a772
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/8bb3a772

Branch: refs/heads/master
Commit: 8bb3a77270775e69c1053ed789c5a1999cae2f51
Parents: 50d27e7
Author: gtully <ga...@gmail.com>
Authored: Mon Aug 20 12:23:53 2018 +0100
Committer: gtully <ga...@gmail.com>
Committed: Mon Aug 20 12:23:53 2018 +0100

----------------------------------------------------------------------
 .../org/apache/activemq/broker/SslContext.java  | 21 ++++--
 .../broker/scheduler/SslContextTest.java        | 69 ++++++++++++++++++++
 2 files changed, 83 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/8bb3a772/activemq-client/src/main/java/org/apache/activemq/broker/SslContext.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/broker/SslContext.java b/activemq-client/src/main/java/org/apache/activemq/broker/SslContext.java
index c3843ae..61e534a 100644
--- a/activemq-client/src/main/java/org/apache/activemq/broker/SslContext.java
+++ b/activemq-client/src/main/java/org/apache/activemq/broker/SslContext.java
@@ -38,6 +38,7 @@ public class SslContext {
     protected List<KeyManager> keyManagers = new ArrayList<KeyManager>();
     protected List<TrustManager> trustManagers = new ArrayList<TrustManager>();
     protected SecureRandom secureRandom;
+    private volatile boolean initialized;
     private SSLContext sslContext;
     
     private static final ThreadLocal<SslContext> current = new ThreadLocal<SslContext>();
@@ -117,18 +118,24 @@ public class SslContext {
     }
 
     public SSLContext getSSLContext() throws NoSuchProviderException, NoSuchAlgorithmException, KeyManagementException {
-        if( sslContext == null ) {
-            if( provider == null ) {
-                sslContext = SSLContext.getInstance(protocol);
-            } else {
-                sslContext = SSLContext.getInstance(protocol, provider);
+        if (!initialized) {
+            synchronized (this) {
+                if (!initialized) {
+                    if (provider == null) {
+                        sslContext = SSLContext.getInstance(protocol);
+                    } else {
+                        sslContext = SSLContext.getInstance(protocol, provider);
+                    }
+                    sslContext.init(getKeyManagersAsArray(), getTrustManagersAsArray(), getSecureRandom());
+                    initialized = true;
+                }
             }
-            sslContext.init(getKeyManagersAsArray(), getTrustManagersAsArray(), getSecureRandom());
         }
         return sslContext;
     }
-    public void setSSLContext(SSLContext sslContext) {
+    public synchronized void setSSLContext(SSLContext sslContext) {
         this.sslContext = sslContext;
+        initialized = true;
     }
     
     

http://git-wip-us.apache.org/repos/asf/activemq/blob/8bb3a772/activemq-client/src/test/java/org/apache/activemq/broker/scheduler/SslContextTest.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/test/java/org/apache/activemq/broker/scheduler/SslContextTest.java b/activemq-client/src/test/java/org/apache/activemq/broker/scheduler/SslContextTest.java
new file mode 100644
index 0000000..f0405b0
--- /dev/null
+++ b/activemq-client/src/test/java/org/apache/activemq/broker/scheduler/SslContextTest.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.broker.scheduler;
+
+import org.apache.activemq.broker.SslContext;
+import org.junit.Test;
+
+import javax.net.ssl.SSLContext;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class SslContextTest {
+    SslContext underTest = new SslContext();
+
+    @Test
+    public void testConcurrentGet() throws Exception {
+
+        final int numReps = 100;
+        ExecutorService executorService = Executors.newFixedThreadPool(numReps);
+        final SSLContext[] results = new SSLContext[numReps];
+
+        for (int i=0; i<numReps; i++) {
+            final int instanceIndex = i;
+            executorService.execute(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        results[instanceIndex] = underTest.getSSLContext();
+                    } catch (NoSuchProviderException e) {
+                        e.printStackTrace();
+                    } catch (NoSuchAlgorithmException e) {
+                        e.printStackTrace();
+                    } catch (KeyManagementException e) {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+
+        executorService.shutdown();
+        assertTrue(executorService.awaitTermination(10, TimeUnit.SECONDS));
+
+        for (int i=0; i<numReps; i++) {
+            assertEquals("single instance", results[0], results[i]);
+        }
+    }
+}