package io.cattle.platform.lock.impl;
import io.cattle.platform.lock.Lock;
import io.cattle.platform.lock.definition.LockDefinition;
import io.cattle.platform.lock.definition.MultiLockDefinition;
import io.cattle.platform.lock.exception.FailedToAcquireLockException;
import io.cattle.platform.lock.provider.LockProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MultiLock implements Lock {
private static final Logger log = LoggerFactory.getLogger(MultiLock.class);
Lock[] locks;
MultiLockDefinition definition;
public MultiLock(MultiLockDefinition def, Lock... locks) {
this.locks = locks;
this.definition = def;
}
public MultiLock(MultiLockDefinition def, LockProvider provider) {
this.definition = def;
LockDefinition[] defs = def.getLockDefinitions();
locks = new Lock[defs.length];
for (int i = 0; i < defs.length; i++) {
locks[i] = provider.getLock(defs[i]);
}
}
public Lock[] getLocks() {
return locks;
}
@Override
public boolean tryLock() {
for (Lock lock : locks) {
if (!lock.tryLock())
return false;
}
return true;
}
@Override
public void lock() throws FailedToAcquireLockException {
for (Lock lock : locks) {
lock.lock();
}
}
@Override
public void unlock() {
for (Lock lock : locks) {
try {
lock.unlock();
} catch (Throwable t) {
/*
* This is never supposed to happen, but hey sometime people
* don't program the right thing
*/
log.error("Failed to unlock [{}], unlock() should never throw an exception", lock.getLockDefinition().getLockId(), t);
}
}
}
@Override
public LockDefinition getLockDefinition() {
return definition;
}
}