in s3-artifact-storage-agent/src/main/java/jetbrains/buildServer/artifacts/s3/download/S3DownloadIOUtil.java [93:126]
private static void transferBytes(@NotNull ReadableByteChannel sourceChannel,
@NotNull WritableByteChannel targetChannel,
boolean expectedCheck,
long expectedBytes,
int bufferSize,
@NotNull IORunnable interruptedCheck,
@NotNull LongConsumer progressTracker
) throws IOException {
interruptedCheck.run();
if (expectedCheck && expectedBytes < 0) throw new IllegalArgumentException(String.format("Expecting negative number of bytes (%s)", expectedBytes));
if (bufferSize <= 0) throw new IllegalArgumentException(String.format("Buffer size is not positive (%s)", bufferSize));
ByteBuffer byteBuffer = ByteBuffer.allocate(expectedCheck && expectedBytes > 0 ? (int)Math.min(expectedBytes, bufferSize) : bufferSize);
long transferred = 0;
while (sourceChannel.read(byteBuffer) >= 0) {
byteBuffer.flip();
while (byteBuffer.hasRemaining()) {
long toBeTransferred = byteBuffer.remaining() + transferred;
if (expectedCheck && toBeTransferred > expectedBytes) {
throw new RecoverableIOException(String.format("Received more bytes from source channel (at least %s) than expected (%s)", toBeTransferred, expectedBytes));
}
interruptedCheck.run();
int written = targetChannel.write(byteBuffer);
transferred += written;
progressTracker.accept(written);
}
byteBuffer.clear();
}
if (expectedCheck && transferred < expectedBytes) {
throw new RecoverableIOException(String.format("Received less bytes from source channel (%s) than expected (%s)", transferred, expectedBytes));
}
}