Search in sources :

Example 1 with SrmPrepareToGetRequest

use of org.dcache.srm.v2_2.SrmPrepareToGetRequest in project dcache by dCache.

the class SRMGetClientV2 method start.

@Override
public void start() throws Exception {
    try {
        copier = new Copier(configuration);
        new Thread(copier).start();
        int len = from.length;
        String[] SURLS = new String[len];
        TGetFileRequest[] fileRequests = new TGetFileRequest[len];
        for (int i = 0; i < len; ++i) {
            SURLS[i] = from[i].toASCIIString();
            URI uri = new URI(SURLS[i]);
            fileRequests[i] = new TGetFileRequest();
            fileRequests[i].setSourceSURL(uri);
            pendingSurlsToIndex.put(SURLS[i], i);
        }
        hook = new Thread(this);
        Runtime.getRuntime().addShutdownHook(hook);
        SrmPrepareToGetRequest srmPrepareToGetRequest = new SrmPrepareToGetRequest();
        srmPrepareToGetRequest.setUserRequestDescription(configuration.getUserRequestDescription());
        srmPrepareToGetRequest.setDesiredTotalRequestTime((int) configuration.getRequestLifetime());
        TRetentionPolicy rp = configuration.getRetentionPolicy() != null ? RetentionPolicy.fromString(configuration.getRetentionPolicy()).toTRetentionPolicy() : null;
        TAccessLatency al = configuration.getAccessLatency() != null ? AccessLatency.fromString(configuration.getAccessLatency()).toTAccessLatency() : null;
        if ((al != null) && (rp == null)) {
            throw new IllegalArgumentException("if access latency is specified, " + "then retention policy have to be specified as well");
        } else if (rp != null) {
            srmPrepareToGetRequest.setTargetFileRetentionPolicyInfo(new TRetentionPolicyInfo(rp, al));
        }
        srmPrepareToGetRequest.setArrayOfFileRequests(new ArrayOfTGetFileRequest(fileRequests));
        TAccessPattern ap = null;
        if (configuration.getAccessPattern() != null) {
            ap = TAccessPattern.fromString(configuration.getAccessPattern());
        }
        TConnectionType ct = null;
        if (configuration.getConnectionType() != null) {
            ct = TConnectionType.fromString(configuration.getConnectionType());
        }
        ArrayOfString protocolArray = null;
        if (configuration.getProtocols() != null) {
            protocolArray = new ArrayOfString(configuration.getProtocols());
        }
        ArrayOfString arrayOfClientNetworks = null;
        if (configuration.getArrayOfClientNetworks() != null) {
            arrayOfClientNetworks = new ArrayOfString(configuration.getArrayOfClientNetworks());
        }
        if (ap != null || ct != null || arrayOfClientNetworks != null || protocolArray != null) {
            srmPrepareToGetRequest.setTransferParameters(new TTransferParameters(ap, ct, arrayOfClientNetworks, protocolArray));
        }
        configuration.getStorageSystemInfo().ifPresent(srmPrepareToGetRequest::setStorageSystemInfo);
        say("calling srmPrepareToGet");
        SrmPrepareToGetResponse response = srm.srmPrepareToGet(srmPrepareToGetRequest);
        say("received response");
        if (response == null) {
            throw new IOException(" null response");
        }
        TReturnStatus status = response.getReturnStatus();
        if (status == null) {
            throw new IOException(" null return status");
        }
        TStatusCode statusCode = status.getStatusCode();
        if (statusCode == null) {
            throw new IOException(" null status code");
        }
        if (RequestStatusTool.isFailedRequestStatus(status) && (statusCode != TStatusCode.SRM_FAILURE || response.getArrayOfFileStatuses() == null)) {
            String explanation = status.getExplanation();
            if (explanation != null) {
                throw new IOException("srmPrepareToGet submission failed, unexpected or failed status : " + statusCode + " explanation= " + explanation);
            } else {
                throw new IOException("srmPrepareToGet submission failed, unexpected or failed status : " + statusCode);
            }
        }
        requestToken = response.getRequestToken();
        dsay(" srm returned requestToken = " + requestToken);
        if (response.getArrayOfFileStatuses() == null) {
            throw new IOException("returned GetRequestFileStatuses is an empty array");
        }
        TGetRequestFileStatus[] getRequestFileStatuses = response.getArrayOfFileStatuses().getStatusArray();
        if (getRequestFileStatuses.length != len) {
            throw new IOException("incorrect number of GetRequestFileStatuses" + "in RequestStatus expected " + len + " received " + getRequestFileStatuses.length);
        }
        while (!pendingSurlsToIndex.isEmpty()) {
            long estimatedWaitInSeconds = 5;
            for (TGetRequestFileStatus getRequestFileStatus : getRequestFileStatuses) {
                URI surl = getRequestFileStatus.getSourceSURL();
                if (surl == null) {
                    esay("invalid getRequestFileStatus, surl is null");
                    continue;
                }
                String surl_string = surl.toString();
                if (!pendingSurlsToIndex.containsKey(surl_string)) {
                    esay("invalid getRequestFileStatus, surl = " + surl_string + " not found");
                    continue;
                }
                TReturnStatus fileStatus = getRequestFileStatus.getStatus();
                if (fileStatus == null) {
                    throw new IOException(" null file return status");
                }
                TStatusCode fileStatusCode = fileStatus.getStatusCode();
                if (fileStatusCode == null) {
                    throw new IOException(" null file status code");
                }
                if (RequestStatusTool.isFailedFileRequestStatus(fileStatus)) {
                    String error = "retreval of surl " + surl_string + " failed, status = " + fileStatusCode + " explanation=" + fileStatus.getExplanation();
                    esay(error);
                    int indx = pendingSurlsToIndex.remove(surl_string);
                    setReportFailed(from[indx], to[indx], error);
                    continue;
                }
                if (getRequestFileStatus.getTransferURL() != null) {
                    java.net.URI globusTURL = new java.net.URI(getRequestFileStatus.getTransferURL().toString());
                    int indx = pendingSurlsToIndex.remove(surl_string);
                    setReportFailed(from[indx], to[indx], "received TURL, but did not complete transfer");
                    CopyJob job = new SRMV2CopyJob(globusTURL, to[indx], srm, requestToken, logger, from[indx], true, this);
                    copier.addCopyJob(job);
                    continue;
                }
                if (getRequestFileStatus.getEstimatedWaitTime() != null && getRequestFileStatus.getEstimatedWaitTime() < estimatedWaitInSeconds && getRequestFileStatus.getEstimatedWaitTime() >= 1) {
                    estimatedWaitInSeconds = getRequestFileStatus.getEstimatedWaitTime();
                }
            }
            if (pendingSurlsToIndex.isEmpty()) {
                dsay("no more pending transfers, breaking the loop");
                Runtime.getRuntime().removeShutdownHook(hook);
                break;
            }
            // do not wait longer then 60 seconds
            if (estimatedWaitInSeconds > 60) {
                estimatedWaitInSeconds = 60;
            }
            try {
                say("sleeping " + estimatedWaitInSeconds + " seconds ...");
                Thread.sleep(estimatedWaitInSeconds * 1000);
            } catch (InterruptedException ie) {
            }
            SrmStatusOfGetRequestRequest srmStatusOfGetRequestRequest = new SrmStatusOfGetRequestRequest();
            srmStatusOfGetRequestRequest.setRequestToken(requestToken);
            // we do not know what to expect from the server when
            // no surls are specified int the status update request
            // so we always are sending the list of all pending srm urls
            String[] pendingSurlStrings = pendingSurlsToIndex.keySet().toArray(new String[pendingSurlsToIndex.size()]);
            // if we do not have completed file requests
            // we want to get status for all files
            // we do not need to specify any surls
            int expectedResponseLength = pendingSurlStrings.length;
            URI[] surlArray = new URI[expectedResponseLength];
            for (int i = 0; i < expectedResponseLength; ++i) {
                surlArray[i] = new URI(pendingSurlStrings[i]);
            }
            srmStatusOfGetRequestRequest.setArrayOfSourceSURLs(new ArrayOfAnyURI(surlArray));
            SrmStatusOfGetRequestResponse srmStatusOfGetRequestResponse = srm.srmStatusOfGetRequest(srmStatusOfGetRequestRequest);
            if (srmStatusOfGetRequestResponse == null) {
                throw new IOException(" null srmStatusOfGetRequestResponse");
            }
            if (srmStatusOfGetRequestResponse.getArrayOfFileStatuses() == null) {
                String error = "array of RequestFileStatuses is null ";
                statusCode = status.getStatusCode();
                if (statusCode != null) {
                    error += " status : " + statusCode + " explanation=" + status.getExplanation();
                }
                esay(error);
                throw new IOException(error);
            }
            getRequestFileStatuses = srmStatusOfGetRequestResponse.getArrayOfFileStatuses().getStatusArray();
            if (getRequestFileStatuses == null || getRequestFileStatuses.length != expectedResponseLength) {
                String error = "incorrect number of RequestFileStatuses";
                statusCode = status.getStatusCode();
                if (statusCode != null) {
                    error += " status : " + statusCode + " explanation=" + status.getExplanation();
                }
                esay(error);
                throw new IOException(error);
            }
            status = srmStatusOfGetRequestResponse.getReturnStatus();
            if (status == null) {
                throw new IOException(" null return status");
            }
            statusCode = status.getStatusCode();
            if (statusCode == null) {
                throw new IOException(" null status code");
            }
            if (RequestStatusTool.isFailedRequestStatus(status)) {
                String error = "srmPrepareToGet update failed, status : " + statusCode + " explanation=" + status.getExplanation();
                esay(error);
                for (int i = 0; i < expectedResponseLength; ++i) {
                    TReturnStatus frstatus = getRequestFileStatuses[i].getStatus();
                    if (frstatus != null) {
                        esay("GetFileRequest[" + getRequestFileStatuses[i].getSourceSURL() + "] status=" + frstatus.getStatusCode() + " explanation=" + frstatus.getExplanation());
                        if (!RequestStatusTool.isTransientStateStatus(frstatus)) {
                            pendingSurlsToIndex.remove(getRequestFileStatuses[i].getSourceSURL().toString());
                        }
                    }
                }
                throw new IOException(error);
            }
        }
    } catch (Exception e) {
        try {
            if (copier != null) {
                dsay("stopping copier");
                copier.stop();
                abortAllPendingFiles();
            }
        } catch (Exception e1) {
            edsay(e1.toString());
        }
        throw e;
    } finally {
        if (copier != null) {
            copier.doneAddingJobs();
            try {
                copier.waitCompletion();
            } catch (Exception e1) {
                edsay(e1.toString());
            }
        }
        report.dumpReport();
        if (!report.everythingAllRight()) {
            report.reportErrors(System.err);
        }
    }
}
Also used : ArrayOfTGetFileRequest(org.dcache.srm.v2_2.ArrayOfTGetFileRequest) TAccessPattern(org.dcache.srm.v2_2.TAccessPattern) ArrayOfString(org.dcache.srm.v2_2.ArrayOfString) SrmPrepareToGetRequest(org.dcache.srm.v2_2.SrmPrepareToGetRequest) TTransferParameters(org.dcache.srm.v2_2.TTransferParameters) ArrayOfAnyURI(org.dcache.srm.v2_2.ArrayOfAnyURI) URI(org.apache.axis.types.URI) TRetentionPolicyInfo(org.dcache.srm.v2_2.TRetentionPolicyInfo) TConnectionType(org.dcache.srm.v2_2.TConnectionType) TGetRequestFileStatus(org.dcache.srm.v2_2.TGetRequestFileStatus) SrmStatusOfGetRequestRequest(org.dcache.srm.v2_2.SrmStatusOfGetRequestRequest) TReturnStatus(org.dcache.srm.v2_2.TReturnStatus) TGetFileRequest(org.dcache.srm.v2_2.TGetFileRequest) ArrayOfTGetFileRequest(org.dcache.srm.v2_2.ArrayOfTGetFileRequest) TRetentionPolicy(org.dcache.srm.v2_2.TRetentionPolicy) IOException(java.io.IOException) SrmPrepareToGetResponse(org.dcache.srm.v2_2.SrmPrepareToGetResponse) TStatusCode(org.dcache.srm.v2_2.TStatusCode) IOException(java.io.IOException) SrmStatusOfGetRequestResponse(org.dcache.srm.v2_2.SrmStatusOfGetRequestResponse) ArrayOfString(org.dcache.srm.v2_2.ArrayOfString) TAccessLatency(org.dcache.srm.v2_2.TAccessLatency) ArrayOfAnyURI(org.dcache.srm.v2_2.ArrayOfAnyURI)

