diff options
author | Caspar De Groot | 2011-09-19 05:40:08 +0000 |
---|---|---|
committer | Caspar De Groot | 2011-09-19 05:40:08 +0000 |
commit | ede599acbecf7b5aaa3c5e5e581ba91811e685ca (patch) | |
tree | 65f834bfb3abd4726e2964207dd7af2f962b7d17 /plugins/org.eclipse.emf.cdo.tests/src/org | |
parent | 98f83cd84af008140603c042ef337ad6c9c2e97f (diff) | |
download | cdo-ede599acbecf7b5aaa3c5e5e581ba91811e685ca.tar.gz cdo-ede599acbecf7b5aaa3c5e5e581ba91811e685ca.tar.xz cdo-ede599acbecf7b5aaa3c5e5e581ba91811e685ca.zip |
[356754] Raw replication of persistent locks
https://bugs.eclipse.org/bugs/show_bug.cgi?id=356754
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests/src/org')
6 files changed, 206 insertions, 118 deletions
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 a4d9fca16e..d2b6d9202a 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 @@ -245,4 +245,12 @@ public abstract class AbstractSyncingTest extends AbstractCDOTest ConcurrencyUtil.sleep(SLEEP_MILLIS); } } + + protected static CDOTransaction openTransaction(CDOSession session) + { + CDOTransaction tx = session.openTransaction(); + tx.options().setLockNotificationEnabled(true); + tx.enableDurableLocking(true); + return tx; + } } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java index cd92e90e75..7ad9814aa6 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllTestsMEMOffline.java @@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.tests.config.IScenario; import org.eclipse.emf.cdo.tests.config.impl.ConfigTest; import org.eclipse.emf.cdo.tests.offline.FailoverTest; import org.eclipse.emf.cdo.tests.offline.OfflineDelayed2Test; +import org.eclipse.emf.cdo.tests.offline.OfflineLockReplicationTest; import org.eclipse.emf.cdo.tests.offline.OfflineLockingTest; import org.eclipse.emf.cdo.tests.offline.OfflineTest; @@ -41,12 +42,14 @@ public class AllTestsMEMOffline extends AllConfigs @Override protected void initTestClasses(List<Class<? extends ConfigTest>> testClasses, IScenario scenario) { - // MEM does not support raw replication - // testClasses.add(OfflineRawTest.class); - testClasses.add(OfflineLockingTest.class); + testClasses.add(OfflineLockReplicationTest.class); testClasses.add(OfflineTest.class); testClasses.add(OfflineDelayed2Test.class); testClasses.add(FailoverTest.class); + + // MEM does not support raw replication + // testClasses.add(OfflineRawTest.class); + // testClasses.add(OfflineLockRawReplicationTest.class); } } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java index b6cc6f9585..0764a1ad1e 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineDelayedTest.java @@ -117,10 +117,6 @@ public class OfflineDelayedTest extends AbstractSyncingTest waitForOnline(clone); } - // public void testXXX() throws Exception - // { - // } - public void _testSyncWhileCommittingToMaster_NewPackage() throws Exception { TestListener listener = new TestListener(); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java new file mode 100644 index 0000000000..229fcf4b53 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2004 - 2011 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: + * Caspar De Groot - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.offline; + +/** + * @author Caspar De Groot + */ +public class OfflineLockRawReplicationTest extends OfflineLockReplicationTest +{ + @Override + protected boolean isRawReplication() + { + return true; + } +} diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockReplicationTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockReplicationTest.java new file mode 100644 index 0000000000..9af878a8a7 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockReplicationTest.java @@ -0,0 +1,169 @@ +/** + * Copyright (c) 2004 - 2011 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: + * Caspar De Groot - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.offline; + +import org.eclipse.emf.cdo.CDOObject; +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.internal.server.syncing.OfflineClone; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.spi.server.InternalRepository; +import org.eclipse.emf.cdo.tests.AbstractSyncingTest; +import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.tests.util.TestListener2; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.util.CommitException; +import org.eclipse.emf.cdo.view.CDOViewLocksChangedEvent; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.EObject; + +/** + * @author Caspar De Groot + */ +public class OfflineLockReplicationTest extends AbstractSyncingTest +{ + public void testCloneLocks_replicationToOtherClone_newSession() throws CommitException + { + testCloneLocks_replicationToOtherClone(false); + } + + public void testCloneLocks_replicationToOtherClone_sameSession() throws CommitException + { + testCloneLocks_replicationToOtherClone(true); + } + + private void testCloneLocks_replicationToOtherClone(boolean keepSession) throws CommitException + { + InternalRepository repo1 = getRepository("repo1"); + assertEquals(true, repo1 instanceof OfflineClone); + InternalRepository repo2 = getRepository("repo2"); + assertEquals(true, repo2 instanceof OfflineClone); + + OfflineClone clone2 = (OfflineClone)repo2; + + waitForOnline(getRepository("repo1")); + waitForOnline(getRepository("repo2")); + + CDOSession clone1session = openSession("repo1"); + + // Store 3 objects in repo1 + CDOTransaction tx1_sess1 = openTransaction(clone1session); + CDOResource resource_tx1_sess1 = tx1_sess1.createResource(getResourcePath("test")); + Company companyA = getModel1Factory().createCompany(); + Company companyB = getModel1Factory().createCompany(); + Company companyC = getModel1Factory().createCompany(); + resource_tx1_sess1.getContents().add(companyA); + resource_tx1_sess1.getContents().add(companyB); + resource_tx1_sess1.getContents().add(companyC); + tx1_sess1.commit(); + + CDOTransaction tx1_sess2; + { + // Verify that they're visible in repo2 + tx1_sess2 = openTransactionWithLockListener("repo2"); + CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test")); + assertEquals(3, resource_tx1_sess2.getContents().size()); + + if (!keepSession) + { + tx1_sess2.getSession().close(); + tx1_sess2 = null; + } + } + + clone2.goOffline(); + waitForOffline(clone2); + + // Lock the objects in repo1. Since repo1 is ONLINE, this will also lock them + // in the master. + CDOUtil.getCDOObject(companyA).cdoReadLock().lock(); + CDOUtil.getCDOObject(companyB).cdoWriteLock().lock(); + CDOUtil.getCDOObject(companyC).cdoWriteOption().lock(); + + clone2.goOnline(); + waitForOnline(clone2); + + { + // Verify that the locks are visible in repo2 + if (!keepSession) + { + tx1_sess2 = openTransactionWithLockListener("repo2"); + } + else + { + ((TestListener2)tx1_sess2.getListeners()[0]).waitFor(1); + } + + CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test")); + EList<EObject> contents = resource_tx1_sess2.getContents(); + CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0)); + CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1)); + CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2)); + + assertEquals(true, companyA_in_sess2.cdoReadLock().isLockedByOthers()); + assertEquals(true, companyB_in_sess2.cdoWriteLock().isLockedByOthers()); + assertEquals(true, companyC_in_sess2.cdoWriteOption().isLockedByOthers()); + + if (!keepSession) + { + tx1_sess2.getSession().close(); + tx1_sess2 = null; + } + } + + clone2.goOffline(); + waitForOffline(clone2); + + // Unlock the objects in repo1. Since repo1 is ONLINE, this will also lock them + // in the master. + CDOUtil.getCDOObject(companyA).cdoReadLock().unlock(); + CDOUtil.getCDOObject(companyB).cdoWriteLock().unlock(); + CDOUtil.getCDOObject(companyC).cdoWriteOption().unlock(); + + clone2.goOnline(); + waitForOnline(clone2); + + { + // Verify in repo2 + if (!keepSession) + { + tx1_sess2 = openTransactionWithLockListener("repo2"); + } + else + { + ((TestListener2)tx1_sess2.getListeners()[0]).waitFor(2); + } + + CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test")); + EList<EObject> contents = resource_tx1_sess2.getContents(); + CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0)); + CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1)); + CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2)); + + assertEquals(false, companyA_in_sess2.cdoReadLock().isLockedByOthers()); + assertEquals(false, companyB_in_sess2.cdoWriteLock().isLockedByOthers()); + assertEquals(false, companyC_in_sess2.cdoWriteOption().isLockedByOthers()); + + tx1_sess2.getSession().close(); + } + + clone1session.close(); + } + + private CDOTransaction openTransactionWithLockListener(String repoName) + { + CDOSession session = openSession(repoName); + CDOTransaction tx = openTransaction(session); + tx.addListener(new TestListener2(CDOViewLocksChangedEvent.class)); + return tx; + } +} diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java index 95312e7aaa..9ef3f09941 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockingTest.java @@ -17,21 +17,16 @@ import org.eclipse.emf.cdo.internal.server.syncing.OfflineClone; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.session.CDOSessionInvalidationEvent; import org.eclipse.emf.cdo.session.CDOSessionLocksChangedEvent; -import org.eclipse.emf.cdo.spi.server.InternalRepository; import org.eclipse.emf.cdo.tests.AbstractSyncingTest; import org.eclipse.emf.cdo.tests.model1.Company; import org.eclipse.emf.cdo.tests.util.TestListener2; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOUtil; -import org.eclipse.emf.cdo.util.CommitException; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.cdo.view.CDOViewLocksChangedEvent; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; -import org.eclipse.emf.common.util.EList; -import org.eclipse.emf.ecore.EObject; - /** * @author Caspar De Groot */ @@ -194,110 +189,4 @@ public class OfflineLockingTest extends AbstractSyncingTest clone1Session.close(); clone2Session.close(); } - - public void testCloneLocks_replicationToOtherClone() throws CommitException - { - InternalRepository repo1 = getRepository("repo1"); - assertEquals(true, repo1 instanceof OfflineClone); - InternalRepository repo2 = getRepository("repo2"); - assertEquals(true, repo2 instanceof OfflineClone); - - OfflineClone clone2 = (OfflineClone)repo2; - - waitForOnline(getRepository("repo1")); - waitForOnline(getRepository("repo2")); - - CDOSession clone1session = openSession("repo1"); - - // Store 3 objects in repo1 - CDOTransaction tx1_sess1 = openTransaction(clone1session); - CDOResource resource_tx1_sess1 = tx1_sess1.createResource(getResourcePath("test")); - Company companyA = getModel1Factory().createCompany(); - Company companyB = getModel1Factory().createCompany(); - Company companyC = getModel1Factory().createCompany(); - resource_tx1_sess1.getContents().add(companyA); - resource_tx1_sess1.getContents().add(companyB); - resource_tx1_sess1.getContents().add(companyC); - tx1_sess1.commit(); - - { - // Verify that they're visible in repo2 - CDOSession clone2session = openSession("repo2"); - CDOTransaction tx1_sess2 = openTransaction(clone2session); - CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test")); - assertEquals(3, resource_tx1_sess2.getContents().size()); - tx1_sess2.close(); - clone2session.close(); - } - - clone2.goOffline(); - waitForOffline(clone2); - - // Lock the objects in repo1. Since repo1 is ONLINE, this will also lock them - // in the master. - CDOUtil.getCDOObject(companyA).cdoReadLock().lock(); - CDOUtil.getCDOObject(companyB).cdoWriteLock().lock(); - CDOUtil.getCDOObject(companyC).cdoWriteOption().lock(); - - clone2.goOnline(); - waitForOnline(clone2); - - { - // Verify that the locks are visible in repo2 - CDOSession clone2session = openSession("repo2"); - CDOTransaction tx1_sess2 = openTransaction(clone2session); - CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test")); - EList<EObject> contents = resource_tx1_sess2.getContents(); - CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0)); - CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1)); - CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2)); - - assertEquals(true, companyA_in_sess2.cdoReadLock().isLockedByOthers()); - assertEquals(true, companyB_in_sess2.cdoWriteLock().isLockedByOthers()); - assertEquals(true, companyC_in_sess2.cdoWriteOption().isLockedByOthers()); - - tx1_sess2.close(); - clone2session.close(); - } - - clone2.goOffline(); - waitForOffline(clone2); - - // Unlock the objects in repo1. Since repo1 is ONLINE, this will also lock them - // in the master. - CDOUtil.getCDOObject(companyA).cdoReadLock().unlock(); - CDOUtil.getCDOObject(companyB).cdoWriteLock().unlock(); - CDOUtil.getCDOObject(companyC).cdoWriteOption().unlock(); - - clone2.goOnline(); - waitForOnline(clone2); - - { - // Verify in repo2 - CDOSession clone2session = openSession("repo2"); - CDOTransaction tx1_sess2 = openTransaction(clone2session); - CDOResource resource_tx1_sess2 = tx1_sess2.getResource(getResourcePath("test")); - EList<EObject> contents = resource_tx1_sess2.getContents(); - CDOObject companyA_in_sess2 = CDOUtil.getCDOObject(contents.get(0)); - CDOObject companyB_in_sess2 = CDOUtil.getCDOObject(contents.get(1)); - CDOObject companyC_in_sess2 = CDOUtil.getCDOObject(contents.get(2)); - - assertEquals(false, companyA_in_sess2.cdoReadLock().isLockedByOthers()); - assertEquals(false, companyB_in_sess2.cdoWriteLock().isLockedByOthers()); - assertEquals(false, companyC_in_sess2.cdoWriteOption().isLockedByOthers()); - - tx1_sess2.close(); - clone2session.close(); - } - - clone1session.close(); - } - - private static CDOTransaction openTransaction(CDOSession session) - { - CDOTransaction tx = session.openTransaction(); - tx.options().setLockNotificationEnabled(true); - tx.enableDurableLocking(true); - return tx; - } } |