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
impl AccessorInfo
sourcepub fn set_scheme(&self, scheme: Scheme) -> &Self
pub fn set_scheme(&self, scheme: Scheme) -> &Self
sourcepub fn root(&self) -> String
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.
sourcepub fn set_root(&self, root: &str) -> &Self
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.
sourcepub fn name(&self) -> String
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.
sourcepub fn set_name(&self, name: &str) -> &Self
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.
sourcepub fn native_capability(&self) -> Capability
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.
sourcepub fn set_native_capability(&self, capability: Capability) -> &Self
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.
sourcepub fn full_capability(&self) -> Capability
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.
sourcepub fn update_full_capability(
&self,
f: impl FnOnce(Capability) -> Capability,
) -> &Self
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.
sourcepub fn http_client(&self) -> HttpClient
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.
sourcepub fn update_http_client(
&self,
f: impl FnOnce(HttpClient) -> HttpClient,
) -> &Self
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.
sourcepub fn executor(&self) -> Executor
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.
sourcepub fn update_executor(&self, f: impl FnOnce(Executor) -> Executor) -> &Self
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
impl Debug for AccessorInfo
source§impl Default for AccessorInfo
impl Default for AccessorInfo
source§fn default() -> AccessorInfo
fn default() -> AccessorInfo
Auto Trait Implementations§
impl !Freeze for AccessorInfo
impl RefUnwindSafe for AccessorInfo
impl Send for AccessorInfo
impl Sync for AccessorInfo
impl Unpin for AccessorInfo
impl UnwindSafe for AccessorInfo
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CompatExt for T
impl<T> CompatExt for T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.