Example 2 with SrmPrepareToGetRequest

use of org.dcache.srm.v2_2.SrmPrepareToGetRequest in project dcache by dCache.

the class SrmPrepareToGet method getTransferProtocols.

private static String[] getTransferProtocols(SrmPrepareToGetRequest request) throws SRMInvalidRequestException {
    TTransferParameters transferParameters = request.getTransferParameters();
    if (transferParameters != null && transferParameters.getArrayOfTransferProtocols() != null) {
        String[] protocols = transferParameters.getArrayOfTransferProtocols().getStringArray();
        protocols = Tools.trimStringArray(protocols);
        if (protocols != null && protocols.length > 0) {
            return protocols;
        }
    }
    throw new SRMInvalidRequestException("request contains no transfer protocols");
}
Also used : TTransferParameters(org.dcache.srm.v2_2.TTransferParameters) SRMInvalidRequestException(org.dcache.srm.SRMInvalidRequestException)

Example 3 with SrmPrepareToGetRequest

use of org.dcache.srm.v2_2.SrmPrepareToGetRequest in project dcache by dCache.

the class SrmPrepareToGet method getSurls.

private static URI[] getSurls(SrmPrepareToGetRequest request) throws SRMInvalidRequestException {
    TGetFileRequest[] fileRequests = getFileRequests(request);
    URI[] surls = new URI[fileRequests.length];
    for (int i = 0; i < fileRequests.length; ++i) {
        TGetFileRequest nextRequest = fileRequests[i];
        if (nextRequest == null) {
            throw new SRMInvalidRequestException("file request #" + (i + 1) + " is null");
        }
        if (nextRequest.getSourceSURL() == null) {
            throw new SRMInvalidRequestException("can't get surl of file request #" + (i + 1) + "  null");
        }
        surls[i] = URI.create(nextRequest.getSourceSURL().toString());
    }
    return surls;
}
Also used : TGetFileRequest(org.dcache.srm.v2_2.TGetFileRequest) URI(java.net.URI) SRMInvalidRequestException(org.dcache.srm.SRMInvalidRequestException)

