package diskCacheV111.poolManager;
import com.google.common.collect.ImmutableSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionLink;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionPool;
import diskCacheV111.poolManager.PoolSelectionUnit.SelectionPoolGroup;
import diskCacheV111.pools.PoolV2Mode;
import dmg.cells.nucleus.CellAddressCore;
public class Pool extends PoolCore implements SelectionPool {
private static final long serialVersionUID = 8108406418388363116L;
final Map<String, PGroup> _pGroupList = new ConcurrentHashMap<>();
private boolean _enabled = true;
private volatile long _active;
private boolean _ping = true;
private long _serialId;
private boolean _rdOnly;
private ImmutableSet<String> _hsmInstances = ImmutableSet.of();
private PoolV2Mode _mode = new PoolV2Mode(PoolV2Mode.DISABLED);
private CellAddressCore _address;
public Pool(String name) {
super(name);
}
@Override
public Collection<SelectionLink> getLinksTargetingPool() {
return new ArrayList<>(_linkList.values());
}
@Override
public Collection<SelectionPoolGroup> getPoolGroupsMemberOf() {
return new ArrayList<>(_pGroupList.values());
}
@Override
public void setActive(boolean active) {
_active = active ? System.currentTimeMillis() : 0;
}
@Override
public long getActive() {
return _ping ? (System.currentTimeMillis() - _active) : 0L;
}
/**
* Returns true if pool heartbeat was received within the last
* 5 minutes.
*/
@Override
public boolean isActive() {
return getActive() < 5 * 60 * 1000;
}
@Override
public void setReadOnly(boolean rdOnly) {
_rdOnly = rdOnly;
}
@Override
public boolean isReadOnly() {
return _rdOnly;
}
/**
* Returns true if reading from the pool is allowed.
*/
@Override
public boolean canRead() {
return isEnabled() && _mode.getMode() != PoolV2Mode.DISABLED && !_mode.isDisabled(PoolV2Mode.DISABLED_FETCH) && !_mode.isDisabled(PoolV2Mode.DISABLED_DEAD);
}
/**
* Returns true if writing to the pool is allowed. Since we
* cannot distinguish between a client write and a
* pool-to-pool write, both operations must be enabled on the
* pool.
*/
@Override
public boolean canWrite() {
return isEnabled() && !isReadOnly() && _mode.getMode() != PoolV2Mode.DISABLED && !_mode.isDisabled(PoolV2Mode.DISABLED_STORE) && !_mode.isDisabled(PoolV2Mode.DISABLED_DEAD) && !_mode.isDisabled(PoolV2Mode.DISABLED_P2P_SERVER);
}
/**
* Returns true if the pool is allowed to read from tape.
*/
@Override
public boolean canReadFromTape() {
return isEnabled() && !isReadOnly() && _mode.getMode() != PoolV2Mode.DISABLED && !_mode.isDisabled(PoolV2Mode.DISABLED_STAGE) && !_mode.isDisabled(PoolV2Mode.DISABLED_DEAD);
}
/**
* Returns true if the pool can deliver files for P2P
* operations.
*/
@Override
public boolean canReadForP2P() {
return isEnabled() && _mode.getMode() != PoolV2Mode.DISABLED && !_mode.isDisabled(PoolV2Mode.DISABLED_P2P_SERVER) && !_mode.isDisabled(PoolV2Mode.DISABLED_DEAD);
}
/**
* Returns true if the pool can receive files for P2P
* operations.
*/
public boolean canWriteForP2P() {
return isEnabled() && !isReadOnly() && _mode.getMode() != PoolV2Mode.DISABLED && !_mode.isDisabled(PoolV2Mode.DISABLED_P2P_CLIENT) && !_mode.isDisabled(PoolV2Mode.DISABLED_DEAD);
}
public void setEnabled(boolean enabled) {
_enabled = enabled;
}
@Override
public boolean isEnabled() {
return _enabled;
}
public void setPing(boolean ping) {
_ping = ping;
}
public boolean isPing() {
return _ping;
}
@Override
public String toString() {
return getName() + " (enabled=" + _enabled + ";active=" + (_active > 0 ? (getActive() / 1000) : "no") + ";rdOnly=" + isReadOnly() + ";links=" + _linkList.size() + ";pgroups=" + _pGroupList.size() + ";hsm=" + _hsmInstances.toString() + ";mode=" + _mode + ")";
}
@Override
public boolean setSerialId(long serialId) {
if (serialId == _serialId) {
return false;
}
_serialId = serialId;
return true;
}
@Override
public long getSerialId()
{
return _serialId;
}
@Override
public void setPoolMode(PoolV2Mode mode) {
_mode = mode;
}
@Override
public PoolV2Mode getPoolMode() {
return _mode;
}
@Override
public ImmutableSet<String> getHsmInstances() {
return _hsmInstances;
}
@Override
public void setHsmInstances(Set<String> hsmInstances) {
if (hsmInstances == null) {
_hsmInstances = ImmutableSet.of();
} else {
_hsmInstances = ImmutableSet.copyOf(hsmInstances);
}
}
@Override
public CellAddressCore getAddress()
{
return _address;
}
@Override
public void setAddress(CellAddressCore address)
{
_address = address;
}
}