@Transactional private boolean _decreaseAvailableCapacity(long size) { if (!lockCapacity()) { logDeletedBackupStorage(); return false; } capacityVO.setAvailableCapacity(capacityVO.getAvailableCapacity() - size); merge(); return true; }
@Transactional private boolean _update(Long total, Long avail) { if (!lockCapacity()) { logDeletedBackupStorage(); return false; } if (total != null) { capacityVO.setTotalCapacity(total); } if (avail != null) { capacityVO.setAvailableCapacity(avail); } merge(); return true; }
@Transactional private boolean reserve(String bsUuid, long size) { BackupStorageVO vo = dbf.getEntityManager().find(BackupStorageVO.class, bsUuid, LockModeType.PESSIMISTIC_WRITE); if (vo == null) { logger.warn(String.format("reservation failure, cannot find backup storage[uuid:%s]", bsUuid)); return false; } if (vo.getAvailableCapacity() < size) { logger.warn(String.format("reservation failure, cannot reserve capacity[%s bytes] on backup storage[uuid:%s]", size, bsUuid)); return false; } long avail = vo.getAvailableCapacity() - size; vo.setAvailableCapacity(avail); dbf.getEntityManager().merge(vo); logger.debug(String.format("reserve %s bytes on backup storage[uuid:%s, total capacity:%s, available capacity:%s]", size, bsUuid, vo.getTotalCapacity(), avail)); return true; }
protected void updateCapacity(Long totalCapacity, Long availableCapacity) { if (totalCapacity == null || availableCapacity == null) { return; } BackupStorageVO vo = dbf.findByUuid(self.getUuid(), BackupStorageVO.class); vo.setTotalCapacity(totalCapacity); vo.setAvailableCapacity(availableCapacity); dbf.update(vo); }
@Transactional private void handle(ReturnBackupStorageMsg msg) { self = dbf.getEntityManager().find(BackupStorageVO.class, self.getUuid(), LockModeType.PESSIMISTIC_WRITE); long availSize = self.getAvailableCapacity() + msg.getSize(); if (availSize > self.getTotalCapacity()) { availSize = self.getTotalCapacity(); } self.setAvailableCapacity(availSize); dbf.getEntityManager().merge(self); bus.reply(msg, new ReturnBackupStorageReply()); }
@Transactional private boolean _increaseAvailableCapacity(long size) { if (!lockCapacity()) { logDeletedBackupStorage(); return false; } long n = capacityVO.getAvailableCapacity() + size; if (n > capacityVO.getTotalCapacity()) { throw new CloudRuntimeException(String.format("invalid backup storage[uuid:%s] capacity, available capacity[%s] > total capacity[%s]", capacityVO.getUuid(), n, capacityVO.getTotalCapacity())); } capacityVO.setAvailableCapacity(n); merge(); return true; }
@Override public BackupStorageInventory createBackupStorage(BackupStorageVO vo, APIAddBackupStorageMsg msg) { APIAddSimulatorBackupStorageMsg smsg = (APIAddSimulatorBackupStorageMsg) msg; vo.setTotalCapacity(smsg.getTotalCapacity()); vo.setAvailableCapacity(smsg.getAvailableCapacity()); vo = dbf.persistAndRefresh(vo); return BackupStorageInventory.valueOf(vo); }
private boolean lockCapacity() { if (backupStorageUuid != null) { capacityVO = dbf.getEntityManager().find(BackupStorageVO.class, backupStorageUuid, LockModeType.PESSIMISTIC_WRITE); } if (capacityVO != null) { totalForLog = capacityVO.getTotalCapacity(); availForLog = capacityVO.getAvailableCapacity(); originalCopy = new BackupStorageVO(); originalCopy.setAvailableCapacity(capacityVO.getAvailableCapacity()); originalCopy.setTotalCapacity(capacityVO.getTotalCapacity()); } return capacityVO != null; }
@Transactional private boolean _run(BackupStorageCapacityUpdaterRunnable runnable) { if (!lockCapacity()) { logDeletedBackupStorage(); return false; } BackupStorageCapacity cap = new BackupStorageCapacity(); cap.setUuid(capacityVO.getUuid()); cap.setAvailableCapacity(capacityVO.getAvailableCapacity()); cap.setTotalCapacity(capacityVO.getTotalCapacity()); cap = runnable.call(cap); if (cap != null) { capacityVO.setTotalCapacity(cap.getTotalCapacity()); capacityVO.setAvailableCapacity(cap.getAvailableCapacity()); merge(); return true; } return false; }
@Override public void run(MessageReply reply) { if (reply.isSuccess()) { BackupStorageVO srcBS = dbf.findByUuid(self.getUuid(), BackupStorageVO.class); srcBS.setAvailableCapacity(srcBS.getAvailableCapacity() + spec.getSize()); dbf.update(srcBS); logger.info(String.format("Deleted image %s and returned space[size:%s] to BS[uuid:%s] after image migration", spec.getInstallPath(), spec.getSize(), self.getUuid())); trash.removeFromDb(spec.getTrashId()); result.setSize(spec.getSize()); result.setResourceUuids(CollectionDSL.list(spec.getResourceUuid())); completion.success(result); } else { logger.warn(String.format("Failed to delete image %s in image migration.", spec.getInstallPath())); completion.fail(reply.getError()); } } });
protected BackupStorageVO(BackupStorageVO vo) { this.setUuid(vo.getUuid()); this.setAttachedZoneRefs(vo.getAttachedZoneRefs()); this.setCreateDate(vo.getCreateDate()); this.setDescription(vo.getDescription()); this.setLastOpDate(vo.getLastOpDate()); this.setName(vo.getName()); this.setState(vo.getState()); this.setStatus(vo.getStatus()); this.setTotalCapacity(vo.getTotalCapacity()); this.setType(vo.getType()); this.setUrl(vo.getUrl()); this.setAvailableCapacity(vo.getAvailableCapacity()); }