diff options
author | Eike Stepper | 2011-01-19 11:43:05 +0000 |
---|---|---|
committer | Eike Stepper | 2011-01-19 11:43:05 +0000 |
commit | 8b399137c6bfa68d4678e34978cc8e6b6a780567 (patch) | |
tree | abd26655c92237e8b38a621fe1eec92101b2c32a | |
parent | 3e59c7ffa2413f8963e67f12c487dfa85c6dd4ce (diff) | |
download | cdo-8b399137c6bfa68d4678e34978cc8e6b6a780567.tar.gz cdo-8b399137c6bfa68d4678e34978cc8e6b6a780567.tar.xz cdo-8b399137c6bfa68d4678e34978cc8e6b6a780567.zip |
[334659] Reoccurring ConcurrentModificationExceptions at commits of 1 transaction at the time.
https://bugs.eclipse.org/bugs/show_bug.cgi?id=334659
-rw-r--r-- | plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/TransactionTest.java | 145 | ||||
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java | 1 |
2 files changed, 129 insertions, 17 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/TransactionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/TransactionTest.java index c3a941c31a..20015040ca 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/TransactionTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/TransactionTest.java @@ -11,14 +11,23 @@ */ package org.eclipse.emf.cdo.tests; +import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil; import org.eclipse.emf.cdo.tests.model1.Category; import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.transaction.CDOCommitContext; import org.eclipse.emf.cdo.transaction.CDOPushTransaction; import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.transaction.CDOTransactionConflictEvent; +import org.eclipse.emf.cdo.transaction.CDOTransactionHandler2; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.util.CommitException; import org.eclipse.emf.cdo.view.CDOView; +import org.eclipse.net4j.util.event.IEvent; +import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.io.IOUtil; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.om.OMPlatform; @@ -75,7 +84,7 @@ public class TransactionTest extends AbstractCDOTest public void testCreateManySessions() throws Exception { { - msg("Opening session"); + IOUtil.OUT().println("Opening session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); transaction.createResource("/test2"); @@ -86,7 +95,7 @@ public class TransactionTest extends AbstractCDOTest for (int i = 0; i < 100; i++) { - msg("Session " + i); + IOUtil.OUT().println("Session " + i); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.getResource("/test2"); @@ -100,7 +109,7 @@ public class TransactionTest extends AbstractCDOTest public void testCreateManyTransactions() throws Exception { - msg("Opening session"); + IOUtil.OUT().println("Opening session"); CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); CDOResource resource = transaction.createResource("/test2"); @@ -110,7 +119,7 @@ public class TransactionTest extends AbstractCDOTest long lastDuration = 0; for (int i = 0; i < 100; i++) { - msg("Transaction " + i + " (" + lastDuration + ")"); + IOUtil.OUT().println("Transaction " + i + " (" + lastDuration + ")"); lastDuration = System.currentTimeMillis(); transaction = session.openTransaction(); resource = transaction.getResource("/test2"); @@ -143,18 +152,18 @@ public class TransactionTest extends AbstractCDOTest { try { - msg("Thread " + id + ": Started"); + IOUtil.OUT().println("Thread " + id + ": Started"); for (int i = 0; i < 100; i++) { CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); - msg("Thread " + id + ": Session + Transaction " + i); + IOUtil.OUT().println("Thread " + id + ": Session + Transaction " + i); transaction.close(); session.close(); } - msg("Thread " + id + ": Done"); + IOUtil.OUT().println("Thread " + id + ": Done"); } catch (Exception ex) { @@ -198,23 +207,23 @@ public class TransactionTest extends AbstractCDOTest public void testPushModeNewObjects() throws Exception { - msg("Creating category1"); + IOUtil.OUT().println("Creating category1"); Category category1 = getModel1Factory().createCategory(); category1.setName("category1"); - msg("Creating category2"); + IOUtil.OUT().println("Creating category2"); Category category2 = getModel1Factory().createCategory(); category2.setName("category2"); - msg("Creating category3"); + IOUtil.OUT().println("Creating category3"); Category category3 = getModel1Factory().createCategory(); category3.setName("category3"); - msg("Creating company"); + IOUtil.OUT().println("Creating company"); Company company = getModel1Factory().createCompany(); company.setName("Foundation"); - msg("Adding categories"); + IOUtil.OUT().println("Adding categories"); company.getCategories().add(category1); category1.getCategories().add(category2); category1.getCategories().add(category3); @@ -248,15 +257,15 @@ public class TransactionTest extends AbstractCDOTest public void testPushModeDeltas() throws Exception { - msg("Creating category1"); + IOUtil.OUT().println("Creating category1"); Category category1 = getModel1Factory().createCategory(); category1.setName("category1"); - msg("Creating company"); + IOUtil.OUT().println("Creating company"); Company company = getModel1Factory().createCompany(); company.setName("Foundation"); - msg("Adding categories"); + IOUtil.OUT().println("Adding categories"); company.getCategories().add(category1); CDOSession session = openSession(); @@ -270,12 +279,12 @@ public class TransactionTest extends AbstractCDOTest pushTransaction.commit(); - msg("Creating category2"); + IOUtil.OUT().println("Creating category2"); Category category2 = getModel1Factory().createCategory(); category2.setName("category2"); category1.getCategories().add(category2); - msg("Creating category3"); + IOUtil.OUT().println("Creating category3"); Category category3 = getModel1Factory().createCategory(); category3.setName("category3"); category1.getCategories().add(category3); @@ -298,4 +307,106 @@ public class TransactionTest extends AbstractCDOTest assertEquals(2, company.getCategories().get(0).getCategories().size()); session.close(); } + + public void testAutoRollbackOnConflictEvent() throws Exception + { + final CDOSession session1 = openSession(); + final CDOTransaction transaction1 = session1.openTransaction(); + + CDOResource resource1 = transaction1.createResource("/test"); + Category category1 = getModel1Factory().createCategory(); + resource1.getContents().add(category1); + transaction1.commit(); + + final CDOSession session2 = openSession(); + final CDOTransaction transaction2 = session2.openTransaction(); + transaction2.addListener(new IListener() + { + public void notifyEvent(IEvent event) + { + if (event instanceof CDOTransactionConflictEvent) + { + transaction2.rollback(); + } + } + }); + + final CountDownLatch rollback = new CountDownLatch(1); + transaction2.addTransactionHandler(new CDOTransactionHandler2() + { + public void rolledBackTransaction(CDOTransaction transaction) + { + IOUtil.OUT().println("rollback"); + rollback.countDown(); + } + + public void committingTransaction(CDOTransaction transaction, CDOCommitContext commitContext) + { + } + + public void committedTransaction(CDOTransaction transaction, CDOCommitContext commitContext) + { + } + }); + + CDOResource resource2 = transaction2.getResource("/test"); + Category category2 = (Category)resource2.getContents().get(0); + category2.setName("session2"); + + category1.setName("session1"); + transaction1.commit(); + + rollback.await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS); + category2.setName("session2"); + transaction2.commit(); + } + + public void testManualRollbackOnConflictException() throws Exception + { + CDOSession session1 = openSession(); + CDOTransaction transaction1 = session1.openTransaction(); + + CDOResource resource1 = transaction1.createResource("/test"); + Category category1 = getModel1Factory().createCategory(); + resource1.getContents().add(category1); + transaction1.commit(); + + CDOSession session2 = openSession(); + CDOTransaction transaction2 = session2.openTransaction(); + + CDOResource resource2 = transaction2.getResource("/test"); + Category category2 = (Category)resource2.getContents().get(0); + category2.setName("session2"); + + category1.setName("session1"); + long commitTime = transaction1.commit().getTimeStamp(); + IOUtil.OUT().println("After transaction1.commit(): " + CDOUtil.getCDOObject(category1).cdoRevision()); + + CDOObject cdoCategory2 = CDOUtil.getCDOObject(category2); + + try + { + IOUtil.OUT().println("Before transaction2.commit(): " + cdoCategory2.cdoRevision()); + category2.setName("session2"); + + transaction2.commit(); + fail("CommitException expected"); + } + catch (CommitException expected) + { + IOUtil.OUT().println("Before transaction2.rollback(): " + cdoCategory2.cdoRevision()); + transaction2.rollback(); + IOUtil.OUT().println("After transaction2.rollback(): " + cdoCategory2.cdoRevision()); + } + + transaction2.waitForUpdate(commitTime, DEFAULT_TIMEOUT); + category2.setName("session2"); + + IOUtil.OUT().println("Before transaction2.commit():"); + CDOCommitInfoUtil.dump(IOUtil.OUT(), transaction2.getChangeSetData()); + + transaction2.commit(); + IOUtil.OUT().println("After transaction2.commit(): " + cdoCategory2.cdoRevision()); + assertEquals(3, cdoCategory2.cdoRevision().getVersion()); + } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java index a9e8d576ed..bb7686d838 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOStateMachine.java @@ -783,6 +783,7 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent { public void execute(InternalCDOObject object, CDOState state, CDOEvent event, Object NULL) { + object.cdoInternalSetRevision(null); changeState(object, CDOState.PROXY); } } |