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