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