diff options
author | Eike Stepper | 2021-11-02 04:02:33 +0000 |
---|---|---|
committer | Eike Stepper | 2021-11-02 04:02:33 +0000 |
commit | 66dd86865699b0177027f2a05bb75ad86c712377 (patch) | |
tree | ab166457a399c75bca0f21bd2efa00dae5cda527 /plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common | |
parent | 10903b6669e6979e0b29435fe8e1ffdac6b1a4c3 (diff) | |
download | cdo-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')
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; |