Trait MultipartWrite

Source
pub trait MultipartWrite:
    Send
    + Sync
    + Unpin
    + 'static {
    // Required methods
    fn write_once(
        &self,
        size: u64,
        body: Buffer,
    ) -> impl Future<Output = Result<Metadata>> + MaybeSend;
    fn initiate_part(&self) -> impl Future<Output = Result<String>> + MaybeSend;
    fn write_part(
        &self,
        upload_id: &str,
        part_number: usize,
        size: u64,
        body: Buffer,
    ) -> impl Future<Output = Result<MultipartPart>> + MaybeSend;
    fn complete_part(
        &self,
        upload_id: &str,
        parts: &[MultipartPart],
    ) -> impl Future<Output = Result<Metadata>> + MaybeSend;
    fn abort_part(
        &self,
        upload_id: &str,
    ) -> impl Future<Output = Result<()>> + MaybeSend;
}
Expand description

MultipartWrite is used to implement oio::Write based on multipart uploads. By implementing MultipartWrite, services don’t need to care about the details of uploading parts.

§Architecture

The architecture after adopting MultipartWrite:

  • Services impl MultipartWrite
  • MultipartWriter impl Write
  • Expose MultipartWriter as Accessor::Writer

§Notes

MultipartWrite has an oneshot optimization when write has been called only once:

w.write(bs).await?;
w.close().await?;

We will use write_once instead of starting a new multipart upload.

§Requirements

Services that implement BlockWrite must fulfill the following requirements:

  • Must be a http service that could accept AsyncBody.
  • Don’t need initialization before writing.
  • Block ID is generated by caller BlockWrite instead of services.
  • Complete block by an ordered block id list.

Required Methods§

Source

fn write_once( &self, size: u64, body: Buffer, ) -> impl Future<Output = Result<Metadata>> + MaybeSend

write_once is used to write the data to underlying storage at once.

MultipartWriter will call this API when:

  • All the data has been written to the buffer and we can perform the upload at once.
Source

fn initiate_part(&self) -> impl Future<Output = Result<String>> + MaybeSend

initiate_part will call start a multipart upload and return the upload id.

MultipartWriter will call this when:

  • the total size of data is unknown.
  • the total size of data is known, but the size of current write is less than the total size.
Source

fn write_part( &self, upload_id: &str, part_number: usize, size: u64, body: Buffer, ) -> impl Future<Output = Result<MultipartPart>> + MaybeSend

write_part will write a part of the data and returns the result MultipartPart.

MultipartWriter will call this API and stores the result in order.

  • part_number is the index of the part, starting from 0.
Source

fn complete_part( &self, upload_id: &str, parts: &[MultipartPart], ) -> impl Future<Output = Result<Metadata>> + MaybeSend

complete_part will complete the multipart upload to build the final file.

Source

fn abort_part( &self, upload_id: &str, ) -> impl Future<Output = Result<()>> + MaybeSend

abort_part will cancel the multipart upload and purge all data.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§