Skip to content

Support for zero-copy file upload/download with java.nio #3928

@StephenFlavin

Description

@StephenFlavin

Describe the feature

Currently it seems that the code specifically deals in on heap ByteBuffers either converting direct to non-direct Buffers or writing to non-direct Buffers when there are more performant and memory efficient zero-copy routes.

Most of the heavy lifting on supporting these off heap/zero copy file transfers are done by the HTTP client and the OS with native support in Java via FileChannel#transferTo and FileChannel#transferFrom to socket channels and similar for SocketChannel#write for DirectByteBuffers.

The specific implementation of this is up to the HTTP client in use (e.g. https://netty.io/4.0/api/io/netty/channel/FileRegion.html) but the option is removed at too high a level for the client specific implementations.

I believe it was done this way to guard against concurrent modification during write ops which I've discussed on #3925

Use Case

High frequency efficient read/write ops to S3

Proposed Solution

Don't do any conversion from direct to non-direct ByteBuffers, pass along the File/FileChannel object instead of converting to a ByteBuffer publisher and leave it up to the http client lib to deal with as required.

For Path/File/Filechannel AsyncRequestBody is unsuitable since it's an implementation of SdkPublisher<ByteBuffer>, I think in this case the AsyncRequestBody is just unnecessary and the plain Path/File/Filechannel should be passed on to the http client.

The Netty docs state

If your operating system (or JDK / JRE) does not support zero-copy file transfer, sending a file with FileRegion might fail or yield worse performance. For example, sending a large file doesn't work well in Windows.

In which case this should be possible to disable with a flag passed to the http client when building the S3Client

Other Information

No response

Acknowledgements

  • I may be able to implement this feature request
  • This feature might incur a breaking change

AWS Java SDK version used

macOs 13.2.1 (22D68)

JDK version used

openjdk 11.0.16.1 & openjdk 19.0.1

Operating System and version

macOs 13.2.1 (22D68)

Metadata

Metadata

Assignees

No one assigned

    Labels

    feature-requestA feature should be added or improved.p3This is a minor priority issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions