Struct opendal::raw::AccessorInfo

source ·
pub struct AccessorInfo { /* private fields */ }
Expand description

Info for the accessor. Users can use this struct to retrieve information about the underlying backend.

This struct is intentionally not implemented with Clone to ensure that all accesses within the same operator, access layers, and services use the same instance of AccessorInfo. This is especially important for HttpClient and Executor.

§Panic Safety

All methods provided by AccessorInfo will safely handle lock poisoning scenarios. If the inner RwLock is poisoned (which happens when another thread panicked while holding the write lock), this method will gracefully continue execution.

  • For read operations, the method will return the current state.
  • For write operations, the method will do nothing.

§Maintain Notes

We are using std::sync::RwLock to provide thread-safe access to the inner data.

I have performed the bench across different arc-swap alike crates:

test arcswap                    ... bench:          14.85 ns/iter (+/- 0.33)
test arcswap_full               ... bench:         128.27 ns/iter (+/- 4.30)
test baseline                   ... bench:          11.33 ns/iter (+/- 0.76)
test mutex_4                    ... bench:         296.73 ns/iter (+/- 49.96)
test mutex_unconteded           ... bench:          13.26 ns/iter (+/- 0.56)
test rwlock_fast_4              ... bench:         201.60 ns/iter (+/- 7.47)
test rwlock_fast_uncontended    ... bench:          12.77 ns/iter (+/- 0.37)
test rwlock_parking_4           ... bench:         232.02 ns/iter (+/- 11.14)
test rwlock_parking_uncontended ... bench:          13.18 ns/iter (+/- 0.39)
test rwlock_std_4               ... bench:         219.56 ns/iter (+/- 5.56)
test rwlock_std_uncontended     ... bench:          13.55 ns/iter (+/- 0.33)

The results show that as long as there aren’t too many uncontended accesses, RwLock is the best choice, allowing for fast access and the ability to modify partial data without cloning everything.

And it’s true: we only update and modify the internal data in a few instances, such as when building an operator or applying new layers.

Implementations§

source§

impl AccessorInfo

source

pub fn scheme(&self) -> Scheme

Scheme of backend.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply returning the current scheme.

source

pub fn set_scheme(&self, scheme: Scheme) -> &Self

Set Scheme for backend.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply skipping the update operation rather than propagating the panic.

source

pub fn root(&self) -> String

Root of backend, will be in format like /path/to/dir/

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply returning the current root.

source

pub fn set_root(&self, root: &str) -> &Self

Set root for backend.

Note: input root must be normalized.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply skipping the update operation rather than propagating the panic.

source

pub fn name(&self) -> String

Name of backend, could be empty if underlying backend doesn’t have namespace concept.

For example:

  • name for s3 => bucket name
  • name for azblob => container name
§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply returning the current scheme.

source

pub fn set_name(&self, name: &str) -> &Self

Set name of this backend.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply skipping the update operation rather than propagating the panic.

source

pub fn native_capability(&self) -> Capability

Get backend’s native capabilities.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply returning the current native capability.

source

pub fn set_native_capability(&self, capability: Capability) -> &Self

Set native capabilities for service.

§NOTES

Set native capability will also flush the full capability. The only way to change full_capability is via update_full_capability.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply skipping the update operation rather than propagating the panic.

source

pub fn full_capability(&self) -> Capability

Get service’s full capabilities.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply returning the current native capability.

source

pub fn update_full_capability( &self, f: impl FnOnce(Capability) -> Capability, ) -> &Self

Update service’s full capabilities.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply skipping the update operation rather than propagating the panic.

source

pub fn http_client(&self) -> HttpClient

Get http client from the context.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply returning the current http client.

source

pub fn update_http_client( &self, f: impl FnOnce(HttpClient) -> HttpClient, ) -> &Self

Update http client for the context.

§Note

Requests must be forwarded to the old HTTP client after the update. Otherwise, features such as retry, tracing, and metrics may not function properly.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply skipping the update operation.

source

pub fn executor(&self) -> Executor

Get executor from the context.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply returning the current executor.

source

pub fn update_executor(&self, f: impl FnOnce(Executor) -> Executor) -> &Self

Set executor for the context.

§Note

Tasks must be forwarded to the old executor after the update. Otherwise, features such as retry, timeout, and metrics may not function properly.

§Panic Safety

This method safely handles lock poisoning scenarios. If the inner RwLock is poisoned, this method will gracefully continue execution by simply skipping the update operation.

Trait Implementations§

source§

impl Debug for AccessorInfo

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for AccessorInfo

source§

fn default() -> AccessorInfo

Returns the “default value” for a type. Read more

Auto Trait Implementations§

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
§

impl<T> CompatExt for T

§

fn compat(self) -> Compat<T>

Applies the [Compat] adapter by value. Read more
§

fn compat_ref(&self) -> Compat<&T>

Applies the [Compat] adapter by shared reference. Read more
§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the [Compat] adapter by mutable reference. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

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

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

fn with_current_context(self) -> WithContext<Self>

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

impl<T> Instrument for T

§

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

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

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> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
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> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

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

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

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
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<G1, G2> Within<G2> for G1
where G2: Contains<G1>,

§

fn is_within(&self, b: &G2) -> bool

§

impl<T> ErasedDestructor for T
where T: 'static,

source§

impl<T> MaybeSend for T
where T: Send,

§

impl<T> MaybeSendSync for T