Example #1
0
  public void turlArrived(
      String surl, String turl, String remoteRequestId, String remoteFileId, Long size) {
    synchronized (remoteSurlToFileReqIds) {
      Collection<Long> fileRequestIds = remoteSurlToFileReqIds.get(surl);
      if (fileRequestIds == null || fileRequestIds.isEmpty()) {
        LOG.error("turlArrived for unknown SURL = " + surl + " !!!!!!!");
        return;
      }
      for (long id : fileRequestIds) {
        CopyFileRequest cfr = getFileRequest(id);
        if (getQosPlugin() != null && cfr.getQOSTicket() != null) {
          getQosPlugin().sayStatus(cfr.getQOSTicket());
        }

        if (isSourceSrm() && !isSourceLocal()) {
          cfr.setSourceTurl(URI.create(turl));
        } else {
          cfr.setDestinationTurl(URI.create(turl));
        }
        if (size != null) {
          cfr.setSize(size);
        }
        cfr.setRemoteRequestId(remoteRequestId);
        cfr.setRemoteFileId(remoteFileId);
        cfr.saveJob();

        try {
          String theSchedulerId = getSchedulerId();
          State state = cfr.getState();
          if (theSchedulerId != null && !state.isFinal()) {
            cfr.scheduleWith(Scheduler.getScheduler(theSchedulerId));
          }
        } catch (IllegalStateException
            | IllegalArgumentException
            | IllegalStateTransition
            | InterruptedException e) {
          LOG.error("failed to schedule CopyFileRequest {}: {}", cfr, e.toString());
          try {
            cfr.setState(State.FAILED, "Failed to schedule request: " + e.getMessage());
          } catch (IllegalStateTransition ist) {
            LOG.error("Illegal State Transition : {}" + ist.getMessage());
          }
        }
        remoteSurlToFileReqIds.remove(surl, id);
      }
    }
  }
Example #2
0
    @Override
    public void run() {
      try {
        PutFileRequest fr = Job.getJob(fileRequestJobId, PutFileRequest.class);

        try {
          String fileId = future.checkedGet();

          State state = fr.getState();
          switch (state) {
            case INPROGRESS:
              logger.trace("Storage info arrived for file {}.", fr.getSurlString());
              fr.setFileId(fileId);
              fr.saveJob(true);
              Scheduler.getScheduler(fr.getSchedulerId()).execute(fr);
              break;
            case CANCELED:
            case FAILED:
              fr.getStorage().abortPut(fr.getUser(), fileId, fr.getSurl(), fr.getErrorMessage());
              break;
            default:
              logger.error("Put request is in an unexpected state in callback: {}", state);
              fr.getStorage().abortPut(fr.getUser(), fileId, fr.getSurl(), fr.getErrorMessage());
              break;
          }
        } catch (SRMException e) {
          fr.setStateAndStatusCode(State.FAILED, e.getMessage(), e.getStatusCode());
        }
      } catch (IllegalStateTransition ist) {
        if (!ist.getFromState().isFinal()) {
          logger.error(ist.getMessage());
        }
      } catch (SRMInvalidRequestException e) {
        try {
          String fileId = future.checkedGet();
          SRM.getSRM()
              .getStorage()
              .abortPut(user, fileId, surl, "Request was aborted while being prepared.");
        } catch (SRMException ignored) {
        }
      }
    }
Example #3
0
 public void remoteFileRequestDone(String surl, String requestId, String fileId) {
   synchronized (remoteSurlToFileReqIds) {
     try {
       Scheduler<?> scheduler = Scheduler.getScheduler(schedulerId);
       RequestCredential credential = RequestCredential.getRequestCredential(credentialId);
       String caCertificatePath = getConfiguration().getCaCertificatePath();
       if (isSourceSrm() && !isSourceLocal()) {
         RemoteTurlGetterV2.staticReleaseFile(
             credential, surl, requestId, 0, 0, caCertificatePath, clientTransport);
       } else {
         RemoteTurlPutterV2.staticPutDone(
             credential, surl, requestId, 0, 0, caCertificatePath, clientTransport);
       }
     } catch (Exception e) {
       LOG.error(
           "set remote file status to done failed, surl={}, " + "requestId={}, fileId={}",
           surl,
           requestId,
           fileId);
     }
   }
 }
