Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2007-09-18 15:51:05 +0000
committerEike Stepper2007-09-18 15:51:05 +0000
commitc561762431c67d37c46ca1de7a0788473a1b3c6d (patch)
tree779c77a1aeb80b4ba065323af8c298475b5439d7 /plugins/org.eclipse.net4j.tests
parentf89cf319aa1a1a725882947c9702a8e4ba52515d (diff)
downloadcdo-c561762431c67d37c46ca1de7a0788473a1b3c6d.tar.gz
cdo-c561762431c67d37c46ca1de7a0788473a1b3c6d.tar.xz
cdo-c561762431c67d37c46ca1de7a0788473a1b3c6d.zip
[203538] Limit memory consumption in CDORevisionResolverImpl
https://bugs.eclipse.org/bugs/show_bug.cgi?id=203538
Diffstat (limited to 'plugins/org.eclipse.net4j.tests')
-rw-r--r--plugins/org.eclipse.net4j.tests/CacheTest.launch (renamed from plugins/org.eclipse.net4j.tests/Net4j MonitorTest.launch)6
-rw-r--r--plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch16
-rw-r--r--plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch16
-rw-r--r--plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch16
-rw-r--r--plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java54
-rw-r--r--plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java81
-rw-r--r--plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java156
7 files changed, 295 insertions, 50 deletions
diff --git a/plugins/org.eclipse.net4j.tests/Net4j MonitorTest.launch b/plugins/org.eclipse.net4j.tests/CacheTest.launch
index 42c7782088..63894f3870 100644
--- a/plugins/org.eclipse.net4j.tests/Net4j MonitorTest.launch
+++ b/plugins/org.eclipse.net4j.tests/CacheTest.launch
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/MonitorTest.java"/>
+<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="1"/>
@@ -9,11 +9,13 @@
<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.util.tests.MonitorTest"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.util.tests.cache.CacheTest"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xms10M&#13;&#10;-Xmx100M"/>
</launchConfiguration>
diff --git a/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch b/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch
deleted file mode 100644
index 666182b471..0000000000
--- a/plugins/org.eclipse.net4j.tests/Net4j SignalTest.launch
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.tests.SignalTest"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/SignalTest.java"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-</launchConfiguration>
diff --git a/plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch b/plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch
deleted file mode 100644
index 1dee27575d..0000000000
--- a/plugins/org.eclipse.net4j.tests/Net4j SynchronizingCorrelatorTest.launch
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.net4j.tests"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.util.tests.SynchronizingCorrelatorTest"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/>
-</launchConfiguration>
diff --git a/plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch b/plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch
deleted file mode 100644
index 7d0ee890f0..0000000000
--- a/plugins/org.eclipse.net4j.tests/Net4j TCPTransportTest.launch
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.net4j.tests/src/org/eclipse/net4j/tests/TCPTransportTest.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit3"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.net4j.tests.TCPTransportTest"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.net4j.tests"/>
-</launchConfiguration>
diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java
new file mode 100644
index 0000000000..2d1f72a1ff
--- /dev/null
+++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/CacheTest.java
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ **************************************************************************/
+package org.eclipse.net4j.util.tests.cache;
+
+import org.eclipse.net4j.internal.util.cache.CacheMonitor;
+import org.eclipse.net4j.internal.util.cache.ThresholdConditionPolicy;
+import org.eclipse.net4j.util.cache.ICacheMonitor.ConditionPolicy;
+import org.eclipse.net4j.util.tests.AbstractOMTest;
+
+/**
+ * @author Eike Stepper
+ */
+public class CacheTest extends AbstractOMTest
+{
+ public void testLifecycle() throws Exception
+ {
+ ConditionPolicy conditionPolicy = new ThresholdConditionPolicy(1000000L, 10000000L);
+
+ CacheMonitor cacheMonitor = new CacheMonitor();
+ cacheMonitor.setConditionPolicy(conditionPolicy);
+ cacheMonitor.setPauseRED(100L);
+ cacheMonitor.setPauseYELLOW(100L);
+ cacheMonitor.setPauseGREEN(100L);
+ cacheMonitor.setDaemon(true);
+ cacheMonitor.activate();
+
+ RevisionManager revisionManager = new RevisionManager();
+ revisionManager.setCacheMonitor(cacheMonitor);
+ revisionManager.activate();
+
+ for (int version = 1; version <= 10; version++)
+ {
+ for (int id = 1; id <= 100; id++)
+ {
+ Revision revision = revisionManager.getRevision(id, version);
+ Thread.sleep(20);
+ }
+
+ System.gc();
+ Thread.sleep(1000);
+ }
+
+ revisionManager.deactivate();
+ cacheMonitor.deactivate();
+ }
+}
diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java
new file mode 100644
index 0000000000..1dd267e128
--- /dev/null
+++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/Revision.java
@@ -0,0 +1,81 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ **************************************************************************/
+package org.eclipse.net4j.util.tests.cache;
+
+import java.lang.ref.PhantomReference;
+import java.lang.ref.ReferenceQueue;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Eike Stepper
+ */
+public class Revision
+{
+ private int id;
+
+ private int version;
+
+ private byte[] data = new byte[100000];
+
+ public Revision(int id, int version)
+ {
+ this.id = id;
+ this.version = version;
+ }
+
+ public int getID()
+ {
+ return id;
+ }
+
+ public int getVersion()
+ {
+ return version;
+ }
+
+ public byte[] getData()
+ {
+ return data;
+ }
+
+ @Override
+ public String toString()
+ {
+ return "R" + id + "v" + version;
+ }
+
+ @SuppressWarnings("unchecked")
+ private static Set finalized = new HashSet();
+
+ @SuppressWarnings("unchecked")
+ private static List refs = new ArrayList();
+
+ @SuppressWarnings("unchecked")
+ private static ReferenceQueue queue = new ReferenceQueue();
+
+ @Override
+ protected void finalize() throws Throwable
+ {
+ System.err.println("FINALIZE " + this);
+ long token = id;
+ token <<= 32;
+ token |= version;
+ if (!finalized.add(token))
+ {
+ System.err.println("************************************************************************");
+ }
+
+ refs.add(new PhantomReference<Revision>(this, queue));
+ }
+}
diff --git a/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java
new file mode 100644
index 0000000000..9b4fa66973
--- /dev/null
+++ b/plugins/org.eclipse.net4j.tests/src/org/eclipse/net4j/util/tests/cache/RevisionManager.java
@@ -0,0 +1,156 @@
+/***************************************************************************
+ * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ **************************************************************************/
+package org.eclipse.net4j.util.tests.cache;
+
+import org.eclipse.net4j.internal.util.cache.Cache;
+
+import java.lang.ref.Reference;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Eike Stepper
+ */
+public class RevisionManager extends Cache<Revision>
+{
+ private Map<Integer, TimeLine> timeLines = new HashMap<Integer, TimeLine>();
+
+ public RevisionManager()
+ {
+ }
+
+ public Revision getRevision(int id, int version)
+ {
+ TimeLine timeLine = timeLines.get(id);
+ if (timeLine == null)
+ {
+ timeLine = new TimeLine(id);
+ timeLines.put(id, timeLine);
+ }
+
+ return timeLine.getRevision(version);
+ }
+
+ public void evictElements(int elementCount)
+ {
+ }
+
+ protected Revision loadRevision(int id, int version)
+ {
+ Revision revision = new Revision(id, version);
+ System.out.println("Loaded " + revision + " (free=" + Runtime.getRuntime().freeMemory() + ", total="
+ + Runtime.getRuntime().totalMemory() + ", max=" + Runtime.getRuntime().maxMemory() + ")");
+ return revision;
+ }
+
+ protected int getRevisionSize(Revision revision)
+ {
+ return 1;
+ }
+
+ @Override
+ protected void unreachableElement(Reference<? extends Revision> reference)
+ {
+ System.out.println("Unreachable: " + reference);
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private class TimeLine
+ {
+ private int id;
+
+ private List<Reference<Revision>> revisions = new ArrayList<Reference<Revision>>();
+
+ public TimeLine(int id)
+ {
+ this.id = id;
+ }
+
+ public int getID()
+ {
+ return id;
+ }
+
+ public Revision getRevision(int version)
+ {
+ for (Iterator<Reference<Revision>> it = revisions.iterator(); it.hasNext();)
+ {
+ Reference<Revision> reference = it.next();
+ Revision revision = reference.get();
+ if (revision != null)
+ {
+ if (revision.getVersion() == version)
+ {
+ return revision;
+ }
+ }
+ else
+ {
+ it.remove();
+ break;
+ }
+ }
+
+ long time = System.currentTimeMillis();
+ Revision revision = loadRevision(id, version);
+ time = System.currentTimeMillis() - time;
+ int size = getRevisionSize(revision);
+
+ revisions.add(new CacheElement(revision, getReferenceQueue()));
+ return revision;
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class CacheElement extends WeakReference<Revision>
+ {
+ private int id;
+
+ private int version;
+
+ public CacheElement(Revision revision, ReferenceQueue<Revision> queue)
+ {
+ super(revision, queue);
+ id = revision.getID();
+ version = revision.getVersion();
+ }
+
+ public int getID()
+ {
+ return id;
+ }
+
+ public int getVersion()
+ {
+ return version;
+ }
+
+ public Revision getRevision()
+ {
+ return get();
+ }
+
+ @Override
+ public String toString()
+ {
+ return "Ref" + id + "v" + version + (get() == null ? " cleared" : " set");
+ }
+ }
+}

Back to the top