Skip to content

Resume S3 MultipartUpload across PHP process boundaries via persisted UploadId #62649

Description

@TobyTheHutt

Tip

Help move this idea forward

  • Use the 👍 reaction to show support for this feature.
  • Avoid commenting unless you have relevant information to add; unnecessary comments create noise for subscribers.
  • Subscribe to receive notifications about status changes and new comments.

Is your feature request related to a problem? Please describe.

\OC\Files\ObjectStore\S3ObjectTrait::writeMultiPart holds the Aws\Multipart\UploadState (containing the UploadId) as a local variable. The state is not persisted. When the PHP process terminates abnormally, the UploadId is lost.

The in-progress multipart upload remains on the S3 destination. Nextcloud has no reference to it. Subsequent MOVE/COPY/PUT attempts on the same source restart from part 0 and orphan the previous parts.

Describe the solution you'd like

Persist the UploadId, source-storage id, source internal path, and destination internal path at CreateMultipartUpload time. Store in oc_filecache_extended or an equivalent table.

On the next MOVE/COPY/PUT against the same source, writeMultiPart MUST look up the persisted UploadId. When present, reconstruct the UploadState via \Aws\S3\MultipartUploadingTrait::getStateFromService($client, $bucket, $key, $uploadId) and pass it to MultipartUploader via the state config option.

Delete the persisted record on CompleteMultipartUpload or AbortMultipartUpload.

Describe alternatives you've considered

  • Retry from part 0 on the next attempt. Wastes upload bandwidth equal to the completed part count.
  • Client-side chunked-upload resume (PR #27034). WebDAV Chunk-v2, client-driven, unrelated to server-side MultipartUploader.
  • Same-request retry with reduced concurrency (PR #53580). Bounded to a single PHP process, does not survive process death.
  • Orphan reap via scheduled ListMultipartUploads + AbortMultipartUpload. Cleanup pattern only, forfeits progress.

Additional context

Metadata

Metadata

Assignees

No one assigned

    Labels

    0. Needs triagePending check for reproducibility or if it fits our roadmapenhancement

    Projects

    Status
    To triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions