From aa9ac4a914c18ef9421c769f8cb40e1a6b3b9972 Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Tue, 11 Apr 2017 16:14:54 +0200 Subject: [PATCH] ARTEMIS-1084 Throw RunTime on bad Oracle table size --- .../drivers/oracle/Oracle12CSQLProvider.java | 4 ++-- .../impl/PagingStoreFactoryDatabase.java | 9 ++++++-- .../impl/DatabaseStoreConfigurationTest.java | 18 ++++++++------- .../tests/integration/paging/PagingTest.java | 23 +++++++++++++++++++ 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/oracle/Oracle12CSQLProvider.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/oracle/Oracle12CSQLProvider.java index ac58bd33cc..c9f661d23b 100644 --- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/oracle/Oracle12CSQLProvider.java +++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/drivers/oracle/Oracle12CSQLProvider.java @@ -29,8 +29,8 @@ public class Oracle12CSQLProvider extends GenericSQLProvider { protected Oracle12CSQLProvider(String tableName, DatabaseStoreType databaseStoreType) { super(tableName.toUpperCase(), databaseStoreType); - if (tableName.length() > 10 && databaseStoreType == DatabaseStoreType.PAGE) { - throw new RuntimeException("The maximum name size for the paging store table, when using Oracle12C is 10 characters."); + if (tableName.length() > 30) { + throw new RuntimeException("The maximum name size for the " + databaseStoreType.name().toLowerCase() + " store table, when using Oracle12C is 30 characters."); } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryDatabase.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryDatabase.java index 31fc7291a4..3177b6ec06 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryDatabase.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreFactoryDatabase.java @@ -109,15 +109,20 @@ public class PagingStoreFactoryDatabase implements PagingStoreFactory { public synchronized void start() throws Exception { if (!started) { + //fix to prevent page table names to be longer than 30 chars (upper limit for Oracle12c identifiers length) + final String pageStoreTableNamePrefix = dbConf.getPageStoreTableName(); + if (pageStoreTableNamePrefix.length() > 10) { + throw new IllegalStateException("The maximum name size for the page store table prefix is 10 characters: THE PAGING STORE CAN'T START"); + } if (dbConf.getDataSource() != null) { SQLProvider.Factory sqlProviderFactory = dbConf.getSqlProviderFactory(); if (sqlProviderFactory == null) { sqlProviderFactory = new GenericSQLProvider.Factory(); } - pagingFactoryFileFactory = new JDBCSequentialFileFactory(dbConf.getDataSource(), sqlProviderFactory.create(dbConf.getPageStoreTableName(), SQLProvider.DatabaseStoreType.PAGE), executorFactory.getExecutor()); + pagingFactoryFileFactory = new JDBCSequentialFileFactory(dbConf.getDataSource(), sqlProviderFactory.create(pageStoreTableNamePrefix, SQLProvider.DatabaseStoreType.PAGE), executorFactory.getExecutor()); } else { String driverClassName = dbConf.getJdbcDriverClassName(); - pagingFactoryFileFactory = new JDBCSequentialFileFactory(dbConf.getJdbcConnectionUrl(), driverClassName, JDBCUtils.getSQLProvider(driverClassName, dbConf.getPageStoreTableName(), SQLProvider.DatabaseStoreType.PAGE), executorFactory.getExecutor()); + pagingFactoryFileFactory = new JDBCSequentialFileFactory(dbConf.getJdbcConnectionUrl(), driverClassName, JDBCUtils.getSQLProvider(driverClassName, pageStoreTableNamePrefix, SQLProvider.DatabaseStoreType.PAGE), executorFactory.getExecutor()); } pagingFactoryFileFactory.start(); started = true; diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DatabaseStoreConfigurationTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DatabaseStoreConfigurationTest.java index 27e3593ce7..58745a23bf 100644 --- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DatabaseStoreConfigurationTest.java +++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/DatabaseStoreConfigurationTest.java @@ -36,15 +36,17 @@ public class DatabaseStoreConfigurationTest extends ActiveMQTestBase { @Test public void testOracle12TableSize() { - Throwable rte = null; - try { - new Oracle12CSQLProvider.Factory().create("A_TABLE_NAME_THAT_IS_TOO_LONG", SQLProvider.DatabaseStoreType.PAGE); - } catch (Throwable t) { - rte = t; - } + for (SQLProvider.DatabaseStoreType storeType : SQLProvider.DatabaseStoreType.values()) { + Throwable rte = null; + try { + new Oracle12CSQLProvider.Factory().create("_A_TABLE_NAME_THAT_IS_TOO_LONG_", storeType); + } catch (Throwable t) { + rte = t; + } - assertNotNull(rte); - assertTrue(rte.getMessage().contains("The maximum name size for the paging store table, when using Oracle12C is 10 characters.")); + assertNotNull(rte); + assertTrue(rte.getMessage().contains("The maximum name size for the " + storeType.name().toLowerCase() + " store table, when using Oracle12C is 30 characters.")); + } } protected Configuration createConfiguration(String fileName) throws Exception { diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java index 48127d2ae8..ddabf1b63e 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java @@ -55,6 +55,7 @@ import org.apache.activemq.artemis.core.client.impl.ClientConsumerInternal; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.config.DivertConfiguration; import org.apache.activemq.artemis.core.config.StoreConfiguration; +import org.apache.activemq.artemis.core.config.storage.DatabaseStorageConfiguration; import org.apache.activemq.artemis.core.filter.Filter; import org.apache.activemq.artemis.core.io.IOCallback; import org.apache.activemq.artemis.core.journal.Journal; @@ -150,6 +151,28 @@ public class PagingTest extends ActiveMQTestBase { locator = createInVMNonHALocator(); } + @Test + public void testTooLongPageStoreTableNamePrefix() throws Exception { + if (storeType == StoreConfiguration.StoreType.DATABASE) { + final Configuration config = createDefaultInVMConfig(); + final DatabaseStorageConfiguration storageConfiguration = (DatabaseStorageConfiguration) config.getStoreConfiguration(); + //set the page store table to be longer than 10 chars -> the paging manager initialization will fail + storageConfiguration.setPageStoreTableName("PAGE_STORE_"); + + final int PAGE_MAX = 20 * 1024; + + final int PAGE_SIZE = 10 * 1024; + + final ActiveMQServer server = createServer(true, config, PAGE_SIZE, PAGE_MAX); + server.start(); + + //due to a failed initialisation of the paging manager, it must be null + Assert.assertNull(server.getPagingManager()); + + server.stop(); + } + } + @Test public void testPageOnLargeMessageMultipleQueues() throws Exception { Configuration config = createDefaultInVMConfig();