@Transactional private boolean _decreaseAvailableCapacity(long size) { if (!lockCapacity()) { logDeletedPrimaryStorage(); return false; } capacityVO.setAvailableCapacity(capacityVO.getAvailableCapacity() - size); merge(); return true; }
@Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { cap.setTotalCapacity(totalCapacity); cap.setAvailableCapacity(availableCapacity); cap.setTotalPhysicalCapacity(totalPhysicalCapacity); cap.setAvailablePhysicalCapacity(availablePhysicalCapacity); return cap; } });
@Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { cap.setTotalCapacity(totalCapacity); cap.setAvailableCapacity(availableCapacity); cap.setTotalPhysicalCapacity(totalPhysicalCapacity); cap.setAvailablePhysicalCapacity(availablePhysicalCapacity); return cap; } });
@Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { cap.setAvailableCapacity(0L); cap.setAvailablePhysicalCapacity(0L); cap.setSystemUsedCapacity(0L); cap.setTotalPhysicalCapacity(0L); cap.setTotalCapacity(0L); return cap; } });
@Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { cap.setAvailableCapacity(0L); cap.setTotalCapacity(0L); cap.setTotalPhysicalCapacity(0L); cap.setAvailablePhysicalCapacity(0L); cap.setSystemUsedCapacity(0L); return cap; } });
@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; } });
@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; }
@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 PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { if(total < avail || avail < 0) { N.New(PrimaryStorageCapacityVO.class, cap.getUuid()).error_("the total capacity of the fusionstor primary is wrong, uuid[%s]",cap.getUuid()); } cap.setTotalCapacity(total); cap.setAvailableCapacity(avail); cap.setTotalPhysicalCapacity(total); cap.setAvailablePhysicalCapacity(avail); return cap; } });
@Transactional private boolean _update(Long total, Long avail, Long physicalTotal, Long physicalAvail) { if (!lockCapacity()) { logDeletedPrimaryStorage(); return false; } if (capacityVO.getSystemUsedCapacity() == null && physicalTotal != null && physicalAvail != null) { capacityVO.setSystemUsedCapacity(physicalTotal - physicalAvail); } if (total != null) { capacityVO.setTotalCapacity(total); } if (avail != null) { capacityVO.setAvailableCapacity(avail); } if (physicalTotal != null) { capacityVO.setTotalPhysicalCapacity(physicalTotal); } if (physicalAvail != null) { capacityVO.setAvailablePhysicalCapacity(physicalAvail); } 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; }
@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; } });
@Override public PrimaryStorageInventory createPrimaryStorage(PrimaryStorageVO vo, APIAddPrimaryStorageMsg msg) { String mountPath = PathUtil.join("/primarystoragesimulator", vo.getUuid()); vo.setMountPath(mountPath); vo = dbf.persistAndRefresh(vo); APIAddSimulatorPrimaryStorageMsg smsg = (APIAddSimulatorPrimaryStorageMsg) msg; PrimaryStorageCapacityVO cvo = new PrimaryStorageCapacityVO(); cvo.setUuid(vo.getUuid()); cvo.setAvailableCapacity(smsg.getAvailableCapacity()); cvo.setTotalCapacity(smsg.getTotalCapacity()); cvo.setAvailablePhysicalCapacity(smsg.getAvailablePhysicalCapacity()); cvo.setTotalPhysicalCapacity(smsg.getTotalPhysicalCapacity()); dbf.persist(cvo); return PrimaryStorageInventory.valueOf(vo); }