Author: mgrigorov
Date: Tue Dec 20 13:45:53 2011
New Revision: 1221257

URL: http://svn.apache.org/viewvc?rev=1221257&view=rev
Log:
WICKET-4285
PageSavingThread.stop() blocks forever


Modified:
    
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
    
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java

Modified: 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java?rev=1221257&r1=1221256&r2=1221257&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
 (original)
+++ 
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/pageStore/AsynchronousDataStore.java
 Tue Dec 20 13:45:53 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();
        }
 
        /**
@@ -106,19 +103,17 @@ public class AsynchronousDataStore imple
        @Override
        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();
        }
@@ -325,8 +320,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;
@@ -334,18 +327,17 @@ 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;
                }
 
                @Override
                public void run()
                {
-                       while (destroy.get() == false)
+                       while (!Thread.interrupted())
                        {
                                Entry entry = null;
                                try
@@ -354,7 +346,7 @@ public class AsynchronousDataStore imple
                                }
                                catch (InterruptedException e)
                                {
-                                       log.error(e.getMessage(), e);
+                                       Thread.currentThread().interrupt();
                                }
 
                                if (entry != null)
@@ -364,11 +356,6 @@ public class AsynchronousDataStore imple
                                        entryMap.remove(getKey(entry));
                                }
                        }
-
-                       synchronized (destroy)
-                       {
-                               destroy.notify();
-                       }
                }
        }
 
@@ -378,4 +365,4 @@ public class AsynchronousDataStore imple
                // should not wrap in abother AsynchronousDataStore
                return false;
        }
-}
\ No newline at end of file
+}

Modified: 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java?rev=1221257&r1=1221256&r2=1221257&view=diff
==============================================================================
--- 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java
 (original)
+++ 
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/DiskDataStoreTest.java
 Tue Dec 20 13:45:53 2011
@@ -313,7 +313,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)
@@ -350,12 +350,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());
 


Reply via email to