[
https://issues.apache.org/jira/browse/OOZIE-1922?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15068848#comment-15068848
]
Rohini Palaniswamy commented on OOZIE-1922:
-------------------------------------------
See couple of issues with the patch.
1) rwLock.getQueueLength() == 0 && rwLock.getWriteHoldCount() == 0 &&
rwLock.getReadHoldCount() == 0
This only checks for if there are no waiting threads and if all locks held
by this thread are released before removing the lock. It does not take into
account if any other thread is holding read or write lock. You will also have
to make use of the following APIs in the logic.
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html#getReadLockCount()
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html#isWriteLocked()
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html#isWriteLockedByCurrentThread()
2)
{code}
& !readWriteLock.readLock().isAcquiredInThisProcess()
+ &&
!readWriteLock.writeLock().isAcquiredInThisProcess()
{code}
- Should be && instead of &.
- isAcquiredInThisProcess stands for if acquired in this JVM. You are trying
to remove it from current node's zkLocks HashMap if the node does not hold lock
anymore. That is good, but lock.getParticipantNodes().size() == 0 condition
will prevent it if another node is hold the lock. So you will have to remove
that condition.
Haven't looked at the test cases yet. Can you put the revised patch in review
board as it is hard to read logic for the test cases.
3) Related to OOZIE-2394 patch:
Even though acquire() may not cause a ZK call for a reentrant lock, looking
at the isAcquiredInThisProcess()/getParticipantNodes() APIs used in release()
call, I am concerned that those will be new calls to ZK and might cause
performance degradation if synchronous is removed in OOZIE-2394. Can you run
one test case enabling debug logging for ZK and see how many calls are made
with and without removal of synchronous. If there is increase by even one ZK
call, I would like to retain the synchronous method. Cleanup of removing very
few lines of simple code is not worth for the cost of a ZK call.
> MemoryLocksService fails if lock is acquired multiple times in same thread
> and released
> ---------------------------------------------------------------------------------------
>
> Key: OOZIE-1922
> URL: https://issues.apache.org/jira/browse/OOZIE-1922
> Project: Oozie
> Issue Type: Bug
> Reporter: Purshotam Shah
> Assignee: Azrael Seoeun
> Attachments: OOZIE-1922-V1.patch, OOZIE-1922.1.patch,
> OOZIE-1922.2.patch, OOZIE-1922.3.patch
>
>
> ReentrantLock can be acquired multiple times in same thread. For multiple
> acquire call, ReentrantLock hold count is incremented by one.
> So if we acquire lock multiple time from same thread, all will be successful
> and hold count is increased for every call.
> But if we release lock, MemoryLocksService ignore the count and deletes the
> lock. Even if it's held by some command.
> Simple step can reproduce it.
> {code}
> service.getWriteLock("test", 5000); //writeHoldCount = 1
> MemoryLockToken lock = (MemoryLockToken)service.getWriteLock("test",
> 5000); //writeHoldCount = 2
> lock.release(); //writeHoldCount = 1
> lock = (MemoryLockToken)service.getWriteLock("test", 5000);
> //writeHoldCount = 1, it should be 2.
> {code}
> {code}
> @Override
> public void release() {
> int val = rwLock.getQueueLength();
> if (val == 0) {
> synchronized (locks) {
> locks.remove(resource);
> }
> }
> lock.unlock();
> }
> }
> {code}
> MemoryLocks should check hold count before removing lock.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)