package fr.ens.biologie.genomique.eoulsan.util.locker;
import fr.ens.biologie.genomique.eoulsan.EoulsanException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* This class implements a locker using Zookeeper based on Twiter's DistributedLock class. See {@link <a href=
* "https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/zookeeper/DistributedLock.java">
* Twitter Commons code</a>}
* @author Laurent Jourdren
* @since 2.0
*/
public class DistributedLocker implements Locker, Watcher {
private final DistributedLock lock;
private CountDownLatch connectSignal = new CountDownLatch(1);
@Override
public void lock() throws IOException {
this.lock.lock();
}
@Override
public void unlock() throws IOException {
this.lock.unlock();
}
@Override
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
this.connectSignal.countDown();
}
}
//
// Constructor
//
/**
* Public constructor.
* @param connectString Zookeeper connection string
* @param sessionTimeout session time out
* @param lockBasePath lock base path
* @param lockName lock name
* @throws IOException if an error occurs while creating the ZooKeeper
* connection
*/
public DistributedLocker(final String connectString, final int sessionTimeout,
final String lockBasePath, final String lockName) throws IOException {
ZooKeeper zk = new ZooKeeper(connectString, sessionTimeout, this);
try {
connectSignal.await();
} catch (InterruptedException e) {
throw new IOException(e);
}
this.lock = new DistributedLock(zk,lockBasePath + '/'+ lockName);
}
}