package org.dcache.poolmanager;
import com.google.common.collect.Maps;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import diskCacheV111.poolManager.CostModule;
import diskCacheV111.poolManager.PoolSelectionUnit;
import diskCacheV111.pools.PoolCostInfo;
public class Utils {
/*
* no instance allowed
*/
private Utils() {
// static methods only
}
public static Map<String, PoolLinkGroupInfo> linkGroupInfos(PoolSelectionUnit selectionUnit, CostModule costModule)
{
return Maps.newHashMap(Maps.transformValues(selectionUnit.getLinkGroups(),
linkGroup -> toPoolLinkGroupInfo(linkGroup, costModule)));
}
private static PoolLinkGroupInfo toPoolLinkGroupInfo(PoolSelectionUnit.SelectionLinkGroup linkGroup,
CostModule costModule)
{
long linkAvailableSpace = 0;
long linkTotalSpace = 0;
Set<String> referencedPools = new HashSet<>();
for (PoolSelectionUnit.SelectionLink link : linkGroup.getLinks()) {
for (PoolSelectionUnit.SelectionPool pool : link.getPools()) {
if (pool.isEnabled()) {
String poolName = pool.getName();
/* calculate pool space only once. This can be an issue if pool
* exist in to different links used by same pool group.
*/
if (!referencedPools.contains(poolName)) {
referencedPools.add(poolName);
PoolCostInfo poolCostInfo =
costModule.getPoolCostInfo(poolName);
if (poolCostInfo != null) {
linkAvailableSpace += poolCostInfo.getSpaceInfo().getFreeSpace()
+ poolCostInfo.getSpaceInfo().getRemovableSpace();
linkTotalSpace += poolCostInfo.getSpaceInfo().getTotalSpace();
}
}
}
}
}
return new PoolLinkGroupInfo(linkGroup, linkTotalSpace, linkAvailableSpace);
}
}