@Override public void entityLifeCycleEvent(EntityEvent evt, Object o) { PrimaryStorageCapacityVO c = (PrimaryStorageCapacityVO) o; PrimaryStorageCapacityVO pre = c.getShadow(); if (c.getAvailableCapacity() != pre.getAvailableCapacity()) { String info = String.format( "[PrimaryStorageCapacity:Change][uuid=%s]: %s --> %s (%s)", pre.getUuid(), pre.getAvailableCapacity(), c.getAvailableCapacity(), c.getAvailableCapacity() - pre.getAvailableCapacity()); logger.debug(info); loggerd.debug(info); printCallTrace(); } } });
private void logCapacityChange() { if (logger.isTraceEnabled()) { StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); int index = 0; String fileName = PrimaryStorageCapacityUpdater.class.getSimpleName() + ".java"; for (int i = 0; i < stackTraceElements.length; i++) { if (fileName.equals(stackTraceElements[i].getFileName())) { index = i; } } StackTraceElement caller = stackTraceElements[index + 1]; logger.trace(String.format("[Primary Storage Capacity] %s:%s:%s changed the capacity of the primary storage[uuid:%s] as:\n" + "total: %s --> %s\n" + "available: %s --> %s\n" + "physical total: %s --> %s\n" + "physical available: %s --> %s\n", caller.getFileName(), caller.getMethodName(), caller.getLineNumber(), capacityVO.getUuid(), totalForLog, capacityVO.getTotalCapacity(), availForLog, capacityVO.getAvailableCapacity(), totalPhysicalForLog, capacityVO.getTotalPhysicalCapacity(), availPhysicalForLog, capacityVO.getAvailablePhysicalCapacity())); } }
@Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { long avail = cap.getAvailableCapacity() - size; if (avail < 0) { logger.warn(String.format("[Primary Storage Allocation] reserved capacity on primary storage[uuid:%s] failed," + " no available capacity on it", inv.getUuid())); return null; } long origin = cap.getAvailableCapacity(); cap.setAvailableCapacity(avail); if (logger.isTraceEnabled()) { logger.trace(String.format("[Primary Storage Allocation] reserved %s bytes on primary storage[uuid:%s," + " available before:%s, available now:%s]", size, inv.getUuid(), origin, avail)); } return cap; } });
@Transactional private boolean _decreaseAvailableCapacity(long size) { if (!lockCapacity()) { logDeletedPrimaryStorage(); return false; } capacityVO.setAvailableCapacity(capacityVO.getAvailableCapacity() - size); merge(); return true; }
if (vo.getCapacity().getAvailableCapacity() >= requiredSize) { res.add(vo);
@Transactional private boolean _reserve(long size, boolean exceptionOnFailure) { if (!lockCapacity()) { logDeletedPrimaryStorage(); return false; } if (capacityVO.getAvailableCapacity() < size) { if (exceptionOnFailure) { throw new OperationFailureException(operr("cannot reserve %s bytes on the primary storage[uuid:%s]," + " it's short of available capacity", size, capacityVO.getUuid())); } else { return false; } } capacityVO.setAvailableCapacity(capacityVO.getAvailableCapacity() - size); merge(); return true; }
@Override public void run(FlowTrigger trigger, Map data) { PrimaryStorageAllocationSpec spec = (PrimaryStorageAllocationSpec) data.get(AllocatorParams.SPEC); List<PrimaryStorageVO> candidates = (List<PrimaryStorageVO>) data.get(AllocatorParams.CANDIDATES); DebugUtils.Assert(candidates != null && !candidates.isEmpty(), "PrimaryStorageReservedCapacityAllocatorFlow cannot be the first element in allocator chain"); long reservedCapacity = SizeUtils.sizeStringToBytes(PrimaryStorageGlobalConfig.RESERVED_CAPACITY.value()); List<PrimaryStorageVO> ret = new ArrayList<PrimaryStorageVO>(candidates.size()); for (PrimaryStorageVO vo : candidates) { if (vo.getCapacity().getAvailableCapacity() - psRatioMgr.calculateByRatio(vo.getUuid(), spec.getSize()) >= reservedCapacity) { ret.add(vo); } } if (ret.isEmpty()) { throw new OperationFailureException(operr("after subtracting reserved capacity[%s], there is no primary storage having required size[%s bytes]", PrimaryStorageGlobalConfig.RESERVED_CAPACITY.value(), spec.getSize())); } data.put(AllocatorParams.CANDIDATES, ret); trigger.next(); } }
@Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { if (cap.getTotalCapacity() == 0 && cap.getAvailableCapacity() == 0) { // init cap.setTotalCapacity(total); cap.setAvailableCapacity(avail); } cap.setTotalPhysicalCapacity(total); cap.setAvailablePhysicalCapacity(avail); return cap; } });
@Transactional private boolean _increaseAvailableCapacity(long size) { if (!lockCapacity()) { logDeletedPrimaryStorage(); return false; } long n = capacityVO.getAvailableCapacity() + size; if (n > capacityVO.getTotalCapacity()) { throw new CloudRuntimeException(String.format("invalid primary storage[uuid:%s] capacity, available capacity[%s] > total capacity[%s]", capacityVO.getUuid(), n, capacityVO.getTotalCapacity())); } capacityVO.setAvailableCapacity(n); merge(); return true; }
private boolean lockCapacity() { if (primaryStorageUuid != null) { capacityVO = dbf.getEntityManager().find(PrimaryStorageCapacityVO.class, primaryStorageUuid, LockModeType.PESSIMISTIC_WRITE); } else if (query != null) { query.setLockMode(LockModeType.PESSIMISTIC_WRITE); List<PrimaryStorageCapacityVO> caps = query.getResultList(); capacityVO = caps.isEmpty() ? null : caps.get(0); } if (capacityVO != null) { totalForLog = capacityVO.getTotalCapacity(); availForLog = capacityVO.getAvailableCapacity(); totalPhysicalForLog = capacityVO.getTotalPhysicalCapacity(); availPhysicalForLog = capacityVO.getAvailablePhysicalCapacity(); originalCopy = new PrimaryStorageCapacityVO(); originalCopy.setAvailableCapacity(capacityVO.getAvailableCapacity()); originalCopy.setTotalCapacity(capacityVO.getTotalCapacity()); originalCopy.setAvailablePhysicalCapacity(capacityVO.getAvailablePhysicalCapacity()); originalCopy.setTotalPhysicalCapacity(capacityVO.getTotalPhysicalCapacity()); originalCopy.setSystemUsedCapacity(capacityVO.getSystemUsedCapacity()); } return capacityVO != null; }
"availablePhysicalCapacity: %s]", cap.getTotalCapacity(), cap.getAvailableCapacity(), cap.getTotalPhysicalCapacity(), cap.getAvailablePhysicalCapacity()); long a = cap.getAvailableCapacity() - avail; cap.setAvailableCapacity(a); "availablePhysicalCapacity: %s]", cap.getTotalCapacity(), cap.getAvailableCapacity(), cap.getTotalPhysicalCapacity(), cap.getAvailablePhysicalCapacity()); logger.info(String.format("decrease local primary storage[uuid: %s] capacity, changed capacity from %s to %s", cap.getUuid(), beforeCapacity, nowCapacity));
for (PrimaryStorageVO vo : vos) { if (ratioMgr.calculatePrimaryStorageAvailableCapacityByRatio(vo.getUuid(), vo.getCapacity().getAvailableCapacity()) > spec.getSize()) { res.add(vo);
@Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { if (total != null) { cap.setTotalCapacity(cap.getTotalCapacity() + total); } if (avail != null) { cap.setAvailableCapacity(cap.getAvailableCapacity() + avail); } if (totalPhysical != null) { cap.setTotalPhysicalCapacity(cap.getTotalPhysicalCapacity() + totalPhysical); } if (availPhysical != null) { cap.setAvailablePhysicalCapacity(cap.getAvailablePhysicalCapacity() + availPhysical); } if (systemUsed != null) { if (cap.getSystemUsedCapacity() == null) { cap.setSystemUsedCapacity(0L); } cap.setSystemUsedCapacity(cap.getSystemUsedCapacity() + systemUsed); } return cap; } });
public static PrimaryStorageCapacityInventory valueOf(PrimaryStorageCapacityVO vo) { PrimaryStorageCapacityInventory inv = new PrimaryStorageCapacityInventory(); inv.setUuid(vo.getUuid()); inv.setTotalCapacity(vo.getTotalCapacity()); inv.setAvailableCapacity(vo.getAvailableCapacity()); inv.setCreateDate(vo.getCreateDate()); inv.setLastOpDate(vo.getLastOpDate()); inv.setTotalPhysicalCapacity(vo.getTotalPhysicalCapacity()); inv.setAvailablePhysicalCapacity(vo.getAvailablePhysicalCapacity()); inv.setSystemUsedCapacity(vo.getSystemUsedCapacity()); return inv; }
protected PrimaryStorageInventory(PrimaryStorageVO vo) { setZoneUuid(vo.getZoneUuid()); setCreateDate(vo.getCreateDate()); setDescription(vo.getDescription()); setLastOpDate(vo.getLastOpDate()); setName(vo.getName()); setState(vo.getState().toString()); setType(vo.getType()); setUrl(vo.getUrl()); setUuid(vo.getUuid()); setMountPath(vo.getMountPath()); setStatus(vo.getStatus().toString()); attachedClusterUuids = new ArrayList<String>(vo.getAttachedClusterRefs().size()); for (PrimaryStorageClusterRefVO ref : vo.getAttachedClusterRefs()) { attachedClusterUuids.add(ref.getClusterUuid()); } if (vo.getCapacity() != null) { setTotalCapacity(vo.getCapacity().getTotalCapacity()); setAvailableCapacity(vo.getCapacity().getAvailableCapacity()); setTotalPhysicalCapacity(vo.getCapacity().getTotalPhysicalCapacity()); setAvailablePhysicalCapacity(vo.getCapacity().getAvailablePhysicalCapacity()); setSystemUsedCapacity(vo.getCapacity().getSystemUsedCapacity()); } }