Updated Branches:
  refs/heads/master 3dea2aca9 -> dfc566742

WICKET-4572 DiskDataStore returns the wrong page when the page disk space is 
full


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/dfc56674
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/dfc56674
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/dfc56674

Branch: refs/heads/master
Commit: dfc566742e48f666efe24592c01d688cb0922e5d
Parents: 3dea2ac
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Mon May 28 12:47:45 2012 +0300
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Mon May 28 12:49:00 2012 +0300

----------------------------------------------------------------------
 .../apache/wicket/pageStore/PageWindowManager.java |   23 +++++++++-
 .../persistent/disk/PageWindowManagerTest.java     |   35 +++++++++++++++
 2 files changed, 56 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/dfc56674/wicket-core/src/main/java/org/apache/wicket/pageStore/PageWindowManager.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/pageStore/PageWindowManager.java 
b/wicket-core/src/main/java/org/apache/wicket/pageStore/PageWindowManager.java
index 0f2faa6..03887bb 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/pageStore/PageWindowManager.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/pageStore/PageWindowManager.java
@@ -64,6 +64,11 @@ public class PageWindowManager implements Serializable
         */
        private IntHashMap<Integer> idToWindowIndex = null;
 
+       /**
+        * Inversed index of #idToWindowIndex
+        */
+       private IntHashMap<Integer> windowIndexToPageId = null;
+
        /** index of last added page */
        private int indexPointer = -1;
 
@@ -84,7 +89,13 @@ public class PageWindowManager implements Serializable
        {
                if (idToWindowIndex != null && pageId != -1 && windowIndex != 
-1)
                {
+                       Integer oldPageId = 
windowIndexToPageId.remove(windowIndex);
+                       if (oldPageId != null)
+                       {
+                               idToWindowIndex.remove(oldPageId);
+                       }
                        idToWindowIndex.put(pageId, windowIndex);
+                       windowIndexToPageId.put(windowIndex, pageId);
                }
        }
 
@@ -94,7 +105,11 @@ public class PageWindowManager implements Serializable
         */
        private void removeWindowIndex(int pageId)
        {
-               idToWindowIndex.remove(pageId);
+               Integer windowIndex = idToWindowIndex.remove(pageId);
+               if (windowIndex != null)
+               {
+                       windowIndexToPageId.remove(windowIndex);
+               }
        }
 
        /**
@@ -104,6 +119,8 @@ public class PageWindowManager implements Serializable
        {
                idToWindowIndex = null;
                idToWindowIndex = new IntHashMap<Integer>();
+               windowIndexToPageId = null;
+               windowIndexToPageId = new IntHashMap<Integer>();
                for (int i = 0; i < windows.size(); ++i)
                {
                        PageWindowInternal window = windows.get(i);
@@ -195,6 +212,7 @@ public class PageWindowManager implements Serializable
                }
 
                idToWindowIndex = null;
+               windowIndexToPageId = null;
        }
 
        /**
@@ -213,6 +231,7 @@ public class PageWindowManager implements Serializable
 
                        windows.remove(index + 1);
                        idToWindowIndex = null; // reset index
+                       windowIndexToPageId = null;
                }
        }
 
@@ -364,7 +383,7 @@ public class PageWindowManager implements Serializable
                }
 
                // if we are not going to reuse a page window (because it's not 
on
-               // indexPointor position or because we didn't find it), 
increment the
+               // indexPointer position or because we didn't find it), 
increment the
                // indexPointer
                if (index == -1 || index != indexPointer)
                {

http://git-wip-us.apache.org/repos/asf/wicket/blob/dfc56674/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
index ddfd242..44b5d71 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/page/persistent/disk/PageWindowManagerTest.java
@@ -27,6 +27,41 @@ import org.junit.Test;
 public class PageWindowManagerTest extends Assert
 {
        /**
+        * https://issues.apache.org/jira/browse/WICKET-4572
+        */
+       @Test
+       public void removeObsoleteIndices()
+       {
+               int page0id = 0,
+                       page1id = 1,
+                       page2id = 2;
+               int maxSize = 10;
+
+               PageWindowManager manager = new PageWindowManager(maxSize);
+
+               // Add few pages.
+               // All of them fully occupy the max space in the 
pageWindowManager.
+               // So adding N+1st page removes the Nth page.
+               manager.createPageWindow(page0id, maxSize);
+               PageWindow page0Window = manager.getPageWindow(page0id);
+               assertWindow(page0Window, page0id, 
page0Window.getFilePartOffset(), page0Window.getFilePartSize());
+
+               manager.createPageWindow(page1id, maxSize);
+               PageWindow page1Window = manager.getPageWindow(page1id);
+               assertWindow(page1Window, page1id, 
page1Window.getFilePartOffset(), page1Window.getFilePartSize());
+
+               // Try to get a page which has been lost with the adding of 
page1
+               assertNull("Page0 must be lost when Page1 has been added.", 
manager.getPageWindow(page0id));
+
+               manager.createPageWindow(page2id, maxSize);
+               PageWindow page2Window = manager.getPageWindow(page2id);
+               assertWindow(page2Window, page2id, 
page2Window.getFilePartOffset(), page2Window.getFilePartSize());
+
+               // Try to get a page which has been lost with the adding of 
page2
+               assertNull("Page1 must be lost when Page2 has been added.", 
manager.getPageWindow(page1id));
+       }
+
+       /**
         * 
         */
        @Test

Reply via email to