2011-06-25 123 views
4

我想在Zookeeper中实施屏障。当有少量节点需要加入才能通过障碍时,我的实现始终工作。然而,当我用100多个需要加入障碍的节点测试我的实现时,大约1%的时间看起来像其中一个节点缺少最后一个观察者事件,并且没有检查以查看子节点的数量障碍节点已经改变。动物园管理员屏障实施

我甚至同步观察者上的过程方法,但是这并没有改变任何东西。下面是我的过程方法的代码,以及检查是否需要前进的逻辑。

观察过程:

public BarrierWatcher(FastBarrier FastBarrier) { 
     this.ofb = FastBarrier; 
    } 

    @Override 
    public synchronized void process(WatchedEvent event) { 
     synchronized (ofb) { 
     ofb.notify(); 
     } 
    } 

逻辑来控制阻挡机构:

BarrierWatcher bw = new BarrierWatcher(this); 
List<String> memberList = zk.getChildren(barrierPath, bw); 
synchronized(this) { 
    while (memberList.size() < numOfMembers) { 
    this.wait(1000); 
    memberList = zk.getChildren(barrierPath, bw); 
    } 
} 

而不是仅仅调用this.wait(),我不得不添加this.wait(1000)为罕见失败发生。一旦所有节点加入,它就会一直通过屏障。我确定同步过程方法可以解决这个问题,但它没有。任何人有任何这方面的经验,或一个想法我可能做错了什么?

+0

对不起,在代码格式。我不确定那是怎么发生的。我希望这不会让你无法阅读。 –

+0

发布你的代码的其余部分,这是不足以找出发生了什么。 – sbridges

回答