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
