Author: mgrigorov
Date: Tue Oct 25 18:06:28 2011
New Revision: 1188840

URL: http://svn.apache.org/viewvc?rev=1188840&view=rev
Log:
WICKET-4164 StoredResponsesMap not threadsafe

Add as minimal as possible synchronization in the map that is used to store the 
buffered responses.


Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/StoredResponsesMap.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/StoredResponsesMapTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/StoredResponsesMap.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/StoredResponsesMap.java?rev=1188840&r1=1188839&r2=1188840&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/StoredResponsesMap.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/StoredResponsesMap.java
 Tue Oct 25 18:06:28 2011
@@ -64,7 +64,7 @@ class StoredResponsesMap extends MostRec
        }
 
        @Override
-       protected boolean removeEldestEntry(java.util.Map.Entry<String, Object> 
eldest)
+       protected synchronized boolean 
removeEldestEntry(java.util.Map.Entry<String, Object> eldest)
        {
                boolean removed = super.removeEldestEntry(eldest);
                if (removed == false)
@@ -95,7 +95,12 @@ class StoredResponsesMap extends MostRec
                Value value = new Value();
                value.creationTime = Time.now();
                value.response = (BufferedWebResponse)bufferedResponse;
-               Value oldValue = (Value)super.put(key, value);
+
+               Value oldValue;
+               synchronized (this)
+               {
+                       oldValue = (Value)super.put(key, value);
+               }
 
                return oldValue != null ? oldValue.response : null;
        }
@@ -104,7 +109,11 @@ class StoredResponsesMap extends MostRec
        public BufferedWebResponse get(Object key)
        {
                BufferedWebResponse result = null;
-               Value value = (Value)super.get(key);
+               Value value;
+               synchronized (this)
+               {
+                       value = (Value)super.get(key);
+               }
                if (value != null)
                {
                        Duration elapsedTime = 
Time.now().subtract(value.creationTime);
@@ -124,7 +133,12 @@ class StoredResponsesMap extends MostRec
        @Override
        public BufferedWebResponse remove(Object key)
        {
-               Value removedValue = (Value)super.remove(key);
+               Value removedValue;
+               synchronized (this)
+               {
+                       removedValue = (Value)super.remove(key);
+               }
+
                return removedValue != null ? removedValue.response : null;
        }
 

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/StoredResponsesMapTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/StoredResponsesMapTest.java?rev=1188840&r1=1188839&r2=1188840&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/StoredResponsesMapTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/protocol/http/StoredResponsesMapTest.java
 Tue Oct 25 18:06:28 2011
@@ -21,8 +21,8 @@ import static org.junit.Assert.assertNul
 import static org.junit.Assert.assertTrue;
 
 import java.security.SecureRandom;
-import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -98,15 +98,15 @@ public class StoredResponsesMapTest
        @Ignore
        public void heavyLoad() throws InterruptedException
        {
-               int numberOfThreads = 100;
-               final int iterations = 10000;
+               final int numberOfThreads = 100;
+               final int iterations = 1000;
                final CountDownLatch startLatch = new 
CountDownLatch(numberOfThreads);
                final CountDownLatch endLatch = new 
CountDownLatch(numberOfThreads);
                final SecureRandom rnd = new SecureRandom();
                final StoredResponsesMap map = new StoredResponsesMap(1000, 
Duration.seconds(60));
-               final List<String> keys = new ArrayList<String>();
+               final List<String> keys = new CopyOnWriteArrayList<String>();
 
-               Runnable r = new Runnable()
+               final Runnable r = new Runnable()
                {
                        public void run()
                        {


Reply via email to