@Override protected void handle(final DeleteVolumeOnPrimaryStorageMsg msg) { HypervisorType type = findHypervisorTypeByImageFormatAndPrimaryStorageUuid(msg.getVolume().getFormat(), msg.getPrimaryStorageUuid()); HypervisorFactory f = getHypervisorFactoryByHypervisorType(type.toString()); final HypervisorBackend bkd = f.getHypervisorBackend(self); bkd.handle(msg, new ReturnValueCompletion<DeleteVolumeOnPrimaryStorageReply>(msg) { @Override public void success(DeleteVolumeOnPrimaryStorageReply reply) { logger.debug( String.format("successfully delete volume[uuid:%s]", msg.getVolume().getUuid())); bus.reply(msg, reply); } @Override public void fail(ErrorCode errorCode) { logger.debug( String.format("can't delete volume[uuid:%s] right now, add a GC job", msg.getVolume().getUuid())); SMPDeleteVolumeGC gc = new SMPDeleteVolumeGC(); gc.NAME = String.format("gc-smp-%s-volume-%s", self.getUuid(), msg.getVolume()); gc.primaryStorageUuid = self.getUuid(); gc.hypervisorType = type.toString(); gc.volume = msg.getVolume(); gc.submit(SMPPrimaryStorageGlobalConfig.GC_INTERVAL.value(Long.class), TimeUnit.SECONDS); DeleteVolumeOnPrimaryStorageReply reply = new DeleteVolumeOnPrimaryStorageReply(); bus.reply(msg, reply); } }); }