예제 #1
0
 @Override
 public ListenableFuture<String> apply(Void ignored)
     throws CacheException, InterruptedException, NoSuchAlgorithmException, IOException {
   final PnfsId pnfsId = descriptor.getFileAttributes().getPnfsId();
   LOGGER.debug("Checking if {} still exists.", pnfsId);
   FsPath path;
   try {
     path = pnfs.getPathByPnfsId(pnfsId);
   } catch (FileNotFoundCacheException e) {
     // Remove file asynchronously to prevent request cancellation from
     // interrupting the state update.
     executor.execute(() -> removeFile(pnfsId));
     throw new FileNotFoundCacheException(
         "File not found in name space during pre-flush check.", e);
   }
   checksumModule.enforcePreFlushPolicy(descriptor);
   return Futures.immediateFuture(path.toString());
 }
예제 #2
0
  /**
   * Get the mover channel for a certain HTTP request. The mover channel is identified by UUID
   * generated upon mover start and sent back to the door as a part of the address info.
   *
   * @param request HttpRequest that was sent by the client
   * @param exclusive True if the mover channel exclusively is to be opened in exclusive mode. False
   *     if the mover channel can be shared with other requests.
   * @return Mover channel for specified UUID
   * @throws IllegalArgumentException Request did not include UUID or no mover channel found for
   *     UUID in the request
   */
  private NettyTransferService<HttpProtocolInfo>.NettyMoverChannel open(
      HttpRequest request, boolean exclusive) throws IllegalArgumentException, URISyntaxException {
    QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri());

    Map<String, List<String>> params = queryStringDecoder.parameters();
    if (!params.containsKey(HttpTransferService.UUID_QUERY_PARAM)) {
      if (!request.getUri().equals("/favicon.ico")) {
        _logger.error(
            "Received request without UUID in the query " + "string. Request-URI was {}",
            request.getUri());
      }

      throw new IllegalArgumentException("Query string does not include any UUID.");
    }

    List<String> uuidList = params.get(HttpTransferService.UUID_QUERY_PARAM);
    if (uuidList.isEmpty()) {
      throw new IllegalArgumentException("UUID parameter does not include any value.");
    }

    UUID uuid = UUID.fromString(uuidList.get(0));
    NettyTransferService<HttpProtocolInfo>.NettyMoverChannel file =
        _server.openFile(uuid, exclusive);
    if (file == null) {
      throw new IllegalArgumentException(
          "Request is no longer valid. " + "Please resubmit to door.");
    }

    URI uri = new URI(request.getUri());
    FsPath requestedFile = FsPath.create(uri.getPath());
    FsPath transferFile = FsPath.create(file.getProtocolInfo().getPath());

    if (!requestedFile.equals(transferFile)) {
      _logger.warn(
          "Received an illegal request for file {}, while serving {}", requestedFile, transferFile);
      throw new IllegalArgumentException(
          "The file you specified does " + "not match the UUID you specified!");
    }

    _files.add(file);

    return file;
  }
예제 #3
0
  public FileAttributes getFileAttributes(String requestPath) throws CacheException {

    PnfsHandler handler = ServletContextHandlerAttributes.getPnfsHandler(ctx);
    FsPath path;
    if (requestPath == null || requestPath.isEmpty()) {
      path = FsPath.ROOT;
    } else {
      path = FsPath.create(FsPath.ROOT + requestPath);
    }
    Set<FileAttribute> attributes = EnumSet.allOf(FileAttribute.class);

    FileAttributes namespaceAttrributes = handler.getFileAttributes(path, attributes);
    return namespaceAttrributes;
  }
예제 #4
0
 @Override
 public void list(
     Subject subject,
     String path,
     Glob glob,
     Range<Integer> range,
     Set<FileAttribute> attrs,
     ListHandler handler)
     throws CacheException {
   try (DirectoryStream stream =
       _handler.list(subject, Restrictions.none(), FsPath.create(path), glob, range, attrs)) {
     for (DirectoryEntry entry : stream) {
       handler.addEntry(entry.getName(), entry.getFileAttributes());
     }
   } catch (InterruptedException e) {
     throw new TimeoutCacheException(e.getMessage());
   }
 }
예제 #5
0
 public HttpGetResponse(
     long fileSize, NettyTransferService<HttpProtocolInfo>.NettyMoverChannel file) {
   super(HTTP_1_1, OK);
   HttpProtocolInfo protocolInfo = file.getProtocolInfo();
   headers().add(ACCEPT_RANGES, BYTES);
   headers().add(CONTENT_LENGTH, fileSize);
   String digest = buildDigest(file);
   if (!digest.isEmpty()) {
     headers().add(DIGEST, digest);
   }
   headers()
       .add(
           "Content-Disposition",
           contentDisposition(
               protocolInfo.getDisposition(), FsPath.create(protocolInfo.getPath()).name()));
   if (protocolInfo.getLocation() != null) {
     headers().add(CONTENT_LOCATION, protocolInfo.getLocation());
   }
 }