我成功地锁定了/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");
}
}
}
}发布于 2017-07-05 21:11:11
虽然没有显式地记录(但请参阅technote 7),但管理员用于创建锁的机制取决于特定znode路径的子节点。InterProcessMutex是饲养员锁具配方的一个实现,它的文档确实包含了这些细节。通过尝试使用这样的层次结构,您实际上是在扰乱锁的内部结构。
锁定的路径应该被认为是一个“对象”,其内部znodes是不可访问的,并且可能发生更改。
对更新的响应
该守则确实是这种不当使用的一个例子。
对Update2的响应
是的,有时也能用。但这取决于InterProcessMutex实现的内部细节。您会发现,对于某些锁名,这将有效,而对于另一些锁名称,它将不起作用,或者您将有未定义的行为。
https://stackoverflow.com/questions/44932695
复制相似问题