package com.linkedin.parseq.zk.recipes; import com.linkedin.parseq.Task; import com.linkedin.parseq.zk.client.ZKClient; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; /** * This class represents multiple zookeeper locks that has to be * acquired in an atomic manner. Note that Locks are acquired in * the natural ordering of its lockPath to avoid deadlock. * * @author Ang Xu */ public class MultiLocks implements Synchronizable { /** * an unmodifiable list of {@link ZKLock}s to be acquired in order. */ private final List<ZKLock> _locks; public MultiLocks(ZKClient zkClient, String... lockPaths) { List<ZKLock> locks = Arrays.stream(lockPaths) .sorted() .map(lockPath -> new ZKLock(lockPath, zkClient)) .collect(Collectors.toList()); _locks = Collections.unmodifiableList(locks); } /** * {@inheritDoc} */ @Override public <T> Task<T> synchronize(Task<T> task, long deadline) { for (ZKLock lock : _locks) { task = lock.synchronize(task, deadline); } return task; } }