ARTEMIS-1084 Throw RunTime on bad Oracle table size
This commit is contained in:
parent
f609884186
commit
aa9ac4a914
|
@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue