diff options
author | Eike Stepper | 2010-04-26 06:38:50 +0000 |
---|---|---|
committer | Eike Stepper | 2010-04-26 06:38:50 +0000 |
commit | 5ae7f4d2f33c4b21a78a49d90c4ba96b9b8f29c7 (patch) | |
tree | b2dddaab92a95a88bdb5ffbe95179eaaa3a46fd2 | |
parent | ff22caff9e471cca4865ec8398245341e0d2440c (diff) | |
download | cdo-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
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) |