Author: arminw Date: Wed Mar 14 18:13:42 2007 New Revision: 518417 URL: http://svn.apache.org/viewvc?view=rev&rev=518417 Log: add new methods to locking-api, adapt and improve existing LockManager-impl classes
Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/locking/CommonsOJBLockManager.java db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManager.java db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerCommonsImpl.java db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerRemoteImpl.java db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerServlet.java db/ojb/trunk/src/test/org/apache/ojb/web.xml Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/locking/CommonsOJBLockManager.java URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/locking/CommonsOJBLockManager.java?view=diff&rev=518417&r1=518416&r2=518417 ============================================================================== --- db/ojb/trunk/src/java/org/apache/ojb/broker/locking/CommonsOJBLockManager.java (original) +++ db/ojb/trunk/src/java/org/apache/ojb/broker/locking/CommonsOJBLockManager.java Wed Mar 14 18:13:42 2007 @@ -1,12 +1,6 @@ package org.apache.ojb.broker.locking; -import org.apache.commons.transaction.locking.GenericLock; -import org.apache.commons.transaction.locking.GenericLockManager; -import org.apache.commons.transaction.locking.LockException; -import org.apache.commons.transaction.locking.MultiLevelLock; -import org.apache.commons.transaction.util.LoggerFacade; - -/* Copyright 2002-2004 The Apache Software Foundation +/* Copyright 2005 The Apache Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +15,14 @@ * limitations under the License. */ +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; +import org.apache.commons.transaction.locking.GenericLock; +import org.apache.commons.transaction.locking.GenericLockManager; +import org.apache.commons.transaction.locking.LockException; +import org.apache.commons.transaction.locking.MultiLevelLock; +import org.apache.commons.transaction.util.LoggerFacade; + /** * Extension of [EMAIL PROTECTED] org.apache.commons.transaction.locking.GenericLockManager} to * support all locking isolation level defined in OJB locking api and a provider of @@ -32,7 +34,6 @@ * [EMAIL PROTECTED] #createIsolationLevel(Object, IsolationLevels, org.apache.commons.transaction.util.LoggerFacade)} * dependend on the specified isolation level. * - * @author <a href="mailto:[EMAIL PROTECTED]">Armin Waibel</a> * @version $Id$ */ class CommonsOJBLockManager extends GenericLockManager @@ -41,12 +42,20 @@ static final int COMMON_WRITE_LOCK = 107; static final int COMMON_UPGRADE_LOCK = 113; - private final Object sync = new Object(); - - public CommonsOJBLockManager(LoggerFacade logger, long timeoutMSecs, long checkThreshholdMSecs) + public CommonsOJBLockManager(LoggerFacade logger, long globalLockTimeoutMSecs, long checkThreshholdMSecs) throws IllegalArgumentException { - super(1, logger, timeoutMSecs, checkThreshholdMSecs); + super(1, logger, globalLockTimeoutMSecs, checkThreshholdMSecs); + } + + public synchronized String toString() + { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("globalOwner_MapSize="+globalOwners.size()) + .append("globalLocks_MapSize="+globalLocks.size()) + .append("effectiveGlobalTimeouts_MapSize="+effectiveGlobalTimeouts.size()) + .append("timedOutOwners_SetSize="+effectiveGlobalTimeouts.size()) + .toString(); } /** @@ -149,7 +158,7 @@ */ public OJBLock atomicGetOrCreateLock(Object resourceId, Object isolationLevel) { - synchronized(sync) + synchronized(globalLocks) { MultiLevelLock lock = getLock(resourceId); if(lock == null) @@ -170,7 +179,7 @@ protected GenericLock createLock(Object resourceId, IsolationLevels isolationLevel) { - synchronized(sync) + synchronized(globalLocks) { if(isolationLevel != null) { Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManager.java URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManager.java?view=diff&rev=518417&r1=518416&r2=518417 ============================================================================== --- db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManager.java (original) +++ db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManager.java Wed Mar 14 18:13:42 2007 @@ -87,82 +87,130 @@ public String getLockInfo(); /** - * Acquires a readlock for lock key on resource object. + * Acquires a readlock for lock owner on resource object. * Returns true if successful, else false. * - * @param key The owner key of the lock. - * @param resourceId The resource to lock. + * @param owner The owner of the lock. + * @param resource The resource to lock. * @param isolationLevel The isolation level of the lock. * @return <em>True</em> if the lock was successfully acquired. */ - public boolean readLock(Object key, Object resourceId, IsolationLevels isolationLevel); + public boolean readLock(Object owner, Object resource, IsolationLevels isolationLevel); /** - * Acquires a write lock for lock key on resource object. + * Acquires a readlock for lock owner on resource object. + * Returns <em>true</em> if successful, else false. + * The <em>lock timeout</em> and the <em>block timeout</em> must + * be specified too (support for <em>lock timeout</em> and the <em>block timeout</em> + * depends on the implementation). + * + * @param owner The owner of the lock. + * @param resource The resource to lock. + * @param isolationLevel The isolation level of the lock. + * @param lockTimeout The lock timeout in <em>ms</em> of acquired lock. + * @param blockTimeout The time to wait for acquire the lock in <em>ms</em>. + * @return <em>True</em> if the lock was successfully acquired. + */ + public boolean readLock(Object owner, Object resource, IsolationLevels isolationLevel, long lockTimeout, long blockTimeout); + + /** + * Acquires a write lock for lock owner on resource object. * Returns true if successful, else false. * - * @param key The owner key of the lock. - * @param resourceId The resource to lock. + * @param owner The owner of the lock. + * @param resource The resource to lock. + * @param isolationLevel The isolation level of the lock. + * @return <em>True</em> if the lock was successfully acquired. + */ + public boolean writeLock(Object owner, Object resource, IsolationLevels isolationLevel); + + /** + * Acquires a write lock for lock owner on resource object. + * Returns true if successful, else false. + * The <em>lock timeout</em> and the <em>block timeout</em> must + * be specified too (support for <em>lock timeout</em> and the <em>block timeout</em> + * depends on the implementation). + * + * @param owner The owner of the lock. + * @param resource The resource to lock. + * @param isolationLevel The isolation level of the lock. + * @param lockTimeout The lock timeout in <em>ms</em> of acquired lock. + * @param blockTimeout The time to wait for acquire the lock in <em>ms</em>. + * @return <em>True</em> if the lock was successfully acquired. + */ + public boolean writeLock(Object owner, Object resource, IsolationLevels isolationLevel, long lockTimeout, long blockTimeout); + + /** + * Acquire an upgrade lock. + * (Current implementations always acquire a write lock instead). + * + * @param owner The owner of the lock. + * @param resource The resource to lock. * @param isolationLevel The isolation level of the lock. * @return <em>True</em> if the lock was successfully acquired. */ - public boolean writeLock(Object key, Object resourceId, IsolationLevels isolationLevel); + public boolean upgradeLock(Object owner, Object resource, IsolationLevels isolationLevel); /** * Acquire an upgrade lock. * (Current implementations always acquire a write lock instead). + * The <em>lock timeout</em> and the <em>block timeout</em> must + * be specified too (support for <em>lock timeout</em> and the <em>block timeout</em> + * depends on the implementation). * - * @param key The owner key of the lock. - * @param resourceId The resource to lock. + * @param owner The owner of the lock. + * @param resource The resource to lock. * @param isolationLevel The isolation level of the lock. + * @param lockTimeout The lock timeout in <em>ms</em> of acquired lock. + * @param blockTimeout The time to wait for acquire the lock in <em>ms</em>. * @return <em>True</em> if the lock was successfully acquired. */ - public boolean upgradeLock(Object key, Object resourceId, IsolationLevels isolationLevel); + public boolean upgradeLock(Object owner, Object resource, IsolationLevels isolationLevel, long lockTimeout, long blockTimeout); /** - * Releases a lock for lock key on resource object. + * Releases a lock for lock owner on resource object. * Returns true if successful, else false. * - * @param key The owner key of the lock. - * @param resourceId The resource to release. + * @param owner The owner of the lock. + * @param resource The resource to release. * @return <em>True</em> if the lock was successfully released. */ - public boolean releaseLock(Object key, Object resourceId); + public boolean releaseLock(Object owner, Object resource); /** - * Release all resource locks hold by the specified owner key. + * Release all resource locks hold by the specified owner owner. * - * @param key The owner key to release all associated locks. + * @param owner The owner to release all associated locks. */ - public void releaseLocks(Object key); + public void releaseLocks(Object owner); /** * Checks if there is a read lock for owner key on resource object. * Returns true if so, else false. * - * @param key The owner key of the lock. - * @param resourceId The resource to check. + * @param owner The owner key of the lock. + * @param resource The resource to check. * @return <em>True</em> if the lock exists. */ - public boolean hasRead(Object key, Object resourceId); + public boolean hasRead(Object owner, Object resource); /** - * Checks if there is a write lock for lock key on resource object. + * Checks if there is a write lock for lock owner on resource object. * Returns true if so, else false. * - * @param key The owner key of the lock. - * @param resourceId The resource to check. + * @param owner The owner key of the lock. + * @param resource The resource to check. * @return <em>True</em> if the lock exists. */ - public boolean hasWrite(Object key, Object resourceId); + public boolean hasWrite(Object owner, Object resource); /** - * Checks if there is a upgrade lock for lock key on resource object. + * Checks if there is a upgrade lock for lock owner on resource object. * Returns true if so, else false. * - * @param key The owner key of the lock. - * @param resourceId The resource to check. + * @param owner The owner key of the lock. + * @param resource The resource to check. * @return <em>True</em> if the lock exists. */ - public boolean hasUpgrade(Object key, Object resourceId); + public boolean hasUpgrade(Object owner, Object resource); } Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerCommonsImpl.java URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerCommonsImpl.java?view=diff&rev=518417&r1=518416&r2=518417 ============================================================================== --- db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerCommonsImpl.java (original) +++ db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerCommonsImpl.java Wed Mar 14 18:13:42 2007 @@ -62,6 +62,7 @@ public void setLockTimeout(long timeout) { + log.debug("Set lock timeout to " + timeout + " ms"); this.lockTimeout = timeout; } @@ -72,74 +73,94 @@ public void setBlockTimeout(long blockTimeout) { + log.debug("Set waiting block time to acquire a lock to " + blockTimeout + " ms"); this.blockTimeout = blockTimeout; } public String getLockInfo() { String eol = SystemUtils.LINE_SEPARATOR; - StringBuffer msg = new StringBuffer("Class: " + LockManagerCommonsImpl.class.getName() + eol) - .append("lock timeout: ").append(getLockTimeout()).append(" [ms]").append(eol) - .append("block timeout: ").append(getBlockTimeout()).append(" [ms]").append(eol) - .append("commons-tx lock-manger info ==> ").append(eol).append(lm); + StringBuffer msg = new StringBuffer("Class: " + LockManagerCommonsImpl.class.getName() + eol); + msg.append("lock timeout: ").append(getLockTimeout()).append(" [ms]").append(eol); + msg.append("block timeout: ").append(getBlockTimeout()).append(" [ms]").append(eol); + msg.append("commons-tx lock-manger info ==> ").append(eol); + msg.append(lm != null ? lm.toString() : "not initialized"); return msg.toString(); } - public boolean readLock(Object key, Object resourceId, IsolationLevels isolationLevel) + public boolean readLock(final Object owner, final Object resource, final IsolationLevels isolationLevel, + final long lockTimeout, final long blockTimeout) { - return isolationLevel.ignoreForLock() || lm.readLock(key, resourceId, isolationLevel, blockTimeout); + return isolationLevel.ignoreForLock() || lm.readLock(owner, resource, isolationLevel, blockTimeout, lockTimeout); } - public boolean writeLock(Object key, Object resourceId, IsolationLevels isolationLevel) + public boolean readLock(final Object owner, final Object resource, final IsolationLevels isolationLevel) { - return isolationLevel.ignoreForLock() || lm.writeLock(key, resourceId,isolationLevel, blockTimeout); + return readLock(owner, resource, isolationLevel, lockTimeout, blockTimeout); } - public boolean upgradeLock(Object key, Object resourceId, IsolationLevels isolationLevel) + public boolean writeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel, + final long lockTimeout, final long blockTimeout) { - return isolationLevel.ignoreForLock() || lm.upgradeLock(key, resourceId, isolationLevel, blockTimeout); + return isolationLevel.ignoreForLock() || lm.writeLock(owner, resource, isolationLevel, blockTimeout, lockTimeout); } - public boolean releaseLock(Object key, Object resourceId) + public boolean writeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel) + { + return writeLock(owner, resource, isolationLevel, lockTimeout, blockTimeout); + } + + public boolean upgradeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel, + final long lockTimeout, final long blockTimeout) + { + return isolationLevel.ignoreForLock() || lm.upgradeLock(owner, resource, isolationLevel, blockTimeout, lockTimeout); + } + + public boolean upgradeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel) + { + return upgradeLock(owner, resource, isolationLevel, lockTimeout, blockTimeout); + } + + public boolean releaseLock(Object owner, Object resourceId) { boolean result = true; try { - lm.release(key, resourceId); + lm.release(owner, resourceId); } catch(RuntimeException e) { - log.error("Can't release lock for owner key " + key + ", on resource " + resourceId, e); + log.error("Can't release lock for owner " + owner + ", on resource " + resourceId, e); result = false; } return result; } - public void releaseLocks(Object key) + public void releaseLocks(Object owner) { try { - lm.releaseAll(key); + lm.releaseAll(owner); } catch(RuntimeException e) { - log.error("Can't release all locks for owner key " + key, e); + log.error("Can't release all locks for owner " + owner, e); } } - public boolean hasRead(Object key, Object resourceId) + public boolean hasRead(Object owner, Object resourceId) { - return lm.hasRead(key, resourceId); + return lm.hasRead(owner, resourceId); } - public boolean hasWrite(Object key, Object resourceId) + public boolean hasWrite(Object owner, Object resourceId) { - return lm.hasWrite(key, resourceId); + return lm.hasWrite(owner, resourceId); } - public boolean hasUpgrade(Object key, Object resourceId) + public boolean hasUpgrade(Object owner, Object resourceId) { - return lm.hasUpgrade(key, resourceId); + return lm.hasUpgrade(owner, resourceId); } @@ -153,10 +174,10 @@ */ final class OJBLockManager extends CommonsOJBLockManager { - public OJBLockManager(LoggerFacade logger, long timeoutMSecs, long checkThreshholdMSecs) + public OJBLockManager(LoggerFacade logger, long globalLockTimeoutMSecs, long checkThreshholdMSecs) throws IllegalArgumentException { - super(logger, timeoutMSecs, checkThreshholdMSecs); + super(logger, globalLockTimeoutMSecs, checkThreshholdMSecs); } private CommonsOJBLockManager.OJBLock lookupLock(Object resourceId) @@ -164,7 +185,7 @@ return (CommonsOJBLockManager.OJBLock) getLock(resourceId); } - boolean readLock(Object key, Object resourceId, IsolationLevels isolationLevel, long timeout) + boolean readLock(Object owner, Object resourceId, IsolationLevels isolationLevel, long blockTimeout, long lockTimeout) { /* arminw: Not sure what's the best way to go @@ -177,48 +198,55 @@ So I chose the 'tryLock' call for read locks which immediately return. */ int lockLevel = mapLockLevelDependendOnIsolationLevel(isolationLevel, COMMON_READ_LOCK); - return tryLock(key, resourceId, lockLevel, true, isolationLevel); + boolean result = tryLock(owner, resourceId, lockLevel, true, isolationLevel); + if(result) + { + startGlobalTimeout(owner, lockTimeout); + } + return result; } - boolean writeLock(Object key, Object resourceId, IsolationLevels isolationLevel, long timeout) + boolean writeLock(Object owner, Object resourceId, IsolationLevels isolationLevel, long blockTimeout, long lockTimeout) { try { int lockLevel = mapLockLevelDependendOnIsolationLevel(isolationLevel, COMMON_WRITE_LOCK); - lock(key, resourceId, lockLevel, GenericLock.COMPATIBILITY_REENTRANT, - false, timeout, isolationLevel); + lock(owner, resourceId, lockLevel, GenericLock.COMPATIBILITY_REENTRANT, + false, blockTimeout, isolationLevel); + startGlobalTimeout(owner, lockTimeout); return true; } catch(LockException e) { - if(log.isEnabledFor(Logger.INFO)) log.info("Can't get write lock for " + key, e); + if(log.isEnabledFor(Logger.INFO)) log.info("Can't get write lock for " + owner + ", " + e.getReason(), e); return false; } } - boolean upgradeLock(Object key, Object resourceId, IsolationLevels isolationLevel, long timeout) + boolean upgradeLock(Object owner, Object resourceId, IsolationLevels isolationLevel, long blockTimeout, long lockTimeout) { try { int lockLevel = mapLockLevelDependendOnIsolationLevel(isolationLevel, COMMON_UPGRADE_LOCK); - lock(key, resourceId, lockLevel, GenericLock.COMPATIBILITY_REENTRANT, - false, timeout, isolationLevel); + lock(owner, resourceId, lockLevel, GenericLock.COMPATIBILITY_REENTRANT, + false, blockTimeout, isolationLevel); + startGlobalTimeout(owner, lockTimeout); return true; } catch(LockException e) { - if(log.isEnabledFor(Logger.INFO)) log.info("Can't get upgrade lock for " + key, e); + if(log.isEnabledFor(Logger.INFO)) log.info("Can't get upgrade lock for " + owner + ", " + e.getReason(), e); return false; } } - boolean hasRead(Object key, Object resourceId) + boolean hasRead(Object owner, Object resourceId) { CommonsOJBLockManager.OJBLock lock = lookupLock(resourceId); boolean result = false; if(lock != null) { - result = lock.hasRead(key); + result = lock.hasRead(owner); } return result; } @@ -234,15 +262,20 @@ return result; } - boolean hasUpgrade(Object key, Object resourceId) + boolean hasUpgrade(Object owner, Object resourceId) { CommonsOJBLockManager.OJBLock lock = lookupLock(resourceId); boolean result = false; if(lock != null) { - result = lock.hasUpgrade(key); + result = lock.hasUpgrade(owner); } return result; + } + + public synchronized String toString() + { + return "[" + this.getClass().getName() + "] " + super.toString(); } } Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerRemoteImpl.java URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerRemoteImpl.java?view=diff&rev=518417&r1=518416&r2=518417 ============================================================================== --- db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerRemoteImpl.java (original) +++ db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerRemoteImpl.java Wed Mar 14 18:13:42 2007 @@ -84,6 +84,12 @@ } } + /** noop */ + public void setBlockTimeout(long timeout) + { + log.info("Can't set global block-timeout, it's managed by the lock-servlet"); + } + /** * noop * @@ -91,7 +97,7 @@ */ public void setLockTimeout(long timeout) { - log.info("Can't set lock-timeout, it's managed by the lock-servlet"); + log.info("Can't set global lock-timeout, it's managed by the lock-servlet"); } public long getLockTimeout() @@ -131,12 +137,6 @@ } } - /** noop */ - public void setBlockTimeout(long timeout) - { - log.info("Can't set lock-timeout, it's managed by the lock-servlet"); - } - public String getLockInfo() { LockInfo info = new LockInfo(METHOD_LOCK_INFO); @@ -151,15 +151,16 @@ } } - public boolean readLock(Object key, Object resourceId, IsolationLevels isolationLevel) + public boolean readLock(final Object owner, final Object resource, final IsolationLevels isolationLevel) { - if(isolationLevel.ignoreForLock()) - { - return true; + return readLock(owner, resource, isolationLevel, 0, 0); } - else + + public boolean readLock(final Object owner, final Object resource, final IsolationLevels isolationLevel, + final long lockTimeout, final long blockTimeout) { - LockInfo info = new LockInfo(key, resourceId, isolationLevel.getValue(), METHOD_READ_LOCK); + LockInfo info = new LockInfo(owner, resource, isolationLevel, METHOD_READ_LOCK, + lockTimeout, blockTimeout); try { byte[] requestBarr = serialize(info); @@ -167,15 +168,14 @@ } catch(Throwable t) { - throw new LockRuntimeException("Cannot check read lock for '" - + resourceId + "' using key '" + key + "'", t); + throw new LockRuntimeException("Cannot get read lock for resource '" + + resource + "' using owner '" + owner + "'", t); } } - } - public boolean releaseLock(Object key, Object resourceId) + public boolean releaseLock(final Object owner, final Object resource) { - LockInfo info = new LockInfo(key, resourceId, METHOD_RELEASE_SINGLE_LOCK); + LockInfo info = new LockInfo(owner, resource, METHOD_RELEASE_SINGLE_LOCK); try { byte[] requestBarr = serialize(info); @@ -183,14 +183,14 @@ } catch(Throwable t) { - throw new LockRuntimeException("Cannot remove write lock for '" - + resourceId + "' using key '" + key + "'", t); + throw new LockRuntimeException("Cannot remove write lock for resource '" + + resource + "' using owner '" + owner + "'", t); } } - public void releaseLocks(Object key) + public void releaseLocks(final Object owner) { - LockInfo info = new LockInfo(key, null, METHOD_RELEASE_LOCKS); + LockInfo info = new LockInfo(owner, null, METHOD_RELEASE_LOCKS); try { byte[] requestBarr = serialize(info); @@ -198,19 +198,20 @@ } catch(Throwable t) { - throw new LockRuntimeException("Cannot release locks using owner key '" + key + "'", t); + throw new LockRuntimeException("Cannot release locks using owner '" + owner + "'", t); } } - public boolean writeLock(Object key, Object resourceId, IsolationLevels isolationLevel) + public boolean writeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel) { - if(isolationLevel.ignoreForLock()) - { - return true; + return writeLock(owner, resource, isolationLevel, 0, 0); } - else + + public boolean writeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel, + final long lockTimeout, final long blockTimeout) { - LockInfo info = new LockInfo(key, resourceId, isolationLevel.getValue(), METHOD_WRITE_LOCK); + LockInfo info = new LockInfo(owner, resource, isolationLevel, METHOD_WRITE_LOCK, + lockTimeout, blockTimeout); try { byte[] requestBarr = serialize(info); @@ -218,21 +219,21 @@ } catch(Throwable t) { - throw new LockRuntimeException("Cannot set write lock for '" - + resourceId + "' using key '" + key + "'", t); + throw new LockRuntimeException("Cannot set write lock for resource '" + + resource + "' using owner '" + owner + "'", t); } } - } - public boolean upgradeLock(Object key, Object resourceId, IsolationLevels isolationLevel) + public boolean upgradeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel) { - if(isolationLevel.ignoreForLock()) - { - return true; + return upgradeLock(owner, resource, isolationLevel, 0, 0); } - else + + public boolean upgradeLock(final Object owner, final Object resource, final IsolationLevels isolationLevel, + final long lockTimeout, final long blockTimeout) { - LockInfo info = new LockInfo(key, resourceId, isolationLevel.getValue(), METHOD_UPGRADE_LOCK); + LockInfo info = new LockInfo(owner, resource, isolationLevel, METHOD_UPGRADE_LOCK, + lockTimeout, blockTimeout); try { byte[] requestBarr = serialize(info); @@ -240,51 +241,50 @@ } catch(Throwable t) { - throw new LockRuntimeException("Cannot set write lock for '" - + resourceId + "' using key '" + key + "'", t); + throw new LockRuntimeException("Cannot upgrade lock on resource '" + + resource + "' using owner '" + owner + "'", t); } } - } - public boolean hasRead(Object key, Object resourceId) + public boolean hasRead(Object owner, Object resource) { try { - byte[] requestBarr = serialize(new LockInfo(key, resourceId, METHOD_CHECK_READ)); + byte[] requestBarr = serialize(new LockInfo(owner, resource, METHOD_CHECK_READ)); return performRequest(requestBarr); } catch(Throwable t) { - throw new LockRuntimeException("Cannot check read lock for '" - + resourceId + "' using key '" + key + "'", t); + throw new LockRuntimeException("Cannot check read lock for resource '" + + resource + "' using owner '" + owner + "'", t); } } - public boolean hasWrite(Object key, Object resourceId) + public boolean hasWrite(Object owner, Object resource) { try { - byte[] requestBarr = serialize(new LockInfo(key, resourceId, METHOD_CHECK_WRITE)); + byte[] requestBarr = serialize(new LockInfo(owner, resource, METHOD_CHECK_WRITE)); return performRequest(requestBarr); } catch(Throwable t) { - throw new LockRuntimeException("Cannot check write lock for '" - + resourceId + "' using key '" + key + "'", t); + throw new LockRuntimeException("Cannot check write lock for resource '" + + resource + "' using owner '" + owner + "'", t); } } - public boolean hasUpgrade(Object key, Object resourceId) + public boolean hasUpgrade(Object owner, Object resource) { try { - byte[] requestBarr = serialize(new LockInfo(key, resourceId, METHOD_CHECK_UPGRADE)); + byte[] requestBarr = serialize(new LockInfo(owner, resource, METHOD_CHECK_UPGRADE)); return performRequest(requestBarr); } catch(Throwable t) { - throw new LockRuntimeException("Cannot check write lock for '" - + resourceId + "' using key '" + key + "'", t); + throw new LockRuntimeException("Cannot check write lock for resource '" + + resource + "' using owner '" + owner + "'", t); } } @@ -417,29 +417,34 @@ public static final class LockInfo implements Serializable { - public String key; + public String owner; public String resourceId; public int isolationLevel; public byte methodName; + public long blockTimeout; + public long lockTimeout; - public LockInfo(byte methodName) + public LockInfo(final byte methodName) { this.methodName = methodName; } - public LockInfo(Object key, Object resourceId, byte methodName) + public LockInfo(final Object owner, final Object resourceId, final byte methodName) { - this.key = key != null ? key.toString() : null; + this.owner = owner != null ? owner.toString() : null; this.resourceId = resourceId != null ? resourceId.toString() : null; this.methodName = methodName; } - public LockInfo(Object key, Object resourceId, int isolationLevel, byte methodName) + public LockInfo(final Object owner, final Object resourceId, final IsolationLevels isolationLevel, + final byte methodName, final long lockTimeout, final long blockTimeout) { - this.key = key != null ? key.toString() : null; + this.owner = owner != null ? owner.toString() : null; this.resourceId = resourceId != null ? resourceId.toString() : null; - this.isolationLevel = isolationLevel; + this.isolationLevel = isolationLevel.getValue(); this.methodName = methodName; + this.lockTimeout = lockTimeout; + this.blockTimeout = blockTimeout; } } } Modified: db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerServlet.java URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerServlet.java?view=diff&rev=518417&r1=518416&r2=518417 ============================================================================== --- db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerServlet.java (original) +++ db/ojb/trunk/src/java/org/apache/ojb/broker/locking/LockManagerServlet.java Wed Mar 14 18:13:42 2007 @@ -35,16 +35,20 @@ /** - * @author Thomas Mahler + * OJB's locking server servlet used to perform distributed lock requests from different + * nodes - internal this class use a [EMAIL PROTECTED] LockManagerInMemoryImpl} instance + * to manage the lock objects. + * + * @version $Id: $ */ public class LockManagerServlet extends HttpServlet { - protected static LockManager lockmanager; static final String STR_LOCK_TIMEOUT = "lockTimeout"; static final String STR_BLOCK_TIMEOUT = "blockTimeout"; static final String STR_LOCK_MANAGER = "lockManager"; private static final String prefix = "[ojb-lockserver] "; + protected static LockManager lockmanager; private static long numRequests; private static Throwable lastError = null; @@ -78,7 +82,7 @@ { Long lockTimeout = NumberUtils.createLong(strTimeout); lockmanager.setLockTimeout(lockTimeout.longValue()); - System.out.println(prefix + "Set lock-timeout=" + lockTimeout); + //System.out.println(prefix + "Set lock-timeout=" + lockTimeout); } catch(Exception e) { @@ -97,7 +101,7 @@ { Long blockTimeout = NumberUtils.createLong(strBlock); lockmanager.setBlockTimeout(blockTimeout.longValue()); - System.out.println(prefix + "Set block-timeout=" + blockTimeout); + //System.out.println(prefix + "Set block-timeout=" + blockTimeout); } catch(Exception e) { @@ -186,45 +190,49 @@ { case LockManagerRemoteImpl.METHOD_READ_LOCK: { - result = BooleanUtils.toBooleanObject(lockmanager.readLock(info.key, info.resourceId, IsolationLevels.getEnum(info.isolationLevel))); + result = BooleanUtils.toBooleanObject(lockmanager.readLock(info.owner, info.resourceId, IsolationLevels.getEnum(info.isolationLevel), + info.lockTimeout > 0 ? info.lockTimeout : lockmanager.getLockTimeout(), + info.blockTimeout > 0 ? info.blockTimeout : lockmanager.getBlockTimeout())); break; } case LockManagerRemoteImpl.METHOD_RELEASE_SINGLE_LOCK: { - result = BooleanUtils.toBooleanObject(lockmanager.releaseLock(info.key, info.resourceId)); + result = BooleanUtils.toBooleanObject(lockmanager.releaseLock(info.owner, info.resourceId)); break; } case LockManagerRemoteImpl.METHOD_RELEASE_LOCKS: { - lockmanager.releaseLocks(info.key); + lockmanager.releaseLocks(info.owner); result = Boolean.TRUE; break; } case LockManagerRemoteImpl.METHOD_WRITE_LOCK: { - result = BooleanUtils.toBooleanObject(lockmanager.writeLock(info.key, info.resourceId, - IsolationLevels.getEnum(info.isolationLevel))); + result = BooleanUtils.toBooleanObject(lockmanager.writeLock(info.owner, info.resourceId, IsolationLevels.getEnum(info.isolationLevel), + info.lockTimeout > 0 ? info.lockTimeout : lockmanager.getLockTimeout(), + info.blockTimeout > 0 ? info.blockTimeout : lockmanager.getBlockTimeout())); break; } case LockManagerRemoteImpl.METHOD_UPGRADE_LOCK: { - result = BooleanUtils.toBooleanObject(lockmanager.upgradeLock(info.key, - info.resourceId, IsolationLevels.getEnum(info.isolationLevel))); + result = BooleanUtils.toBooleanObject(lockmanager.upgradeLock(info.owner, info.resourceId, IsolationLevels.getEnum(info.isolationLevel), + info.lockTimeout > 0 ? info.lockTimeout : lockmanager.getLockTimeout(), + info.blockTimeout > 0 ? info.blockTimeout : lockmanager.getBlockTimeout())); break; } case LockManagerRemoteImpl.METHOD_CHECK_READ: { - result = BooleanUtils.toBooleanObject(lockmanager.hasRead(info.key, info.resourceId)); + result = BooleanUtils.toBooleanObject(lockmanager.hasRead(info.owner, info.resourceId)); break; } case LockManagerRemoteImpl.METHOD_CHECK_WRITE: { - result = BooleanUtils.toBooleanObject(lockmanager.hasWrite(info.key, info.resourceId)); + result = BooleanUtils.toBooleanObject(lockmanager.hasWrite(info.owner, info.resourceId)); break; } case LockManagerRemoteImpl.METHOD_CHECK_UPGRADE: { - result = BooleanUtils.toBooleanObject(lockmanager.hasUpgrade(info.key, info.resourceId)); + result = BooleanUtils.toBooleanObject(lockmanager.hasUpgrade(info.owner, info.resourceId)); break; } case LockManagerRemoteImpl.METHOD_LOCK_INFO: Modified: db/ojb/trunk/src/test/org/apache/ojb/web.xml URL: http://svn.apache.org/viewvc/db/ojb/trunk/src/test/org/apache/ojb/web.xml?view=diff&rev=518417&r1=518416&r2=518417 ============================================================================== --- db/ojb/trunk/src/test/org/apache/ojb/web.xml (original) +++ db/ojb/trunk/src/test/org/apache/ojb/web.xml Wed Mar 14 18:13:42 2007 @@ -31,13 +31,15 @@ <init-param> <param-name>lockManager</param-name> <param-value>org.apache.ojb.broker.locking.LockManagerInMemoryImpl</param-value> + <!--<param-value>org.apache.ojb.broker.locking.LockManagerCommonsImpl</param-value>--> </init-param> <init-param> <param-name>lockTimeout</param-name> - <!-- set lock timeout to 10 minutes (setting in [ms]) --> - <param-value>600000</param-value> + <!-- set lock timeout to 2 minutes (setting in [ms]) --> + <param-value>120000</param-value> </init-param> <init-param> + <!-- set block timeout to 1 sec (setting in [ms], if supported by the Impl.) --> <param-name>blockTimeout</param-name> <param-value>1000</param-value> </init-param> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]