Example 4 with SrmPrepareToGetRequest

use of org.dcache.srm.v2_2.SrmPrepareToGetRequest in project dcache by dCache.

the class RemoteTurlGetterV2 method getInitialRequest.

@Override
public void getInitialRequest() throws SRMException {
    if (number_of_file_reqs == 0) {
        LOGGER.debug("number_of_file_reqs is 0, nothing to do");
        return;
    }
    LOGGER.debug("SURLs[0] is {}", SURLs[0]);
    try {
        srmv2 = new SRMClientV2(URIs.createWithDefaultPort(SURLs[0]), Optional.of(credential.getDelegatedCredential()), Optional.empty(), retry_timout, retry_num, false, false, caCertificatePath, transport);
        int len = SURLs.length;
        TGetFileRequest[] fileRequests = new TGetFileRequest[len];
        for (int i = 0; i < len; ++i) {
            URI surl = new URI(SURLs[i]);
            fileRequests[i] = new TGetFileRequest();
            fileRequests[i].setSourceSURL(surl);
            pendingSurlsToIndex.put(SURLs[i], i);
        }
        SrmPrepareToGetRequest srmPrepareToGetRequest = new SrmPrepareToGetRequest();
        srmPrepareToGetRequest.setDesiredTotalRequestTime((int) lifetime);
        TTransferParameters transferParameters = new TTransferParameters();
        transferParameters.setAccessPattern(TAccessPattern.TRANSFER_MODE);
        transferParameters.setConnectionType(TConnectionType.WAN);
        transferParameters.setArrayOfTransferProtocols(new ArrayOfString(protocols));
        srmPrepareToGetRequest.setTransferParameters(transferParameters);
        // we do not want to do this
        // we do not know which storage type to use and
        // it is read anyway
        ArrayOfTGetFileRequest arrayOfTGetFileRequest = new ArrayOfTGetFileRequest();
        arrayOfTGetFileRequest.setRequestArray(fileRequests);
        srmPrepareToGetRequest.setArrayOfFileRequests(arrayOfTGetFileRequest);
        srmPrepareToGetResponse = srmv2.srmPrepareToGet(srmPrepareToGetRequest);
    } catch (Exception e) {
        LOGGER.error("failed to connect to {} {}", SURLs[0], e.getMessage());
        throw new SRMException("failed to connect to " + SURLs[0], e);
    }
}
Also used : SRMException(org.dcache.srm.SRMException) TGetFileRequest(org.dcache.srm.v2_2.TGetFileRequest) ArrayOfTGetFileRequest(org.dcache.srm.v2_2.ArrayOfTGetFileRequest) ArrayOfTGetFileRequest(org.dcache.srm.v2_2.ArrayOfTGetFileRequest) ArrayOfString(org.dcache.srm.v2_2.ArrayOfString) SrmPrepareToGetRequest(org.dcache.srm.v2_2.SrmPrepareToGetRequest) TTransferParameters(org.dcache.srm.v2_2.TTransferParameters) ArrayOfAnyURI(org.dcache.srm.v2_2.ArrayOfAnyURI) URI(org.apache.axis.types.URI) SRMException(org.dcache.srm.SRMException) IOException(java.io.IOException) RemoteException(java.rmi.RemoteException)

