serve s3: stream multipart uploads to the backend instead of buffering in memory
Previously serve s3 buffered every part of a multipart upload in memory (in the gofakes3 S3 library) and concatenated them when the upload completed, so memory use grew with the size of the upload. serve s3 now streams the parts, in part-number order, into a single PutStream upload to the underlying remote, which performs its own upload with bounded memory. The whole file is never held in memory - memory use is bounded by the parts in flight. This works for any remote that supports PutStream (nearly all, including crypt) and for any part size, so clients that don't produce uniform-sized parts (for example PostgreSQL backup tools such as pgBarman and pgBackRest) work too. Parts must arrive in ascending, contiguous part-number order; parts uploaded out of order are buffered until their turn, and there is no per-part retry (a failure aborts the whole upload). These trade-offs are documented. Passing --disable-multipart-streaming, or using a remote without PutStream, reverts to buffering the parts in memory (the previous behaviour); a one-off NOTICE is logged the first time this happens. Fixes #7453
This commit is contained in:
@@ -598,8 +598,8 @@ github.com/rclone/Proton-API-Bridge v1.0.3 h1:Bs7RC4xCFSN0BPIYVda/BNxp0qo3NV0gB2
|
||||
github.com/rclone/Proton-API-Bridge v1.0.3/go.mod h1:26RAest751Ofk+F/d8xtl4UyWXrZvMQwn39U8rm/WKM=
|
||||
github.com/rclone/go-proton-api v1.0.2 h1:cJtJUab0MGJ3C6q5kiEJs3pbyhSLnOKMyYOQehA0PBc=
|
||||
github.com/rclone/go-proton-api v1.0.2/go.mod h1:LB2kCEaZMzNn3ocdz+qYfxXmuLxxN0ka62KJd2x53Bc=
|
||||
github.com/rclone/gofakes3 v0.0.6 h1:gTW5Dq04EouaoKyyTSuSL+WS3VZU3k2QNOBn9ghX7kE=
|
||||
github.com/rclone/gofakes3 v0.0.6/go.mod h1:M/uFc52GcEFuIP4stgrSR99SqqqxMR0ncgiTbj0eszc=
|
||||
github.com/rclone/gofakes3 v0.0.7 h1:5AeROIAFbhp/7+f7BSsc8LzDbnx/WxgjV22SAUKmHp4=
|
||||
github.com/rclone/gofakes3 v0.0.7/go.mod h1:M/uFc52GcEFuIP4stgrSR99SqqqxMR0ncgiTbj0eszc=
|
||||
github.com/relvacode/iso8601 v1.7.0 h1:BXy+V60stMP6cpswc+a93Mq3e65PfXCgDFfhvNNGrdo=
|
||||
github.com/relvacode/iso8601 v1.7.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I=
|
||||
github.com/rfjakob/eme v1.2.0 h1:8dAHL+WVAw06+7DkRKnRiFp1JL3QjcJEZFqDnndUaSI=
|
||||
|
||||
Reference in New Issue
Block a user