Curator Hierarchy Locking(重叠锁)
Curator Hierarchy Locking (overlapping locks)
我能够成功锁定 /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), the mechanisms used by curator to create the lock depend on the child nodes of a particular znode path. The InterProcessMutex
is an implementation of the zookeeper lock recipe,其文档确实包含这些详细信息。通过尝试使用这样的分层结构,您实际上是在搞乱锁的内部结构。
锁定路径应被视为"object",其内部 znode 不可访问且可能会更改。
响应更新
有问题的代码确实是这种不当使用的一个例子。
响应更新2
是的,它有时可以工作。但这取决于 InterProcessMutex
实现的内部细节。您会发现,对于某些锁名称,这将起作用,而对于其他锁名称,则不起作用,否则您将有未定义的行为。
我能够成功锁定 /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), the mechanisms used by curator to create the lock depend on the child nodes of a particular znode path. The InterProcessMutex
is an implementation of the zookeeper lock recipe,其文档确实包含这些详细信息。通过尝试使用这样的分层结构,您实际上是在搞乱锁的内部结构。
锁定路径应被视为"object",其内部 znode 不可访问且可能会更改。
响应更新
有问题的代码确实是这种不当使用的一个例子。
响应更新2
是的,它有时可以工作。但这取决于 InterProcessMutex
实现的内部细节。您会发现,对于某些锁名称,这将起作用,而对于其他锁名称,则不起作用,否则您将有未定义的行为。