Example #4
0
  private void getTURLs()
      throws SRMException, IOException, InterruptedException, IllegalStateTransition,
          DataAccessException {
    if (isSourceSrm() && !isSourceLocal()) { // implying destination is local
      if (getStorageType() != null && !storageType.equals(TFileStorageType.PERMANENT)) {
        throw new SRMNotSupportedException(
            "TargetFileStorageType " + getStorageType() + " is not supported");
      }
      RequestCredential credential = RequestCredential.getRequestCredential(credentialId);
      LOG.debug("obtained credential={} id={}", credential, credential.getId());

      for (int i = 0; i < getNumOfFileRequest(); ++i) {
        CopyFileRequest cfr = getFileRequests().get(i);
        if (cfr.getState() == State.UNSCHEDULED && cfr.getSchedulerId() == null) {
          if (cfr.getSourceTurl() != null) {
            cfr.scheduleWith(Scheduler.getScheduler(schedulerId));
          } else {
            // Since source SURLs are local, we can just set the path
            remoteSurlToFileReqIds.put(cfr.getSourceSurl().toASCIIString(), cfr.getId());
            String path = localPathFromSurl(cfr.getDestinationSurl());
            LOG.debug("setting destination path to {}", path);
            cfr.setLocalDestinationPath(path);
            cfr.saveJob();
          }
        }
      }
      String[] remoteSurlsUniqueArray =
          remoteSurlToFileReqIds.keySet().toArray(new String[remoteSurlToFileReqIds.size()]);
      if (LOG.isDebugEnabled()) {
        for (int i = 0; i < remoteSurlsUniqueArray.length; ++i) {
          LOG.debug("remoteSurlsUniqueArray[{}]={}", i, remoteSurlsUniqueArray[i]);
        }
      }
      // need to fetch files from remote SRM system
      setRemoteTurlClient(
          new RemoteTurlGetterV2(
              getStorage(),
              credential,
              remoteSurlsUniqueArray,
              getProtocols(),
              this,
              getConfiguration().getCopyMaxPollPeriod(),
              2,
              this.getRemainingLifetime(),
              getConfiguration().getCaCertificatePath(),
              clientTransport));
      getRemoteTurlClient().getInitialRequest();
      getRemoteTurlClient().run();
      return;
    }

    if (isSourceSrm()) { // source is this storage system
      for (int i = 0; i < getNumOfFileRequest(); ++i) {
        CopyFileRequest cfr = getFileRequests().get(i);

        if (cfr.getState() == State.UNSCHEDULED
            && cfr.getSchedulerId() == null
            && cfr.getLocalSourcePath() == null) {
          String path = localPathFromSurl(cfr.getSourceSurl());
          LOG.debug("setting source path to {}", path);
          cfr.setLocalSourcePath(path);
          cfr.saveJob();
        }
      }
    } else { // source is not SRM, so supplied values are the TURL(s)
      for (int i = 0; i < getNumOfFileRequest(); ++i) {
        CopyFileRequest cfr = getFileRequests().get(i);

        if (cfr.getState() == State.UNSCHEDULED
            && cfr.getSchedulerId() == null
            && cfr.getSourceTurl() == null) {
          LOG.debug("getTurlsArrived, setting \"from\" turl to {}", cfr.getSourceSurl());
          cfr.setSourceTurl(cfr.getSourceSurl());
          cfr.saveJob();
        }
      }
    }

    // now source is known, either as a TURL or a local path.

    if (isDestinationSrm() && isDestinationLocal()) { // destination is this system
      // As we have a source (either a path or a TURL) for all files and
      // the destination is local, we have all the information needed.
      for (int i = 0; i < getNumOfFileRequest(); ++i) {
        CopyFileRequest cfr = getFileRequests().get(i);
        if (cfr.getState() == State.UNSCHEDULED && cfr.getSchedulerId() == null) {
          String path = localPathFromSurl(cfr.getDestinationSurl());
          LOG.debug("setting local destination path to {}", path);
          cfr.setLocalDestinationPath(path);
          cfr.scheduleWith(Scheduler.getScheduler(schedulerId));
        }
      }
      return;
    }

    if (!isDestinationSrm()) { // destination is some TURL
      // As we have a source (either a path or a TURL) for all files and
      // the destination is a TURL, we have all the information needed.
      for (int i = 0; i < getNumOfFileRequest(); ++i) {
        CopyFileRequest cfr = getFileRequests().get(i);
        if (cfr.getState() == State.UNSCHEDULED && cfr.getSchedulerId() == null) {
          LOG.debug("setting destination to {}", cfr.getDestinationSurl());
          cfr.setDestinationTurl(cfr.getDestinationSurl());
          cfr.scheduleWith(Scheduler.getScheduler(schedulerId));
        }
      }
      return;
    }

    // The only possibility left is a remote destination SURLs, for which
    // we need to discover a TURLs.

    for (int i = 0; i < getNumOfFileRequest(); ++i) {
      CopyFileRequest cfr = getFileRequests().get(i);
      if (cfr.getState() != State.UNSCHEDULED || cfr.getSchedulerId() != null) {
        // copy file request has being canceled,failed or scheduled before
      } else if (cfr.getDestinationTurl() != null) {
        // destination TURL has arrived, but request has not been scheduled
        cfr.scheduleWith(Scheduler.getScheduler(schedulerId));
      } else {
        remoteSurlToFileReqIds.put(cfr.getDestinationSurl().toASCIIString(), cfr.getId());
      }
    }

    int uniqueCount = remoteSurlToFileReqIds.size();
    String[] uniqueSurls = remoteSurlToFileReqIds.keySet().toArray(new String[uniqueCount]);
    String[] destinationSurls = new String[uniqueCount];
    long[] sizes = new long[uniqueCount];
    for (int i = 0; i < uniqueCount; ++i) {
      long id = Iterables.get(remoteSurlToFileReqIds.get(uniqueSurls[i]), 0);
      CopyFileRequest cfr = getFileRequest(id);
      sizes[i] = getStorage().getFileMetaData(getUser(), cfr.getSourceSurl(), false).size;
      LOG.debug("local size is {}", sizes[i]);
      cfr.setSize(sizes[i]);
      destinationSurls[i] = cfr.getDestinationSurl().toString();
      if (getQosPlugin() != null) {
        makeQosReservation(i);
      }
    }

    // Now create an SRM client to fetch a TURL for each SURL.

    RequestCredential credential = RequestCredential.getRequestCredential(credentialId);
    setRemoteTurlClient(
        new RemoteTurlPutterV2(
            getStorage(),
            credential,
            destinationSurls,
            sizes,
            getProtocols(),
            this,
            getConfiguration().getCopyMaxPollPeriod(),
            2,
            this.getRemainingLifetime(),
            getStorageType(),
            getTargetRetentionPolicy(),
            getTargetAccessLatency(),
            getOverwriteMode(),
            getTargetSpaceToken(),
            getConfiguration().getCaCertificatePath(),
            clientTransport));
    getRemoteTurlClient().getInitialRequest();

    getRemoteTurlClient().run();
  }