ARTEMIS-1084 Throw RunTime on bad Oracle table size

This commit is contained in:
Francesco Nigro 2017-04-11 16:14:54 +02:00 committed by Clebert Suconic
parent f609884186
commit aa9ac4a914
4 changed files with 42 additions and 12 deletions

View File

@ -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.");
}
}

View File

@ -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;

View File

@ -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 {

View File

@ -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();