Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-01-22 00:14:51 +0000
committerEike Stepper2010-01-22 00:14:51 +0000
commitecf7ffef01bba12b83b4c5d5333e2657b5cd9f6e (patch)
treeb3060cbbca728000002d0162e91083d4c5470109
parent5b98326f18dd7185e1e17dea2e48bf131ad5c6e5 (diff)
downloadcdo-ecf7ffef01bba12b83b4c5d5333e2657b5cd9f6e.tar.gz
cdo-ecf7ffef01bba12b83b4c5d5333e2657b5cd9f6e.tar.xz
cdo-ecf7ffef01bba12b83b4c5d5333e2657b5cd9f6e.zip
[270716] Provide support for branching
https://bugs.eclipse.org/bugs/show_bug.cgi?id=270716
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java14
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java18
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java15
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java13
4 files changed, 33 insertions, 27 deletions
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 2143061773..b1000d693f 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
@@ -239,11 +239,17 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi
else if (revision.getClass() == PointerCDORevision.class)
{
CDOBranchVersion target = ((PointerCDORevision)revision).getTarget();
- revision = getCachedRevisionByVersion(revision.getID(), target);
- if (revision == null && loadOnDemand)
+ InternalCDORevision targetRevision = getCachedRevisionByVersion(revision.getID(), target);
+ if (targetRevision == null && loadOnDemand)
{
info = new MissingRevisionInfo.ExactlyKnown(id, target);
+ if (revisedPointers != null && target instanceof CDORevision)
+ {
+ revisedPointers.put((CDORevision)target, revision.getRevised());
+ }
}
+
+ revision = targetRevision;
}
}
else
@@ -290,9 +296,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi
revisions.set(i, missingRevision);
addRevision(missingRevision);
- if (supportingBranches && //
- info.getType() != MissingRevisionInfo.Type.EXACTLY_KNOWN && //
- missingRevision.getBranch() != branch)
+ if (missingRevision.getBranch() != branch && info.getType() == MissingRevisionInfo.Type.EXACTLY_KNOWN)
{
long revised = info.getRevised();
if (revisedPointers != null)
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java
index 88e4f460d0..66f15a9d58 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java
@@ -156,16 +156,17 @@ public interface InternalCDORevisionManager extends CDORevisionManager, CDORevis
public void writeResult(CDODataOutput out, CDOBranch branch, CDORevision revision, int referenceChunk)
throws IOException
{
- if (revision.getBranch() != branch)
+ if (revision == null)
{
- out.writeByte(POINTER_REVISION);
+ out.writeByte(DETACHED_REVISION);
out.writeLong(revised);
- out.writeCDORevision(revision, referenceChunk);
+ throw new RuntimeException();
}
- else if (revision == null)
+ else if (revision.getBranch() != branch)
{
- out.writeByte(DETACHED_REVISION);
+ out.writeByte(POINTER_REVISION);
out.writeLong(revised);
+ out.writeCDORevision(revision, referenceChunk);
}
else
{
@@ -212,10 +213,13 @@ public interface InternalCDORevisionManager extends CDORevisionManager, CDORevis
{
case MISSING:
return new MissingRevisionInfo(in);
+
case POSSIBLY_AVAILABLE:
return new PossiblyAvailable(in);
+
case EXACTLY_KNOWN:
return new ExactlyKnown(in);
+
default:
throw new IOException(); // Can not happen
}
@@ -293,11 +297,12 @@ public interface InternalCDORevisionManager extends CDORevisionManager, CDORevis
public void writeResult(CDODataOutput out, CDOBranch branch, CDORevision revision, int referenceChunk)
throws IOException
{
- boolean useAvailable = revision.getBranch().equals(available.getBranch())
+ boolean useAvailable = revision.getBranch() == available.getBranch()
&& revision.getVersion() == available.getVersion();
if (useAvailable)
{
out.writeByte(NO_REVISION);
+ out.writeLong(getRevised());
}
else
{
@@ -310,6 +315,7 @@ public interface InternalCDORevisionManager extends CDORevisionManager, CDORevis
{
if (resultType == NO_REVISION)
{
+ setRevised(in.readLong());
return (InternalCDORevision)available;
}
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
index 500d6dc744..864103ddcf 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java
@@ -251,21 +251,22 @@ public class Repository extends Container<Object> implements InternalRepository
int prefetchDepth)
{
CDOID id = info.getID();
+ CDOBranch branch = branchPoint.getBranch();
+
switch (info.getType())
{
case MISSING:
- case POSSIBLY_AVAILABLE: // This one is optimized by the caller
+ case POSSIBLY_AVAILABLE:
IStoreAccessor accessor = StoreThreadLocal.getAccessor();
InternalCDORevision revision = accessor.readRevision(id, branchPoint, referenceChunk, revisionManager);
if (revision == null && supportingBranches)
{
- CDOBranch branch = branchPoint.getBranch();
if (!branch.isMainBranch())
{
revision = loadRevsionTarget(id, branchPoint, referenceChunk, accessor);
if (revision != null)
{
- long revised = loadRevisionRevised(id, branch, branchPoint.getTimeStamp());
+ long revised = loadRevisionRevised(id, branch);
info.setRevised(revised);
}
}
@@ -300,17 +301,13 @@ public class Repository extends Container<Object> implements InternalRepository
return null;
}
- private long loadRevisionRevised(CDOID id, CDOBranch branch, long timeStamp)
+ private long loadRevisionRevised(CDOID id, CDOBranch branch)
{
InternalCDORevision revision = loadRevisionByVersion(id, branch.getVersion(CDORevision.FIRST_VERSION),
CDORevision.UNCHUNKED);
if (revision != null)
{
- long revised = revision.getTimeStamp() - 1;
- if (timeStamp <= revised)
- {
- return revised;
- }
+ return revision.getTimeStamp() - 1;
}
return CDORevision.UNSPECIFIED_DATE;
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java
index 05e5ac6a1e..7964de78a7 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/BranchingTest.java
@@ -18,7 +18,6 @@ import org.eclipse.emf.cdo.common.commit.CDOCommit;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.eresource.CDOResource;
-import org.eclipse.emf.cdo.server.IMEMStore;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.model1.OrderDetail;
@@ -59,6 +58,7 @@ public class BranchingTest extends AbstractCDOTest
protected void closeSession1()
{
session1.close();
+ session1 = null;
}
protected CDOSession openSession2()
@@ -223,8 +223,10 @@ public class BranchingTest extends AbstractCDOTest
assertEquals("CDO", product.getName());
orderDetail.setPrice(10);
+
commit = transaction.commit();
assertEquals(subBranch, commit.getBranch());
+
long commitTime2 = commit.getTimeStamp();
transaction.close();
closeSession1();
@@ -238,11 +240,6 @@ public class BranchingTest extends AbstractCDOTest
check(session, mainBranch, commitTime2, 5, "CDO");
check(session, mainBranch, CDOBranchPoint.UNSPECIFIED_DATE, 5, "CDO");
check(session, subBranch, commitTime1, 5, "CDO");
-
- IMEMStore store = (IMEMStore)getRepository().getStore();
- dump("MEMStore", store.getAllRevisions());
- dump("ServerCache", getRepository().getRevisionManager().getCache().getAllRevisions());
-
check(session, subBranch, commitTime2, 10, "CDO");
check(session, subBranch, CDOBranchPoint.UNSPECIFIED_DATE, 10, "CDO");
session.close();
@@ -253,12 +250,14 @@ public class BranchingTest extends AbstractCDOTest
CDOView view = session.openView(branch, timeStamp);
CDOResource resource = view.getResource("/res");
+ dump("ClientCache", ((InternalCDOSession)session).getRevisionManager().getCache().getAllRevisions());
OrderDetail orderDetail = (OrderDetail)resource.getContents().get(1);
- dump("ServerCache", getRepository().getRevisionManager().getCache().getAllRevisions());
+
dump("ClientCache", ((InternalCDOSession)session).getRevisionManager().getCache().getAllRevisions());
assertEquals(price, orderDetail.getPrice());
Product1 product = orderDetail.getProduct();
+ dump("ClientCache", ((InternalCDOSession)session).getRevisionManager().getCache().getAllRevisions());
assertEquals(name, product.getName());
view.close();

Back to the top