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]> 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]> 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 >> >> > > >
