@Transactional private void updateCapacity(long total, long avail) { PrimaryStorageCapacityVO cvo = dbf.getEntityManager() .find(PrimaryStorageCapacityVO.class, self.getUuid(), LockModeType.PESSIMISTIC_WRITE); DebugUtils.Assert( cvo != null, String.format("how can there is no PrimaryStorageCapacityVO[uuid:%s]", self.getUuid())); cvo.setTotalPhysicalCapacity(total); cvo.setAvailablePhysicalCapacity(avail); dbf.getEntityManager().merge(cvo); }
@Transactional private void handle(TakePrimaryStorageCapacityMsg msg) { PrimaryStorageCapacityVO vo = dbf.getEntityManager() .find(PrimaryStorageCapacityVO.class, self.getUuid(), LockModeType.PESSIMISTIC_WRITE); vo.setAvailableCapacity(vo.getAvailableCapacity() - msg.getSize()); if (vo.getAvailableCapacity() < 0) { vo.setAvailableCapacity(0); } dbf.getEntityManager().merge(vo); TakePrimaryStorageCapacityReply reply = new TakePrimaryStorageCapacityReply(); bus.reply(msg, reply); }
@Transactional private void handle(PrimaryStorageReportCapacityMsg msg) { PrimaryStorageCapacityVO vo = dbf.getEntityManager() .find(PrimaryStorageCapacityVO.class, self.getUuid(), LockModeType.PESSIMISTIC_WRITE); if (vo.getTotalCapacity() == 0) { vo.setTotalCapacity(msg.getTotalCapacity()); vo.setAvailableCapacity(msg.getAvailableCapacity()); dbf.getEntityManager().merge(vo); } PrimaryStorageReportCapacityReply reply = new PrimaryStorageReportCapacityReply(); bus.reply(msg, reply); }
@Transactional(readOnly = true) private void checkIfBackupStorageAttachedToMyZone(String bsUuid) { String sql = "select bs.uuid from BackupStorageVO bs, BackupStorageZoneRefVO ref where bs.uuid = ref.backupStorageUuid and ref.zoneUuid = :zoneUuid and bs.uuid = :bsUuid"; TypedQuery<String> q = dbf.getEntityManager().createQuery(sql, String.class); q.setParameter("zoneUuid", self.getZoneUuid()); q.setParameter("bsUuid", bsUuid); if (q.getResultList().isEmpty()) { throw new OperationFailureException( errf.stringToOperationError( String.format( "backup storage[uuid:%s] is not attached to zone[uuid:%s] the primary storage[uuid:%s] belongs to", bsUuid, self.getZoneUuid(), self.getUuid()))); } }
private void handle(final APISyncPrimaryStorageCapacityMsg msg) { final APISyncPrimaryStorageCapacityEvent evt = new APISyncPrimaryStorageCapacityEvent(msg.getId()); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("sync-capacity-of-primary-storage-%s", self.getUuid())); chain .then( new ShareFlow() { Long volumeUsage; Long snapshotUsage; Long totalPhysicalSize; Long availablePhysicalSize; @Override public void setup() { flow( new NoRollbackFlow() { String __name__ = "sync-capacity-used-by-volumes"; @Override public void run(final FlowTrigger trigger, Map data) { VolumeReportPrimaryStorageCapacityUsageMsg msg = new VolumeReportPrimaryStorageCapacityUsageMsg(); msg.setPrimaryStorageUuid(self.getUuid()); bus.makeLocalServiceId(msg, VolumeConstant.SERVICE_ID); bus.send( msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { trigger.fail(reply.getError()); return; } VolumeReportPrimaryStorageCapacityUsageReply r = reply.castReply(); volumeUsage = r.getUsedCapacity(); volumeUsage = ratioMgr.calculateByRatio(self.getUuid(), volumeUsage); trigger.next(); } }); } }); flow( new NoRollbackFlow() { String __name__ = "sync-capacity-used-by-volume-snapshots"; @Override public void run(final FlowTrigger trigger, Map data) { VolumeSnapshotReportPrimaryStorageCapacityUsageMsg msg = new VolumeSnapshotReportPrimaryStorageCapacityUsageMsg(); msg.setPrimaryStorageUuid(self.getUuid()); bus.makeLocalServiceId(msg, VolumeSnapshotConstant.SERVICE_ID); bus.send( msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { trigger.fail(reply.getError()); return; } // note: snapshot size is physical size, // don't calculate over-provisioning here VolumeSnapshotReportPrimaryStorageCapacityUsageReply r = reply.castReply(); snapshotUsage = r.getUsedSize(); trigger.next(); } }); } }); flow( new NoRollbackFlow() { String __name__ = "sync-physical-capacity"; @Override public void run(final FlowTrigger trigger, Map data) { syncPhysicalCapacity( new ReturnValueCompletion<PhysicalCapacityUsage>(trigger) { @Override public void success(PhysicalCapacityUsage returnValue) { totalPhysicalSize = returnValue.totalPhysicalSize; availablePhysicalSize = returnValue.availablePhysicalSize; availablePhysicalSize = availablePhysicalSize < 0 ? 0 : availablePhysicalSize; trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } }); done( new FlowDoneHandler(msg) { @Override public void handle(Map data) { writeToDb(); self = dbf.reload(self); evt.setInventory(getSelfInventory()); bus.publish(evt); } private void writeToDb() { PrimaryStorageCapacityUpdater updater = new PrimaryStorageCapacityUpdater(self.getUuid()); updater.run( new PrimaryStorageCapacityUpdaterRunnable() { @Override public PrimaryStorageCapacityVO call(PrimaryStorageCapacityVO cap) { long avail = cap.getTotalCapacity() - volumeUsage - snapshotUsage; cap.setAvailableCapacity(avail); cap.setAvailablePhysicalCapacity(availablePhysicalSize); cap.setTotalPhysicalCapacity(totalPhysicalSize); return cap; } }); } }); error( new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { evt.setErrorCode(errCode); bus.publish(evt); } }); } }) .start(); }
protected String getSyncId() { return String.format("primaryStorage-%s", self.getUuid()); }
private void handle(final APISyncPrimaryStorageCapacityMsg msg) { final APISyncPrimaryStorageCapacityEvent evt = new APISyncPrimaryStorageCapacityEvent(msg.getId()); FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("sync-capacity-of-primary-storage-%s", self.getUuid())); chain .then( new ShareFlow() { Long volumeUsage; Long snapshotUsage; Long totalPhysicalSize; Long availablePhysicalSize; @Override public void setup() { flow( new NoRollbackFlow() { String __name__ = "sync-capacity-used-by-volumes"; @Override public void run(final FlowTrigger trigger, Map data) { VolumeReportPrimaryStorageCapacityUsageMsg msg = new VolumeReportPrimaryStorageCapacityUsageMsg(); msg.setPrimaryStorageUuid(self.getUuid()); bus.makeLocalServiceId(msg, VolumeConstant.SERVICE_ID); bus.send( msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { trigger.fail(reply.getError()); return; } VolumeReportPrimaryStorageCapacityUsageReply r = reply.castReply(); volumeUsage = r.getUsedCapacity(); trigger.next(); } }); } }); flow( new NoRollbackFlow() { String __name__ = "sync-capacity-used-by-volume-snapshots"; @Override public void run(final FlowTrigger trigger, Map data) { VolumeSnapshotReportPrimaryStorageCapacityUsageMsg msg = new VolumeSnapshotReportPrimaryStorageCapacityUsageMsg(); msg.setPrimaryStorageUuid(self.getUuid()); bus.makeLocalServiceId(msg, VolumeSnapshotConstant.SERVICE_ID); bus.send( msg, new CloudBusCallBack(trigger) { @Override public void run(MessageReply reply) { if (!reply.isSuccess()) { trigger.fail(reply.getError()); return; } VolumeSnapshotReportPrimaryStorageCapacityUsageReply r = reply.castReply(); snapshotUsage = r.getUsedSize(); trigger.next(); } }); } }); flow( new NoRollbackFlow() { String __name__ = "sync-physical-capacity"; @Override public void run(final FlowTrigger trigger, Map data) { syncPhysicalCapacity( new ReturnValueCompletion<PhysicalCapacityUsage>(trigger) { @Override public void success(PhysicalCapacityUsage returnValue) { totalPhysicalSize = returnValue.totalPhysicalSize; availablePhysicalSize = returnValue.availablePhysicalSize; availablePhysicalSize = availablePhysicalSize < 0 ? 0 : availablePhysicalSize; trigger.next(); } @Override public void fail(ErrorCode errorCode) { trigger.fail(errorCode); } }); } }); done( new FlowDoneHandler(msg) { @Override public void handle(Map data) { writeToDb(); self = dbf.reload(self); evt.setInventory(getSelfInventory()); bus.publish(evt); } @Transactional private void writeToDb() { PrimaryStorageCapacityVO vo = dbf.getEntityManager() .find( PrimaryStorageCapacityVO.class, self.getUuid(), LockModeType.PESSIMISTIC_WRITE); long avail = vo.getTotalCapacity() - volumeUsage - snapshotUsage; avail = avail < 0 ? 0 : avail; vo.setAvailableCapacity(avail); vo.setAvailablePhysicalCapacity(availablePhysicalSize); vo.setTotalPhysicalCapacity(totalPhysicalSize); dbf.getEntityManager().merge(vo); } }); error( new FlowErrorHandler(msg) { @Override public void handle(ErrorCode errCode, Map data) { evt.setErrorCode(errCode); bus.publish(evt); } }); } }) .start(); }