Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2016-02-02 18:12:06 +0000
committerEike Stepper2016-02-02 18:12:06 +0000
commit027042deaae7bc3d2d52e63e8dd1263eaa830aa9 (patch)
treed063d1eeb234a15a9fdae599abb903098f61547a
parent159858b31bee9d8c3e11b7f1111d78469da02a11 (diff)
downloadcdo-027042deaae7bc3d2d52e63e8dd1263eaa830aa9.tar.gz
cdo-027042deaae7bc3d2d52e63e8dd1263eaa830aa9.tar.xz
cdo-027042deaae7bc3d2d52e63e8dd1263eaa830aa9.zip
486458: Provide support for optimized loading and notifying of object units
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=486458
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnitIndication.java60
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/UnitManager.java33
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnit.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnitManager.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java3
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnit.java2
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnitManager.java2
10 files changed, 77 insertions, 35 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
index 6b68a0f219..33a959b419 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
@@ -594,7 +594,7 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
if (repository.isSupportingUnits())
{
InternalUnitManager unitManager = repository.getUnitManager();
- objectAttacher = unitManager.attachObjects(context); // TODO Fork a monitor.
+ objectAttacher = unitManager.attachObjects(context);
}
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java
index 21e0d908cf..31581f12f7 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java
@@ -144,8 +144,6 @@ public abstract class AbstractHorizontalClassMapping implements IClassMapping, I
primaryKey.addIndexField(branchField);
}
- int xxx;
- // table.addIndex(IDBIndex.Type.NON_UNIQUE, ATTRIBUTES_ID, ATTRIBUTES_REVISED);
table.addIndex(IDBIndex.Type.NON_UNIQUE, ATTRIBUTES_REVISED);
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnitIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnitIndication.java
index f7046aeb34..c15a20e533 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnitIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnitIndication.java
@@ -20,6 +20,7 @@ import org.eclipse.emf.cdo.server.IUnitManager;
import org.eclipse.emf.cdo.spi.server.InternalView;
import org.eclipse.net4j.util.om.monitor.OMMonitor;
+import org.eclipse.net4j.util.om.monitor.OMMonitor.Async;
import java.io.IOException;
@@ -61,39 +62,50 @@ public class UnitIndication extends CDOServerReadIndicationWithMonitoring
final RuntimeException[] runtimeException = { null };
InternalView view = getView(viewID);
- boolean success = view.openUnit(rootID, opcode == CDOProtocolConstants.UNIT_CREATE, new CDORevisionHandler()
+ monitor.begin();
+ Async async = monitor.forkAsync();
+
+ try
{
- public boolean handleRevision(CDORevision revision)
+ boolean success = view.openUnit(rootID, opcode == CDOProtocolConstants.UNIT_CREATE, new CDORevisionHandler()
{
- try
- {
- out.writeCDORevision(revision, CDORevision.UNCHUNKED); // Exposes revision to client side
- return true;
- }
- catch (IOException ex)
+ public boolean handleRevision(CDORevision revision)
{
- ioException[0] = ex;
- }
- catch (RuntimeException ex)
- {
- runtimeException[0] = ex;
+ try
+ {
+ out.writeCDORevision(revision, CDORevision.UNCHUNKED); // Exposes revision to client side
+ return true;
+ }
+ catch (IOException ex)
+ {
+ ioException[0] = ex;
+ }
+ catch (RuntimeException ex)
+ {
+ runtimeException[0] = ex;
+ }
+
+ return false;
}
+ });
- return false;
+ if (ioException[0] != null)
+ {
+ throw ioException[0];
}
- }, monitor);
- if (ioException[0] != null)
- {
- throw ioException[0];
- }
+ if (runtimeException[0] != null)
+ {
+ throw runtimeException[0];
+ }
- if (runtimeException[0] != null)
+ out.writeCDORevision(null, CDORevision.UNCHUNKED); // No more revisions
+ out.writeBoolean(success);
+ }
+ finally
{
- throw runtimeException[0];
+ async.stop();
+ monitor.done();
}
-
- out.writeCDORevision(null, CDORevision.UNCHUNKED); // No more revisions
- out.writeBoolean(success);
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/UnitManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/UnitManager.java
index beef8860ab..d7fb635664 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/UnitManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/UnitManager.java
@@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
import org.eclipse.emf.cdo.common.revision.CDORevisionProvider;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
+import org.eclipse.emf.cdo.common.util.CDOException;
import org.eclipse.emf.cdo.server.IStoreAccessor.UnitSupport;
import org.eclipse.emf.cdo.server.IUnit;
import org.eclipse.emf.cdo.server.IUnitManager;
@@ -88,8 +89,6 @@ public class UnitManager extends Container<IUnit> implements InternalUnitManager
{
checkActive();
- int xxx; // TODO Check that units are not nested.
-
WriteLock writeLock = managerLock.writeLock();
UnitInitializer unitInitializer;
boolean hook = false;
@@ -118,6 +117,9 @@ public class UnitManager extends Container<IUnit> implements InternalUnitManager
}
else
{
+ checkNotNested(rootID, view, units.keySet());
+ checkNotNested(rootID, view, unitInitializers.keySet());
+
unitInitializer = createUnitInitializer(rootID, view, revisionHandler);
// No need to synchronize on unitInitializers because all other access holds the manager lock.
@@ -193,6 +195,26 @@ public class UnitManager extends Container<IUnit> implements InternalUnitManager
return unit;
}
+ private void checkNotNested(CDOID rootID, IView view, Set<CDOID> unitIDs)
+ {
+ InternalCDORevision rootRevision = (InternalCDORevision)view.getRevision(rootID);
+ CDOID unitID = getUnit(rootRevision, view, unitIDs);
+ if (unitID != null)
+ {
+ throw new CDOException("Attempt to nest the new unit " + rootID + " in the existing unit " + unitID);
+ }
+
+ Set<CDOID> set = Collections.singleton(rootID);
+ for (CDOID id : unitIDs)
+ {
+ InternalCDORevision revision = (InternalCDORevision)view.getRevision(id);
+ if (getUnit(revision, view, set) != null)
+ {
+ throw new CDOException("Attempt to nest the existing unit " + id + " in the new unit " + rootID);
+ }
+ }
+ }
+
public IUnit getUnit(CDOID rootID)
{
checkActive();
@@ -372,7 +394,7 @@ public class UnitManager extends Container<IUnit> implements InternalUnitManager
Map<CDOID, CDOID> unitMappings)
{
UnitSupport storeAccessor = (UnitSupport)commitContext.getAccessor();
- storeAccessor.writeUnits(unitMappings, timeStamp); // TODO Fork a monitor.
+ storeAccessor.writeUnits(unitMappings, timeStamp);
}
protected void createUnitHook1()
@@ -385,6 +407,11 @@ public class UnitManager extends Container<IUnit> implements InternalUnitManager
private static CDOID getUnit(InternalCDORevision revision, CDORevisionProvider revisionProvider, Set<CDOID> rootIDs)
{
+ if (rootIDs.isEmpty())
+ {
+ return null;
+ }
+
CDOID id = revision.getID();
if (rootIDs.contains(id))
{
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java
index 90b546b400..8afb616608 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java
@@ -33,7 +33,6 @@ import org.eclipse.emf.cdo.spi.server.InternalView;
import org.eclipse.net4j.util.AdapterUtil;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.lifecycle.Lifecycle;
-import org.eclipse.net4j.util.om.monitor.OMMonitor;
import org.eclipse.net4j.util.options.IOptionsContainer;
import org.eclipse.net4j.util.registry.HashMapRegistry;
import org.eclipse.net4j.util.registry.IRegistry;
@@ -206,7 +205,7 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio
this.durableLockingID = durableLockingID;
}
- public boolean openUnit(CDOID rootID, boolean create, CDORevisionHandler revisionHandler, OMMonitor monitor)
+ public boolean openUnit(CDOID rootID, boolean create, CDORevisionHandler revisionHandler)
{
IUnitManager unitManager = repository.getUnitManager();
IUnit unit = unitManager.getUnit(rootID);
@@ -227,7 +226,6 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio
return false;
}
- int xxx; // TODO Use monitor?
unit.open(this, revisionHandler);
}
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnit.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnit.java
index a41352d478..be18cfa165 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnit.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnit.java
@@ -14,6 +14,8 @@ import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
/**
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
* @author Eike Stepper
* @since 4.5
*/
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnitManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnitManager.java
index 6c373e9383..15523d76e9 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnitManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IUnitManager.java
@@ -16,6 +16,8 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
import org.eclipse.net4j.util.container.IContainer;
/**
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
* @author Eike Stepper
* @since 4.5
*/
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java
index 1127725369..57f1fbdb10 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalView.java
@@ -17,7 +17,6 @@ import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
import org.eclipse.emf.cdo.server.IView;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
-import org.eclipse.net4j.util.om.monitor.OMMonitor;
import java.util.List;
@@ -61,5 +60,5 @@ public interface InternalView extends IView, ILifecycle
/**
* @since 4.5
*/
- public boolean openUnit(CDOID rootID, boolean create, CDORevisionHandler revisionHandler, OMMonitor monitor);
+ public boolean openUnit(CDOID rootID, boolean create, CDORevisionHandler revisionHandler);
}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnit.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnit.java
index 26acbe17e0..19e79e6cdd 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnit.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnit.java
@@ -13,6 +13,8 @@ package org.eclipse.emf.cdo.view;
import org.eclipse.emf.ecore.EObject;
/**
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
* @author Eike Stepper
* @since 4.5
*/
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnitManager.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnitManager.java
index d31139c633..fd94f255b7 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnitManager.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnitManager.java
@@ -17,6 +17,8 @@ import org.eclipse.net4j.util.container.IContainer;
import org.eclipse.emf.ecore.EObject;
/**
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
* @author Eike Stepper
* @since 4.5
*/

Back to the top