From 64bc75c17dcccfe26cd009660f743d7d0faa3ab4 Mon Sep 17 00:00:00 2001
From: Caspar De Groot
Date: Thu, 15 Sep 2011 04:13:42 +0000
Subject: [356754] Raw replication of persistent locks
https://bugs.eclipse.org/bugs/show_bug.cgi?id=356754
---
.../emf/cdo/common/lock/CDOLockChangeInfo.java | 5 +
.../eclipse/emf/cdo/common/lock/CDOLockUtil.java | 11 +-
.../common/lock/CDOLockChangeInfoImpl.java | 22 +++-
.../internal/common/protocol/CDODataInputImpl.java | 7 ++
.../common/protocol/CDODataOutputImpl.java | 26 +++--
.../cdo/server/internal/db/DBStoreAccessor.java | 12 +++
.../emf/cdo/internal/server/LockManager.java | 45 +++++----
.../eclipse/emf/cdo/internal/server/Session.java | 5 +-
.../server/syncing/SynchronizableRepository.java | 12 ++-
.../emf/cdo/spi/server/InternalLockManager.java | 5 +
.../emf/cdo/tests/db/AllTestsDBH2Offline.java | 4 +
.../eclipse/emf/cdo/tests/AbstractSyncingTest.java | 8 ++
.../eclipse/emf/cdo/tests/AllTestsMEMOffline.java | 9 +-
.../emf/cdo/tests/offline/OfflineDelayedTest.java | 4 -
.../offline/OfflineLockRawReplicationTest.java | 23 +++++
.../emf/cdo/tests/offline/OfflineLockingTest.java | 111 ---------------------
.../eclipse/emf/internal/cdo/CDOObjectImpl.java | 19 +---
.../emf/internal/cdo/object/CDOLegacyWrapper.java | 16 +--
.../cdo/util/DefaultLocksChangedEvent.java | 5 +
.../eclipse/emf/internal/cdo/view/CDOViewImpl.java | 46 ++++++++-
.../org/eclipse/emf/spi/cdo/InternalCDOObject.java | 6 --
.../src/org/eclipse/net4j/db/DBUtil.java | 9 ++
22 files changed, 216 insertions(+), 194 deletions(-)
create mode 100644 plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/offline/OfflineLockRawReplicationTest.java
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfo.java
index 3669f9abe3..643901354f 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfo.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfo.java
@@ -30,6 +30,11 @@ import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType;
*/
public interface CDOLockChangeInfo extends CDOBranchPoint
{
+ /**
+ *
+ */
+ public boolean isInvalidateAll();
+
/**
* @return The branch at which the lock changes took place, same as getView().getBranch()
.
*/
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockUtil.java
index 3250f5adfa..b0defe9ac4 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockUtil.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockUtil.java
@@ -18,10 +18,10 @@ import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.lock.CDOLockChangeInfo.Operation;
import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea;
import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade;
+import org.eclipse.emf.cdo.internal.common.lock.CDOLockAreaImpl;
import org.eclipse.emf.cdo.internal.common.lock.CDOLockChangeInfoImpl;
import org.eclipse.emf.cdo.internal.common.lock.CDOLockOwnerImpl;
import org.eclipse.emf.cdo.internal.common.lock.CDOLockStateImpl;
-import org.eclipse.emf.cdo.internal.common.lock.CDOLockAreaImpl;
import org.eclipse.emf.cdo.spi.common.lock.InternalCDOLockState;
import org.eclipse.net4j.util.CheckUtil;
@@ -72,7 +72,7 @@ public final class CDOLockUtil
sessionID = session.getSessionID();
viewID = view.getViewID();
}
-
+
CDOLockOwner owner = new CDOLockOwnerImpl(sessionID, viewID, durableLockingID, isDurableView);
cdoLockState.addReadLockOwner(owner);
}
@@ -104,7 +104,7 @@ public final class CDOLockUtil
int viewID = view.getViewID();
return new CDOLockOwnerImpl(sessionID, viewID, durableLockingID, false);
}
-
+
CheckUtil.checkNull(durableLockingID, "durableLockingID");
return new CDOLockOwnerImpl(0, 0, durableLockingID, true); // TODO (CD) Symbolic constants?
}
@@ -115,6 +115,11 @@ public final class CDOLockUtil
return new CDOLockChangeInfoImpl(branch.getPoint(timestamp), lockOwner, cdoLockStates, op, lockType);
}
+ public static CDOLockChangeInfo createLockChangeInfo()
+ {
+ return new CDOLockChangeInfoImpl();
+ }
+
public static CDOLockChangeInfo createLockChangeInfo(long timestamp, CDOCommonView view, CDOBranch viewedBranch,
Operation op, LockType lockType, CDOLockState[] cdoLockStates)
{
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockChangeInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockChangeInfoImpl.java
index e8a7a16b62..11a3091eb6 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockChangeInfoImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockChangeInfoImpl.java
@@ -33,6 +33,8 @@ public class CDOLockChangeInfoImpl implements CDOLockChangeInfo
private final LockType lockType;
+ private final boolean isInvalidateAll;
+
public CDOLockChangeInfoImpl(CDOBranchPoint branchPoint, CDOLockOwner lockOwner, CDOLockState[] lockStates,
Operation operation, LockType lockType)
{
@@ -41,16 +43,27 @@ public class CDOLockChangeInfoImpl implements CDOLockChangeInfo
this.lockStates = lockStates;
this.operation = operation;
this.lockType = lockType;
+ isInvalidateAll = false;
+ }
+
+ public CDOLockChangeInfoImpl()
+ {
+ branchPoint = null;
+ lockOwner = null;
+ lockStates = null;
+ operation = null;
+ lockType = null;
+ isInvalidateAll = true;
}
public CDOBranch getBranch()
{
- return branchPoint.getBranch();
+ return branchPoint == null ? null : branchPoint.getBranch();
}
public long getTimeStamp()
{
- return branchPoint.getTimeStamp();
+ return branchPoint == null ? 0L : branchPoint.getTimeStamp();
}
public CDOLockOwner getLockOwner()
@@ -72,4 +85,9 @@ public class CDOLockChangeInfoImpl implements CDOLockChangeInfo
{
return lockType;
}
+
+ public boolean isInvalidateAll()
+ {
+ return isInvalidateAll;
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java
index 8928db8eb3..1590d4027f 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java
@@ -30,6 +30,7 @@ import org.eclipse.emf.cdo.common.lock.CDOLockChangeInfo;
import org.eclipse.emf.cdo.common.lock.CDOLockChangeInfo.Operation;
import org.eclipse.emf.cdo.common.lock.CDOLockOwner;
import org.eclipse.emf.cdo.common.lock.CDOLockState;
+import org.eclipse.emf.cdo.common.lock.CDOLockUtil;
import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockArea;
import org.eclipse.emf.cdo.common.lock.IDurableLockingManager.LockGrade;
import org.eclipse.emf.cdo.common.model.CDOClassifierRef;
@@ -270,6 +271,12 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl
public CDOLockChangeInfo readCDOLockChangeInfo() throws IOException
{
+ boolean isInvalidateAll = readBoolean();
+ if (isInvalidateAll)
+ {
+ return CDOLockUtil.createLockChangeInfo();
+ }
+
CDOBranchPoint branchPoint = readCDOBranchPoint();
CDOLockOwner lockOwner = readCDOLockOwner();
Operation operation = readEnum(Operation.class);
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java
index ef3bcdaa6b..1ebd54b3dd 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java
@@ -227,16 +227,24 @@ public abstract class CDODataOutputImpl extends ExtendedDataOutput.Delegating im
public void writeCDOLockChangeInfo(CDOLockChangeInfo lockChangeInfo) throws IOException
{
- writeCDOBranchPoint(lockChangeInfo);
- writeCDOLockOwner(lockChangeInfo.getLockOwner());
- writeEnum(lockChangeInfo.getOperation());
- writeCDOLockType(lockChangeInfo.getLockType());
-
- CDOLockState[] lockStates = lockChangeInfo.getLockStates();
- writeInt(lockStates.length);
- for (CDOLockState lockState : lockStates)
+ if (lockChangeInfo.isInvalidateAll())
+ {
+ writeBoolean(true);
+ }
+ else
{
- writeCDOLockState(lockState);
+ writeBoolean(false);
+ writeCDOBranchPoint(lockChangeInfo);
+ writeCDOLockOwner(lockChangeInfo.getLockOwner());
+ writeEnum(lockChangeInfo.getOperation());
+ writeCDOLockType(lockChangeInfo.getLockType());
+
+ CDOLockState[] lockStates = lockChangeInfo.getLockStates();
+ writeInt(lockStates.length);
+ for (CDOLockState lockState : lockStates)
+ {
+ writeCDOLockState(lockState);
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
index 42aca92d88..fc5ad2928f 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java
@@ -1102,6 +1102,9 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
where = " WHERE " + CDODBSchema.COMMIT_INFOS_TIMESTAMP + " BETWEEN " + fromCommitTime + " AND " + toCommitTime;
DBUtil.serializeTable(out, connection, CDODBSchema.COMMIT_INFOS, null, where);
+ DBUtil.serializeTable(out, connection, store.getDBSchema().getTable("cdo_lock_areas"), null, null);
+ DBUtil.serializeTable(out, connection, store.getDBSchema().getTable("cdo_locks"), null, null);
+
IIDHandler idHandler = store.getIDHandler();
idHandler.rawExport(connection, out, fromCommitTime, toCommitTime);
@@ -1132,6 +1135,15 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
{
DBUtil.deserializeTable(in, connection, CDODBSchema.BRANCHES, monitor.fork());
DBUtil.deserializeTable(in, connection, CDODBSchema.COMMIT_INFOS, monitor.fork());
+
+ // Delete all non-empty lock areas
+ String sql = "DELETE FROM cdo_lock_areas WHERE EXISTS (SELECT * FROM cdo_locks WHERE cdo_locks.area_id=cdo_lock_areas.id)";
+ DBUtil.update(connection, sql);
+ DBUtil.deserializeTable(in, connection, store.getDBSchema().getTable("cdo_lock_areas"), monitor.fork());
+
+ DBUtil.clearTable(connection, "cdo_locks");
+ DBUtil.deserializeTable(in, connection, store.getDBSchema().getTable("cdo_locks"), monitor.fork());
+
store.getIDHandler().rawImport(connection, in, fromCommitTime, toCommitTime, monitor.fork());
rawImportPackageUnits(in, fromCommitTime, toCommitTime, packageUnits, monitor.fork());
mappingStrategy.rawImport(this, in, fromCommitTime, toCommitTime, monitor.fork(size));
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/LockManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/LockManager.java
index 5db93a490f..421c51de87 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/LockManager.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/LockManager.java
@@ -352,7 +352,7 @@ public class LockManager extends RWOLockManager