Search in sources :

Example 1 with SrmBringOnlineResponse

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

the class SRMBringOnlineClientV2 method start.

@Override
public void start() throws Exception {
    try {
        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);
        SrmBringOnlineRequest srmBringOnlineRequest = new SrmBringOnlineRequest();
        srmBringOnlineRequest.setUserRequestDescription(configuration.getUserRequestDescription());
        srmBringOnlineRequest.setDesiredTotalRequestTime((int) configuration.getRequestLifetime());
        if (configuration.getDesiredLifetime() != null) {
            srmBringOnlineRequest.setDesiredLifeTime(configuration.getDesiredLifetime().intValue());
        }
        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 has to be specified as well");
        } else if (rp != null) {
            srmBringOnlineRequest.setTargetFileRetentionPolicyInfo(new TRetentionPolicyInfo(rp, al));
        }
        srmBringOnlineRequest.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) {
            srmBringOnlineRequest.setTransferParameters(new TTransferParameters(ap, ct, arrayOfClientNetworks, protocolArray));
        }
        configuration.getStorageSystemInfo().ifPresent(srmBringOnlineRequest::setStorageSystemInfo);
        say("calling srmBringOnline");
        SrmBringOnlineResponse response = srm.srmBringOnline(srmBringOnlineRequest);
        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)) {
            throw new IOException("srmBringOnline submission failed, unexpected or failed status : " + statusCode + " explanation=" + status.getExplanation());
        }
        requestToken = response.getRequestToken();
        dsay(" srm returned requestToken = " + requestToken);
        if (response.getArrayOfFileStatuses() == null) {
            throw new IOException("returned bringOnlineRequestFileStatuses is an empty array");
        }
        TBringOnlineRequestFileStatus[] bringOnlineRequestFileStatuses = response.getArrayOfFileStatuses().getStatusArray();
        if (bringOnlineRequestFileStatuses.length != len) {
            throw new IOException("incorrect number of TBringOnlineRequestFileStatus" + "in RequestStatus expected " + len + " received " + bringOnlineRequestFileStatuses.length);
        }
        while (!pendingSurlsToIndex.isEmpty()) {
            long estimatedWaitInSeconds = 60;
            for (TBringOnlineRequestFileStatus bringOnlineRequestFileStatus : bringOnlineRequestFileStatuses) {
                URI surl = bringOnlineRequestFileStatus.getSourceSURL();
                if (surl == null) {
                    esay("invalid bringOnlineRequestFileStatus, surl is null");
                    continue;
                }
                String surl_string = surl.toString();
                if (!pendingSurlsToIndex.containsKey(surl_string)) {
                    esay("invalid bringOnlineRequestFileStatus, surl = " + surl_string + " not found");
                    continue;
                }
                TReturnStatus fileStatus = bringOnlineRequestFileStatus.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 = "retrieval of surl " + surl_string + " failed, status = " + fileStatusCode + " explanation=" + fileStatus.getExplanation();
                    esay(error);
                    int indx = pendingSurlsToIndex.remove(surl_string);
                    setReportFailed(from[indx], from[indx], error);
                    continue;
                }
                if (fileStatus.getStatusCode() == TStatusCode.SRM_SUCCESS) {
                    int indx = pendingSurlsToIndex.remove(surl_string);
                    setReportSucceeded(from[indx], from[indx]);
                    System.out.println(from[indx] + " brought online, use request id " + requestToken + " to release");
                    continue;
                }
                Integer estimatedWaitTime = bringOnlineRequestFileStatus.getEstimatedWaitTime();
                if (estimatedWaitTime != null && estimatedWaitTime < estimatedWaitInSeconds && estimatedWaitTime >= 1) {
                    estimatedWaitInSeconds = estimatedWaitTime;
                }
            }
            if (pendingSurlsToIndex.isEmpty()) {
                dsay("no more pending transfers, breaking the loop");
                Runtime.getRuntime().removeShutdownHook(hook);
                break;
            }
            try {
                say("sleeping " + estimatedWaitInSeconds + " seconds ...");
                Thread.sleep(estimatedWaitInSeconds * 1000);
            } catch (InterruptedException ie) {
            }
            SrmStatusOfBringOnlineRequestRequest srmStatusOfBringOnlineRequestRequest = new SrmStatusOfBringOnlineRequestRequest();
            srmStatusOfBringOnlineRequestRequest.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]);
            }
            srmStatusOfBringOnlineRequestRequest.setArrayOfSourceSURLs(new ArrayOfAnyURI(surlArray));
            SrmStatusOfBringOnlineRequestResponse srmStatusOfBringOnlineRequestResponse = srm.srmStatusOfBringOnlineRequest(srmStatusOfBringOnlineRequestRequest);
            if (srmStatusOfBringOnlineRequestResponse == null) {
                throw new IOException(" null srmStatusOfBringOnlineRequestResponse");
            }
            if (srmStatusOfBringOnlineRequestResponse.getArrayOfFileStatuses() == null) {
                esay("incorrect number of RequestFileStatuses");
                throw new IOException("incorrect number of RequestFileStatuses");
            }
            bringOnlineRequestFileStatuses = srmStatusOfBringOnlineRequestResponse.getArrayOfFileStatuses().getStatusArray();
            if (bringOnlineRequestFileStatuses == null || bringOnlineRequestFileStatuses.length != expectedResponseLength) {
                esay("incorrect number of RequestFileStatuses");
                throw new IOException("incorrect number of RequestFileStatuses");
            }
            status = srmStatusOfBringOnlineRequestResponse.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 = "srmBringOnline update failed, status : " + statusCode + " explanation=" + status.getExplanation();
                esay(error);
                for (int i = 0; i < expectedResponseLength; ++i) {
                    TReturnStatus frstatus = bringOnlineRequestFileStatuses[i].getStatus();
                    if (frstatus != null) {
                        if (!RequestStatusTool.isTransientStateStatus(frstatus)) {
                            int indx = pendingSurlsToIndex.remove(bringOnlineRequestFileStatuses[i].getSourceSURL().toString());
                            setReportFailed(from[indx], from[indx], error);
                        }
                        esay("BringOnlineFileRequest[" + bringOnlineRequestFileStatuses[i].getSourceSURL() + "] status=" + frstatus.getStatusCode() + " explanation=" + frstatus.getExplanation());
                    }
                }
                throw new IOException(error);
            }
        }
    } catch (Exception e) {
        esay(e.toString());
    } finally {
        report.dumpReport();
        if (!report.everythingAllRight()) {
            report.reportErrors(System.err);
            System.exit(1);
        }
    }
}
Also used : ArrayOfTGetFileRequest(org.dcache.srm.v2_2.ArrayOfTGetFileRequest) TAccessPattern(org.dcache.srm.v2_2.TAccessPattern) TBringOnlineRequestFileStatus(org.dcache.srm.v2_2.TBringOnlineRequestFileStatus) SrmBringOnlineRequest(org.dcache.srm.v2_2.SrmBringOnlineRequest) ArrayOfString(org.dcache.srm.v2_2.ArrayOfString) TTransferParameters(org.dcache.srm.v2_2.TTransferParameters) ArrayOfAnyURI(org.dcache.srm.v2_2.ArrayOfAnyURI) URI(org.apache.axis.types.URI) SrmStatusOfBringOnlineRequestResponse(org.dcache.srm.v2_2.SrmStatusOfBringOnlineRequestResponse) SrmStatusOfBringOnlineRequestRequest(org.dcache.srm.v2_2.SrmStatusOfBringOnlineRequestRequest) TRetentionPolicyInfo(org.dcache.srm.v2_2.TRetentionPolicyInfo) TConnectionType(org.dcache.srm.v2_2.TConnectionType) 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) TStatusCode(org.dcache.srm.v2_2.TStatusCode) IOException(java.io.IOException) ArrayOfString(org.dcache.srm.v2_2.ArrayOfString) TAccessLatency(org.dcache.srm.v2_2.TAccessLatency) SrmBringOnlineResponse(org.dcache.srm.v2_2.SrmBringOnlineResponse) ArrayOfAnyURI(org.dcache.srm.v2_2.ArrayOfAnyURI)

