From a9ce90f97a9efb3b0444cec0bb24823a17729c5a Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Wed, 4 Sep 2019 18:32:06 +0200 Subject: [PATCH] ARTEMIS-2471 JdbcNodeManager doesn't use jdbc-user and jdbc-password tags --- .../server/impl/jdbc/JdbcNodeManager.java | 6 + .../impl/jdbc/JdbcSharedStateManager.java | 24 ++++ .../server/impl/jdbc/JdbcNodeManagerTest.java | 121 ++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManagerTest.java diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java index b98fd857bb..6fd4b86efb 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManager.java @@ -88,6 +88,8 @@ public final class JdbcNodeManager extends NodeManager { configuration.getJdbcLockRenewPeriodMillis(), configuration.getJdbcLockAcquisitionTimeoutMillis(), configuration.getJdbcConnectionUrl(), + configuration.getJdbcUser(), + configuration.getJdbcPassword(), configuration.getJdbcDriverClassName(), sqlProvider, scheduledExecutorService, @@ -126,6 +128,8 @@ public final class JdbcNodeManager extends NodeManager { long lockRenewPeriodMillis, long lockAcquisitionTimeoutMillis, String jdbcUrl, + String user, + String password, String driverClass, SQLProvider provider, ScheduledExecutorService scheduledExecutorService, @@ -137,6 +141,8 @@ public final class JdbcNodeManager extends NodeManager { executorFactory == null ? null : executorFactory.getExecutor(), lockExpirationMillis, jdbcUrl, + user, + password, driverClass, provider), lockRenewPeriodMillis, diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcSharedStateManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcSharedStateManager.java index 9357435bbc..8ad6f1e2c5 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcSharedStateManager.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcSharedStateManager.java @@ -76,6 +76,26 @@ final class JdbcSharedStateManager extends AbstractJDBCDriver implements SharedS null, locksExpirationMillis, jdbcConnectionUrl, + null, + null, + jdbcDriverClass, + provider); + } + + public static JdbcSharedStateManager usingConnectionUrl(String holderId, + long locksExpirationMillis, + String jdbcConnectionUrl, + String user, + String password, + String jdbcDriverClass, + SQLProvider provider) { + return JdbcSharedStateManager.usingConnectionUrl(holderId, + -1, + null, + locksExpirationMillis, + jdbcConnectionUrl, + user, + password, jdbcDriverClass, provider); } @@ -85,6 +105,8 @@ final class JdbcSharedStateManager extends AbstractJDBCDriver implements SharedS Executor networkTimeoutExecutor, long locksExpirationMillis, String jdbcConnectionUrl, + String user, + String password, String jdbcDriverClass, SQLProvider provider) { final JdbcSharedStateManager sharedStateManager = new JdbcSharedStateManager(holderId, locksExpirationMillis); @@ -92,6 +114,8 @@ final class JdbcSharedStateManager extends AbstractJDBCDriver implements SharedS sharedStateManager.setJdbcConnectionUrl(jdbcConnectionUrl); sharedStateManager.setJdbcDriverClass(jdbcDriverClass); sharedStateManager.setSqlProvider(provider); + sharedStateManager.setUser(user); + sharedStateManager.setPassword(password); try { sharedStateManager.start(); return sharedStateManager; diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManagerTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManagerTest.java new file mode 100644 index 0000000000..762e051c03 --- /dev/null +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/jdbc/JdbcNodeManagerTest.java @@ -0,0 +1,121 @@ +/* + * 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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.artemis.core.server.impl.jdbc; + +import java.sql.DriverManager; +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import org.apache.activemq.artemis.core.config.storage.DatabaseStorageConfiguration; +import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class JdbcNodeManagerTest extends ActiveMQTestBase { + + @Parameterized.Parameter + public boolean useAuthentication; + private DatabaseStorageConfiguration dbConf; + private ScheduledExecutorService leaseLockExecutor; + + @Parameterized.Parameters(name = "authentication = {0}") + public static Collection data() { + return Arrays.asList(new Object[][]{{false}, {true}}); + } + + @Before + public void configure() { + if (useAuthentication) { + System.setProperty("derby.connection.requireAuthentication", "true"); + System.setProperty("derby.user." + getJdbcUser(), getJdbcPassword()); + } + dbConf = createDefaultDatabaseStorageConfiguration(); + dbConf.setJdbcUser(getJdbcUser()); + dbConf.setJdbcPassword(getJdbcPassword()); + leaseLockExecutor = Executors.newSingleThreadScheduledExecutor(); + } + + @After + public void shutdownExecutors() throws InterruptedException { + try { + final CountDownLatch latch = new CountDownLatch(1); + leaseLockExecutor.execute(latch::countDown); + Assert.assertTrue("the scheduler of the lease lock has some pending task in ", latch.await(10, TimeUnit.SECONDS)); + } finally { + leaseLockExecutor.shutdownNow(); + } + } + + @After + @Override + public void shutdownDerby() { + try { + if (useAuthentication) { + DriverManager.getConnection("jdbc:derby:;shutdown=true", getJdbcUser(), getJdbcPassword()); + } else { + DriverManager.getConnection("jdbc:derby:;shutdown=true"); + } + } catch (Exception ignored) { + } + if (useAuthentication) { + System.clearProperty("derby.connection.requireAuthentication"); + System.clearProperty("derby.user." + getJdbcUser()); + } + } + + protected String getJdbcUser() { + if (useAuthentication) { + return System.getProperty("jdbc.user", "testuser"); + } else { + return null; + } + } + + protected String getJdbcPassword() { + if (useAuthentication) { + return System.getProperty("jdbc.password", "testpassword"); + } else { + return null; + } + } + + @Test + public void shouldStartAndStopGracefullyTest() throws Exception { + final AtomicReference criticalError = new AtomicReference<>(); + final JdbcNodeManager nodeManager = JdbcNodeManager.with(dbConf, leaseLockExecutor, null, (code, message, file) -> criticalError.lazySet(message)); + try { + nodeManager.start(); + } finally { + nodeManager.stop(); + final String error = criticalError.get(); + if (error != null) { + Assert.fail(error); + } + } + } + +}