You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by an...@apache.org on 2011/07/27 11:30:29 UTC

svn commit: r1151397 - in /jackrabbit/trunk: jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/jcr/ jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/ jackrabbit-standalone/src/main/resources/WEB-INF/ jackrabbit-webapp...

Author: angela
Date: Wed Jul 27 09:30:28 2011
New Revision: 1151397

URL: http://svn.apache.org/viewvc?rev=1151397&view=rev
Log:
JCR-3027 - apply modified patch (original author: chad davis)

Modified:
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java
    jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JCRWebdavServerServlet.java
    jackrabbit/trunk/jackrabbit-standalone/src/main/resources/WEB-INF/web.xml
    jackrabbit/trunk/jackrabbit-webapp/src/main/webapp/WEB-INF/web.xml

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java?rev=1151397&r1=1151396&r2=1151397&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java Wed Jul 27 09:30:28 2011
@@ -33,11 +33,11 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  * <code>JCRWebdavServer</code>...
@@ -48,7 +48,7 @@ public class JCRWebdavServer implements 
     private static Logger log = LoggerFactory.getLogger(JCRWebdavServer.class);
 
     /** the session cache */
-    private final SessionCache cache = new SessionCache();
+    private final SessionCache cache;
 
     /** the jcr repository */
     private final Repository repository;
@@ -64,6 +64,19 @@ public class JCRWebdavServer implements 
     public JCRWebdavServer(Repository repository, SessionProvider sessionProvider) {
         this.repository = repository;
         this.sessionProvider = sessionProvider;
+        cache = new SessionCache();
+    }
+
+    /**
+     * Creates a new JCRWebdavServer that operates on the given repository.
+     *
+     * @param repository
+     * @param concurrencyLevel 
+     */
+    public JCRWebdavServer(Repository repository, SessionProvider sessionProvider, int concurrencyLevel) {
+        this.repository = repository;
+        this.sessionProvider = sessionProvider;
+        cache = new SessionCache(concurrencyLevel);
     }
 
     //---------------------------------------< DavSessionProvider interface >---
