Another thing is to use InterProcessSemaphoreMutex instead. It is a 
non-reentrant lock and can be unlocked from any thread.

-JZ

> On Oct 28, 2015, at 2:55 PM, tathagata roy <[email protected]> wrote:
> 
> Thanks Jordan for the response. 
> 
> I cannot use the strategy because the thread can hold multiple locks , and if 
> i do that it will release all the locks. The example i have put in the 
> question is just a sample i was trying but in the actual project a single 
> thread holds multiple locks.
> 
> Is there any other way i can do that?
> 
> On Wed, Oct 28, 2015 at 3:43 PM, Jordan Zimmerman <[email protected] 
> <mailto:[email protected]>> wrote:
> Your RevocationListener should interrupt the thread that holds the lock. 
> Then, that thread can release the lock.
> 
> -Jordan
> 
>> On Oct 28, 2015, at 2:19 PM, tathagata roy <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> All,
>> 
>> I am trying to test the revocable Locking in Apache Curator. I have two 
>> threads which tries to acquire a lock. If the first test acquires the lock, 
>> the second thread can ask the first thread to release the lock so that the 
>> 2nd thread can acquire it
>> 
>>           RetryPolicy retryPolicy = new 
>> ExponentialBackoffRetry(baseSleepTimeMills, maxRetries);
>>         CuratorFramework client = CuratorFrameworkFactory.newClient(hosts, 
>> retryPolicy);
>>         client.start();
>> 
>>         final InterProcessMutex lock = new InterProcessMutex(client, 
>> lockBasePath);
>> 
>>         Collection<String> nodes =  lock.getParticipantNodes();
>> 
>>         lock.makeRevocable(new RevocationListener<InterProcessMutex>(){
>> 
>>             @Override
>>             public void revocationRequested(InterProcessMutex lock1) {
>>                 try {
>>                     if(lock.isAcquiredInThisProcess()){
>>                         lock.release();
>>                     }
>> 
>>                 } catch (Exception e) {
>>                     // TODO Auto-generated catch block
>>                     e.printStackTrace();
>>                 }
>> 
>>             }
>> 
>>         });
>> 
>>         if(nodes!=null && !nodes.isEmpty()){
>>             Revoker.attemptRevoke(client, nodes.iterator().next());
>>         }
>> 
>>         if (lock.acquire(waitTimeSeconds, TimeUnit.SECONDS)) {
>>             try {
>>                 doSomeWork(lockName);
>>             } finally {
>>                 lock.release();
>>             }
>>         } else {
>>             System.err.printf("%s timed out after %d seconds waiting to 
>> acquire lock on %s\n",
>>                     lockName, waitTimeSeconds, lockPath);
>>         }
>> 
>> The problem is, when the 2nd thread calls the attemptRevoke, the callback 
>> async method is called on the first process, but since its a call back 
>> method that's a third thread, and if that invokes the lock.release it throws 
>> an Exception 
>> 
>> java.lang.IllegalMonitorStateException: You do not own the lock
>> 
>> That is as per the api 
>> 
>> release() Perform one release of the mutex if the calling thread is the same 
>> thread that acquired it.
>> 
>> So basically this is never possible because callbacks will always be another 
>> thread. Is my understanding right? Is there any other way to achieve this? 
>> 
>> Thanks for any suggestions
>> 
>> -Tatha
>>        
>> 
> 
> 

Reply via email to