package org.zstack.storage.primary; import org.zstack.header.storage.primary.PrimaryStorageCapacityVO; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * Created by frank on 11/9/2015. */ public class PrimaryStoragePhysicalCapacityManagerImpl implements PrimaryStoragePhysicalCapacityManager { private double globalRatio = 1; private ConcurrentHashMap<String, Double> primaryStorageRatio = new ConcurrentHashMap<String, Double>(); @Override public void setGlobalRatio(double ratio) { globalRatio = ratio; } @Override public double getGlobalRatio() { return globalRatio; } @Override public void setRatio(String psUuid, double ratio) { primaryStorageRatio.put(psUuid, ratio); } @Override public void deleteRatio(String psUuid) { primaryStorageRatio.remove(psUuid); } @Override public double getRatio(String psUuid) { Double ratio = primaryStorageRatio.get(psUuid); return ratio == null ? globalRatio : ratio; } @Override public Map<String, Double> getAllRatio() { return primaryStorageRatio; } @Override public boolean checkCapacityByRatio(String psUuid, long totalPhysicalCapacity, long totalAvailableCapacity) { if (totalAvailableCapacity == totalPhysicalCapacity) { return true; } double ratio = getRatio(psUuid); long used = totalPhysicalCapacity - totalAvailableCapacity; return used < Math.round(totalPhysicalCapacity * ratio); } @Override public boolean checkCapacityByRatio(String psUuid, PrimaryStorageCapacityVO cap) { return checkCapacityByRatio(psUuid, cap.getTotalPhysicalCapacity(), cap.getAvailablePhysicalCapacity()); } }