[MRM-1956] Replace tomcat-jdbc pool with HikariCP

Signed-off-by: olivier lamy <olamy@apache.org>
This commit is contained in:
olivier lamy 2017-06-20 21:49:28 +10:00
parent c6d882dfdc
commit 8d3f82a479
8 changed files with 82 additions and 66 deletions

View File

@ -65,7 +65,11 @@
<version>${jettyVersion}</version> <version>${jettyVersion}</version>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<scope>runtime</scope>
</dependency>
<dependency> <dependency>
<groupId>org.apache.derby</groupId> <groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId> <artifactId>derby</artifactId>
@ -81,16 +85,6 @@
<artifactId>ant</artifactId> <artifactId>ant</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>

View File

@ -157,31 +157,29 @@
<New id="users" class="org.eclipse.jetty.plus.jndi.Resource"> <New id="users" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/users</Arg> <Arg>jdbc/users</Arg>
<Arg> <Arg>
<New class="org.apache.tomcat.jdbc.pool.DataSource"> <New class="com.zaxxer.hikari.HikariDataSource">
<Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set> <Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set>
<Set name="url">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users;create=true</Set> <Set name="jdbcUrl">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users;create=true</Set>
<Set name="username">sa</Set> <Set name="username">sa</Set>
<Set name="maxActive">20</Set> <Set name="maximumPoolSize">20</Set>
<Set name="removeAbandoned">true</Set> <Set name="minimumIdle">5</Set>
<Set name="logAbandoned">true</Set>
<Set name="initialSize">5</Set>
<Set name="testOnBorrow">true</Set>
<!-- very rigourous sql query validation --> <!-- very rigourous sql query validation -->
<Set name="validationQuery">select 1</Set> <!--Set name="connectionTestQuery">select 1</Set-->
</New> </New>
</Arg> </Arg>
</New> </New>
<!--
<New id="usersShutdown" class="org.eclipse.jetty.plus.jndi.Resource"> <New id="usersShutdown" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>jdbc/usersShutdown</Arg> <Arg>jdbc/usersShutdown</Arg>
<Arg> <Arg>
<New class="org.apache.tomcat.jdbc.pool.DataSource"> <New class="com.zaxxer.hikari.HikariDataSource">
<Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set> <Set name="driverClassName">org.apache.derby.jdbc.EmbeddedDriver</Set>
<Set name="url">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users</Set> <Set name="jdbcUrl">jdbc:derby:<SystemProperty name="appserver.base" default=".."/>/data/databases/users</Set>
<Set name="username">sa</Set> <Set name="username">sa</Set>
</New> </New>
</Arg> </Arg>
</New> </New>
-->
</Configure> </Configure>

View File

@ -53,7 +53,7 @@ public class DefaultRepositoryScanner
@Inject @Inject
private RepositoryContentConsumers repositoryContentConsumers; private RepositoryContentConsumers repositoryContentConsumers;
private Set<RepositoryScannerInstance> inProgressScans = new LinkedHashSet<RepositoryScannerInstance>(); private Set<RepositoryScannerInstance> inProgressScans = new LinkedHashSet<>();
@Override @Override
public RepositoryScanStatistics scan( ManagedRepository repository, long changesSince ) public RepositoryScanStatistics scan( ManagedRepository repository, long changesSince )

View File

@ -27,9 +27,11 @@ import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
import org.apache.archiva.mock.MockRepositorySessionFactory; import org.apache.archiva.mock.MockRepositorySessionFactory;
import org.apache.archiva.redback.components.taskqueue.execution.TaskExecutor; import org.apache.archiva.redback.components.taskqueue.execution.TaskExecutor;
import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner; import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
import org.apache.commons.lang.StringUtils;
import org.codehaus.plexus.util.FileUtils; import org.codehaus.plexus.util.FileUtils;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.ContextConfiguration;
@ -48,7 +50,7 @@ import static org.mockito.Mockito.mock;
@RunWith( ArchivaSpringJUnit4ClassRunner.class ) @RunWith( ArchivaSpringJUnit4ClassRunner.class )
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } ) @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
@DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD ) @DirtiesContext( classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD )
public abstract class ArchivaRepositoryScanningTaskExecutorAbstractTest public abstract class AbstractArchivaRepositoryScanningTaskExecutorTest
extends TestCase extends TestCase
{ {
@Inject @Inject
@ -96,12 +98,11 @@ public abstract class ArchivaRepositoryScanningTaskExecutorAbstractTest
// set the timestamps to a time well in the past // set the timestamps to a time well in the past
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
cal.add( Calendar.YEAR, -1 ); cal.add( Calendar.YEAR, -1 );
for ( File f : (List<File>) FileUtils.getFiles( repoDir, "**", null ) ) FileUtils.getFiles( repoDir, "**", null ) //
{ .stream().forEach( file -> file.setLastModified( cal.getTimeInMillis() ) );
f.setLastModified( cal.getTimeInMillis() );
}
// TODO: test they are excluded instead // TODO: test they are excluded instead
for ( String dir : (List<String>) FileUtils.getDirectoryNames( repoDir, "**/.svn", null, false ) ) for ( String dir : FileUtils.getDirectoryNames( repoDir, "**/.svn", null, false ) )
{ {
FileUtils.deleteDirectory( new File( repoDir, dir ) ); FileUtils.deleteDirectory( new File( repoDir, dir ) );
} }

View File

@ -33,7 +33,7 @@ import java.util.Collection;
*/ */
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } ) @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
public class ArchivaRepositoryScanningTaskExecutorPhase1Test public class ArchivaRepositoryScanningTaskExecutorPhase1Test
extends ArchivaRepositoryScanningTaskExecutorAbstractTest extends AbstractArchivaRepositoryScanningTaskExecutorTest
{ {
// Split of ArchivaRepositoryScanningTaskExecutorTest should be executed first // Split of ArchivaRepositoryScanningTaskExecutorTest should be executed first
// to avoid testConsumer in unknown state if member of Phase2 all ready executed // to avoid testConsumer in unknown state if member of Phase2 all ready executed

View File

@ -34,26 +34,23 @@ import java.util.Date;
/** /**
* ArchivaRepositoryScanningTaskExecutorPhase2Test * ArchivaRepositoryScanningTaskExecutorPhase2Test
*
*
*/ */
@ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } ) @ContextConfiguration( locations = { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
public class ArchivaRepositoryScanningTaskExecutorPhase2Test public class ArchivaRepositoryScanningTaskExecutorPhase2Test
extends ArchivaRepositoryScanningTaskExecutorAbstractTest extends AbstractArchivaRepositoryScanningTaskExecutorTest
{ {
@Test @Test
public void testExecutorScanOnlyNewArtifacts() public void testExecutorScanOnlyNewArtifacts()
throws Exception throws Exception
{ {
createAndSaveTestStats();
RepositoryTask repoTask = new RepositoryTask(); RepositoryTask repoTask = new RepositoryTask();
repoTask.setRepositoryId( TEST_REPO_ID ); repoTask.setRepositoryId( TEST_REPO_ID );
repoTask.setScanAll( false ); repoTask.setScanAll( false );
createAndSaveTestStats();
taskExecutor.executeTask( repoTask ); taskExecutor.executeTask( repoTask );
// check no artifacts processed // check no artifacts processed
@ -67,7 +64,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
RepositoryStatistics newStats = RepositoryStatistics newStats =
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ); repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
assertEquals( 0, newStats.getNewFileCount() ); assertEquals( 0, newStats.getNewFileCount() );
assertEquals( 31, newStats.getTotalFileCount() ); assertEquals( 41, newStats.getTotalFileCount() );
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
// assertEquals( 8, newStats.getTotalArtifactCount() ); // assertEquals( 8, newStats.getTotalArtifactCount() );
// assertEquals( 3, newStats.getTotalGroupCount() ); // assertEquals( 3, newStats.getTotalGroupCount() );
@ -100,7 +97,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
RepositoryStatistics updatedStats = RepositoryStatistics updatedStats =
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ); repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
assertEquals( 2, updatedStats.getNewFileCount() ); assertEquals( 2, updatedStats.getNewFileCount() );
assertEquals( 33, updatedStats.getTotalFileCount() ); assertEquals( 43, updatedStats.getTotalFileCount() );
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
// assertEquals( 8, newStats.getTotalArtifactCount() ); // assertEquals( 8, newStats.getTotalArtifactCount() );
// assertEquals( 3, newStats.getTotalGroupCount() ); // assertEquals( 3, newStats.getTotalGroupCount() );
@ -147,7 +144,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
RepositoryStatistics newStats = RepositoryStatistics newStats =
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ); repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
assertEquals( 2, newStats.getNewFileCount() ); assertEquals( 2, newStats.getNewFileCount() );
assertEquals( 33, newStats.getTotalFileCount() ); assertEquals( 43, newStats.getTotalFileCount() );
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
// assertEquals( 8, newStats.getTotalArtifactCount() ); // assertEquals( 8, newStats.getTotalArtifactCount() );
// assertEquals( 3, newStats.getTotalGroupCount() ); // assertEquals( 3, newStats.getTotalGroupCount() );
@ -194,7 +191,7 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
RepositoryStatistics newStats = RepositoryStatistics newStats =
repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID ); repositoryStatisticsManager.getLastStatistics( metadataRepository, TEST_REPO_ID );
assertEquals( 2, newStats.getNewFileCount() ); assertEquals( 2, newStats.getNewFileCount() );
assertEquals( 33, newStats.getTotalFileCount() ); assertEquals( 43, newStats.getTotalFileCount() );
// FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation // FIXME: can't test these as they weren't stored in the database, move to tests for RepositoryStatisticsManager implementation
// assertEquals( 8, newStats.getTotalArtifactCount() ); // assertEquals( 8, newStats.getTotalArtifactCount() );
// assertEquals( 3, newStats.getTotalGroupCount() ); // assertEquals( 3, newStats.getTotalGroupCount() );
@ -212,8 +209,9 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
repoTask.setScanAll( true ); repoTask.setScanAll( true );
Date date = Calendar.getInstance().getTime(); Date date = Calendar.getInstance().getTime();
repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, //
new Date( date.getTime() - 1234567 ), date, 8, 8 ); new Date( date.getTime() - 1234567 ), //
date, 8, 8 ); //
taskExecutor.executeTask( repoTask ); taskExecutor.executeTask( repoTask );
@ -227,17 +225,9 @@ public class ArchivaRepositoryScanningTaskExecutorPhase2Test
throws MetadataRepositoryException throws MetadataRepositoryException
{ {
Date date = Calendar.getInstance().getTime(); Date date = Calendar.getInstance().getTime();
RepositoryStatistics stats = new RepositoryStatistics();
stats.setScanStartTime( new Date( date.getTime() - 1234567 ) );
stats.setScanEndTime( date );
stats.setNewFileCount( 31 );
stats.setTotalArtifactCount( 8 );
stats.setTotalFileCount( 31 );
stats.setTotalGroupCount( 3 );
stats.setTotalProjectCount( 5 );
stats.setTotalArtifactFileSize( 38545 );
repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, repositoryStatisticsManager.addStatisticsAfterScan( metadataRepository, TEST_REPO_ID, //
new Date( date.getTime() - 1234567 ), date, 31, 31 ); new Date( date.getTime() - 1234567 ), date, //
41, 41 );
} }
} }

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
~ 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.
-->
<configuration>
<appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d [%t] %-5p %c %x - %m%n"/>
</Console>
</appenders>
<loggers>
<logger name="org.springframework" level="error"/>
<logger name="org.apache.archiva" level="debug"/>
<root level="info">
<appender-ref ref="console"/>
</root>
</loggers>
</configuration>

