Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2016-03-01 12:10:31 +0000
committerEike Stepper2016-03-01 12:10:31 +0000
commit49be90f741a86ae87796a3b45ad667b1ac1c21ab (patch)
tree898566e071193a909fa14ab5735545264e5cbe54 /plugins
parent5e2beb161a1e25874a10462de68522c5f2e53af7 (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/CDONet4jSessionConfigurationImpl.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java6
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_486458_Test.java52
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java12
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/view/CDOUnitManager.java4
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java64
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java5
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);

Back to the top