Example 2 with SrmBringOnlineResponse

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

the class BringOnlineRequest method getSrmBringOnlineResponse.

private final SrmBringOnlineResponse getSrmBringOnlineResponse() throws SRMInvalidRequestException {
    SrmBringOnlineResponse response = new SrmBringOnlineResponse();
    response.setReturnStatus(getTReturnStatus());
    response.setRequestToken(getTRequestToken());
    ArrayOfTBringOnlineRequestFileStatus arrayOfTBringOnlineRequestFileStatus = new ArrayOfTBringOnlineRequestFileStatus();
    arrayOfTBringOnlineRequestFileStatus.setStatusArray(getArrayOfTBringOnlineRequestFileStatus());
    response.setArrayOfFileStatuses(arrayOfTBringOnlineRequestFileStatus);
    response.setRemainingTotalRequestTime(getRemainingLifetimeIn(TimeUnit.SECONDS));
    return response;
}
Also used : ArrayOfTBringOnlineRequestFileStatus(org.dcache.srm.v2_2.ArrayOfTBringOnlineRequestFileStatus) SrmBringOnlineResponse(org.dcache.srm.v2_2.SrmBringOnlineResponse)

Example 3 with SrmBringOnlineResponse

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

the class SrmBringOnline method getFailedResponse.

