Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-04-26 06:38:50 +0000
committerEike Stepper2010-04-26 06:38:50 +0000
commit5ae7f4d2f33c4b21a78a49d90c4ba96b9b8f29c7 (patch)
treeb2dddaab92a95a88bdb5ffbe95179eaaa3a46fd2
parentff22caff9e471cca4865ec8398245341e0d2440c (diff)
downloadcdo-5ae7f4d2f33c4b21a78a49d90c4ba96b9b8f29c7.tar.gz
cdo-5ae7f4d2f33c4b21a78a49d90c4ba96b9b8f29c7.tar.xz
cdo-5ae7f4d2f33c4b21a78a49d90c4ba96b9b8f29c7.zip
[256936] Support for Offline Mode
https://bugs.eclipse.org/bugs/show_bug.cgi?id=256936
-rw-r--r--plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/AllTestsDBH2Offline.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java11
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineDelayedTest.java74
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java8
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java71
5 files changed, 153 insertions, 16 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/AllTestsDBH2Offline.java b/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/AllTestsDBH2Offline.java
index c414a50a5c..2fed5d1204 100644
--- a/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/AllTestsDBH2Offline.java
+++ b/plugins/org.eclipse.emf.cdo.tests.db/src/org/eclipse/emf/cdo/tests/db/AllTestsDBH2Offline.java
@@ -14,7 +14,7 @@ import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.server.db.CDODBUtil;
import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
-import org.eclipse.emf.cdo.tests.OfflineTest;
+import org.eclipse.emf.cdo.tests.OfflineDelayedTest;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest;
import org.eclipse.net4j.db.DBUtil;
@@ -72,7 +72,8 @@ public class AllTestsDBH2Offline extends DBConfigs
// super.initTestClasses(testClasses);
// testClasses.add(OfflineRawTest.class);
- testClasses.add(OfflineTest.class);
+ testClasses.add(OfflineDelayedTest.class);
+ // testClasses.add(OfflineTest.class);
// testClasses.add(FailoverTest.class);
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java
index f91953fe6e..50a732f045 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AbstractSyncingTest.java
@@ -60,11 +60,15 @@ public abstract class AbstractSyncingTest extends AbstractCDOTest
Map<String, Object> testProperties = super.getTestProperties();
testProperties.put(OfflineConfig.PROP_TEST_RAW_REPLICATION, isRawReplication());
testProperties.put(OfflineConfig.PROP_TEST_SQUEEZE_COMMIT_INFOS, isSqueezedCommitInfos());
+ testProperties.put(OfflineConfig.PROP_TEST_DELAYED_COMMIT_HANDLING, getTestDelayedCommitHandling());
testProperties.put(OfflineConfig.PROP_TEST_FAILOVER, isFailover());
return testProperties;
}
- protected abstract boolean isFailover();
+ protected boolean isFailover()
+ {
+ return false;
+ }
protected boolean isRawReplication()
{
@@ -76,6 +80,11 @@ public abstract class AbstractSyncingTest extends AbstractCDOTest
return false;
}
+ protected Object getTestDelayedCommitHandling()
+ {
+ return null;
+ }
+
protected static void checkEvent(TestListener listener, int newPackageUnits, int newObjects, int changedObjects,
int detachedObjects)
{
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineDelayedTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineDelayedTest.java
new file mode 100644
index 0000000000..3614c27262
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineDelayedTest.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests;
+
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.spi.server.InternalRepository;
+import org.eclipse.emf.cdo.tests.model1.Company;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+
+import org.eclipse.net4j.util.event.IEvent;
+
+/**
+ * @author Eike Stepper
+ */
+public class OfflineDelayedTest extends AbstractSyncingTest
+{
+ private Object lock = new Object();
+
+ @Override
+ protected Object getTestDelayedCommitHandling()
+ {
+ return lock;
+ }
+
+ public void testSyncWhileCommittingToMaster() throws Exception
+ {
+ TestListener listener = new TestListener();
+ InternalRepository clone = getRepository();
+ waitForOnline(clone);
+
+ {
+ getOfflineConfig().stopMasterTransport();
+ waitForOffline(clone);
+
+ CDOSession masterSession = openSession(clone.getName() + "_master");
+ CDOTransaction masterTransaction = masterSession.openTransaction();
+ CDOResource masterResource = masterTransaction.createResource("/master/resource");
+
+ masterResource.getContents().add(getModel1Factory().createCompany());
+ masterTransaction.commit();
+
+ masterResource.getContents().add(getModel1Factory().createCompany());
+ masterTransaction.commit();
+
+ masterTransaction.close();
+ masterSession.addListener(listener);
+
+ getOfflineConfig().startMasterTransport();
+ waitForOnline(clone);
+ }
+
+ Company company = getModel1Factory().createCompany();
+ company.setName("Test");
+
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource("/my/resource");
+
+ resource.getContents().add(company);
+ transaction.commit();
+
+ IEvent[] events = listener.getEvents();
+ assertEquals(1, events.length);
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java
index 8e6676fa5b..a668d8f38c 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/OfflineTest.java
@@ -34,12 +34,6 @@ import java.util.List;
*/
public class OfflineTest extends AbstractSyncingTest
{
- @Override
- protected boolean isFailover()
- {
- return false;
- }
-
public void testMasterCommits_ArrivalInClone() throws Exception
{
CDOSession session = openSession(getRepository().getName() + "_master");
@@ -344,7 +338,7 @@ public class OfflineTest extends AbstractSyncingTest
transaction.commit();
}
- public void testSqueezedCommitInfos_Initial() throws Exception
+ public void testManyCommitInfos_Initial() throws Exception
{
OfflineClone clone = (OfflineClone)getRepository();
waitForOnline(clone);
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java
index d7ca5bdbfe..26cd42e9c3 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java
@@ -11,8 +11,10 @@
*/
package org.eclipse.emf.cdo.tests.config.impl;
+import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.internal.common.revision.CDORevisionManagerImpl;
import org.eclipse.emf.cdo.internal.common.revision.cache.noop.NOOPRevisionCache;
+import org.eclipse.emf.cdo.internal.server.syncing.OfflineClone;
import org.eclipse.emf.cdo.internal.server.syncing.RepositorySynchronizer;
import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
import org.eclipse.emf.cdo.net4j.CDOSessionConfiguration;
@@ -30,12 +32,14 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.spi.server.InternalRepositorySynchronizer;
import org.eclipse.emf.cdo.spi.server.InternalSessionManager;
+import org.eclipse.emf.cdo.spi.server.InternalStore;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
import org.eclipse.net4j.acceptor.IAcceptor;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.jvm.JVMUtil;
import org.eclipse.net4j.util.ObjectUtil;
+import org.eclipse.net4j.util.concurrent.ConcurrencyUtil;
import org.eclipse.net4j.util.container.IManagedContainer;
import org.eclipse.net4j.util.io.IOUtil;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
@@ -211,6 +215,8 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf
public static final String PROP_TEST_SQUEEZE_COMMIT_INFOS = "test.squeeze.commit.infos";
+ public static final String PROP_TEST_DELAYED_COMMIT_HANDLING = "test.delayed.commit.handling";
+
private static final long serialVersionUID = 1L;
private transient IAcceptor masterAcceptor;
@@ -251,20 +257,68 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf
final String masterName = name + "_master";
IStore masterStore = createStore(masterName);
- InternalRepository master = (InternalRepository)(failover ? CDOServerUtil.createFailoverParticipant(masterName,
- masterStore, props, createSynchronizer("backup", name), true) : CDOServerUtil.createRepository(masterName,
- masterStore, props));
+ InternalRepository master;
+ if (failover)
+ {
+ InternalRepositorySynchronizer synchronizer = createSynchronizer("backup", name);
+ master = (InternalRepository)CDOServerUtil.createFailoverParticipant(masterName, masterStore, props,
+ synchronizer, true);
+ }
+ else
+ {
+ master = (InternalRepository)CDOServerUtil.createRepository(masterName, masterStore, props);
+ }
repositories.put(masterName, master);
LifecycleUtil.activate(master);
-
startMasterTransport();
InternalRepositorySynchronizer synchronizer = createSynchronizer("master", masterName);
IStore store = createStore(name);
- return (InternalRepository)(failover ? CDOServerUtil.createFailoverParticipant(name, store, props, synchronizer,
- false) : CDOServerUtil.createOfflineClone(name, store, props, synchronizer));
+ if (failover)
+ {
+ return (InternalRepository)CDOServerUtil.createFailoverParticipant(name, store, props, synchronizer, false);
+ }
+ else
+ {
+ OfflineClone repository = new OfflineClone()
+ {
+ @Override
+ public void handleCommitInfo(CDOCommitInfo commitInfo)
+ {
+ waitIfLockAvailable();
+ super.handleCommitInfo(commitInfo);
+ }
+
+ private void waitIfLockAvailable()
+ {
+ Object lock = getTestDelayedCommitHandling();
+ if (lock != null)
+ {
+ ConcurrencyUtil.sleep(2000);
+
+ // synchronized (lock)
+ // {
+ // try
+ // {
+ // lock.wait();
+ // }
+ // catch (InterruptedException ex)
+ // {
+ // throw WrappedException.wrap(ex);
+ // }
+ // }
+ }
+ }
+ };
+
+ repository.setName(name);
+ repository.setStore((InternalStore)store);
+ repository.setProperties(props);
+ repository.setSynchronizer(synchronizer);
+ return repository;
+ }
}
protected InternalRepositorySynchronizer createSynchronizer(final String acceptorName, final String repositoryName)
@@ -328,6 +382,11 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf
return result;
}
+ protected Object getTestDelayedCommitHandling()
+ {
+ return getTestProperty(PROP_TEST_DELAYED_COMMIT_HANDLING);
+ }
+
public void startMasterTransport()
{
if (masterAcceptor == null)

Back to the top