diff options
author | Eike Stepper | 2016-02-02 18:12:06 +0000 |
---|---|---|
committer | Eike Stepper | 2016-02-02 18:12:06 +0000 |
commit | 027042deaae7bc3d2d52e63e8dd1263eaa830aa9 (patch) | |
tree | d063d1eeb234a15a9fdae599abb903098f61547a | |
parent | 159858b31bee9d8c3e11b7f1111d78469da02a11 (diff) | |
download | cdo-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
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 */ |