You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2018/07/16 21:32:24 UTC
wicket git commit: WICKET-6563 update javadoc
Repository: wicket
Updated Branches:
refs/heads/WICKET-6563 af606ac59 -> f08ab9049
WICKET-6563 update javadoc
IDataStore is no more, renamed test
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/f08ab904
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f08ab904
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f08ab904
Branch: refs/heads/WICKET-6563
Commit: f08ab904982571dfad1821d5201c6744a2501560
Parents: af606ac
Author: Sven Meier <sv...@apache.org>
Authored: Mon Jul 16 11:06:24 2018 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Mon Jul 16 11:06:31 2018 +0200
----------------------------------------------------------------------
.../java/org/apache/wicket/Application.java | 2 +-
.../core/util/string/ComponentRenderer.java | 2 +-
.../apache/wicket/pageStore/DiskPageStore.java | 12 +-
.../wicket/pageStore/IPersistentPageStore.java | 10 +-
.../wicket/pageStore/InMemoryPageStore.java | 4 +-
.../apache/wicket/settings/StoreSettings.java | 23 +-
.../pageStore/AsynchronousDataStoreTest.java | 4 +-
.../wicket/pageStore/DiskDataStoreTest.java | 429 -------------------
.../wicket/pageStore/DiskPageStoreTest.java | 429 +++++++++++++++++++
.../pageStore/disk/PageWindowManagerTest.java | 2 +-
.../browser/PersistedPagesProvider.java | 6 +-
.../diskstore/browser/PersistedPanel.java | 2 +-
.../browser/SessionIdentifiersModel.java | 4 +-
.../apache/wicket/jmx/StoreSettingsMBean.java | 2 +-
14 files changed, 465 insertions(+), 466 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/main/java/org/apache/wicket/Application.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Application.java b/wicket-core/src/main/java/org/apache/wicket/Application.java
index e1a0fb8..ab8c380 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Application.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Application.java
@@ -1024,7 +1024,7 @@ public abstract class Application implements UnboundListener, IEventSink
/** The Security Settings */
private SecuritySettings securitySettings;
- /** The settings for {@link IPageStore}, {@link IDataStore} and {@link IPageManager} */
+ /** The settings for {@link IPageStore} and {@link IPageManager} */
private StoreSettings storeSettings;
/** can the settings object be set/used. */
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java b/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
index 9104eb9..2b3d303 100644
--- a/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
+++ b/wicket-core/src/main/java/org/apache/wicket/core/util/string/ComponentRenderer.java
@@ -452,7 +452,7 @@ public class ComponentRenderer
private RenderPage(Component component)
{
- // do not store the page in IPageStore/IDataStore. WICKET-5422
+ // WICKET-5422 do not store the page in IPageStore
setStatelessHint(true);
String componentMarkup;
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
index 9bf2c19..f172e3f 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/DiskPageStore.java
@@ -61,7 +61,7 @@ public class DiskPageStore implements IPersistentPageStore
private static final String KEY = "wicket:DiskPageStore";
- private static final String INDEX_FILE_NAME = "DiskDataStoreIndex";
+ private static final String INDEX_FILE_NAME = "DiskPageStoreIndex";
/**
* A cache that holds all page stores.
@@ -131,7 +131,7 @@ public class DiskPageStore implements IPersistentPageStore
catch (SecurityException e)
{
throw new WicketRuntimeException(
- "SecurityException occurred while creating DiskDataStore. Consider using a non-disk based IDataStore implementation. "
+ "SecurityException occurred while creating DiskPageStore. Consider using a non-disk based IPageStore implementation. "
+ "See org.apache.wicket.Application.setPageManagerProvider(IPageManagerProvider)",
e);
}
@@ -341,7 +341,7 @@ public class DiskPageStore implements IPersistentPageStore
}
catch (Exception e)
{
- log.error("Couldn't load DiskDataStore index from file " + index + ".", e);
+ log.error("Couldn't load DiskPageStore index from file " + index + ".", e);
}
}
Files.remove(index);
@@ -381,13 +381,13 @@ public class DiskPageStore implements IPersistentPageStore
}
catch (Exception e)
{
- log.error("Couldn't write DiskDataStore index to file " + index + ".", e);
+ log.error("Couldn't write DiskPageStore index to file " + index + ".", e);
}
}
}
@Override
- public Set<String> getSessionIdentifiers()
+ public Set<String> getContextIdentifiers()
{
return Collections.unmodifiableSet(diskDatas.keySet());
}
@@ -414,7 +414,7 @@ public class DiskPageStore implements IPersistentPageStore
}
@Override
- public String getSessionIdentifier(IPageContext context)
+ public String getContextIdentifier(IPageContext context)
{
SessionAttribute sessionAttribute = getSessionAttribute(context, true);
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java
index b42746d..ab0ed24 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/IPersistentPageStore.java
@@ -30,20 +30,20 @@ public interface IPersistentPageStore extends IPageStore
/**
* Get the identifier for pages stored for the given context.
*/
- String getSessionIdentifier(IPageContext context);
+ String getContextIdentifier(IPageContext context);
/**
* Get the identifiers for all pages stored in all contexts.
*/
- Set<String> getSessionIdentifiers();
+ Set<String> getContextIdentifiers();
/**
- * Get information about all persisted pages with the given session identifier.
+ * Get information about all persisted pages with the given context identifier.
*/
- List<IPersistedPage> getPersistentPages(String sessionIdentifier);
+ List<IPersistedPage> getPersistentPages(String contextIdentifier);
/**
- * Get total size of all stored pages.
+ * Get total size of all pages stored in all contexts.
*
* @return
*/
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java b/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java
index 364b466..ccc054d 100644
--- a/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java
+++ b/wicket-core/src/main/java/org/apache/wicket/pageStore/InMemoryPageStore.java
@@ -156,13 +156,13 @@ public class InMemoryPageStore implements IPersistentPageStore
}
@Override
- public String getSessionIdentifier(IPageContext context)
+ public String getContextIdentifier(IPageContext context)
{
return context.getSessionId();
}
@Override
- public Set<String> getSessionIdentifiers()
+ public Set<String> getContextIdentifiers()
{
return datas.keySet();
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/main/java/org/apache/wicket/settings/StoreSettings.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/settings/StoreSettings.java b/wicket-core/src/main/java/org/apache/wicket/settings/StoreSettings.java
index 6e911d3..965258c 100644
--- a/wicket-core/src/main/java/org/apache/wicket/settings/StoreSettings.java
+++ b/wicket-core/src/main/java/org/apache/wicket/settings/StoreSettings.java
@@ -26,9 +26,8 @@ import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.lang.Bytes;
/**
- * A class for settings related to the the storages where page instances are persisted -
- * {@link org.apache.wicket.pageStore.IPageStore},
- * {@link org.apache.wicket.pageStore.IDataStore} and {@link org.apache.wicket.page.IPageManager}.
+ * A class for settings related to the the storages where page instances are persisted, used by
+ * {@link org.apache.wicket.pageStore.IPageStore} {@link org.apache.wicket.page.IPageManager}.
* <p>
* For more information about page storages read <a
* href="https://cwiki.apache.org/confluence/x/qIaoAQ">Page Storage - Wiki page</a>
@@ -63,7 +62,7 @@ public class StoreSettings
/**
* @return maximum page size. After this size is exceeded,
- * the {@link org.apache.wicket.pageStore.DiskDataStore} will start saving the
+ * the {@link org.apache.wicket.pageStore.DiskPageStore} will start saving the
* pages at the beginning of file.
*/
public Bytes getMaxSizePerSession()
@@ -73,7 +72,7 @@ public class StoreSettings
/**
* Sets the maximum size of the {@link File} where page instances per session are stored. After
- * reaching this size the {@link org.apache.wicket.pageStore.DiskDataStore} will start overriding the
+ * reaching this size the {@link org.apache.wicket.pageStore.DiskPageStore} will start overriding the
* oldest pages at the beginning of the file.
*
* @param maxSizePerSession
@@ -88,7 +87,7 @@ public class StoreSettings
}
/**
- * @return the location of the folder where {@link org.apache.wicket.pageStore.DiskDataStore} will store the files with page
+ * @return the location of the folder where {@link org.apache.wicket.pageStore.DiskPageStore} will store the files with page
* instances per session
*/
public File getFileStoreFolder()
@@ -119,7 +118,7 @@ public class StoreSettings
}
/**
- * Sets the folder where {@link org.apache.wicket.pageStore.DiskDataStore} will store the files with page instances per
+ * Sets the folder where {@link org.apache.wicket.pageStore.DiskPageStore} will store the files with page instances per
* session
*
* @param fileStoreFolder
@@ -134,7 +133,7 @@ public class StoreSettings
/**
* @return the capacity of the queue used to store the pages which will be stored asynchronously
- * @see org.apache.wicket.pageStore.AsynchronousDataStore
+ * @see org.apache.wicket.pageStore.AsynchronousPageStore
*/
public int getAsynchronousQueueCapacity()
{
@@ -146,7 +145,7 @@ public class StoreSettings
*
* @param queueCapacity
* the capacity of the queue
- * @see org.apache.wicket.pageStore.AsynchronousDataStore
+ * @see org.apache.wicket.pageStore.AsynchronousPageStore
* @return {@code this} object for chaining
*/
public StoreSettings setAsynchronousQueueCapacity(int queueCapacity)
@@ -161,9 +160,9 @@ public class StoreSettings
}
/**
- * Sets a flag whether to wrap the configured {@link org.apache.wicket.pageStore.IDataStore} with
- * {@link org.apache.wicket.pageStore.AsynchronousDataStore}. By doing this the HTTP worker thread will not wait for the
- * actual write of the page's bytes into the wrapped {@link org.apache.wicket.pageStore.IDataStore}.
+ * Sets a flag whether to wrap the configured {@link org.apache.wicket.pageStore.IPageStore} with
+ * {@link org.apache.wicket.pageStore.AsynchronousPageStore}. By doing this the HTTP worker thread will not wait for the
+ * actual write of the page's bytes into the wrapped {@link org.apache.wicket.pageStore.IPageStore}.
*
* @param async
* {@code true} to make it asynchronous, {@code false} - otherwise
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
index 7c0b0a7..d63fc46 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/AsynchronousDataStoreTest.java
@@ -26,7 +26,7 @@ import org.apache.wicket.page.IManageablePage;
import org.junit.Test;
/**
- * Tests for {@link AsynchronousDataStore}
+ * Tests for {@link AsynchronousPageStore}
*/
public class AsynchronousDataStoreTest
{
@@ -54,7 +54,7 @@ public class AsynchronousDataStoreTest
private static final SecureRandom RND = new SecureRandom();
/**
- * Executes random mutator and accessor operations on {@link AsynchronousDataStore} validating
+ * Executes random mutator and accessor operations on {@link AsynchronousPageStore} validating
* that the used data structures can be used simultaneously.
*
* @throws Exception
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java
deleted file mode 100644
index 1eb580a..0000000
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskDataStoreTest.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.wicket.pageStore;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.UUID;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.wicket.page.IManageablePage;
-import org.apache.wicket.serialize.java.JavaSerializer;
-import org.apache.wicket.settings.StoreSettings;
-import org.apache.wicket.util.SlowTests;
-import org.apache.wicket.util.lang.Bytes;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Test for {@link DiskDataStore}.
- */
-@Category(SlowTests.class)
-public class DiskDataStoreTest extends Assert
-{
- /** Log for reporting. */
- private static final Logger log = LoggerFactory.getLogger(DiskDataStoreTest.class);
-
- /**
- * Construct.
- */
- public DiskDataStoreTest()
- {
- }
-
- private static final Random random = new Random();
- private static final int FILE_SIZE_MIN = 1024 * 200;
- private static final int FILE_SIZE_MAX = 1024 * 300;
- private static final Bytes MAX_SIZE_PER_SESSION = Bytes.megabytes(10);
- private static final int SESSION_COUNT = 50;
- private static final int FILES_COUNT = 1000;
- private static final int SLEEP_MAX = 10;
- private static final int THREAD_COUNT = 20;
- private static final int READ_MODULO = 100;
-
- private static final ConcurrentHashMap<String, IPageContext> contexts = new ConcurrentHashMap<>();
-
- private static IPageContext getContext(String sessionId) {
- IPageContext context = new DummyPageContext();
-
- IPageContext existing = contexts.putIfAbsent(sessionId, context);
- return existing != null ? existing : context;
- }
-
- private static class TaskPage implements IManageablePage
- {
- private final String sessionId;
-
- private int id;
-
- private byte[] data;
-
- public TaskPage(String sessionId, int id)
- {
- this.sessionId = sessionId;
-
- this.id = id;
-
- int length = FILE_SIZE_MIN + random.nextInt(FILE_SIZE_MAX - FILE_SIZE_MIN);
- data = new byte[length];
- random.nextBytes(data);
- }
-
- public String getSessionId()
- {
- return sessionId;
- }
-
- public boolean check(TaskPage other)
- {
- if (other.data.length != other.data.length)
- {
- log.error("data.length != length");
- return false;
- }
- if (other.id != other.id)
- {
- log.error("data.id != id");
- return false;
- }
- if (other.sessionId != other.sessionId)
- {
- log.error("data.sessionId != sessionId");
- return false;
- }
- return true;
- }
-
- @Override
- public boolean isPageStateless()
- {
- return false;
- }
-
- @Override
- public int getPageId()
- {
- return id;
- }
-
- @Override
- public void detach()
- {
- }
-
- @Override
- public boolean setFreezePageId(boolean freeze)
- {
- return false;
- }
- }
-
- private final Map<String, AtomicInteger> sessionCounter = new ConcurrentHashMap<String, AtomicInteger>();
- private final ConcurrentLinkedQueue<TaskPage> pagesToSave = new ConcurrentLinkedQueue<TaskPage>();
- private final ConcurrentLinkedQueue<TaskPage> filesToRead1 = new ConcurrentLinkedQueue<TaskPage>();
- private final ConcurrentLinkedQueue<TaskPage> filesToRead2 = new ConcurrentLinkedQueue<TaskPage>();
-
- private final AtomicInteger read1Count = new AtomicInteger(0);
- private final AtomicInteger read2Count = new AtomicInteger(0);
- private final AtomicInteger saveCount = new AtomicInteger(0);
-
- private final AtomicBoolean saveDone = new AtomicBoolean(false);
- private final AtomicBoolean read1Done = new AtomicBoolean(false);
- private final AtomicBoolean read2Done = new AtomicBoolean(false);
-
- private final AtomicInteger failures = new AtomicInteger();
-
- private final AtomicInteger bytesWritten = new AtomicInteger(0);
- private final AtomicInteger bytesRead = new AtomicInteger(0);
-
- private final AtomicInteger saveTime = new AtomicInteger(0);
-
- private RuntimeException exceptionThrownByThread;
-
- private String randomSessionId()
- {
- List<String> s = new ArrayList<String>(sessionCounter.keySet());
- return s.get(random.nextInt(s.size()));
- }
-
- private int nextSessionId(String sessionId)
- {
- AtomicInteger i = sessionCounter.get(sessionId);
- return i.incrementAndGet();
- }
-
- private void generateFiles()
- {
- for (int i = 0; i < SESSION_COUNT; ++i)
- {
- sessionCounter.put(UUID.randomUUID().toString(), new AtomicInteger(0));
- }
- for (int i = 0; i < FILES_COUNT; ++i)
- {
- String session = randomSessionId();
- TaskPage file = new TaskPage(session, nextSessionId(session));
- long now = System.nanoTime();
- pagesToSave.add(file);
- long duration = System.nanoTime() - now;
- saveTime.addAndGet((int)duration);
- }
- }
-
- private IPageStore pageStore;
-
- /**
- * Stores RuntimeException into a field.
- */
- private abstract class ExceptionCapturingRunnable implements Runnable
- {
- @Override
- public final void run()
- {
- try
- {
- doRun();
- }
- catch (RuntimeException e)
- {
- exceptionThrownByThread = e;
- }
- }
-
- /**
- * Called by {@link #run()}. Thrown RuntimeExceptions are stores into a field for later
- * check.
- */
- protected abstract void doRun();
- }
-
- // Store/Save data in DataStore
- private class SaveRunnable extends ExceptionCapturingRunnable
- {
- @Override
- protected void doRun()
- {
- TaskPage page;
-
- while ((page = pagesToSave.poll()) != null || saveCount.get() < FILES_COUNT)
- {
- if (page != null)
- {
- pageStore.addPage(getContext(page.getSessionId()), page);
-
- if (saveCount.get() % READ_MODULO == 0)
- {
- filesToRead1.add(page);
- }
- saveCount.incrementAndGet();
- bytesWritten.addAndGet(page.data.length);
- }
-
- try
- {
- Thread.sleep(random.nextInt(SLEEP_MAX));
- }
- catch (InterruptedException e)
- {
- log.error(e.getMessage(), e);
- }
- }
-
- saveDone.set(true);
- }
- };
-
- // Read data from DataStore
- private class Read1Runnable extends ExceptionCapturingRunnable
- {
- @Override
- protected void doRun()
- {
- TaskPage page;
- while ((page = filesToRead1.poll()) != null || !saveDone.get())
- {
- if (page != null)
- {
- TaskPage other = (TaskPage)pageStore.getPage(getContext(page.getSessionId()), page.getPageId());
- if (page.check(other) == false)
- {
- failures.incrementAndGet();
- log.error("Detected error number: " + failures.get());
- }
- filesToRead2.add(page);
- read1Count.incrementAndGet();
- bytesRead.addAndGet(other.data.length);
- }
-
- try
- {
- Thread.sleep(random.nextInt(SLEEP_MAX));
- }
- catch (InterruptedException e)
- {
- log.error(e.getMessage(), e);
- }
- }
-
- read1Done.set(true);
- }
- };
-
- private class Read2Runnable extends ExceptionCapturingRunnable
- {
- @Override
- protected void doRun()
- {
- TaskPage page;
- while ((page = filesToRead2.poll()) != null || !read1Done.get())
- {
- if (page != null)
- {
- TaskPage other = (TaskPage)pageStore.getPage(getContext(page.getSessionId()), page.getPageId());
- if (page.check(other) == false)
- {
- failures.incrementAndGet();
- log.error("Detected error number: " + failures.get());
- }
- read2Count.incrementAndGet();
- bytesRead.addAndGet(other.data.length);
- }
-
- try
- {
- Thread.sleep(random.nextInt(SLEEP_MAX));
- }
- catch (InterruptedException e)
- {
- log.error(e.getMessage(), e);
- }
- }
-
- read2Done.set(true);
- }
- }
-
- private void doTestDataStore()
- {
- log.info("Starting...");
- long start = System.currentTimeMillis();
-
- for (int i = 0; i < THREAD_COUNT; ++i)
- {
- new Thread(new Read1Runnable()).start();
- }
-
- for (int i = 0; i < THREAD_COUNT; ++i)
- {
- new Thread(new Read2Runnable()).start();
- }
-
- for (int i = 0; i < THREAD_COUNT; ++i)
- {
- new Thread(new SaveRunnable()).start();
- }
-
- while (!(read1Done.get() && read2Done.get() && saveDone.get()))
- {
- try
- {
- Thread.sleep(50);
- }
- catch (InterruptedException e)
- {
- log.error(e.getMessage(), e);
- }
- }
-
- if (exceptionThrownByThread != null)
- {
- throw new RuntimeException("One of the worker threads failed.", exceptionThrownByThread);
- }
-
- long duration = System.currentTimeMillis() - start;
-
- 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.info("Average save time (ns): " + (double)saveTime.get() / (double)saveCount.get());
-
- assertEquals(0, failures.get());
-
- for (String s : sessionCounter.keySet())
- {
- pageStore.removeAllPages(getContext(s));
- }
- }
-
- /**
- * store()
- */
- @Test
- public void store()
- {
- generateFiles();
-
- StoreSettings storeSettings = new StoreSettings(null);
- File fileStoreFolder = storeSettings.getFileStoreFolder();
- int asynchronousQueueCapacity = storeSettings.getAsynchronousQueueCapacity();
-
- pageStore = new DiskPageStore("app1", fileStoreFolder, MAX_SIZE_PER_SESSION, new JavaSerializer("app1"));
- pageStore = new AsynchronousPageStore(pageStore, asynchronousQueueCapacity);
-
- doTestDataStore();
-
- pageStore.destroy();
- }
-
- /**
- * https://issues.apache.org/jira/browse/WICKET-4478
- *
- * Tests that the folder where a session data is put is partitioned, i.e.
- * it is put in folders which names are automatically calculated on the fly.
- */
- @Test
- public void sessionFolderName()
- {
- StoreSettings storeSettings = new StoreSettings(null);
- java.io.File fileStoreFolder = storeSettings.getFileStoreFolder();
- DiskPageStore store = new DiskPageStore("sessionFolderName", fileStoreFolder, MAX_SIZE_PER_SESSION, new JavaSerializer("sessionFolderName"));
-
- String sessionId = "abcdefg";
- java.io.File sessionFolder = store.getSessionFolder(sessionId, true);
- String absolutePath = sessionFolder.getAbsolutePath();
- assertTrue(absolutePath.contains("sessionFolderName-filestore"));
- assertTrue(absolutePath.contains("7141"));
- assertTrue(absolutePath.contains("1279"));
- assertTrue(absolutePath.contains("abcdefg"));
-
- DiskPageStore.DiskData sessionEntry = new DiskPageStore.DiskData(store, sessionId);
- sessionEntry.unbind();
- // assert that the 'sessionId' folder and the parents two levels up are removed
- assertFalse(sessionFolder.getParentFile().getParentFile().exists());
-
- }
-}
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java
new file mode 100644
index 0000000..0ed47dd
--- /dev/null
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/DiskPageStoreTest.java
@@ -0,0 +1,429 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.wicket.pageStore;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.wicket.page.IManageablePage;
+import org.apache.wicket.serialize.java.JavaSerializer;
+import org.apache.wicket.settings.StoreSettings;
+import org.apache.wicket.util.SlowTests;
+import org.apache.wicket.util.lang.Bytes;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Test for {@link DiskPageStore}.
+ */
+@Category(SlowTests.class)
+public class DiskPageStoreTest extends Assert
+{
+ /** Log for reporting. */
+ private static final Logger log = LoggerFactory.getLogger(DiskPageStoreTest.class);
+
+ /**
+ * Construct.
+ */
+ public DiskPageStoreTest()
+ {
+ }
+
+ private static final Random random = new Random();
+ private static final int FILE_SIZE_MIN = 1024 * 200;
+ private static final int FILE_SIZE_MAX = 1024 * 300;
+ private static final Bytes MAX_SIZE_PER_SESSION = Bytes.megabytes(10);
+ private static final int SESSION_COUNT = 50;
+ private static final int FILES_COUNT = 1000;
+ private static final int SLEEP_MAX = 10;
+ private static final int THREAD_COUNT = 20;
+ private static final int READ_MODULO = 100;
+
+ private static final ConcurrentHashMap<String, IPageContext> contexts = new ConcurrentHashMap<>();
+
+ private static IPageContext getContext(String sessionId) {
+ IPageContext context = new DummyPageContext();
+
+ IPageContext existing = contexts.putIfAbsent(sessionId, context);
+ return existing != null ? existing : context;
+ }
+
+ private static class TaskPage implements IManageablePage
+ {
+ private final String sessionId;
+
+ private int id;
+
+ private byte[] data;
+
+ public TaskPage(String sessionId, int id)
+ {
+ this.sessionId = sessionId;
+
+ this.id = id;
+
+ int length = FILE_SIZE_MIN + random.nextInt(FILE_SIZE_MAX - FILE_SIZE_MIN);
+ data = new byte[length];
+ random.nextBytes(data);
+ }
+
+ public String getSessionId()
+ {
+ return sessionId;
+ }
+
+ public boolean check(TaskPage other)
+ {
+ if (other.data.length != other.data.length)
+ {
+ log.error("data.length != length");
+ return false;
+ }
+ if (other.id != other.id)
+ {
+ log.error("data.id != id");
+ return false;
+ }
+ if (other.sessionId != other.sessionId)
+ {
+ log.error("data.sessionId != sessionId");
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isPageStateless()
+ {
+ return false;
+ }
+
+ @Override
+ public int getPageId()
+ {
+ return id;
+ }
+
+ @Override
+ public void detach()
+ {
+ }
+
+ @Override
+ public boolean setFreezePageId(boolean freeze)
+ {
+ return false;
+ }
+ }
+
+ private final Map<String, AtomicInteger> sessionCounter = new ConcurrentHashMap<String, AtomicInteger>();
+ private final ConcurrentLinkedQueue<TaskPage> pagesToSave = new ConcurrentLinkedQueue<TaskPage>();
+ private final ConcurrentLinkedQueue<TaskPage> filesToRead1 = new ConcurrentLinkedQueue<TaskPage>();
+ private final ConcurrentLinkedQueue<TaskPage> filesToRead2 = new ConcurrentLinkedQueue<TaskPage>();
+
+ private final AtomicInteger read1Count = new AtomicInteger(0);
+ private final AtomicInteger read2Count = new AtomicInteger(0);
+ private final AtomicInteger saveCount = new AtomicInteger(0);
+
+ private final AtomicBoolean saveDone = new AtomicBoolean(false);
+ private final AtomicBoolean read1Done = new AtomicBoolean(false);
+ private final AtomicBoolean read2Done = new AtomicBoolean(false);
+
+ private final AtomicInteger failures = new AtomicInteger();
+
+ private final AtomicInteger bytesWritten = new AtomicInteger(0);
+ private final AtomicInteger bytesRead = new AtomicInteger(0);
+
+ private final AtomicInteger saveTime = new AtomicInteger(0);
+
+ private RuntimeException exceptionThrownByThread;
+
+ private String randomSessionId()
+ {
+ List<String> s = new ArrayList<String>(sessionCounter.keySet());
+ return s.get(random.nextInt(s.size()));
+ }
+
+ private int nextSessionId(String sessionId)
+ {
+ AtomicInteger i = sessionCounter.get(sessionId);
+ return i.incrementAndGet();
+ }
+
+ private void generateFiles()
+ {
+ for (int i = 0; i < SESSION_COUNT; ++i)
+ {
+ sessionCounter.put(UUID.randomUUID().toString(), new AtomicInteger(0));
+ }
+ for (int i = 0; i < FILES_COUNT; ++i)
+ {
+ String session = randomSessionId();
+ TaskPage file = new TaskPage(session, nextSessionId(session));
+ long now = System.nanoTime();
+ pagesToSave.add(file);
+ long duration = System.nanoTime() - now;
+ saveTime.addAndGet((int)duration);
+ }
+ }
+
+ private IPageStore pageStore;
+
+ /**
+ * Stores RuntimeException into a field.
+ */
+ private abstract class ExceptionCapturingRunnable implements Runnable
+ {
+ @Override
+ public final void run()
+ {
+ try
+ {
+ doRun();
+ }
+ catch (RuntimeException e)
+ {
+ exceptionThrownByThread = e;
+ }
+ }
+
+ /**
+ * Called by {@link #run()}. Thrown RuntimeExceptions are stores into a field for later
+ * check.
+ */
+ protected abstract void doRun();
+ }
+
+ // Store/Save data in store
+ private class SaveRunnable extends ExceptionCapturingRunnable
+ {
+ @Override
+ protected void doRun()
+ {
+ TaskPage page;
+
+ while ((page = pagesToSave.poll()) != null || saveCount.get() < FILES_COUNT)
+ {
+ if (page != null)
+ {
+ pageStore.addPage(getContext(page.getSessionId()), page);
+
+ if (saveCount.get() % READ_MODULO == 0)
+ {
+ filesToRead1.add(page);
+ }
+ saveCount.incrementAndGet();
+ bytesWritten.addAndGet(page.data.length);
+ }
+
+ try
+ {
+ Thread.sleep(random.nextInt(SLEEP_MAX));
+ }
+ catch (InterruptedException e)
+ {
+ log.error(e.getMessage(), e);
+ }
+ }
+
+ saveDone.set(true);
+ }
+ };
+
+ // Read data from store
+ private class Read1Runnable extends ExceptionCapturingRunnable
+ {
+ @Override
+ protected void doRun()
+ {
+ TaskPage page;
+ while ((page = filesToRead1.poll()) != null || !saveDone.get())
+ {
+ if (page != null)
+ {
+ TaskPage other = (TaskPage)pageStore.getPage(getContext(page.getSessionId()), page.getPageId());
+ if (page.check(other) == false)
+ {
+ failures.incrementAndGet();
+ log.error("Detected error number: " + failures.get());
+ }
+ filesToRead2.add(page);
+ read1Count.incrementAndGet();
+ bytesRead.addAndGet(other.data.length);
+ }
+
+ try
+ {
+ Thread.sleep(random.nextInt(SLEEP_MAX));
+ }
+ catch (InterruptedException e)
+ {
+ log.error(e.getMessage(), e);
+ }
+ }
+
+ read1Done.set(true);
+ }
+ };
+
+ private class Read2Runnable extends ExceptionCapturingRunnable
+ {
+ @Override
+ protected void doRun()
+ {
+ TaskPage page;
+ while ((page = filesToRead2.poll()) != null || !read1Done.get())
+ {
+ if (page != null)
+ {
+ TaskPage other = (TaskPage)pageStore.getPage(getContext(page.getSessionId()), page.getPageId());
+ if (page.check(other) == false)
+ {
+ failures.incrementAndGet();
+ log.error("Detected error number: " + failures.get());
+ }
+ read2Count.incrementAndGet();
+ bytesRead.addAndGet(other.data.length);
+ }
+
+ try
+ {
+ Thread.sleep(random.nextInt(SLEEP_MAX));
+ }
+ catch (InterruptedException e)
+ {
+ log.error(e.getMessage(), e);
+ }
+ }
+
+ read2Done.set(true);
+ }
+ }
+
+ private void doTestStore()
+ {
+ log.info("Starting...");
+ long start = System.currentTimeMillis();
+
+ for (int i = 0; i < THREAD_COUNT; ++i)
+ {
+ new Thread(new Read1Runnable()).start();
+ }
+
+ for (int i = 0; i < THREAD_COUNT; ++i)
+ {
+ new Thread(new Read2Runnable()).start();
+ }
+
+ for (int i = 0; i < THREAD_COUNT; ++i)
+ {
+ new Thread(new SaveRunnable()).start();
+ }
+
+ while (!(read1Done.get() && read2Done.get() && saveDone.get()))
+ {
+ try
+ {
+ Thread.sleep(50);
+ }
+ catch (InterruptedException e)
+ {
+ log.error(e.getMessage(), e);
+ }
+ }
+
+ if (exceptionThrownByThread != null)
+ {
+ throw new RuntimeException("One of the worker threads failed.", exceptionThrownByThread);
+ }
+
+ long duration = System.currentTimeMillis() - start;
+
+ 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.info("Average save time (ns): " + (double)saveTime.get() / (double)saveCount.get());
+
+ assertEquals(0, failures.get());
+
+ for (String s : sessionCounter.keySet())
+ {
+ pageStore.removeAllPages(getContext(s));
+ }
+ }
+
+ /**
+ * store()
+ */
+ @Test
+ public void store()
+ {
+ generateFiles();
+
+ StoreSettings storeSettings = new StoreSettings(null);
+ File fileStoreFolder = storeSettings.getFileStoreFolder();
+ int asynchronousQueueCapacity = storeSettings.getAsynchronousQueueCapacity();
+
+ pageStore = new DiskPageStore("app1", fileStoreFolder, MAX_SIZE_PER_SESSION, new JavaSerializer("app1"));
+ pageStore = new AsynchronousPageStore(pageStore, asynchronousQueueCapacity);
+
+ doTestStore();
+
+ pageStore.destroy();
+ }
+
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-4478
+ *
+ * Tests that the folder where a session data is put is partitioned, i.e.
+ * it is put in folders which names are automatically calculated on the fly.
+ */
+ @Test
+ public void sessionFolderName()
+ {
+ StoreSettings storeSettings = new StoreSettings(null);
+ java.io.File fileStoreFolder = storeSettings.getFileStoreFolder();
+ DiskPageStore store = new DiskPageStore("sessionFolderName", fileStoreFolder, MAX_SIZE_PER_SESSION, new JavaSerializer("sessionFolderName"));
+
+ String sessionId = "abcdefg";
+ java.io.File sessionFolder = store.getSessionFolder(sessionId, true);
+ String absolutePath = sessionFolder.getAbsolutePath();
+ assertTrue(absolutePath.contains("sessionFolderName-filestore"));
+ assertTrue(absolutePath.contains("7141"));
+ assertTrue(absolutePath.contains("1279"));
+ assertTrue(absolutePath.contains("abcdefg"));
+
+ DiskPageStore.DiskData sessionEntry = new DiskPageStore.DiskData(store, sessionId);
+ sessionEntry.unbind();
+ // assert that the 'sessionId' folder and the parents two levels up are removed
+ assertFalse(sessionFolder.getParentFile().getParentFile().exists());
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java b/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java
index 9f1bd55..1f0243b 100644
--- a/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/pageStore/disk/PageWindowManagerTest.java
@@ -207,7 +207,7 @@ public class PageWindowManagerTest extends Assert
private static final SecureRandom RND = new SecureRandom();
/**
- * Executes random mutator and accessor operations on {@link org.apache.wicket.pageStore.AsynchronousDataStore} validating
+ * Executes random mutator and accessor operations on {@link org.apache.wicket.pageStore.AsynchronousPageStore} validating
* that the used data structures can be used simultaneously.
*
* @throws Exception
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPagesProvider.java
----------------------------------------------------------------------
diff --git a/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPagesProvider.java b/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPagesProvider.java
index 2b1ffe0..62abfaf 100644
--- a/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPagesProvider.java
+++ b/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPagesProvider.java
@@ -73,11 +73,11 @@ class PersistedPagesProvider extends SortableDataProvider<IPersistedPage, String
{
String sessId = sessionId.getObject();
- IPersistentPageStore dataStore = store.getObject();
+ IPersistentPageStore persistentPagesStore = store.getObject();
- if (dataStore != null)
+ if (persistentPagesStore != null)
{
- pages.addAll(dataStore.getPersistentPages(sessId));
+ pages.addAll(persistentPagesStore.getPersistentPages(sessId));
}
}
}
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPanel.java
----------------------------------------------------------------------
diff --git a/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPanel.java b/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPanel.java
index d0e071c..4705f5d 100644
--- a/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPanel.java
+++ b/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/PersistedPanel.java
@@ -151,7 +151,7 @@ public class PersistedPanel extends GenericPanel<IPersistentPageStore>
IPageContext context = new DefaultPageContext(Session.get());
- return store.getSessionIdentifier(context);
+ return store.getContextIdentifier(context);
}
private DataTable<IPersistedPage, String> createTable(String id, IModel<String> sessionId)
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/SessionIdentifiersModel.java
----------------------------------------------------------------------
diff --git a/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/SessionIdentifiersModel.java b/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/SessionIdentifiersModel.java
index e778a96..06592b9 100644
--- a/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/SessionIdentifiersModel.java
+++ b/wicket-devutils/src/main/java/org/apache/wicket/devutils/diskstore/browser/SessionIdentifiersModel.java
@@ -49,10 +49,10 @@ public class SessionIdentifiersModel extends LoadableDetachableModel<List<String
return Collections.emptyList();
}
- ArrayList<String> identifiers = new ArrayList<>(store.getSessionIdentifiers());
+ ArrayList<String> identifiers = new ArrayList<>(store.getContextIdentifiers());
IPageContext context = new DefaultPageContext(Session.get());
- String current = store.getSessionIdentifier(context);
+ String current = store.getContextIdentifier(context);
if (identifiers.contains(current) == false)
{
// identifiers of the store seem no to match their sessions ids,
http://git-wip-us.apache.org/repos/asf/wicket/blob/f08ab904/wicket-jmx/src/main/java/org/apache/wicket/jmx/StoreSettingsMBean.java
----------------------------------------------------------------------
diff --git a/wicket-jmx/src/main/java/org/apache/wicket/jmx/StoreSettingsMBean.java b/wicket-jmx/src/main/java/org/apache/wicket/jmx/StoreSettingsMBean.java
index 4e18730..079019e 100644
--- a/wicket-jmx/src/main/java/org/apache/wicket/jmx/StoreSettingsMBean.java
+++ b/wicket-jmx/src/main/java/org/apache/wicket/jmx/StoreSettingsMBean.java
@@ -43,7 +43,7 @@ public interface StoreSettingsMBean
/**
* @return {@code true} when the HTTP worker thread doesn't wait for the storing of the page's
- * bytes in {@link IDataStore}
+ * bytes in {@link IPageStore}
*/
boolean isAsynchronous();
}