public static final SrmBringOnlineResponse getFailedResponse(String error, TStatusCode statusCode) {
    SrmBringOnlineResponse srmBringOnlineResponse = new SrmBringOnlineResponse();
    srmBringOnlineResponse.setReturnStatus(new TReturnStatus(statusCode, error));
    return srmBringOnlineResponse;
}
Also used : TReturnStatus(org.dcache.srm.v2_2.TReturnStatus) SrmBringOnlineResponse(org.dcache.srm.v2_2.SrmBringOnlineResponse)

Example 4 with SrmBringOnlineResponse

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

the class SrmBringOnline method srmBringOnline.

private SrmBringOnlineResponse srmBringOnline() throws SRMInvalidRequestException, SRMInternalErrorException, SRMNotSupportedException {
    String[] protocols = getProtocols(request);
    String clientHost = getClientNetwork(request).orElse(this.clientHost);
    TGetFileRequest[] fileRequests = getFileRequests(request);
    URI[] surls = getSurls(fileRequests);
    long requestTime = Lifetimes.calculateLifetime(request.getDesiredTotalRequestTime(), configuration.getBringOnlineLifetime());
    long desiredLifetimeInSeconds = getDesiredLifetime(request, requestTime);
    if (protocols != null && protocols.length > 0) {
        String[] supportedProtocols = storage.supportedGetProtocols();
        boolean isAnyProtocolSupported = any(asList(protocols), in(asList(supportedProtocols)));
        if (!isAnyProtocolSupported) {
            throw new SRMNotSupportedException("Protocol(s) not supported: " + Arrays.toString(protocols));
        }
    }
    BringOnlineRequest r = new BringOnlineRequest(srm.getSrmId(), user, surls, protocols, requestTime, desiredLifetimeInSeconds, configuration.getBringOnlineMaxPollPeriod(), request.getUserRequestDescription(), clientHost);
    try (JDC ignored = r.applyJdc()) {
        srm.acceptNewJob(r);
        return r.getSrmBringOnlineResponse(configuration.getBringOnlineSwitchToAsynchronousModeDelay());
    } catch (InterruptedException e) {
        throw new SRMInternalErrorException("Operation interrupted", e);
    } catch (IllegalStateTransition e) {
        throw new SRMInternalErrorException("Scheduling failure", e);
    }
}
Also used : IllegalStateTransition(org.dcache.srm.scheduler.IllegalStateTransition) SRMNotSupportedException(org.dcache.srm.SRMNotSupportedException) TGetFileRequest(org.dcache.srm.v2_2.TGetFileRequest) JDC(org.dcache.srm.util.JDC) URI(java.net.URI) SRMInternalErrorException(org.dcache.srm.SRMInternalErrorException) SrmBringOnlineRequest(org.dcache.srm.v2_2.SrmBringOnlineRequest) BringOnlineRequest(org.dcache.srm.request.BringOnlineRequest)

