Trait opendal::raw::oio::MultipartWrite
source · pub trait MultipartWrite: Send + Sync + Unpin + 'static {
// Required methods
fn write_once(
&self,
size: u64,
body: Buffer,
) -> impl Future<Output = Result<()>> + 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<()>> + 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
implWrite
- Expose
MultipartWriter
asAccessor::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§
sourcefn write_once(
&self,
size: u64,
body: Buffer,
) -> impl Future<Output = Result<()>> + MaybeSend
fn write_once( &self, size: u64, body: Buffer, ) -> impl Future<Output = Result<()>> + 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.
sourcefn initiate_part(&self) -> impl Future<Output = Result<String>> + MaybeSend
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 then the total size.
sourcefn write_part(
&self,
upload_id: &str,
part_number: usize,
size: u64,
body: Buffer,
) -> impl Future<Output = Result<MultipartPart>> + MaybeSend
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.
sourcefn complete_part(
&self,
upload_id: &str,
parts: &[MultipartPart],
) -> impl Future<Output = Result<()>> + MaybeSend
fn complete_part( &self, upload_id: &str, parts: &[MultipartPart], ) -> impl Future<Output = Result<()>> + MaybeSend
complete_part will complete the multipart upload to build the final file.