Author: nzamosenchuk
Date: 2009-12-01 03:07:29 -0500 (Tue, 01 Dec 2009)
New Revision: 909
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java
Log:
EXOJCR-243: reimplemented addLockData() method using Node.replace() instead of put() to
prevent concurrency race situation.
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java
===================================================================
---
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java 2009-11-30
16:41:43 UTC (rev 908)
+++
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JBossCacheStorageConnection.java 2009-12-01
08:07:29 UTC (rev 909)
@@ -1353,15 +1353,19 @@
if (oldLockData != null)
{
// if LockData already present with different lock token, then node has already
been locked!
- if (oldLockData.getTokenHash() != lockData.getTokenHash())
+ if (!oldLockData.getTokenHash().equals(lockData.getTokenHash()))
{
- throw new LockException("Unable to write lock data. Node [" +
lockData.getNodeIdentifier()
+ throw new LockException("Unable to write LockData. Node [" +
lockData.getNodeIdentifier()
+ "] already has LockData!");
}
else
{
// token is the same, then Lock is just refreshed. Putting new LockData.
- node.put(JBossCacheStorage.LOCK_DATA, lockData);
+ if (!node.replace(JBossCacheStorage.LOCK_DATA, oldLockData, lockData))
+ {
+ throw new LockException("Unable to re-write LockData. Possibly
LockData for the Node[" + lockData.getNodeIdentifier()
+ + "] has just been changed!");
+ }
}
}
}
Show replies by date