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); } } }
@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) { } } }
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); } } }
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(); }