while (offset < objectSize) { if (offset + length > objectSize) length = objectSize - offset; futures.add(executorService.submit(new DownloadPartTask(Range.fromOffsetLength(offset, length), channel))); offset += length;
@Override public String call() throws Exception { Range range = Range.fromOffsetLength(offset, length); InputStream is = file != null ? new FileInputStream(file) : stream; is = new ProgressInputStream(is, LargeFileUploader.this); SizedInputStream segmentStream = file != null ? new InputStreamSegment(is, offset, length) : new SizedInputStream(is, length); PutObjectRequest request = new PutObjectRequest(bucket, key, segmentStream).withRange(range); return s3Client.putObject(request).getETag(); } }
private int doRead(SegmentHandle handle, long offset, byte[] buffer, int bufferOffset, int length) throws Exception { long traceId = LoggerHelpers.traceEnter(log, "read", handle.getSegmentName(), offset, bufferOffset, length); if (offset < 0 || bufferOffset < 0 || length < 0) { throw new ArrayIndexOutOfBoundsException(); } try (InputStream reader = client.readObjectStream(config.getBucket(), config.getRoot() + handle.getSegmentName(), Range.fromOffsetLength(offset, length))) { /* * TODO: This implementation assumes that if S3Client.readObjectStream returns null, then * the object does not exist and we throw StreamNotExistsException. The javadoc, however, * says that this call returns null in case of 304 and 412 responses. We need to * investigate what these responses mean precisely and react accordingly. * * See https://github.com/pravega/pravega/issues/1549 */ if (reader == null) { throw new StreamSegmentNotExistsException(handle.getSegmentName()); } int bytesRead = StreamHelpers.readAll(reader, buffer, bufferOffset, length); LoggerHelpers.traceLeave(log, "read", traceId, bytesRead); return bytesRead; } }
private Void doWrite(SegmentHandle handle, long offset, InputStream data, int length) throws StreamSegmentException { Preconditions.checkArgument(!handle.isReadOnly(), "handle must not be read-only."); long traceId = LoggerHelpers.traceEnter(log, "write", handle.getSegmentName(), offset, length); SegmentProperties si = doGetStreamSegmentInfo(handle.getSegmentName()); if (si.isSealed()) { throw new StreamSegmentSealedException(handle.getSegmentName()); } if (si.getLength() != offset) { throw new BadOffsetException(handle.getSegmentName(), si.getLength(), offset); } client.putObject(this.config.getBucket(), this.config.getRoot() + handle.getSegmentName(), Range.fromOffsetLength(offset, length), data); LoggerHelpers.traceLeave(log, "write", traceId); return null; }
@Override public CopyPartResult copyPart(CopyPartRequest request) { Range range = request.getSourceRange(); if (range.getLast() == -1) { range = Range.fromOffsetLength(0, aclMap.get(request.getSourceKey()).getSize()); request.withSourceRange(range); } CopyObjectResult result = executeRequest(client, request, CopyObjectResult.class); CopyPartResult retVal = new CopyPartResult(); retVal.setPartNumber(request.getPartNumber()); retVal.setETag(result.getETag()); return retVal; } }
targetPath, uploadId, 1).withSourceRange(Range.fromOffsetLength(0, offset)); CopyPartResult copyResult = client.copyPart(copyRequest); targetPath, uploadId, 2).withSourceRange(Range.fromOffsetLength(0, objectSize));