Ejemplo n.º 1
0
  private void downloadVolumeToStorage(
      VolumeVO volume, HostVO sserver, String url, String checkSum, ImageFormat format) {
    boolean downloadJobExists = false;
    VolumeHostVO volumeHost = null;

    volumeHost = _volumeHostDao.findByHostVolume(sserver.getId(), volume.getId());
    if (volumeHost == null) {
      volumeHost =
          new VolumeHostVO(
              sserver.getId(),
              volume.getId(),
              sserver.getDataCenterId(),
              new Date(),
              0,
              VMTemplateStorageResourceAssoc.Status.NOT_DOWNLOADED,
              null,
              null,
              "jobid0000",
              null,
              url,
              checkSum,
              format);
      _volumeHostDao.persist(volumeHost);
    } else if ((volumeHost.getJobId() != null) && (volumeHost.getJobId().length() > 2)) {
      downloadJobExists = true;
    }

    Long maxVolumeSizeInBytes = getMaxVolumeSizeInBytes();
    String secUrl = sserver.getStorageUrl();
    if (volumeHost != null) {
      start();
      DownloadCommand dcmd =
          new DownloadCommand(secUrl, volume, maxVolumeSizeInBytes, checkSum, url, format);
      if (downloadJobExists) {
        dcmd = new DownloadProgressCommand(dcmd, volumeHost.getJobId(), RequestType.GET_OR_RESTART);
        dcmd.setResourceType(ResourceType.VOLUME);
      }
      dcmd.setProxy(getHttpProxy());
      HostVO ssvm = _ssvmMgr.pickSsvmHost(sserver);
      if (ssvm == null) {
        s_logger.warn(
            "There is no secondary storage VM for secondary storage host " + sserver.getName());
        return;
      }
      DownloadListener dl =
          new DownloadListener(
              ssvm,
              sserver,
              volume,
              _timer,
              _volumeHostDao,
              volumeHost.getId(),
              this,
              dcmd,
              _volumeDao,
              _storageMgr,
              _resourceLimitMgr,
              _alertMgr,
              _accountMgr);

      if (downloadJobExists) {
        dl.setCurrState(volumeHost.getDownloadState());
      }
      DownloadListener old = null;
      synchronized (_listenerVolumeMap) {
        old = _listenerVolumeMap.put(volumeHost, dl);
      }
      if (old != null) {
        old.abandon();
      }

      try {
        send(ssvm.getId(), dcmd, dl);
      } catch (AgentUnavailableException e) {
        s_logger.warn(
            "Unable to start /resume download of volume "
                + volume.getName()
                + " to "
                + sserver.getName(),
            e);
        dl.setDisconnected();
        dl.scheduleStatusCheck(RequestType.GET_OR_RESTART);
      }
    }
  }