Search in sources :

Example 1 with SwiftInvalidResponseException

use of org.apache.hadoop.fs.swift.exceptions.SwiftInvalidResponseException in project hadoop by apache.

the class SwiftRestClient method buildException.

/**
   * Build an exception from a failed operation. This can include generating
   * specific exceptions (e.g. FileNotFound), as well as the default
   * {@link SwiftInvalidResponseException}.
   *
   * @param uri URI for operation
   * @param method operation that failed
   * @param statusCode status code
   * @param <M> method type
   * @return an exception to throw
   */
private <M extends HttpMethod> IOException buildException(URI uri, M method, int statusCode) {
    IOException fault;
    //log the failure @debug level
    String errorMessage = String.format("Method %s on %s failed, status code: %d," + " status line: %s", method.getName(), uri, statusCode, method.getStatusLine());
    if (LOG.isDebugEnabled()) {
        LOG.debug(errorMessage);
    }
    //send the command
    switch(statusCode) {
        case SC_NOT_FOUND:
            fault = new FileNotFoundException("Operation " + method.getName() + " on " + uri);
            break;
        case SC_BAD_REQUEST:
            //bad HTTP request
            fault = new SwiftBadRequestException("Bad request against " + uri, method.getName(), uri, method);
            break;
        case SC_REQUESTED_RANGE_NOT_SATISFIABLE:
            //out of range
            StringBuilder errorText = new StringBuilder(method.getStatusText());
            //get the requested length
            Header requestContentLen = method.getRequestHeader(HEADER_CONTENT_LENGTH);
            if (requestContentLen != null) {
                errorText.append(" requested ").append(requestContentLen.getValue());
            }
            //and the result
            Header availableContentRange = method.getResponseHeader(HEADER_CONTENT_RANGE);
            if (availableContentRange != null) {
                errorText.append(" available ").append(availableContentRange.getValue());
            }
            fault = new EOFException(errorText.toString());
            break;
        case SC_UNAUTHORIZED:
            //auth failure; should only happen on the second attempt
            fault = new SwiftAuthenticationFailedException("Operation not authorized- current access token =" + getToken(), method.getName(), uri, method);
            break;
        case SwiftProtocolConstants.SC_TOO_MANY_REQUESTS_429:
        case SwiftProtocolConstants.SC_THROTTLED_498:
            //response code that may mean the client is being throttled
            fault = new SwiftThrottledRequestException("Client is being throttled: too many requests", method.getName(), uri, method);
            break;
        default:
            //return a generic invalid HTTP response
            fault = new SwiftInvalidResponseException(errorMessage, method.getName(), uri, method);
    }
    return fault;
}
Also used : Header(org.apache.commons.httpclient.Header) FileNotFoundException(java.io.FileNotFoundException) EOFException(java.io.EOFException) IOException(java.io.IOException) SwiftAuthenticationFailedException(org.apache.hadoop.fs.swift.exceptions.SwiftAuthenticationFailedException) SwiftInvalidResponseException(org.apache.hadoop.fs.swift.exceptions.SwiftInvalidResponseException) SwiftThrottledRequestException(org.apache.hadoop.fs.swift.exceptions.SwiftThrottledRequestException) SwiftBadRequestException(org.apache.hadoop.fs.swift.exceptions.SwiftBadRequestException)

Example 2 with SwiftInvalidResponseException

use of org.apache.hadoop.fs.swift.exceptions.SwiftInvalidResponseException in project hadoop by apache.

the class SwiftNativeFileSystemStore method listDirectory.

/**
   * List a directory.
   * This is O(n) for the number of objects in this path.
   *
   *
   *
   * @param path working path
   * @param listDeep ask for all the data
   * @param newest ask for the newest data
   * @return Collection of file statuses
   * @throws IOException IO problems
   * @throws FileNotFoundException if the path does not exist
   */
private List<FileStatus> listDirectory(SwiftObjectPath path, boolean listDeep, boolean newest) throws IOException {
    final byte[] bytes;
    final ArrayList<FileStatus> files = new ArrayList<FileStatus>();
    final Path correctSwiftPath = getCorrectSwiftPath(path);
    try {
        bytes = swiftRestClient.listDeepObjectsInDirectory(path, listDeep);
    } catch (FileNotFoundException e) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("" + "File/Directory not found " + path);
        }
        if (SwiftUtils.isRootDir(path)) {
            return Collections.emptyList();
        } else {
            throw e;
        }
    } catch (SwiftInvalidResponseException e) {
        //bad HTTP error code
        if (e.getStatusCode() == HttpStatus.SC_NO_CONTENT) {
            //this can come back on a root list if the container is empty
            if (SwiftUtils.isRootDir(path)) {
                return Collections.emptyList();
            } else {
                //NO_CONTENT returned on something other than the root directory;
                //see if it is there, and convert to empty list or not found
                //depending on whether the entry exists.
                FileStatus stat = getObjectMetadata(correctSwiftPath, newest);
                if (stat.isDirectory()) {
                    //it's an empty directory. state that
                    return Collections.emptyList();
                } else {
                    //it's a file -return that as the status
                    files.add(stat);
                    return files;
                }
            }
        } else {
            //a different status code: rethrow immediately
            throw e;
        }
    }
    final CollectionType collectionType = JSONUtil.getJsonMapper().getTypeFactory().constructCollectionType(List.class, SwiftObjectFileStatus.class);
    final List<SwiftObjectFileStatus> fileStatusList = JSONUtil.toObject(new String(bytes, Charset.forName("UTF-8")), collectionType);
    //in this case swift will return empty array
    if (fileStatusList.isEmpty()) {
        SwiftFileStatus objectMetadata = getObjectMetadata(correctSwiftPath, newest);
        if (objectMetadata.isFile()) {
            files.add(objectMetadata);
        }
        return files;
    }
    for (SwiftObjectFileStatus status : fileStatusList) {
        if (status.getName() != null) {
            files.add(new SwiftFileStatus(status.getBytes(), status.getBytes() == 0, 1, getBlocksize(), status.getLast_modified().getTime(), getCorrectSwiftPath(new Path(status.getName()))));
        }
    }
    return files;
}
Also used : Path(org.apache.hadoop.fs.Path) SwiftObjectPath(org.apache.hadoop.fs.swift.util.SwiftObjectPath) FileStatus(org.apache.hadoop.fs.FileStatus) CollectionType(com.fasterxml.jackson.databind.type.CollectionType) ArrayList(java.util.ArrayList) FileNotFoundException(java.io.FileNotFoundException) SwiftInvalidResponseException(org.apache.hadoop.fs.swift.exceptions.SwiftInvalidResponseException)

Aggregations

FileNotFoundException (java.io.FileNotFoundException)2 SwiftInvalidResponseException (org.apache.hadoop.fs.swift.exceptions.SwiftInvalidResponseException)2 CollectionType (com.fasterxml.jackson.databind.type.CollectionType)1 EOFException (java.io.EOFException)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 Header (org.apache.commons.httpclient.Header)1 FileStatus (org.apache.hadoop.fs.FileStatus)1 Path (org.apache.hadoop.fs.Path)1 SwiftAuthenticationFailedException (org.apache.hadoop.fs.swift.exceptions.SwiftAuthenticationFailedException)1 SwiftBadRequestException (org.apache.hadoop.fs.swift.exceptions.SwiftBadRequestException)1 SwiftThrottledRequestException (org.apache.hadoop.fs.swift.exceptions.SwiftThrottledRequestException)1 SwiftObjectPath (org.apache.hadoop.fs.swift.util.SwiftObjectPath)1