[ https://issues.apache.org/jira/browse/OOZIE-1922?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15073318#comment-15073318 ]
Rohini Palaniswamy commented on OOZIE-1922: ------------------------------------------- Thanks. New logic for memory looks solid now. {code} + InterProcessReadWriteLock readWriteLock = zkLocks.get(resource); // This shouldn't happen, but if it does, then we should remove entry from map + if (readWriteLock == null) { + return false; + } {code} Above code means that it is not in the hashmap already, so trying to remove from hashmap does not make sense. if (readWriteLock == null) check should be before and outside of isLockHeld. > 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: Purshotam Shah > Attachments: OOZIE-1922-V1.patch, OOZIE-1922-V2.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)