private void checkResize() { if (originalCopy != null && capacityVO != null && originalCopy.getTotalCapacity() != 0 && originalCopy.getTotalCapacity() != capacityVO.getTotalCapacity()) { logger.debug(String.format("the capacity of backup storage[uuid:%s] changed from %s to %s, this indicates the backup storage is re-sized." + " We need to recalculate its capacity", capacityVO.getUuid(), originalCopy.getTotalCapacity(), capacityVO.getTotalCapacity())); // primary storage re-sized } }
private void logCapacityChange() { if (logger.isTraceEnabled()) { StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); int index = 0; String fileName = BackupStorageCapacityUpdater.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("[Backup Storage Capacity] %s:%s:%s changed the capacity of the backup storage[uuid:%s] as:\n" + "total: %s --> %s\n" + "available: %s --> %s\n" , caller.getFileName(), caller.getMethodName(), caller.getLineNumber(), capacityVO.getUuid(), totalForLog, capacityVO.getTotalCapacity(), availForLog, capacityVO.getAvailableCapacity())); } }
@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()); }
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 _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; }
@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; }
@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; }
protected BackupStorageInventory(BackupStorageVO vo) { this.setCreateDate(vo.getCreateDate()); this.setDescription(vo.getDescription()); this.setLastOpDate(vo.getLastOpDate()); this.setName(vo.getName()); this.setState(vo.getState().toString()); this.setStatus(vo.getStatus().toString()); this.setTotalCapacity(vo.getTotalCapacity()); this.setAvailableCapacity(vo.getAvailableCapacity()); this.setType(vo.getType()); this.setUrl(vo.getUrl()); this.setUuid(vo.getUuid()); this.attachedZoneUuids = new ArrayList<String>(vo.getAttachedZoneRefs().size()); for (BackupStorageZoneRefVO ref : vo.getAttachedZoneRefs()) { if (!this.attachedZoneUuids.contains(ref.getZoneUuid())) { this.attachedZoneUuids.add(ref.getZoneUuid()); } } }
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()); }