From 6f2beae5f3a603c684e37bcfe9eb1df99cdb9e94 Mon Sep 17 00:00:00 2001
From: Caspar De Groot
Date: Mon, 5 Sep 2011 11:07:38 +0000
Subject: [351912] Lock coordination with SynchronizableRepositories
https://bugs.eclipse.org/bugs/show_bug.cgi?id=351912
---
.../eclipse/emf/cdo/common/CDOCommonSession.java | 14 ++++
.../org/eclipse/emf/cdo/common/CDOCommonView.java | 1 +
.../cdo/common/lock/CDOLockChangeInfoHandler.java | 3 +
.../cdo/common/lock/IDurableLockingManager.java | 5 +-
.../cdo/common/protocol/CDOProtocolConstants.java | 5 ++
.../cdo/internal/common/lock/CDOLockAreaImpl.java | 10 +--
.../internal/net4j/protocol/CDOClientProtocol.java | 5 ++
.../net4j/protocol/LockObjectsRequest.java | 5 +-
.../net4j/protocol/ReplicateRepositoryRequest.java | 8 +-
.../protocol/SetLockNotificationModeRequest.java | 44 ++++++++++
.../net4j/protocol/UnlockObjectsRequest.java | 3 +-
.../cdo/server/internal/db/DBStoreAccessor.java | 5 +-
.../server/internal/db/DurableLockingManager.java | 72 ++++++++++------
.../internal/net4j/protocol/CDOServerProtocol.java | 3 +
.../net4j/protocol/LockObjectsIndication.java | 2 +
.../SetLockNotificationModeIndication.java | 42 ++++++++++
.../net4j/protocol/UnlockObjectsIndication.java | 1 +
.../emf/cdo/internal/server/LockManager.java | 86 +++++++++----------
.../emf/cdo/internal/server/Repository.java | 13 +--
.../eclipse/emf/cdo/internal/server/Session.java | 3 +-
.../embedded/EmbeddedClientSessionProtocol.java | 6 ++
.../emf/cdo/internal/server/mem/MEMStore.java | 1 -
.../server/syncing/RepositorySynchronizer.java | 97 +++++++++++++---------
.../server/syncing/SynchronizableRepository.java | 25 +++++-
.../emf/cdo/spi/server/DurableLockArea.java | 2 +-
.../emf/cdo/tests/offline/FailoverTest.java | 2 +-
.../cdo/session/CDOSessionLocksChangedEvent.java | 8 ++
.../emf/internal/cdo/session/CDOSessionImpl.java | 44 ++++++++++
.../cdo/session/DelegatingSessionProtocol.java | 18 ++++
.../cdo/transaction/CDOTransactionImpl.java | 2 +-
.../eclipse/emf/internal/cdo/view/CDOViewImpl.java | 27 +++---
.../eclipse/emf/spi/cdo/CDOSessionProtocol.java | 30 ++++++-
32 files changed, 442 insertions(+), 150 deletions(-)
create mode 100644 plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/SetLockNotificationModeRequest.java
create mode 100644 plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/SetLockNotificationModeIndication.java
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonSession.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonSession.java
index 8bea47f3e5..09cee9b7a3 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonSession.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonSession.java
@@ -169,5 +169,19 @@ public interface CDOCommonSession extends IUserAware, IOptionsContainer, Closeab
public PassiveUpdateMode getNewMode();
}
+
+ /**
+ * An {@link IOptionsEvent options event} fired when the {@link LockNotificationMode lock notification mode} of a
+ * CDO session has changed.
+ *
+ * @author Caspar De Groot
+ * @since 4.1
+ */
+ public interface LockNotificationModeEvent extends IOptionsEvent
+ {
+ public LockNotificationMode getOldMode();
+
+ public LockNotificationMode getNewMode();
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonView.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonView.java
index d24ec88fc2..fc6f689211 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonView.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/CDOCommonView.java
@@ -86,6 +86,7 @@ public interface CDOCommonView extends CDOBranchPoint, CDORevisionProvider, IOpt
*/
public interface LockNotificationEvent extends IOptionsEvent
{
+ boolean getEnabled();
}
}
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfoHandler.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfoHandler.java
index 118f973516..91b3cc3329 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfoHandler.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/CDOLockChangeInfoHandler.java
@@ -11,6 +11,9 @@
package org.eclipse.emf.cdo.common.lock;
/**
+ * A call-back interface that indicates the ability to handle {@link CDOLockChangeInfo lock-change infos} that
+ * are passed from other entities.
+ *
* @author Caspar De Groot
* @since 4.1
*/
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/IDurableLockingManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/IDurableLockingManager.java
index 430e020670..919cd41f58 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/IDurableLockingManager.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/lock/IDurableLockingManager.java
@@ -68,9 +68,12 @@ public interface IDurableLockingManager
public Map getLocks();
/**
+ * Returns true
if this instance represents a lock area that is known to be missing (not present) on a
+ * master server. (Relevant only in a replicating configuration.)
+ *
* @since 4.1
*/
- public boolean isDeleted();
+ public boolean isMissing();
/**
* A call-back interface for handling {@link LockArea lock area} objects.
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java
index af623cafb9..1c2644d659 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java
@@ -242,6 +242,11 @@ public interface CDOProtocolConstants
*/
public static final short SIGNAL_ENABLE_LOCK_NOTIFICATION = 53;
+ /**
+ * @since 4.1
+ */
+ public static final short SIGNAL_SET_LOCK_NOTIFICATION_MODE = 54;
+
// //////////////////////////////////////////////////////////////////////
// Session Refresh
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockAreaImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockAreaImpl.java
index 4baa364851..3bbb9e5e46 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockAreaImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/lock/CDOLockAreaImpl.java
@@ -39,7 +39,7 @@ public class CDOLockAreaImpl implements LockArea
private final Map locks;
- private final boolean deleted;
+ private final boolean missing;
public CDOLockAreaImpl(String durableLockingID, String userID, CDOBranchPoint branchPoint, boolean readOnly,
Map locks)
@@ -49,7 +49,7 @@ public class CDOLockAreaImpl implements LockArea
this.branchPoint = branchPoint;
this.readOnly = readOnly;
this.locks = locks;
- deleted = false;
+ missing = false;
}
public CDOLockAreaImpl(String durableLockingID)
@@ -59,7 +59,7 @@ public class CDOLockAreaImpl implements LockArea
branchPoint = null;
readOnly = false;
locks = null;
- deleted = true;
+ missing = true;
}
public String getDurableLockingID()
@@ -99,8 +99,8 @@ public class CDOLockAreaImpl implements LockArea
durableLockingID, userID, branchPoint, readOnly, locks);
}
- public boolean isDeleted()
+ public boolean isMissing()
{
- return deleted;
+ return missing;
}
}
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java
index 956ed5199e..20491c89b5 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java
@@ -525,4 +525,9 @@ public class CDOClientProtocol extends SignalProtocol implements CDO
{
send(new EnableLockNotificationRequest(this, viewID, on));
}
+
+ public void setLockNotificationMode(LockNotificationMode mode)
+ {
+ send(new SetLockNotificationModeRequest(this, mode));
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LockObjectsRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LockObjectsRequest.java
index b01f0a0b0d..1b6b9b53e2 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LockObjectsRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LockObjectsRequest.java
@@ -84,6 +84,8 @@ public class LockObjectsRequest extends CDOClientRequest
staleRevisions[i] = in.readCDORevisionKey();
}
+ long timestamp = in.readLong();
+
int n = in.readInt();
CDOLockState[] newLockStates = new CDOLockState[n];
for (int i = 0; i < n; i++)
@@ -91,6 +93,7 @@ public class LockObjectsRequest extends CDOClientRequest
newLockStates[i] = in.readCDOLockState();
}
- return new LockObjectsResult(succesful, timeout, waitForUpdate, requiredTimestamp, staleRevisions, newLockStates);
+ return new LockObjectsResult(succesful, timeout, waitForUpdate, requiredTimestamp, staleRevisions, newLockStates,
+ timestamp);
}
}
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ReplicateRepositoryRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ReplicateRepositoryRequest.java
index 156fc10184..d919a00a7f 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ReplicateRepositoryRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/ReplicateRepositoryRequest.java
@@ -68,11 +68,11 @@ public class ReplicateRepositoryRequest extends CDOClientRequest
break;
case CDOProtocolConstants.REPLICATE_LOCKAREA:
- boolean deleted = !in.readBoolean();
- if (deleted)
+ boolean missing = !in.readBoolean();
+ if (missing)
{
- String deletedLockAreaID = in.readString();
- LockArea area = CDOLockUtil.createLockArea(deletedLockAreaID);
+ String missingLockAreaID = in.readString();
+ LockArea area = CDOLockUtil.createLockArea(missingLockAreaID);
context.handleLockArea(area);
}
else
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/SetLockNotificationModeRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/SetLockNotificationModeRequest.java
new file mode 100644
index 0000000000..688cdb250d
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/SetLockNotificationModeRequest.java
@@ -0,0 +1,44 @@
+/**
+ * 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.internal.net4j.protocol;
+
+import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
+import org.eclipse.emf.cdo.common.protocol.CDODataInput;
+import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
+import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
+
+import java.io.IOException;
+
+/**
+ * @author Caspar De Groot
+ */
+public class SetLockNotificationModeRequest extends CDOClientRequest
+{
+ private LockNotificationMode mode;
+
+ public SetLockNotificationModeRequest(CDOClientProtocol protocol, LockNotificationMode mode)
+ {
+ super(protocol, CDOProtocolConstants.SIGNAL_SET_LOCK_NOTIFICATION_MODE);
+ this.mode = mode;
+ }
+
+ @Override
+ protected void requesting(CDODataOutput out) throws IOException
+ {
+ out.writeEnum(mode);
+ }
+
+ @Override
+ protected Boolean confirming(CDODataInput in) throws IOException
+ {
+ return in.readBoolean();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/UnlockObjectsRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/UnlockObjectsRequest.java
index 0eefb367a3..1dcc86cf82 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/UnlockObjectsRequest.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/UnlockObjectsRequest.java
@@ -90,12 +90,13 @@ public class UnlockObjectsRequest extends CDOClientRequest
@Override
protected UnlockObjectsResult confirming(CDODataInput in) throws IOException
{
+ long timestamp = in.readLong();
int n = in.readInt();
CDOLockState[] newLockStates = new CDOLockState[n];
for (int i = 0; i < n; i++)
{
newLockStates[i] = in.readCDOLockState();
}
- return new UnlockObjectsResult(newLockStates);
+ return new UnlockObjectsResult(newLockStates, timestamp);
}
}
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 bc1481a8bd..42aca92d88 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
@@ -1301,9 +1301,10 @@ public class DBStoreAccessor extends StoreAccessor implements IDBStoreAccessor,
return manager.createLockArea(this, durableLockingID, userID, branchPoint, readOnly, locks);
}
- public void updateLockArea(LockArea lockArea)
+ public void updateLockArea(LockArea area)
{
- throw new RuntimeException("TODO (CD)"); // TODO (CD)
+ DurableLockingManager manager = getStore().getDurableLockingManager();
+ manager.updateLockArea(this, area);
}
public LockArea getLockArea(String durableLockingID) throws LockAreaNotFoundException
diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DurableLockingManager.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DurableLockingManager.java
index 1e2183698d..7fbd726665 100644
--- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DurableLockingManager.java
+++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DurableLockingManager.java
@@ -151,30 +151,7 @@ public class DurableLockingManager extends Lifecycle
if (!locks.isEmpty())
{
- try
- {
- stmt = statementCache.getPreparedStatement(sqlInsertLock, ReuseProbability.MEDIUM);
- stmt.setString(1, durableLockingID);
-
- for (Entry entry : locks.entrySet())
- {
- CDOID id = entry.getKey();
- int grade = entry.getValue().getValue();
-
- idHandler.setCDOID(stmt, 2, id);
- stmt.setInt(3, grade);
-
- DBUtil.update(stmt, true);
- }
- }
- catch (SQLException e)
- {
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(stmt);
- }
+ insertLocks(accessor, durableLockingID, locks);
}
accessor.getConnection().commit();
@@ -187,6 +164,37 @@ public class DurableLockingManager extends Lifecycle
}
}
+ private void insertLocks(DBStoreAccessor accessor, String durableLockingID, Map locks)
+ {
+ IPreparedStatementCache statementCache = accessor.getStatementCache();
+ PreparedStatement stmt = null;
+
+ try
+ {
+ stmt = statementCache.getPreparedStatement(sqlInsertLock, ReuseProbability.MEDIUM);
+ stmt.setString(1, durableLockingID);
+
+ for (Entry entry : locks.entrySet())
+ {
+ CDOID id = entry.getKey();
+ int grade = entry.getValue().getValue();
+
+ idHandler.setCDOID(stmt, 2, id);
+ stmt.setInt(3, grade);
+
+ DBUtil.update(stmt, true);
+ }
+ }
+ catch (SQLException e)
+ {
+ throw new DBException(e);
+ }
+ finally
+ {
+ statementCache.releasePreparedStatement(stmt);
+ }
+ }
+
public LockArea getLockArea(DBStoreAccessor accessor, String durableLockingID) throws LockAreaNotFoundException
{
IPreparedStatementCache statementCache = accessor.getStatementCache();
@@ -300,6 +308,22 @@ public class DurableLockingManager extends Lifecycle
}
}
+ public void updateLockArea(DBStoreAccessor accessor, LockArea area)
+ {
+ try
+ {
+ String areaID = area.getDurableLockingID();
+ unlockWithoutCommit(accessor, areaID);
+ insertLocks(accessor, areaID, area.getLocks());
+
+ accessor.getConnection().commit();
+ }
+ catch (SQLException e)
+ {
+ throw new DBException(e);
+ }
+ }
+
public void lock(DBStoreAccessor accessor, String durableLockingID, LockType type,
Collection extends Object> objectsToLock)
{
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java
index c3c7d4f8db..30281c9dc2 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java
@@ -320,6 +320,9 @@ public class CDOServerProtocol extends SignalProtocol implement
case CDOProtocolConstants.SIGNAL_ENABLE_LOCK_NOTIFICATION:
return new EnableLockNotificationIndication(this);
+ case CDOProtocolConstants.SIGNAL_SET_LOCK_NOTIFICATION_MODE:
+ return new SetLockNotificationModeIndication(this);
+
default:
return super.createSignalReactor(signalID);
}
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java
index 4484526c62..3773c05cb0 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java
@@ -85,6 +85,8 @@ public class LockObjectsIndication extends CDOServerWriteIndication
out.writeCDORevisionKey(revKey);
}
+ out.writeLong(result.getTimestamp());
+
CDOLockState[] newLockStates = result.getNewLockStates();
out.writeInt(newLockStates.length);
for (CDOLockState lockState : newLockStates)
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/SetLockNotificationModeIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/SetLockNotificationModeIndication.java
new file mode 100644
index 0000000000..24092247af
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/SetLockNotificationModeIndication.java
@@ -0,0 +1,42 @@
+/**
+ * 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.server.internal.net4j.protocol;
+
+import org.eclipse.emf.cdo.common.CDOCommonSession.Options.LockNotificationMode;
+import org.eclipse.emf.cdo.common.protocol.CDODataInput;
+import org.eclipse.emf.cdo.common.protocol.CDODataOutput;
+import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants;
+
+import java.io.IOException;
+
+/**
+ * @author Caspar De Groot
+ */
+public class SetLockNotificationModeIndication extends CDOServerReadIndication
+{
+ public SetLockNotificationModeIndication(CDOServerProtocol protocol)
+ {
+ super(protocol, CDOProtocolConstants.SIGNAL_SET_LOCK_NOTIFICATION_MODE);
+ }
+
+ @Override
+ protected void indicating(CDODataInput in) throws IOException
+ {
+ LockNotificationMode mode = in.readEnum(LockNotificationMode.class);
+ getSession().setLockNotificationMode(mode);
+ }
+
+ @Override
+ protected void responding(CDODataOutput out) throws IOException
+ {
+ out.writeBoolean(true);
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnlockObjectsIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnlockObjectsIndication.java
index a945056014..e4cc3a133d 100644
--- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnlockObjectsIndication.java
+++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/UnlockObjectsIndication.java
@@ -74,6 +74,7 @@ public class UnlockObjectsIndication extends CDOServerWriteIndication
@Override
protected void responding(CDODataOutput out) throws IOException
{
+ out.writeLong(result.getTimestamp());
CDOLockState[] newLockStates = result.getNewLockStates();
out.writeInt(newLockStates.length);
for (CDOLockState state : newLockStates)
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 19d20940e8..26ba1ad922 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
@@ -574,34 +574,14 @@ public class LockManager extends RWOLockManager