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()
{