You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/05/28 11:48:27 UTC
git commit: WICKET-4572 DiskDataStore returns the wrong page when the
page disk space is full
Updated Branches:
refs/heads/wicket-1.5.x 0e9c60ff9 -> fcf001a21
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/fcf001a2
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/fcf001a2
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/fcf001a2
Branch: refs/heads/wicket-1.5.x
Commit: fcf001a21da0626e36fddd98b9b98a1a2e21c02d
Parents: 0e9c60f
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Mon May 28 12:47:45 2012 +0300
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Mon May 28 12:47:45 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/fcf001a2/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/fcf001a2/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