Example 5 with SrmBringOnlineResponse

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

the class BringOnlineRequest method getSrmBringOnlineResponse.

/**
 * Waits for up to timeout milliseconds for the request to reach a non-queued state and then
 * returns the current SrmBringOnlineResponse for this BringOnlineRequest.
 */
public final SrmBringOnlineResponse getSrmBringOnlineResponse(long timeout) throws InterruptedException, SRMInvalidRequestException {
    /* To avoid a race condition between us querying the current
         * response and us waiting for a state change notification,
         * the notification scheme is counter based. This guarantees
         * that we do not loose any notifications. A simple lock
         * around the whole loop would not have worked, as the call to
         * getSrmBringOnlineResponse may itself trigger a state change
         * and thus cause a deadlock when the state change is
         * signaled.
         */
    Date deadline = getDateRelativeToNow(timeout);
    int counter = _stateChangeCounter.get();
    SrmBringOnlineResponse response = getSrmBringOnlineResponse();
    while (response.getReturnStatus().getStatusCode().isProcessing() && deadline.after(new Date()) && _stateChangeCounter.awaitChangeUntil(counter, deadline)) {
        counter = _stateChangeCounter.get();
        response = getSrmBringOnlineResponse();
    }
    response.setRemainingTotalRequestTime(getRemainingLifetimeIn(TimeUnit.SECONDS));
    return response;
}
Also used : SrmBringOnlineResponse(org.dcache.srm.v2_2.SrmBringOnlineResponse) Date(java.util.Date)

Aggregations

SrmBringOnlineResponse (org.dcache.srm.v2_2.SrmBringOnlineResponse)4 SrmBringOnlineRequest (org.dcache.srm.v2_2.SrmBringOnlineRequest)2 TGetFileRequest (org.dcache.srm.v2_2.TGetFileRequest)2 TReturnStatus (org.dcache.srm.v2_2.TReturnStatus)2 IOException (java.io.IOException)1 URI (java.net.URI)1 Date (java.util.Date)1 URI (org.apache.axis.types.URI)1 SRMInternalErrorException (org.dcache.srm.SRMInternalErrorException)1 SRMNotSupportedException (org.dcache.srm.SRMNotSupportedException)1 BringOnlineRequest (org.dcache.srm.request.BringOnlineRequest)1 IllegalStateTransition (org.dcache.srm.scheduler.IllegalStateTransition)1 JDC (org.dcache.srm.util.JDC)1 ArrayOfAnyURI (org.dcache.srm.v2_2.ArrayOfAnyURI)1 ArrayOfString (org.dcache.srm.v2_2.ArrayOfString)1 ArrayOfTBringOnlineRequestFileStatus (org.dcache.srm.v2_2.ArrayOfTBringOnlineRequestFileStatus)1 ArrayOfTGetFileRequest (org.dcache.srm.v2_2.ArrayOfTGetFileRequest)1 SrmStatusOfBringOnlineRequestRequest (org.dcache.srm.v2_2.SrmStatusOfBringOnlineRequestRequest)1 SrmStatusOfBringOnlineRequestResponse (org.dcache.srm.v2_2.SrmStatusOfBringOnlineRequestResponse)1 TAccessLatency (org.dcache.srm.v2_2.TAccessLatency)1