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]);
+ }
+ }
+}