Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2021-11-02 04:02:33 +0000
committerEike Stepper2021-11-02 04:02:33 +0000
commit66dd86865699b0177027f2a05bb75ad86c712377 (patch)
treeab166457a399c75bca0f21bd2efa00dae5cda527 /plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common
parent10903b6669e6979e0b29435fe8e1ffdac6b1a4c3 (diff)
downloadcdo-66dd86865699b0177027f2a05bb75ad86c712377.tar.gz
cdo-66dd86865699b0177027f2a05bb75ad86c712377.tar.xz
cdo-66dd86865699b0177027f2a05bb75ad86c712377.zip
[576893] Implement a CDOPrefetcherManager to prefetch and cache all valid revisions for a CDOViewSet
https://bugs.eclipse.org/bugs/show_bug.cgi?id=576893
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java29
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java107
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java15
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java12
5 files changed, 107 insertions, 58 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
index 14ef402913..eea8e4ba3b 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
@@ -14,11 +14,13 @@ package org.eclipse.emf.cdo.internal.common.revision;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchManager;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
import org.eclipse.emf.cdo.internal.common.bundle.OM;
+import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache;
@@ -33,6 +35,9 @@ import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
/**
* @author Eike Stepper
@@ -122,6 +127,30 @@ public abstract class AbstractCDORevisionCache extends Lifecycle implements Inte
}
@Override
+ public List<CDORevision> getCurrentRevisions()
+ {
+ List<CDORevision> currentRevisions = new ArrayList<>();
+ forEachCurrentRevision(r -> currentRevisions.add(r));
+ return currentRevisions;
+ }
+
+ @Override
+ public void forEachValidRevision(CDOBranchPoint branchPoint, boolean considerBranchBases, Consumer<CDORevision> consumer)
+ {
+ checkBranch(branchPoint.getBranch());
+
+ forEachRevision(r -> CDOBranchUtil.forEachBranchPoint(branchPoint, considerBranchBases, bp -> {
+ if (r.isValid(bp))
+ {
+ consumer.accept(r);
+ return false;
+ }
+
+ return true; // Walk up the branch tree.
+ }));
+ }
+
+ @Override
public final CDORevision removeRevision(CDOID id, CDOBranchVersion branchVersion)
{
referenceQueue.clean();
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
index 423304a896..99be854a9c 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
@@ -37,6 +37,7 @@ import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.function.Consumer;
+import java.util.function.Function;
import java.util.function.Supplier;
/**
@@ -63,10 +64,10 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
{
synchronized (revisionLists)
{
- RevisionList revisionList = revisionLists.get(id);
- if (revisionList != null && !revisionList.isEmpty())
+ RevisionList list = revisionLists.get(id);
+ if (list != null && !list.isEmpty())
{
- Reference<InternalCDORevision> ref = revisionList.getFirst();
+ Reference<InternalCDORevision> ref = list.getFirst();
InternalCDORevision revision = ref.get();
if (revision != null)
{
@@ -81,15 +82,10 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
@Override
public InternalCDORevision getRevision(CDOID id, CDOBranchPoint branchPoint)
{
- checkBranch(branchPoint.getBranch());
-
- RevisionList revisionList = getRevisionList(id, branchPoint.getBranch());
- if (revisionList != null)
- {
- return revisionList.getRevision(branchPoint.getTimeStamp());
- }
+ CDOBranch branch = branchPoint.getBranch();
+ checkBranch(branch);
- return null;
+ return withRevisionList(id, branch, list -> list.getRevision(branchPoint.getTimeStamp()));
}
@Override
@@ -98,64 +94,39 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
CDOBranch branch = branchVersion.getBranch();
checkBranch(branch);
- RevisionList revisionList = getRevisionList(id, branch);
- if (revisionList != null)
- {
- return revisionList.getRevisionByVersion(branchVersion.getVersion());
- }
-
- return null;
+ return withRevisionList(id, branch, list -> list.getRevisionByVersion(branchVersion.getVersion()));
}
@Override
- public List<CDORevision> getCurrentRevisions()
+ public void forEachCurrentRevision(Consumer<CDORevision> consumer)
{
- List<CDORevision> currentRevisions = new ArrayList<>();
- forEachCurrentRevision(r -> currentRevisions.add(r));
- return currentRevisions;
+ forEachRevisionList(list -> {
+ InternalCDORevision revision = list.getRevision(CDORevision.UNSPECIFIED_DATE);
+ if (revision != null)
+ {
+ consumer.accept(revision);
+ }
+ });
}
@Override
- public void forEachCurrentRevision(Consumer<CDORevision> consumer)
+ public void forEachRevision(Consumer<CDORevision> consumer)
{
- synchronized (revisionLists)
- {
- for (RevisionList revisionList : revisionLists.values())
- {
- InternalCDORevision revision = revisionList.getRevision(CDORevision.UNSPECIFIED_DATE);
- if (revision != null)
- {
- consumer.accept(revision);
- }
- }
- }
+ forEachRevisionList(list -> list.forEachRevision(consumer));
}
@Override
public Map<CDOBranch, List<CDORevision>> getAllRevisions()
{
Map<CDOBranch, List<CDORevision>> result = new HashMap<>();
- synchronized (revisionLists)
- {
- for (RevisionList list : revisionLists.values())
- {
- list.getAllRevisions(result);
- }
- }
-
+ forEachRevisionList(list -> list.getAllRevisions(result));
return result;
}
@Override
public void getAllRevisions(List<InternalCDORevision> result)
{
- synchronized (revisionLists)
- {
- for (RevisionList list : revisionLists.values())
- {
- list.getAllRevisions(result);
- }
- }
+ forEachRevisionList(list -> list.getAllRevisions(result));
}
@Override
@@ -298,12 +269,34 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
return true;
}
- protected RevisionList getRevisionList(CDOID id, CDOBranch branch)
+ // protected RevisionList getRevisionList(CDOID id, CDOBranch branch)
+ // {
+ // return withRevisionList(id, branch, list -> list);
+ // }
+
+ protected <T> T withRevisionList(CDOID id, CDOBranch branch, Function<RevisionList, T> function)
{
Object key = createKey(id, branch);
synchronized (revisionLists)
{
- return revisionLists.get(key);
+ RevisionList list = revisionLists.get(key);
+ if (list != null)
+ {
+ return function.apply(list);
+ }
+ }
+
+ return null;
+ }
+
+ protected void forEachRevisionList(Consumer<RevisionList> consumer)
+ {
+ synchronized (revisionLists)
+ {
+ for (RevisionList revisionList : revisionLists.values())
+ {
+ consumer.accept(revisionList);
+ }
}
}
@@ -396,6 +389,18 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
return null;
}
+ public void forEachRevision(Consumer<CDORevision> consumer)
+ {
+ for (Reference<InternalCDORevision> ref : this)
+ {
+ InternalCDORevision revision = ref.get();
+ if (revision != null)
+ {
+ consumer.accept(revision);
+ }
+ }
+ }
+
public CDORevision addRevision(CDORevision revision, Supplier<Reference<InternalCDORevision>> referenceCreator)
{
int version = revision.getVersion();
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
index 2dc2a99723..17c3ea4a72 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
@@ -112,22 +112,25 @@ public class CDORevisionCacheNonAuditing extends AbstractCDORevisionCache
}
@Override
- public List<CDORevision> getCurrentRevisions()
+ public void forEachCurrentRevision(Consumer<CDORevision> consumer)
{
- List<CDORevision> currentRevisions = new ArrayList<>();
- forEachCurrentRevision(r -> currentRevisions.add(r));
- return currentRevisions;
+ forEachRevision(r -> {
+ if (!r.isHistorical())
+ {
+ consumer.accept(r);
+ }
+ });
}
@Override
- public void forEachCurrentRevision(Consumer<CDORevision> consumer)
+ public void forEachRevision(Consumer<CDORevision> consumer)
{
synchronized (revisions)
{
for (Reference<InternalCDORevision> ref : revisions.values())
{
InternalCDORevision revision = ref.get();
- if (revision != null && !revision.isHistorical())
+ if (revision != null)
{
consumer.accept(revision);
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java
index 405ecc2c51..2fcd637a14 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java
@@ -379,7 +379,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi
List<RevisionInfo> infosToLoad = createRevisionInfos(ids, branchPoint, prefetchDepth, loadOnDemand, allInfos);
if (infosToLoad != null)
{
- // Load the requested revision infos, then process and return additional revisions.
+ // Load the requested revision infos, then process the additional revisions.
loadRevisions(infosToLoad, branchPoint, referenceChunk, prefetchDepth, additionalRevisions, consumer);
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java
index a8ece823e1..743bb966d6 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java
@@ -69,6 +69,18 @@ public class NOOPRevisionCache extends Lifecycle implements InternalCDORevisionC
// Do nothing.
}
+ @Override
+ public void forEachValidRevision(CDOBranchPoint branchPoint, boolean considerBranchBases, Consumer<CDORevision> consumer)
+ {
+ // Do nothing.
+ }
+
+ @Override
+ public void forEachRevision(Consumer<CDORevision> consumer)
+ {
+ // Do nothing.
+ }
+
public InternalCDORevision getRevision(CDOID id)
{
return null;

Back to the top