@@ -142,10 +155,33 @@ public class JCRWebdavServer implements 
      */
     private class SessionCache {
 
-        private Map<DavSession, Set<Object>> sessionMap = new HashMap<DavSession, Set<Object>>();
-        private Map<Object, DavSession> referenceToSessionMap = new HashMap<Object, DavSession>();
+        private static final int CONCURRENCY_LEVEL_DEFAULT = 50;
+        private static final int INITIAL_CAPACITY = 50;
+    	private static final int INITIAL_CAPACITY_REF_TO_SESSION = 3 * INITIAL_CAPACITY;
+    	
+        private ConcurrentMap<DavSession, Set<Object>> sessionMap;
+        private ConcurrentMap<Object, DavSession> referenceToSessionMap;
+
+        /**
+         * Create a new session cache with the {@link #CONCURRENCY_LEVEL_DEFAULT default concurrency level}.
+         */
+        private SessionCache() {
+            this(CONCURRENCY_LEVEL_DEFAULT);
+        }
 
         /**
+         * Create a new session cache with the specified the level of concurrency
+         * for this server.
+         * 
+         * @param cacheConcurrencyLevel A positive int value specifying the
+         * concurrency level of the server.
+         */
+        private SessionCache(int cacheConcurrencyLevel) {
+        	sessionMap = new ConcurrentHashMap<DavSession, Set<Object>>(INITIAL_CAPACITY, .75f, cacheConcurrencyLevel);
+        	referenceToSessionMap = new ConcurrentHashMap<Object, DavSession>(INITIAL_CAPACITY_REF_TO_SESSION, .75f, cacheConcurrencyLevel);
+        }
+        
+        /**
          * Try to retrieve <code>DavSession</code> if a TransactionId or
          * SubscriptionId is present in the request header. If no cached session
          * was found <code>null</code> is returned.
@@ -186,6 +222,8 @@ public class JCRWebdavServer implements 
             if (session == null) {
                 Session repSession = getRepositorySession(request);
                 session = new DavSessionImpl(repSession);
+                
+                // TODO: review again if using ConcurrentMap#putIfAbsent() was more appropriate.
                 sessionMap.put(session, new HashSet<Object>());
                 log.debug("login: User '" + repSession.getUserID() + "' logged in.");
             } else {

Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JCRWebdavServerServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JCRWebdavServerServlet.java?rev=1151397&r1=1151396&r2=1151397&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JCRWebdavServerServlet.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/jcr/JCRWebdavServerServlet.java Wed Jul 27 09:30:28 2011
@@ -74,6 +74,13 @@ public abstract class JCRWebdavServerSer
     public final static String INIT_PARAM_MISSING_AUTH_MAPPING = "missing-auth-mapping";
 
     /**
+     * Optional 'concurrency-level' parameter defining the concurrency level
+     * within the jcr-server. If the parameter is omitted the internal default
+     * value (50) is used.
+     */
+    public final static String INIT_PARAM_CONCURRENCY_LEVEL = "concurrency-level";
+
+    /**
      * Servlet context attribute used to store the path prefix instead of
      * having a static field with this servlet. The latter causes problems
      * when running multiple
@@ -170,7 +177,17 @@ public abstract class JCRWebdavServerSer
     public DavSessionProvider getDavSessionProvider() {
         if (server == null) {
             Repository repository = getRepository();
-            server = new JCRWebdavServer(repository, getSessionProvider());
+            String cl = getInitParameter(INIT_PARAM_CONCURRENCY_LEVEL);
+            if (cl != null) {
+                try {
+                    server = new JCRWebdavServer(repository, getSessionProvider(), Integer.parseInt(cl));
+                } catch (NumberFormatException e) {
+                    log.debug("Invalid value '" + cl+ "' for init-param 'concurrency-level'. Using default instead.");
+                    server = new JCRWebdavServer(repository, getSessionProvider());
+                }
+            } else {
+                server = new JCRWebdavServer(repository, getSessionProvider());
+            }
         }
         return server;
     }
@@ -250,7 +267,7 @@ public abstract class JCRWebdavServerSer
      * the node type characteristics of the parent (SNSiblings allowed or not).
      *
      * @param destResource destination resource to be validated.
-     * @param request
+     * @param request The webdav request
      * @param checkHeader flag indicating if the destination header must be present.
      * @return status code indicating whether the destination is valid.
      */
@@ -299,6 +316,7 @@ public abstract class JCRWebdavServerSer
     /**
      * Returns the configured path prefix
      *
+     * @param ctx The servlet context.
      * @return resourcePathPrefix
      * @see #INIT_PARAM_RESOURCE_PATH_PREFIX
      */
@@ -308,6 +326,8 @@ public abstract class JCRWebdavServerSer
 
     /**
      * Returns the repository to be used by this servlet.
+     *
+     * @return the JCR repository to be used by this servlet
      */
     protected abstract Repository getRepository();
 

Modified: jackrabbit/trunk/jackrabbit-standalone/src/main/resources/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-standalone/src/main/resources/WEB-INF/web.xml?rev=1151397&r1=1151396&r2=1151397&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-standalone/src/main/resources/WEB-INF/web.xml (original)
+++ jackrabbit/trunk/jackrabbit-standalone/src/main/resources/WEB-INF/web.xml Wed Jul 27 09:30:28 2011
@@ -127,6 +127,11 @@
             <param-value>/WEB-INF/batchread.properties</param-value>
             <description>JcrRemotingServlet: Optional mapping from node type names to default depth.</description>
         </init-param>
+        <init-param>
+        	<param-name>concurrency-level</param-name>
+        	<param-value>50</param-value>
+        	<description>Number of concurrent requests expected. Default value is 50.</description>
+        </init-param>
         -->
         <load-on-startup>5</load-on-startup>
     </servlet>

Modified: jackrabbit/trunk/jackrabbit-webapp/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-webapp/src/main/webapp/WEB-INF/web.xml?rev=1151397&r1=1151396&r2=1151397&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-webapp/src/main/webapp/WEB-INF/web.xml (original)
+++ jackrabbit/trunk/jackrabbit-webapp/src/main/webapp/WEB-INF/web.xml Wed Jul 27 09:30:28 2011
@@ -315,7 +315,12 @@
             <param-name>batchread-config</param-name>
             <param-value>/WEB-INF/batchread.properties</param-value>
             <description>JcrRemotingServlet: Optional mapping from node type names to default depth.</description>
-        </init-param>        
+        </init-param>
+        <!-- init-param>
+        	<param-name>concurrency-level</param-name>
+        	<param-value>50</param-value>
+        	<description>Number of concurrent requests expected. Default value is 50.</description>
+        </init-param -->
         <load-on-startup>5</load-on-startup>
     </servlet>