java - Curator Hierarchy Locking(重叠锁)

标签 java apache-zookeeper apache-curator distributed-lock

我能够成功锁定 /ads/lock/0-test1 然后无法锁定 /ads/lock

我该如何解决这个问题?

InterProcessMutex lock1 = new InterProcessMutex(client, "/ads/lock/0-test1");
if(lock1.acquire(30000, TimeUnit.MILLISECONDS)){
   InterProcessMutex lock2 = new InterProcessMutex(client, "/ads/lock");

   if(lock2.acquire(30000, TimeUnit.MILLISECONDS)) {  //Failing
   ...
   }
}

更新:这是https://github.com/Microsoft/Cluster-Partition-Rebalancer-For-Kafka/ZookeeperBackedAdoptionLogicImpl.java中发生的事情的本质。第 250 行(详细路径)和第 299 行(根路径)的锁是顺序的。因此,当另一个实例尝试锁定详细路径 (250) 时,锁定失败,因为根路径 (299) 已被锁定。逻辑有效,但根锁始终未获取

更新 2:我写了一个小程序来检查重叠锁是否有效,确实有效。

public class LockTesting {
    public static final String ROOT_LOCK = "/locks";
    public static final String CHILD_LOCK = ROOT_LOCK+"/child";
    private static CuratorFramework client;

    public static void main(String[] args) throws Exception {

        client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 30));
        client.start();
        InterProcessMutex lock1 = new InterProcessMutex(client, CHILD_LOCK);
        if (lock1.acquire(30000, TimeUnit.MILLISECONDS)) {
            System.out.println("Child Locked");
            InterProcessMutex lock2 = new InterProcessMutex(client, ROOT_LOCK);
            if (lock2.acquire(30000, TimeUnit.MILLISECONDS)) {
                System.out.println("Root Locked");
            }
        }

    }
}

最佳答案

虽然没有明确记录(但请参阅 technote 7 ),馆长用来创建锁的机制取决于特定 znode 路径的子节点。 InterProcessMutexzookeeper lock recipe 的一个实现,其文档确实包含这些详细信息。通过尝试使用这样的分层结构,您实际上是在弄乱锁的内部结构。

锁定路径应被视为一个“对象”,其内部 znode 不可访问且可能会发生变化。

响应更新

有问题的代码确实是这种不当使用的一个例子。

响应 Update2

是的,它有时可以工作。但这取决于 InterProcessMutex 实现的内部细节。您会发现,对于某些锁名称,这会起作用,而对于其他锁名称,则不会起作用,否则您会出现未定义的行为。

关于java - Curator Hierarchy Locking(重叠锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44932695/

相关文章:

java - 为什么不调用 Eclipse 插件处理程序?

python - 如何让 python Zookeeper api 工作?

docker - 错误启动用户态代理 : Bind for 0. 0.0.0:2181:意外错误权限被拒绝

java - 如何使用 ThreeTenABP 将 ZonedDateTime/OffsetDateTime 转换为日期?

java - 如何使用反射获取构造函数,在该构造函数中传递父类(super class)作为参数

java - 如何使用 SWT 访问网络摄像头

java - Spark 无法访问 hbase 但可以使用 java 代码访问

apache-curator - Apache Curator "connection string"是什么样的?

java - Apache Curator - Zookeeper 连接丢失异常,可能存在内存泄漏

apache - 在 Curator 重试尝试时处理来自 ZooKeeper 的 EndOfStreamException?