/* * Copyright (c) 2010-2013 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.CDOState; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.commit.CDOChangeSetData; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.tests.config.IConfig; import org.eclipse.emf.cdo.tests.config.IRepositoryConfig; import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires; import org.eclipse.emf.cdo.tests.model1.Company; 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.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.spi.cdo.DefaultCDOMerger; /** * @author Eike Stepper */ @Requires(IRepositoryConfig.CAPABILITY_BRANCHING) public class MergingTest extends AbstractCDOTest { @Override protected void doSetUp() throws Exception { super.doSetUp(); skipStoreWithoutChangeSets(); } public void testFromEmptyBranches() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time2 = transaction.commit().getTimeStamp(); CDOBranch source2 = mainBranch.createBranch("source2", time2); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); long time3 = transaction.commit().getTimeStamp(); CDOBranch source3 = mainBranch.createBranch("source3", time3); CDOChangeSetData result = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, result.isEmpty()); assertEquals(false, transaction.isDirty()); result = transaction.merge(source2.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, result.isEmpty()); assertEquals(false, transaction.isDirty()); CDOChangeSetData check = transaction.merge(source3.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } public void testFromBranchWithAdditions() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); transaction.commit(); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); transaction.commit(); sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); addCompany(contents1); addCompany(contents1); commitAndSync(tx1, transaction); tx1.close(); CDOChangeSetData result = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(false, result.isEmpty()); assertEquals(2, result.getNewObjects().size()); assertEquals(1, result.getChangedObjects().size()); assertEquals(0, result.getDetachedObjects().size()); assertEquals(true, transaction.isDirty()); CDOCommitInfo commitInfo1 = transaction.commit(); assertEquals(2, commitInfo1.getNewObjects().size()); assertEquals(1, commitInfo1.getChangedObjects().size()); assertEquals(0, commitInfo1.getDetachedObjects().size()); assertEquals(false, transaction.isDirty()); assertEquals(mainBranch, ((CDORevision)commitInfo1.getNewObjects().get(0)).getBranch()); assertEquals(mainBranch, ((CDORevision)commitInfo1.getNewObjects().get(1)).getBranch()); assertEquals(1, ((CDORevision)commitInfo1.getNewObjects().get(0)).getVersion()); assertEquals(1, ((CDORevision)commitInfo1.getNewObjects().get(1)).getVersion()); } @Skips(IConfig.EFFORT_MERGING) @SuppressWarnings("unused") public void testRemergeAfterAdditionsInSource() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); Company company0 = addCompany(contents); Company company1 = addCompany(contents); Company company2 = addCompany(contents); Company company3 = addCompany(contents); Company company4 = addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); sleep(10); Company company5 = addCompany(contents); Company company6 = addCompany(contents); Company company7 = addCompany(contents); Company company8 = addCompany(contents); transaction.commit(); sleep(10); Company company9 = addCompany(contents); Company company10 = addCompany(contents); Company company11 = addCompany(contents); transaction.commit(); sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); addCompany(contents1); addCompany(contents1); commitAndSync(tx1, transaction); tx1.close(); transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); CDOChangeSetData check = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } @Skips(IConfig.EFFORT_MERGING) @SuppressWarnings("unused") public void testRemergeAfterAdditionsInSource2() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); Company company0 = addCompany(contents); Company company1 = addCompany(contents); Company company2 = addCompany(contents); Company company3 = addCompany(contents); Company company4 = addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); sleep(10); Company company5 = addCompany(contents); Company company6 = addCompany(contents); Company company7 = addCompany(contents); Company company8 = addCompany(contents); transaction.commit(); sleep(10); Company company9 = addCompany(contents); Company company10 = addCompany(contents); Company company11 = addCompany(contents); transaction.commit(); { sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); addCompany(contents1); addCompany(contents1); commitAndSync(tx1, transaction); tx1.close(); } transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); { sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); addCompany(contents1); commitAndSync(tx1, transaction); tx1.close(); } CDOChangeSetData result = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(false, result.isEmpty()); assertEquals(1, result.getNewObjects().size()); assertEquals(1, result.getChangedObjects().size()); assertEquals(0, result.getDetachedObjects().size()); assertEquals(true, transaction.isDirty()); CDOCommitInfo commitInfo1 = transaction.commit(); assertEquals(1, commitInfo1.getNewObjects().size()); assertEquals(1, commitInfo1.getChangedObjects().size()); assertEquals(0, commitInfo1.getDetachedObjects().size()); assertEquals(false, transaction.isDirty()); assertEquals(mainBranch, ((CDORevision)commitInfo1.getNewObjects().get(0)).getBranch()); assertEquals(1, ((CDORevision)commitInfo1.getNewObjects().get(0)).getVersion()); CDOChangeSetData check = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } @Skips(IConfig.EFFORT_MERGING) public void testAdditionsInSourceAndTarget() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time2 = transaction.commit().getTimeStamp(); CDOBranch source2 = mainBranch.createBranch("source2", time2); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); transaction.commit(); sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); addCompany(contents1); addCompany(contents1); commitAndSync(tx1, transaction); tx1.close(); transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); sleep(10); CDOTransaction tx2 = session.openTransaction(source2); CDOResource res2 = tx2.getResource(getResourcePath("/res")); EList contents2 = res2.getContents(); addCompany(contents2); commitAndSync(tx2, transaction); tx2.close(); CDOChangeSetData result = transaction.merge(source2.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(false, result.isEmpty()); assertEquals(1, result.getNewObjects().size()); assertEquals(1, result.getChangedObjects().size()); assertEquals(0, result.getDetachedObjects().size()); assertEquals(true, transaction.isDirty()); CDOCommitInfo commitInfo2 = transaction.commit(); assertEquals(1, commitInfo2.getNewObjects().size()); assertEquals(1, commitInfo2.getChangedObjects().size()); assertEquals(0, commitInfo2.getDetachedObjects().size()); assertEquals(false, transaction.isDirty()); assertEquals(mainBranch, ((CDORevision)commitInfo2.getNewObjects().get(0)).getBranch()); assertEquals(1, ((CDORevision)commitInfo2.getNewObjects().get(0)).getVersion()); CDOChangeSetData check = transaction.merge(source2.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } @Skips(IConfig.EFFORT_MERGING) public void testRemergeAfterAdditionsInSourceAndTarget() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time2 = transaction.commit().getTimeStamp(); CDOBranch source2 = mainBranch.createBranch("source2", time2); sleep(10); addCompany(contents); addCompany(contents); addCompany(contents); transaction.commit(); sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); addCompany(contents1); addCompany(contents1); commitAndSync(tx1, transaction); tx1.close(); transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); sleep(10); CDOTransaction tx2 = session.openTransaction(source2); CDOResource res2 = tx2.getResource(getResourcePath("/res")); EList contents2 = res2.getContents(); addCompany(contents2); commitAndSync(tx2, transaction); tx2.close(); transaction.merge(source2.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); CDOChangeSetData check = transaction.merge(source2.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } /** * Bug 314605. */ public void _testFromBranchWithChangesInSource_100() throws Exception { disableConsole(); for (int i = 0; i < 100; i++) { System.out.println("run: " + i); mergeFromBranchWithChangesInSource(i); } enableConsole(); } public void testFromBranchWithChangesInSource() throws Exception { mergeFromBranchWithChangesInSource(0); } private void mergeFromBranchWithChangesInSource(int run) throws CommitException { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res" + run)); EList contents = resource.getContents(); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time = transaction.commit().getTimeStamp(); CDOBranch source = mainBranch.createBranch("source" + run, time); sleep(10); CDOTransaction tx1 = session.openTransaction(source); CDOResource res1 = tx1.getResource(getResourcePath("/res" + run)); EList contents1 = res1.getContents(); ((Company)contents1.get(0)).setName("Company0"); ((Company)contents1.get(1)).setName("Company1"); ((Company)contents1.get(2)).setName("Company2"); commitAndSync(tx1, transaction); tx1.close(); CDOChangeSetData result = transaction.merge(source.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(false, result.isEmpty()); assertEquals(0, result.getNewObjects().size()); assertEquals(3, result.getChangedObjects().size()); assertEquals(0, result.getDetachedObjects().size()); assertEquals(true, transaction.isDirty()); CDOCommitInfo commitInfo1 = transaction.commit(); assertEquals(0, commitInfo1.getNewObjects().size()); assertEquals(3, commitInfo1.getChangedObjects().size()); assertEquals(0, commitInfo1.getDetachedObjects().size()); assertEquals(false, transaction.isDirty()); } @SuppressWarnings("unused") public void testRemergeAfterChangesInSource() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); Company company0 = addCompany(contents); Company company1 = addCompany(contents); Company company2 = addCompany(contents); Company company3 = addCompany(contents); Company company4 = addCompany(contents); long time = transaction.commit().getTimeStamp(); CDOBranch source = mainBranch.createBranch("source", time); sleep(10); CDOTransaction tx1 = session.openTransaction(source); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); ((Company)contents1.get(0)).setName("Company0"); ((Company)contents1.get(1)).setName("Company1"); ((Company)contents1.get(2)).setName("Company2"); commitAndSync(tx1, transaction); tx1.close(); long updateTime1 = session.getLastUpdateTime(); transaction.merge(source.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); assertEquals(5, contents.size()); long updateTime2 = session.getLastUpdateTime(); assertEquals(false, updateTime1 == updateTime2); assertEquals("Company0", ((Company)contents.get(0)).getName()); assertEquals("Company1", ((Company)contents.get(1)).getName()); assertEquals("Company2", ((Company)contents.get(2)).getName()); CDOChangeSetData check = transaction.merge(source.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } @SuppressWarnings("unused") public void _testRemergeAfterChangesInSource() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); Company company0 = addCompany(contents); Company company1 = addCompany(contents); Company company2 = addCompany(contents); Company company3 = addCompany(contents); Company company4 = addCompany(contents); long time = transaction.commit().getTimeStamp(); CDOBranch source = mainBranch.createBranch("source", time); sleep(10); CDOTransaction tx1 = session.openTransaction(source); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); ((Company)contents1.get(0)).setName("Company0"); ((Company)contents1.get(1)).setName("Company1"); ((Company)contents1.get(2)).setName("Company2"); CDOCommitInfo commit1 = commitAndSync(tx1, transaction); long updateTime1 = session.getLastUpdateTime(); transaction.merge(commit1, new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); assertEquals(5, contents.size()); long updateTime2 = session.getLastUpdateTime(); assertEquals(false, updateTime1 == updateTime2); assertEquals("Company0", ((Company)contents.get(0)).getName()); assertEquals("Company1", ((Company)contents.get(1)).getName()); assertEquals("Company2", ((Company)contents.get(2)).getName()); ((Company)contents1.get(0)).setName("CompanyX"); ((Company)contents1.get(1)).setName("CompanyY"); ((Company)contents1.get(2)).setName("CompanyZ"); CDOCommitInfo commit2 = commitAndSync(tx1, transaction); CDOChangeSetData check = transaction.merge(commit2, commit1, new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(false, check.isEmpty()); assertEquals(true, transaction.isDirty()); } public void testFromBranchWithRemovalsInSource() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); Company company0 = addCompany(contents); Company company1 = addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source = mainBranch.createBranch("source", time1); sleep(10); CDOTransaction tx1 = session.openTransaction(source); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); ((Company)contents1.get(0)).setName("Company0"); contents1.remove(1); // dumpAllRevisions(getRepository().getStore()); long time2 = commitAndSync(tx1, transaction).getTimeStamp(); assertEquals(true, time1 < time2); dumpAllRevisions(getRepository().getStore()); tx1.close(); CDOBranchPoint head = source.getHead(); DefaultCDOMerger.PerFeature.ManyValued merger = new DefaultCDOMerger.PerFeature.ManyValued(); CDOChangeSetData result = transaction.merge(head, merger); assertEquals(false, result.isEmpty()); assertEquals(0, result.getNewObjects().size()); assertEquals(2, result.getChangedObjects().size()); assertEquals(1, result.getDetachedObjects().size()); assertEquals(true, transaction.isDirty()); assertEquals(CDOState.DIRTY, resource.cdoState()); assertEquals(CDOState.DIRTY, CDOUtil.getCDOObject(company0).cdoState()); assertEquals(CDOState.TRANSIENT, CDOUtil.getCDOObject(company1).cdoState()); CDOCommitInfo commitInfo1 = transaction.commit(); assertEquals(0, commitInfo1.getNewObjects().size()); assertEquals(2, commitInfo1.getChangedObjects().size()); assertEquals(1, commitInfo1.getDetachedObjects().size()); assertEquals(false, transaction.isDirty()); assertEquals(CDOState.CLEAN, resource.cdoState()); assertEquals(CDOState.CLEAN, CDOUtil.getCDOObject(company0).cdoState()); assertEquals(CDOState.TRANSIENT, CDOUtil.getCDOObject(company1).cdoState()); } public void _testRemergeAfterRemovalsInSource() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time = transaction.commit().getTimeStamp(); CDOBranch source = mainBranch.createBranch("source", time); sleep(10); CDOTransaction tx1 = session.openTransaction(source); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); ((Company)contents1.get(0)).setName("Company0"); contents1.remove(1); commitAndSync(tx1, transaction); tx1.close(); transaction.merge(source.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); transaction.commit(); CDOChangeSetData check = transaction.merge(source.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } /** * Bug 309467. */ @SuppressWarnings("unused") public void test_Bugzilla_309467() throws Exception { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); Company company0 = addCompany(contents); Company company1 = addCompany(contents); Company company2 = addCompany(contents); Company company3 = addCompany(contents); Company company4 = addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); { sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); ((Company)contents1.get(0)).setName("C0"); ((Company)contents1.get(1)).setName("C1"); ((Company)contents1.get(2)).setName("C2"); ((Company)contents1.get(3)).setName("C3"); ((Company)contents1.get(4)).setName("C4"); commitAndSync(tx1, transaction); tx1.close(); } CDOChangeSetData result = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(false, result.isEmpty()); assertEquals(true, transaction.isDirty()); transaction.commit(); CDOChangeSetData check = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } /** * Bug 309467. */ @Skips(IConfig.EFFORT_MERGING) @Requires(IRepositoryConfig.CAPABILITY_RESTARTABLE) public void test_Bugzilla_309467_ServerRestart() throws Exception { { CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOTransaction transaction = session.openTransaction(mainBranch); CDOResource resource = transaction.createResource(getResourcePath("/res")); EList contents = resource.getContents(); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); addCompany(contents); long time1 = transaction.commit().getTimeStamp(); CDOBranch source1 = mainBranch.createBranch("source1", time1); { sleep(10); CDOTransaction tx1 = session.openTransaction(source1); CDOResource res1 = tx1.getResource(getResourcePath("/res")); EList contents1 = res1.getContents(); ((Company)contents1.get(0)).setName("C0"); ((Company)contents1.get(1)).setName("C1"); ((Company)contents1.get(2)).setName("C2"); ((Company)contents1.get(3)).setName("C3"); ((Company)contents1.get(4)).setName("C4"); commitAndSync(tx1, transaction); tx1.close(); } CDOChangeSetData result = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(false, result.isEmpty()); assertEquals(true, transaction.isDirty()); transaction.commit(); session.close(); } restartRepository(); CDOSession session = openSession(); CDOBranch mainBranch = session.getBranchManager().getMainBranch(); CDOBranch source1 = mainBranch.getBranch("source1"); CDOTransaction transaction = session.openTransaction(mainBranch); CDOChangeSetData check = transaction.merge(source1.getHead(), new DefaultCDOMerger.PerFeature.ManyValued()); assertEquals(true, check.isEmpty()); assertEquals(false, transaction.isDirty()); } private Company addCompany(EList contents) { Company company = getModel1Factory().createCompany(); contents.add(company); return company; } }