diff options
author | Eike Stepper | 2008-06-12 09:04:17 +0000 |
---|---|---|
committer | Eike Stepper | 2008-06-12 09:04:17 +0000 |
commit | b28d7b289603ebbfd3ddda6cab2d184da88a79ef (patch) | |
tree | 78c52071a1e0d777c6347fde4fcd5d9620177984 | |
parent | 9937d9f2066405d9c481cf1c3c88da117af2120b (diff) | |
download | cdo-b28d7b289603ebbfd3ddda6cab2d184da88a79ef.tar.gz cdo-b28d7b289603ebbfd3ddda6cab2d184da88a79ef.tar.xz cdo-b28d7b289603ebbfd3ddda6cab2d184da88a79ef.zip |
[236784] Invalidate and cache problem
https://bugs.eclipse.org/bugs/show_bug.cgi?id=236784
10 files changed, 125 insertions, 117 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java index 512d797390..b170267b5e 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java @@ -14,6 +14,7 @@ package org.eclipse.emf.cdo.internal.server; import org.eclipse.emf.cdo.common.CDOProtocolConstants; import org.eclipse.emf.cdo.common.CDOProtocolView; import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.common.id.CDOIDObject; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.model.CDOClass; @@ -197,7 +198,7 @@ public class Session extends Container<IView> implements ISession, CDOIDProvider return new View(this, viewID, type); } - public void notifyInvalidation(long timeStamp, List<CDOID> dirtyIDs) + public void notifyInvalidation(long timeStamp, List<CDOIDAndVersion> dirtyIDs) { try { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java index 02cfb5ad0a..1661ad37f7 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/SessionManager.java @@ -12,7 +12,7 @@ **************************************************************************/ package org.eclipse.emf.cdo.internal.server; -import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.internal.server.bundle.OM; import org.eclipse.emf.cdo.internal.server.protocol.CDOServerProtocol; import org.eclipse.emf.cdo.server.ISession; @@ -104,7 +104,7 @@ public class SessionManager extends Container<ISession> implements ISessionManag } } - public void notifyInvalidation(long timeStamp, List<CDOID> dirtyIDs, Session excludedSession) + public void notifyInvalidation(long timeStamp, List<CDOIDAndVersion> dirtyIDs, Session excludedSession) { for (Session session : getSessions()) { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java index 25cc439d40..d75426c8c0 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Transaction.java @@ -11,9 +11,11 @@ package org.eclipse.emf.cdo.internal.server; import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDObjectFactory; import org.eclipse.emf.cdo.common.id.CDOIDTemp; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOPackage; import org.eclipse.emf.cdo.common.model.CDOPackageManager; import org.eclipse.emf.cdo.common.model.core.CDOCorePackage; @@ -199,10 +201,12 @@ public class Transaction extends View implements ITransaction, IStoreWriter.Comm int modifications = dirtyObjectDeltas.length; if (success && modifications > 0) { - List<CDOID> dirtyIDs = new ArrayList<CDOID>(modifications); + List<CDOIDAndVersion> dirtyIDs = new ArrayList<CDOIDAndVersion>(modifications); for (int i = 0; i < modifications; i++) { - dirtyIDs.add(dirtyObjectDeltas[i].getID()); + CDORevisionDelta delta = dirtyObjectDeltas[i]; + CDOIDAndVersion dirtyID = CDOIDUtil.createIDAndVersion(delta.getID(), delta.getOriginVersion()); + dirtyIDs.add(dirtyID); } SessionManager sessionManager = (SessionManager)repository.getSessionManager(); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java index 1a6c64fa7d..90951c8036 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/protocol/InvalidationNotification.java @@ -12,8 +12,7 @@ package org.eclipse.emf.cdo.internal.server.protocol; import org.eclipse.emf.cdo.common.CDOProtocolConstants; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.internal.server.bundle.OM; import org.eclipse.net4j.channel.IChannel; @@ -33,9 +32,9 @@ public class InvalidationNotification extends Request private long timeStamp; - private List<CDOID> dirtyIDs; + private List<CDOIDAndVersion> dirtyIDs; - public InvalidationNotification(IChannel channel, long timeStamp, List<CDOID> dirtyIDs) + public InvalidationNotification(IChannel channel, long timeStamp, List<CDOIDAndVersion> dirtyIDs) { super(channel); this.timeStamp = timeStamp; @@ -63,9 +62,14 @@ public class InvalidationNotification extends Request } out.writeInt(dirtyIDs.size()); - for (CDOID dirtyID : dirtyIDs) + for (CDOIDAndVersion dirtyID : dirtyIDs) { - CDOIDUtil.write(out, dirtyID); + if (PROTOCOL.isEnabled()) + { + PROTOCOL.format("Writing dirty ID: {0}", dirtyID); + } + + dirtyID.write(out, false); } } } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java index c32e966b63..cd24637a7f 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/InvalidationTest.java @@ -14,11 +14,14 @@ import org.eclipse.emf.cdo.CDOSession; import org.eclipse.emf.cdo.CDOSessionInvalidationEvent; import org.eclipse.emf.cdo.CDOTransaction; import org.eclipse.emf.cdo.CDOView; +import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.tests.model1.Category; import org.eclipse.emf.cdo.tests.model1.Company; import org.eclipse.emf.cdo.tests.model1.Model1Factory; +import org.eclipse.emf.internal.cdo.CDOTransactionImpl; + import org.eclipse.net4j.util.event.IEvent; import org.eclipse.net4j.util.event.IListener; @@ -336,4 +339,70 @@ public class InvalidationTest extends AbstractCDOTest msg("Checking after commit"); assertEquals(false, timeOuter.timedOut()); } + + /** + * @see http://bugs.eclipse.org/236784 + */ + public void testInvalidateAndCache() throws Exception + { + msg("Opening sessionA"); + CDOSession sessionA = openModel1Session(); + + msg("Opening transactionA"); + final CDOTransactionImpl transactionA = (CDOTransactionImpl)sessionA.openTransaction(); + final CDOID cdoidA; + + // ************************************************************* + { + msg("Creating categoryA"); + Category categoryA = Model1Factory.eINSTANCE.createCategory(); + categoryA.setName("categoryA"); + + msg("Creating companyA"); + Company companyA = Model1Factory.eINSTANCE.createCompany(); + + msg("Adding categories"); + companyA.getCategories().add(categoryA); + + msg("Creating resource"); + CDOResource resourceA = transactionA.createResource("/test1"); + + msg("Adding companyA"); + resourceA.getContents().add(companyA); + + msg("Committing"); + transactionA.commit(); + + cdoidA = categoryA.cdoID(); + transactionA.removeObject(cdoidA); + } + + // ************************************************************* + msg("Opening sessionB"); + CDOSession sessionB = openSession(); + + msg("Opening transactionB"); + CDOTransaction transactionB = sessionB.openTransaction(); + Category categoryB = (Category)transactionB.getObject(cdoidA, true); + + msg("Changing name"); + categoryB.setName("CHANGED NAME"); + + msg("\n\n\n\n\n\n\n\n\n\n\nCommitting"); + transactionB.commit(); + + msg("Checking after commit"); + boolean timedOut = new PollingTimeOuter(200, 100) + { + @Override + protected boolean successful() + { + Category categoryA = (Category)transactionA.getObject(cdoidA, true); + String name = categoryA.getName(); + return "CHANGED NAME".equals(name); + } + }.timedOut(); + + assertEquals(false, timedOut); + } } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java deleted file mode 100644 index b0b18b3ce1..0000000000 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/SessionTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/*************************************************************************** - * Copyright (c) 2004 - 2008 Eike Stepper, Germany. - * 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.CDOSession; -import org.eclipse.emf.cdo.CDOTransaction; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.eresource.CDOResource; -import org.eclipse.emf.cdo.tests.model1.Category; -import org.eclipse.emf.cdo.tests.model1.Company; -import org.eclipse.emf.cdo.tests.model1.Model1Factory; - -import org.eclipse.emf.internal.cdo.CDOTransactionImpl; - -/** - * @author Eike Stepper - */ -public class SessionTest extends AbstractCDOTest -{ - public void testInvalidateAndCache() throws Exception - { - msg("Opening sessionA"); - CDOSession sessionA = openModel1Session(); - - msg("Opening transactionA"); - final CDOTransactionImpl transactionA = (CDOTransactionImpl)sessionA.openTransaction(); - final CDOID cdoidA; - - // ************************************************************* - { - msg("Creating categoryA"); - Category categoryA = Model1Factory.eINSTANCE.createCategory(); - categoryA.setName("categoryA"); - - msg("Creating companyA"); - Company companyA = Model1Factory.eINSTANCE.createCompany(); - - msg("Adding categories"); - companyA.getCategories().add(categoryA); - - msg("Creating resource"); - CDOResource resourceA = transactionA.createResource("/test1"); - - msg("Adding companyA"); - resourceA.getContents().add(companyA); - - msg("Committing"); - transactionA.commit(); - - cdoidA = categoryA.cdoID(); - transactionA.removeObject(cdoidA); - } - - // ************************************************************* - msg("Opening sessionB"); - CDOSession sessionB = openSession(); - - msg("Opening transactionB"); - CDOTransaction transactionB = sessionB.openTransaction(); - Category categoryB = (Category)transactionB.getObject(cdoidA, true); - - msg("Changing name"); - categoryB.setName("CHANGED NAME"); - - msg("\n\n\n\n\n\n\n\n\n\n\nCommitting"); - transactionB.commit(); - - msg("Checking after commit"); - boolean timedOut = new PollingTimeOuter(200, 100) - { - @Override - protected boolean successful() - { - Category categoryA = (Category)transactionA.getObject(cdoidA, true); - String name = categoryA.getName(); - return "CHANGED NAME".equals(name); - } - }.timedOut(); - - assertEquals(false, timedOut); - } -} diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java index 78f3594657..d2f37e7b09 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOEventHandler.java @@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.CDOTransactionFinishedEvent; import org.eclipse.emf.cdo.CDOTransactionStartedEvent; import org.eclipse.emf.cdo.CDOView; import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.internal.ui.ItemsProcessor; import org.eclipse.emf.internal.cdo.InternalCDOObject; @@ -29,6 +30,7 @@ import org.eclipse.net4j.util.lifecycle.ILifecycleEvent; import org.eclipse.jface.viewers.TreeViewer; +import java.util.HashSet; import java.util.Set; /** @@ -159,8 +161,14 @@ public class CDOEventHandler treeViewer = viewer; } - protected void sessionInvalidated(Set<CDOID> dirtyOIDs) + protected void sessionInvalidated(Set<CDOIDAndVersion> dirtyOIDs) { + Set<CDOID> idsWithoutVersion = new HashSet<CDOID>(); + for (CDOIDAndVersion idAandVersion : dirtyOIDs) + { + idsWithoutVersion.add(idAandVersion.getID()); + } + new ItemsProcessor(view) { @Override @@ -169,7 +177,7 @@ public class CDOEventHandler objectInvalidated(cdoObject); viewer.refresh(cdoObject.cdoInternalInstance(), true); } - }.processCDOObjects(treeViewer, dirtyOIDs); + }.processCDOObjects(treeViewer, idsWithoutVersion); } protected void objectInvalidated(InternalCDOObject cdoObject) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java index 57c0cea688..62198d56d3 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOSessionInvalidationEvent.java @@ -10,7 +10,7 @@ **************************************************************************/ package org.eclipse.emf.cdo; -import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import java.util.Set; @@ -29,5 +29,5 @@ public interface CDOSessionInvalidationEvent extends CDOSessionEvent */ public long getTimeStamp(); - public Set<CDOID> getDirtyOIDs(); + public Set<CDOIDAndVersion> getDirtyOIDs(); } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java index d83cf69752..43f10f795b 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOSessionImpl.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.CDOSessionInvalidationEvent; import org.eclipse.emf.cdo.CDOView; import org.eclipse.emf.cdo.common.CDOProtocolConstants; import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; import org.eclipse.emf.cdo.common.id.CDOIDLibraryDescriptor; import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDObject; @@ -26,6 +27,7 @@ import org.eclipse.emf.cdo.common.model.CDOClassRef; import org.eclipse.emf.cdo.common.model.CDOPackage; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.util.TransportException; +import org.eclipse.emf.cdo.spi.common.InternalCDORevision; import org.eclipse.emf.cdo.util.CDOPackageRegistry; import org.eclipse.emf.cdo.util.CDOUtil; import org.eclipse.emf.cdo.util.LegacySystemNotAvailableException; @@ -543,8 +545,18 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD types.put(id, type); } - public void notifyInvalidation(long timeStamp, Set<CDOID> dirtyOIDs, CDOViewImpl excludedView) + public void notifyInvalidation(long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, CDOViewImpl excludedView) { + for (CDOIDAndVersion dirtyOID : dirtyOIDs) + { + InternalCDORevision revision = getRevisionManager().getRevisionByVersion(dirtyOID.getID(), 0, + dirtyOID.getVersion(), false); + if (revision != null) + { + revision.setRevised(timeStamp - 1); + } + } + dirtyOIDs = Collections.unmodifiableSet(dirtyOIDs); for (CDOViewImpl view : getViews()) { @@ -564,7 +576,7 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD fireInvalidationEvent(timeStamp, dirtyOIDs, excludedView); } - public void fireInvalidationEvent(long timeStamp, Set<CDOID> dirtyOIDs, CDOViewImpl excludedView) + public void fireInvalidationEvent(long timeStamp, Set<CDOIDAndVersion> dirtyOIDs, CDOViewImpl excludedView) { fireEvent(new InvalidationEvent(excludedView, timeStamp, dirtyOIDs)); } @@ -814,9 +826,9 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD private long timeStamp; - private Set<CDOID> dirtyOIDs; + private Set<CDOIDAndVersion> dirtyOIDs; - public InvalidationEvent(CDOViewImpl view, long timeStamp, Set<CDOID> dirtyOIDs) + public InvalidationEvent(CDOViewImpl view, long timeStamp, Set<CDOIDAndVersion> dirtyOIDs) { super(CDOSessionImpl.this); this.view = view; @@ -839,7 +851,7 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD return timeStamp; } - public Set<CDOID> getDirtyOIDs() + public Set<CDOIDAndVersion> getDirtyOIDs() { return dirtyOIDs; } @@ -847,7 +859,7 @@ public class CDOSessionImpl extends Container<CDOView> implements CDOSession, CD @Override public String toString() { - return "CDOSessionInvalidationEvent" + dirtyOIDs; + return "CDOSessionInvalidationEvent: " + dirtyOIDs; } } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java index 603baf4631..9a013d9827 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStateMachine.java @@ -531,12 +531,12 @@ public final class CDOStateMachine extends FiniteStateMachine<CDOState, CDOEvent InternalCDORevision revision = (InternalCDORevision)object.cdoRevision(); revision.setRevised(timeStamp - 1); - CDOViewImpl view = (CDOViewImpl)object.cdoView(); - InternalCDORevision baseRevision = view.getRevision(object.cdoID(), false); - if (baseRevision != null && baseRevision.getVersion() + 1 == revision.getVersion()) - { - baseRevision.setRevised(timeStamp - 1); - } + // CDOViewImpl view = (CDOViewImpl)object.cdoView(); + // InternalCDORevision baseRevision = view.getRevision(object.cdoID(), false); + // if (baseRevision != null && baseRevision.getVersion() + 1 == revision.getVersion()) + // { + // baseRevision.setRevised(timeStamp - 1); + // } } } |