Struct tvix_castore::import::blobs::ConcurrentBlobUploader

source ·
pub struct ConcurrentBlobUploader<BS> {
    blob_service: BS,
    upload_tasks: JoinSet<Result<(), Error>>,
    upload_semaphore: Arc<Semaphore>,
}
Expand description

The concurrent blob uploader provides a mechanism for concurrently uploading small blobs. This is useful when ingesting from sources like tarballs and archives which each blob entry must be read sequentially. Ingesting many small blobs sequentially becomes slow due to round trip time with the blob service. The concurrent blob uploader will buffer small blobs in memory and upload them to the blob service in the background.

Once all blobs have been uploaded, make sure to call ConcurrentBlobUploader::join to wait for all background jobs to complete and check for any errors.

Fields§

§blob_service: BS§upload_tasks: JoinSet<Result<(), Error>>§upload_semaphore: Arc<Semaphore>

Implementations§

source§

impl<BS> ConcurrentBlobUploader<BS>
where BS: BlobService + Clone + 'static,

source

pub fn new(blob_service: BS) -> Self

Creates a new concurrent blob uploader which uploads blobs to the provided blob service.

source

pub async fn upload<R>( &mut self, path: &Path, expected_size: u64, r: R ) -> Result<B3Digest, Error>
where R: AsyncRead + Unpin,

Uploads a blob to the blob service. If the blob is small enough it will be read to a buffer and uploaded in the background. This will read the entirety of the provided reader unless an error occurs, even if blobs are uploaded in the background..

source

pub async fn join(self) -> Result<(), Error>

Waits for all background upload jobs to complete, returning any upload errors.

Auto Trait Implementations§

§

impl<BS> Freeze for ConcurrentBlobUploader<BS>
where BS: Freeze,

§

impl<BS> !RefUnwindSafe for ConcurrentBlobUploader<BS>

§

impl<BS> Send for ConcurrentBlobUploader<BS>
where BS: Send,

§

impl<BS> Sync for ConcurrentBlobUploader<BS>
where BS: Sync,

§

impl<BS> Unpin for ConcurrentBlobUploader<BS>
where BS: Unpin,

§

impl<BS> !UnwindSafe for ConcurrentBlobUploader<BS>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> FutureExt for T

source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
source§

impl<T> FutureExt for T

source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more