You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@curator.apache.org by "Cameron McKenzie (JIRA)" <ji...@apache.org> on 2016/10/25 21:43:58 UTC
[jira] [Commented] (CURATOR-347) Shared read/write lock acquired by
one thread cannot be released by another
[ https://issues.apache.org/jira/browse/CURATOR-347?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15606562#comment-15606562 ]
Cameron McKenzie commented on CURATOR-347:
------------------------------------------
The InterprocessReadWriteLock works per thread due to it using underlying InterprocessMutexes for the read and write locks.
Currently, I'm unaware of a thread agnostic read / write lock that's part of Curator. I think that it would be possible to refactor the InterprocessReadWriteLock to support both per thread or per JVM locks.
> Shared read/write lock acquired by one thread cannot be released by another
> ---------------------------------------------------------------------------
>
> Key: CURATOR-347
> URL: https://issues.apache.org/jira/browse/CURATOR-347
> Project: Apache Curator
> Issue Type: Bug
> Components: Recipes
> Affects Versions: 3.2.0
> Reporter: Meni Hillel
> Fix For: awaiting-response
>
>
> Consider the following: lock is being acquired by main thread but released by another thread. This throws an exception:
> java.lang.IllegalMonitorStateException: You do not own the lock: /locks/abc
> at org.apache.curator.framework.recipes.locks.InterProcessMutex.release(InterProcessMutex.java:140)
> Are locks thread specific? That wouldn't make sense. How else can I achieve this? Also would be nice to have a non-reentrant read/write shared lock.
> public static void main(String[] args) throws Exception {
> final CuratorFramework client = CuratorFrameworkFactory.builder()
> .connectString(ApplicationProperties.getConfig().getMessagebusSyncServers()).sessionTimeoutMs(5000)
> .connectionTimeoutMs(3000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
> client.start();
> InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client, "/locks/abc");
> lock.writeLock().acquire();
> Thread r = new Thread() {
> @Override
> public void run() {
> try {
> InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client, "/locks/abc");
> lock.writeLock().release();
> } catch (Exception e) {
> e.printStackTrace();
> }
> }
> };
> r.start();
> r.join();
> }
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)