Aggregations

TGetFileRequest (org.dcache.srm.v2_2.TGetFileRequest)3 TTransferParameters (org.dcache.srm.v2_2.TTransferParameters)3 IOException (java.io.IOException)2 URI (org.apache.axis.types.URI)2 SRMInvalidRequestException (org.dcache.srm.SRMInvalidRequestException)2 ArrayOfAnyURI (org.dcache.srm.v2_2.ArrayOfAnyURI)2 ArrayOfString (org.dcache.srm.v2_2.ArrayOfString)2 ArrayOfTGetFileRequest (org.dcache.srm.v2_2.ArrayOfTGetFileRequest)2 SrmPrepareToGetRequest (org.dcache.srm.v2_2.SrmPrepareToGetRequest)2 URI (java.net.URI)1 RemoteException (java.rmi.RemoteException)1 SRMException (org.dcache.srm.SRMException)1 SrmPrepareToGetResponse (org.dcache.srm.v2_2.SrmPrepareToGetResponse)1 SrmStatusOfGetRequestRequest (org.dcache.srm.v2_2.SrmStatusOfGetRequestRequest)1 SrmStatusOfGetRequestResponse (org.dcache.srm.v2_2.SrmStatusOfGetRequestResponse)1 TAccessLatency (org.dcache.srm.v2_2.TAccessLatency)1 TAccessPattern (org.dcache.srm.v2_2.TAccessPattern)1 TConnectionType (org.dcache.srm.v2_2.TConnectionType)1 TGetRequestFileStatus (org.dcache.srm.v2_2.TGetRequestFileStatus)1 TRetentionPolicy (org.dcache.srm.v2_2.TRetentionPolicy)1