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


Reply via email to