21
pom.xml
View File

@ -79,7 +79,7 @@
<jackrabbit.version>2.14.1</jackrabbit.version> <jackrabbit.version>2.14.1</jackrabbit.version>
<cxf.version>3.0.3</cxf.version> <cxf.version>3.0.3</cxf.version>
<derbyVersion>10.10.1.1</derbyVersion> <derbyVersion>10.13.1.1</derbyVersion>
<httpclient.version>4.5.2</httpclient.version> <httpclient.version>4.5.2</httpclient.version>
<httpclient.core.version>4.4.4</httpclient.core.version> <httpclient.core.version>4.4.4</httpclient.core.version>
<javaxMailVersion>1.4</javaxMailVersion> <javaxMailVersion>1.4</javaxMailVersion>
@ -95,7 +95,6 @@
<plexus-digest.version>1.1</plexus-digest.version> <plexus-digest.version>1.1</plexus-digest.version>
<plexus-expression-evaluator.version>2.1</plexus-expression-evaluator.version> <plexus-expression-evaluator.version>2.1</plexus-expression-evaluator.version>
<plexus-utils.version>3.0.15</plexus-utils.version> <plexus-utils.version>3.0.15</plexus-utils.version>
<tomcat7Version>7.0.54</tomcat7Version>
<htmlUnitVersion>2.27</htmlUnitVersion> <htmlUnitVersion>2.27</htmlUnitVersion>
<release.preparationGoals>clean install</release.preparationGoals> <release.preparationGoals>clean install</release.preparationGoals>
@ -460,7 +459,13 @@
<dependency> <dependency>
<groupId>com.lmax</groupId> <groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId> <artifactId>disruptor</artifactId>
<version>3.2.1</version> <version>3.3.6</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.6.3</version>
</dependency> </dependency>
<!-- <!--
@ -644,16 +649,6 @@
<artifactId>commons-lang</artifactId> <artifactId>commons-lang</artifactId>
<version>${commons-lang.version}</version> <version>${commons-lang.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
<version>${tomcat7Version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId> <artifactId>commons-compress</artifactId>