Author: joakime
Date: Mon Aug 13 12:40:06 2007
New Revision: 565484
URL: http://svn.apache.org/viewvc?view=rev&rev=565484
Log:
[MRM-465] (Load Testing) When asking for pages that require the effective-pom
in high load, app becomes unresponsive.
Added an ehcache around the effective-pom resolution process.
Added:
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml
(with props)
Modified:
maven/archiva/trunk/archiva-base/archiva-repository-layer/pom.xml
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/pom.xml
URL:
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/pom.xml?view=diff&rev=565484&r1=565483&r2=565484
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/pom.xml (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/pom.xml Mon Aug
13 12:40:06 2007
@@ -106,6 +106,19 @@
<goal>descriptor</goal>
</goals>
</execution>
+ <execution>
+ <id>merge</id>
+ <goals>
+ <goal>merge-descriptors</goal>
+ </goals>
+ <configuration>
+
<descriptor>${project.build.directory}/generated-resources/plexus/META-INF/plexus/components.xml</descriptor>
+ <descriptors>
+
<descriptor>${basedir}/src/main/resources/META-INF/plexus/components-fragment.xml</descriptor>
+
<descriptor>${project.build.directory}/generated-resources/plexus/META-INF/plexus/components.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
</executions>
</plugin>
</plugins>
Modified:
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
URL:
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java?view=diff&rev=565484&r1=565483&r2=565484
==============================================================================
---
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
(original)
+++
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
Mon Aug 13 12:40:06 2007
@@ -29,6 +29,7 @@
import org.apache.maven.archiva.repository.project.ProjectModelFilter;
import org.apache.maven.archiva.repository.project.ProjectModelMerge;
import org.apache.maven.archiva.repository.project.ProjectModelResolverFactory;
+import org.codehaus.plexus.cache.Cache;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.logging.console.ConsoleLogger;
@@ -56,6 +57,11 @@
* @plexus.requirement
*/
private ProjectModelResolverFactory resolverFactory;
+
+ /**
+ * @plexus.requirement role-hint="effective-project-cache"
+ */
+ private Cache effectiveProjectCache;
/**
* Take the provided [EMAIL PROTECTED] ArchivaProjectModel} and build the
effective [EMAIL PROTECTED] ArchivaProjectModel}.
@@ -81,9 +87,21 @@
{
throw new IllegalStateException( "Unable to build effective pom
with no project model resolvers defined." );
}
+
+ ArchivaProjectModel effectiveProject;
+ String projectKey = toProjectKey( project );
+
+ synchronized( effectiveProjectCache )
+ {
+ if( effectiveProjectCache.hasKey( projectKey ) )
+ {
+ effectiveProject = (ArchivaProjectModel)
effectiveProjectCache.get( projectKey );
+ return effectiveProject;
+ }
+ }
// Clone submitted project (so that we don't mess with it)
- ArchivaProjectModel effectiveProject = ArchivaModelCloner.clone(
project );
+ effectiveProject = ArchivaModelCloner.clone( project );
// Setup Expression Evaluation pieces.
effectiveProject = expressionFilter.filter( effectiveProject );
@@ -95,6 +113,11 @@
// Resolve dependency versions from dependency management.
applyDependencyManagement( effectiveProject );
+
+ synchronized( effectiveProjectCache )
+ {
+ effectiveProjectCache.put( projectKey, effectiveProject );
+ }
// Return what we got.
return effectiveProject;
@@ -157,6 +180,16 @@
VersionedReference parentRef = pom.getParentProject();
getLogger().debug( "Has parent: " + parentRef );
+
+ String pomKey = VersionedReference.toKey( parentRef );
+
+ synchronized( effectiveProjectCache )
+ {
+ if( effectiveProjectCache.hasKey( pomKey ) )
+ {
+ return (ArchivaProjectModel) effectiveProjectCache.get(
pomKey );
+ }
+ }
// Find parent using resolvers.
ArchivaProjectModel parentProject =
this.resolverFactory.getCurrentResolverStack().findProject( parentRef );
@@ -173,6 +206,11 @@
// TODO: Document this via monitor.
mixedProject = mixinSuperPom( pom );
}
+
+ synchronized( effectiveProjectCache )
+ {
+ effectiveProjectCache.put( pomKey, mixedProject );
+ }
}
else
{
@@ -187,7 +225,7 @@
mixedProject = mixinSuperPom( pom );
}
-
+
return mixedProject;
}
@@ -229,6 +267,17 @@
key.append( dep.getGroupId() ).append( ":" ).append(
dep.getArtifactId() );
key.append( StringUtils.defaultString( dep.getClassifier() ) ).append(
":" );
key.append( dep.getType() );
+
+ return key.toString();
+ }
+
+ private String toProjectKey( ArchivaProjectModel project )
+ {
+ StringBuffer key = new StringBuffer();
+
+ key.append( project.getGroupId() ).append( ":" );
+ key.append( project.getArtifactId() ).append( ":" );
+ key.append( project.getVersion() );
return key.toString();
}
Added:
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml
URL:
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml?view=auto&rev=565484
==============================================================================
---
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml
(added)
+++
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml
Mon Aug 13 12:40:06 2007
@@ -0,0 +1,25 @@
+<component-set>
+ <components>
+ <component>
+ <role>org.codehaus.plexus.cache.Cache</role>
+ <role-hint>effective-project-cache</role-hint>
+
<implementation>org.codehaus.plexus.cache.ehcache.EhcacheCache</implementation>
+ <description>Effective Project Cache</description>
+ <configuration>
+
<disk-expiry-thread-interval-seconds>600</disk-expiry-thread-interval-seconds>
+ <disk-persistent>true</disk-persistent>
+
<disk-store-path>${java.io.tmpdir}/archiva/effectiveproject</disk-store-path>
+ <eternal>true</eternal>
+ <max-elements-in-memory>1000</max-elements-in-memory>
+ <memory-eviction-policy>LRU</memory-eviction-policy>
+ <name>effective-project-cache</name>
+ <overflow-to-disk>false</overflow-to-disk>
+ <!-- TODO: Adjust the time to live to be more sane (ie: huge 4+ hours)
-->
+ <!-- 45 minutes = 2700 seconds -->
+ <time-to-idle-seconds>2700</time-to-idle-seconds>
+ <!-- 30 minutes = 1800 seconds -->
+ <time-to-live-seconds>1800</time-to-live-seconds>
+ </configuration>
+ </component>
+ </components>
+</component-set>
Propchange:
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Propchange:
maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/resources/META-INF/plexus/components-fragment.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml