Author: mgrigorov
Date: Tue Dec 20 13:38:39 2011
New Revision: 1221256
URL: http://svn.apache.org/viewvc?rev=1221256&view=rev
Log:
WICKET-4285
PageSavingThread.stop() blocks forever
Modified:
wicket/branches/wicket-1.5.x/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
wicket/branches/wicket-1.5.x/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java
Modified:
wicket/branches/wicket-1.5.x/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.5.x/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java?rev=1221256&r1=1221255&r2=1221256&view=diff
==============================================================================
---
wicket/branches/wicket-1.5.x/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
(original)
+++
wicket/branches/wicket-1.5.x/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
Tue Dec 20 13:38:39 2011
@@ -22,7 +22,6 @@ import java.util.concurrent.ConcurrentHa
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.wicket.util.lang.Args;
import org.slf4j.Logger;
@@ -58,9 +57,9 @@ public class AsynchronousDataStore imple
private static final long POLL_WAIT = 1000L;
/**
- * A flag indicating that this {@link IDataStore} should stop
+ * The page saving thread.
*/
- private final AtomicBoolean destroy;
+ private final Thread pageSavingThread;
/**
* The wrapped {@link IDataStore} that actually stores that pages
@@ -89,15 +88,13 @@ public class AsynchronousDataStore imple
public AsynchronousDataStore(final IDataStore dataStore, final int
capacity)
{
this.dataStore = dataStore;
- destroy = new AtomicBoolean(false);
entries = new LinkedBlockingQueue<Entry>(capacity);
entryMap = new ConcurrentHashMap<String, Entry>();
- PageSavingRunnable savingRunnable = new
PageSavingRunnable(dataStore, entries, entryMap,
- destroy);
- Thread thread = new Thread(savingRunnable,
"Wicket-PageSavingThread");
- thread.setDaemon(true);
- thread.start();
+ PageSavingRunnable savingRunnable = new
PageSavingRunnable(dataStore, entries, entryMap);
+ pageSavingThread = new Thread(savingRunnable,
"Wicket-PageSavingThread");
+ pageSavingThread.setDaemon(true);
+ pageSavingThread.start();
}
/**
@@ -105,19 +102,17 @@ public class AsynchronousDataStore imple
*/
public void destroy()
{
- destroy.set(true);
-
- try
+ if (pageSavingThread.isAlive())
{
- synchronized (destroy)
+ pageSavingThread.interrupt();
+ try
+ {
+ pageSavingThread.join();
+ } catch (InterruptedException e)
{
- destroy.wait();
+ log.error(e.getMessage(), e);
}
}
- catch (InterruptedException e)
- {
- log.error(e.getMessage(), e);
- }
dataStore.destroy();
}
@@ -319,8 +314,6 @@ public class AsynchronousDataStore imple
{
private static final Logger log =
LoggerFactory.getLogger(PageSavingRunnable.class);
- private final AtomicBoolean destroy;
-
private final BlockingQueue<Entry> entries;
private final ConcurrentMap<String, Entry> entryMap;
@@ -328,17 +321,16 @@ public class AsynchronousDataStore imple
private final IDataStore dataStore;
private PageSavingRunnable(IDataStore dataStore,
BlockingQueue<Entry> entries,
- ConcurrentMap<String, Entry> entryMap, AtomicBoolean
destroy)
+ ConcurrentMap<String, Entry> entryMap)
{
this.dataStore = dataStore;
this.entries = entries;
this.entryMap = entryMap;
- this.destroy = destroy;
}
public void run()
{
- while (destroy.get() == false)
+ while (!Thread.interrupted())
{
Entry entry = null;
try
@@ -347,7 +339,7 @@ public class AsynchronousDataStore imple
}
catch (InterruptedException e)
{
- log.error(e.getMessage(), e);
+ Thread.currentThread().interrupt();
}
if (entry != null)
@@ -357,11 +349,6 @@ public class AsynchronousDataStore imple
entryMap.remove(getKey(entry));
}
}
-
- synchronized (destroy)
- {
- destroy.notify();
- }
}
}
-}
\ No newline at end of file
+}
Modified:
wicket/branches/wicket-1.5.x/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.5.x/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java?rev=1221256&r1=1221255&r2=1221256&view=diff
==============================================================================
---
wicket/branches/wicket-1.5.x/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java
(original)
+++
wicket/branches/wicket-1.5.x/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java
Tue Dec 20 13:38:39 2011
@@ -309,7 +309,7 @@ public class DiskDataStoreTest extends A
private void doTestDataStore()
{
- log.error("Starting...");
+ log.info("Starting...");
long start = System.currentTimeMillis();
for (int i = 0; i < THREAD_COUNT; ++i)
@@ -346,12 +346,12 @@ public class DiskDataStoreTest extends A
long duration = System.currentTimeMillis() - start;
- log.error("Took: " + duration + " ms");
- log.error("Save: " + saveCount.intValue() + " files, " +
bytesWritten.get() + " bytes");
- log.error("Read: " + (read1Count.get() + read2Count.get()) + "
files, " + bytesRead.get() +
+ log.info("Took: " + duration + " ms");
+ log.info("Save: " + saveCount.intValue() + " files, " +
bytesWritten.get() + " bytes");
+ log.info("Read: " + (read1Count.get() + read2Count.get()) + "
files, " + bytesRead.get() +
" bytes");
- log.error("Average save time (ns): " + (double)saveTime.get() /
(double)saveCount.get());
+ log.info("Average save time (ns): " + (double)saveTime.get() /
(double)saveCount.get());
assertEquals(0, failures.get());