[ 
https://issues.apache.org/jira/browse/OOZIE-1922?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15073137#comment-15073137
 ] 

Purshotam Shah commented on OOZIE-1922:
---------------------------------------

{quote}
You have to. If it is read locks, more than one thread can hold the lock. 
Currently only write locks are acquired in the code though, but still logic 
needs to be correct as there are APIs to acquire read lock.
{quote}
I don't think we will ever support readlocks. We don't have to convolute our 
logic. I will put TODO in code for readlock support.

> 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.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)

Reply via email to