Description
I noticed that LatchWatcher.await does:
public void await(long timeout) throws InterruptedException { synchronized (lock) { if (this.event != null) return; lock.wait(timeout); } }
while the recommendation of lock.wait is to check the wait condition even after the method returns in case of spurious wakeup. lock is a private local field to which notifyAll is called only after a zk event is being handled. I think we should check the await method to something like:
public void await(long timeout) throws InterruptedException { assert timeout > 0; long timeoutTime = System.currentTimeMillis() + timeout; synchronized (lock) { while (this.event == null) { long nextTimeout = timeoutTime - System.currentTimeMillis(); if (nextTimeout <= 0) { return; } lock.wait(nextTimeout); } } }