diff options
author | Eike Stepper | 2016-03-01 12:10:31 +0000 |
---|---|---|
committer | Eike Stepper | 2016-03-01 12:10:31 +0000 |
commit | 49be90f741a86ae87796a3b45ad667b1ac1c21ab (patch) | |
tree | 898566e071193a909fa14ab5735545264e5cbe54 /plugins | |
parent | 5e2beb161a1e25874a10462de68522c5f2e53af7 (diff) | |
download | cdo-49be90f741a86ae87796a3b45ad667b1ac1c21ab.tar.gz cdo-49be90f741a86ae87796a3b45ad667b1ac1c21ab.tar.xz cdo-49be90f741a86ae87796a3b45ad667b1ac1c21ab.zip |
[486458] Provide support for optimized loading and notifying of object units
Add setAutoResourceUnitsEnabled().
https://bugs.eclipse.org/bugs/show_bug.cgi?id=486458
Diffstat (limited to 'plugins')
7 files changed, 141 insertions, 4 deletions
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java index b49fdedb4f..b470e091e5 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java @@ -187,7 +187,7 @@ public class CDONet4jSessionConfigurationImpl extends CDOSessionConfigurationImp authenticating = result.isAuthenticating(); supportingAudits = result.isSupportingAudits(); supportingBranches = result.isSupportingBranches(); - supportingUnits = result.isSupportingBranches(); + supportingUnits = result.isSupportingUnits(); serializingCommits = result.isEnsuringReferentialIntegrity(); ensuringReferentialIntegrity = result.isEnsuringReferentialIntegrity(); idGenerationLocation = result.getIDGenerationLocation(); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java index 6f47da9e11..28c5a50666 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java @@ -30,6 +30,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionKey; import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; import org.eclipse.emf.cdo.common.security.CDOPermission; +import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; import org.eclipse.emf.cdo.server.IStoreAccessor; import org.eclipse.emf.cdo.session.CDOCollectionLoadingPolicy; import org.eclipse.emf.cdo.session.CDORepositoryInfo; @@ -284,6 +285,11 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd // Do nothing } + public void resourceLoaded(CDOResourceImpl resource, boolean loaded) + { + // Do nothing + } + public void prefetchRevisions(CDOID id, int depth) { throw new UnsupportedOperationException(); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_486458_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_486458_Test.java index 307085d04b..27fcf4b7ee 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_486458_Test.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_486458_Test.java @@ -42,6 +42,7 @@ import org.eclipse.emf.cdo.util.UnitIntegrityException; import org.eclipse.emf.cdo.view.CDOAdapterPolicy; import org.eclipse.emf.cdo.view.CDOUnit; import org.eclipse.emf.cdo.view.CDOUnitManager; +import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.net4j.util.io.IOUtil; @@ -358,6 +359,51 @@ public class Bugzilla_486458_Test extends AbstractCDOTest assertEquals("Name2", sibling.getName()); } + public void testResourceUnits() throws Exception + { + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + transaction.getUnitManager().setAutoResourceUnitsEnabled(true); + + System.out.print("Committed: "); + for (int i = 0; i < 5; i++) + { + CDOResource resource = transaction.createResource(getResourcePath("test" + i)); + + Company company = getModel1Factory().createCompany(); + addUnique(resource.getContents(), company); + fillCompany(company); + } + + long start = System.currentTimeMillis(); + transaction.commit(); + long stop = System.currentTimeMillis(); + System.out.println(stop - start); + + session.close(); + clearCache(getRepository().getRevisionManager()); + session = openSession(); + + CDOView view = session.openView(); + view.getUnitManager().setAutoResourceUnitsEnabled(true); + + for (int i = 0; i < 5; i++) + { + CDOResource resource = view.getResource(getResourcePath("test" + i)); + iterateResource(resource); + } + + assertEquals(5, view.getUnitManager().getOpenUnits().length); + + for (int i = 0; i < 5; i++) + { + CDOResource resource = view.getResource(getResourcePath("test" + i)); + resource.unload(); + } + + assertEquals(0, view.getUnitManager().getOpenUnits().length); + } + private void fillRepository() throws ConcurrentAccessException, CommitException { CDOSession session = openSession(); @@ -366,6 +412,7 @@ public class Bugzilla_486458_Test extends AbstractCDOTest for (int i = 0; i < 3; i++) { + System.out.print("Committed: "); Company company = getModel1Factory().createCompany(); addUnique(resource.getContents(), company); fillCompany(company); @@ -373,7 +420,7 @@ public class Bugzilla_486458_Test extends AbstractCDOTest long start = System.currentTimeMillis(); transaction.commit(); long stop = System.currentTimeMillis(); - System.out.println("Committed: " + (stop - start)); + System.out.println(stop - start); } session.close(); @@ -453,6 +500,7 @@ public class Bugzilla_486458_Test extends AbstractCDOTest private static int iterateResource(CDOResource resource) { + System.out.print("Iterated: "); int count = 1; long start = System.currentTimeMillis(); @@ -463,7 +511,7 @@ public class Bugzilla_486458_Test extends AbstractCDOTest } long stop = System.currentTimeMillis(); - System.out.println("Iterated: " + (stop - start)); + System.out.println(stop - start); return count; } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java index 2f18d54f73..017d0fcae2 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java @@ -1230,6 +1230,12 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, } } + if (!root) + { + InternalCDOView view = cdoView(); + view.resourceLoaded(this, true); + } + Notification notification = setLoaded(true); if (notification != null) { @@ -1534,7 +1540,11 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements CDOResource, */ public void unload() { - // Do nothing + if (!root) + { + InternalCDOView view = cdoView(); + view.resourceLoaded(this, false); + } } /** 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 daeb10de43..af17664096 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 @@ -38,6 +38,10 @@ public interface CDOUnitManager extends IContainer<CDOUnit> public CDOUnit[] getOpenUnits(); + public boolean isAutoResourceUnitsEnabled(); + + public void setAutoResourceUnitsEnabled(boolean enabled); + /** * @author Eike Stepper */ diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java index 7ed5c6122c..d3079a793e 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java @@ -36,6 +36,8 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionsLoadedEvent; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.common.util.CDOCommonUtil; import org.eclipse.emf.cdo.common.util.CDOException; +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; import org.eclipse.emf.cdo.spi.common.lock.InternalCDOLockState; @@ -1817,6 +1819,14 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv return id; } + public void resourceLoaded(CDOResourceImpl resource, boolean loaded) + { + if (session.getRepositoryInfo().isSupportingUnits()) + { + unitManager.resourceLoaded(resource, loaded); + } + } + public final CDOUnitManagerImpl getUnitManager() { return unitManager; @@ -1835,6 +1845,8 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv private Set<CDOID> openingIDs; + private Map<CDOResource, CDOUnit> resourceUnits; + public CDOUnitManagerImpl() { } @@ -1984,6 +1996,38 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv } } + public synchronized boolean isAutoResourceUnitsEnabled() + { + return resourceUnits != null; + } + + public synchronized void setAutoResourceUnitsEnabled(boolean enabled) + { + if (enabled) + { + resourceUnits = new HashMap<CDOResource, CDOUnit>(); + } + else + { + resourceUnits = null; + } + } + + public synchronized void resourceLoaded(CDOResourceImpl resource, boolean loaded) + { + if (resourceUnits != null) + { + if (loaded) + { + loadResource(resource); + } + else + { + unloadResource(resource); + } + } + } + @Override protected void doDeactivate() throws Exception { @@ -1992,6 +2036,26 @@ public class CDOViewImpl extends AbstractCDOView implements IExecutorServiceProv super.doDeactivate(); } + private void loadResource(CDOResource resource) + { + CDOUnit unit = resourceUnits.get(resource); + if (unit == null) + { + CDOUnitManager unitManager = resource.cdoView().getUnitManager(); + unit = unitManager.openUnit(resource, true, null); + resourceUnits.put(resource, unit); + } + } + + private void unloadResource(CDOResource resource) + { + CDOUnit unit = resourceUnits.remove(resource); + if (unit != null) + { + unit.close(); + } + } + private EObject getParent(EObject object) { EObject parent = object.eContainer(); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java index 84c5513f6a..73a0a7481a 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java @@ -99,6 +99,11 @@ public interface InternalCDOView extends CDOView, CDOIDProvider, ILifecycle public void attachResource(CDOResourceImpl resource); /** + * @since 4.5 + */ + public void resourceLoaded(CDOResourceImpl resource, boolean loaded); + + /** * @since 3.0 */ public void handleObjectStateChanged(InternalCDOObject object, CDOState oldState, CDOState newState); |