This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 9ef494d6df refactor(core)!: Return `Arc<AccessInfo>` for metadata 
(#4883)
9ef494d6df is described below

commit 9ef494d6df2e9a13c4e5b9b03bcb36ec30c0a7c0
Author: Lzzzt <[email protected]>
AuthorDate: Fri Jul 12 20:12:17 2024 +0800

    refactor(core)!: Return `Arc<AccessInfo>` for metadata (#4883)
    
    * refactor: `Operator` add a field to store metadata and avoid calling 
metadata
    
    Signed-off-by: Lzzzt <[email protected]>
    
    * refactor: change the signature of `Access::info`
    
    Signed-off-by: Lzzzt <[email protected]>
    
    refactor: change the signature of `Access::info` and `AccessDyn::info`
    
    Signed-off-by: Lzzzt <[email protected]>
    
    refactor: change the signature of `Access::info` and `AccessDyn::info`
    
    Signed-off-by: Lzzzt <[email protected]>
    
    revert: revert
    
    Signed-off-by: Lzzzt <[email protected]>
    
    revert: revert
    
    Signed-off-by: Lzzzt <[email protected]>
    
    Update store.rs
    
    refactor: change the signature of `Access::info` and `AccessDyn::info`
    
    Signed-off-by: Lzzzt <[email protected]>
    
    ---------
    
    Signed-off-by: Lzzzt <[email protected]>
---
 core/src/docs/internals/accessor.rs           |  4 ++--
 core/src/layers/blocking.rs                   |  8 +++++---
 core/src/layers/complete.rs                   | 13 +++++++------
 core/src/layers/error_context.rs              |  5 +++--
 core/src/layers/immutable_index.rs            |  7 ++++---
 core/src/layers/logging.rs                    |  3 ++-
 core/src/layers/metrics.rs                    |  2 +-
 core/src/layers/minitrace.rs                  |  3 ++-
 core/src/layers/oteltrace.rs                  |  3 ++-
 core/src/layers/retry.rs                      |  4 ++--
 core/src/layers/timeout.rs                    |  4 ++--
 core/src/layers/tracing.rs                    |  3 ++-
 core/src/raw/accessor.rs                      | 13 +++++++------
 core/src/raw/adapters/kv/backend.rs           |  4 ++--
 core/src/raw/adapters/typed_kv/backend.rs     |  4 ++--
 core/src/raw/layer.rs                         |  9 +++++----
 core/src/raw/oio/list/flat_list.rs            |  5 +++--
 core/src/services/aliyun_drive/backend.rs     |  4 ++--
 core/src/services/alluxio/backend.rs          |  4 ++--
 core/src/services/azblob/backend.rs           |  4 ++--
 core/src/services/azdls/backend.rs            |  4 ++--
 core/src/services/azfile/backend.rs           |  4 ++--
 core/src/services/b2/backend.rs               |  4 ++--
 core/src/services/chainsafe/backend.rs        |  4 ++--
 core/src/services/compfs/backend.rs           |  4 ++--
 core/src/services/cos/backend.rs              |  4 ++--
 core/src/services/dbfs/backend.rs             |  4 ++--
 core/src/services/dropbox/backend.rs          |  4 ++--
 core/src/services/fs/backend.rs               |  4 ++--
 core/src/services/ftp/backend.rs              |  5 +++--
 core/src/services/gcs/backend.rs              |  4 ++--
 core/src/services/gdrive/backend.rs           |  4 ++--
 core/src/services/ghac/backend.rs             |  5 +++--
 core/src/services/github/backend.rs           |  4 ++--
 core/src/services/hdfs/backend.rs             |  4 ++--
 core/src/services/hdfs_native/backend.rs      |  4 ++--
 core/src/services/http/backend.rs             |  5 +++--
 core/src/services/huggingface/backend.rs      |  4 ++--
 core/src/services/icloud/backend.rs           |  4 ++--
 core/src/services/ipfs/backend.rs             |  4 ++--
 core/src/services/ipmfs/backend.rs            |  4 ++--
 core/src/services/koofr/backend.rs            |  4 ++--
 core/src/services/monoiofs/backend.rs         |  3 ++-
 core/src/services/obs/backend.rs              |  4 ++--
 core/src/services/onedrive/backend.rs         |  5 +++--
 core/src/services/oss/backend.rs              |  4 ++--
 core/src/services/pcloud/backend.rs           |  4 ++--
 core/src/services/s3/backend.rs               |  4 ++--
 core/src/services/seafile/backend.rs          |  4 ++--
 core/src/services/sftp/backend.rs             |  5 +++--
 core/src/services/supabase/backend.rs         |  4 ++--
 core/src/services/swift/backend.rs            |  4 ++--
 core/src/services/upyun/backend.rs            |  4 ++--
 core/src/services/vercel_artifacts/backend.rs |  5 +++--
 core/src/services/vercel_blob/backend.rs      |  4 ++--
 core/src/services/webdav/backend.rs           |  4 ++--
 core/src/services/webhdfs/backend.rs          |  5 +++--
 core/src/services/yandex_disk/backend.rs      |  4 ++--
 core/src/types/operator/metadata.rs           |  6 ++++--
 59 files changed, 146 insertions(+), 124 deletions(-)

diff --git a/core/src/docs/internals/accessor.rs 
b/core/src/docs/internals/accessor.rs
index ca0480d45b..8a14ed4898 100644
--- a/core/src/docs/internals/accessor.rs
+++ b/core/src/docs/internals/accessor.rs
@@ -132,7 +132,7 @@
 //!                 ..Default::default()
 //!         });
 //!
-//!         am
+//!         am.into()
 //!     }
 //! }
 //! ```
@@ -302,7 +302,7 @@
 //!                     ..Default::default()
 //!             });
 //!
-//!         am
+//!         am.into()
 //!     }
 //!
 //!     async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
diff --git a/core/src/layers/blocking.rs b/core/src/layers/blocking.rs
index 7293ced965..d3c04174e1 100644
--- a/core/src/layers/blocking.rs
+++ b/core/src/layers/blocking.rs
@@ -15,6 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::sync::Arc;
+
 use tokio::runtime::Handle;
 
 use crate::raw::*;
@@ -178,10 +180,10 @@ impl<A: Access> LayeredAccess for BlockingAccessor<A> {
         &self.inner
     }
 
-    fn metadata(&self) -> AccessorInfo {
-        let mut meta = self.inner.info();
+    fn metadata(&self) -> Arc<AccessorInfo> {
+        let mut meta = self.inner.info().as_ref().clone();
         meta.full_capability_mut().blocking = true;
-        meta
+        meta.into()
     }
 
     async fn create_dir(&self, path: &str, args: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/layers/complete.rs b/core/src/layers/complete.rs
index 68b0340aa7..d89aecb2cc 100644
--- a/core/src/layers/complete.rs
+++ b/core/src/layers/complete.rs
@@ -118,7 +118,7 @@ impl<A: Access> Layer<A> for CompleteLayer {
 
 /// Provide complete wrapper for backend.
 pub struct CompleteAccessor<A: Access> {
-    meta: AccessorInfo,
+    meta: Arc<AccessorInfo>,
     inner: Arc<A>,
 }
 
@@ -380,13 +380,14 @@ impl<A: Access> LayeredAccess for CompleteAccessor<A> {
         &self.inner
     }
 
-    fn metadata(&self) -> AccessorInfo {
-        let mut meta = self.meta.clone();
+    // Todo: May move the logic to the implement of Layer::layer of 
CompleteAccessor<A>
+    fn metadata(&self) -> Arc<AccessorInfo> {
+        let mut meta = (*self.meta).clone();
         let cap = meta.full_capability_mut();
         if cap.list && cap.write_can_empty {
             cap.create_dir = true;
         }
-        meta
+        meta.into()
     }
 
     async fn create_dir(&self, path: &str, args: OpCreateDir) -> 
Result<RpCreateDir> {
@@ -730,11 +731,11 @@ mod tests {
         type BlockingWriter = oio::BlockingWriter;
         type BlockingLister = oio::BlockingLister;
 
-        fn info(&self) -> AccessorInfo {
+        fn info(&self) -> Arc<AccessorInfo> {
             let mut info = AccessorInfo::default();
             info.set_native_capability(self.capability);
 
-            info
+            info.into()
         }
 
         async fn create_dir(&self, _: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/layers/error_context.rs b/core/src/layers/error_context.rs
index cabe84b053..78ab14db3b 100644
--- a/core/src/layers/error_context.rs
+++ b/core/src/layers/error_context.rs
@@ -17,6 +17,7 @@
 
 use std::fmt::Debug;
 use std::fmt::Formatter;
+use std::sync::Arc;
 
 use futures::TryFutureExt;
 
@@ -56,7 +57,7 @@ impl<A: Access> Layer<A> for ErrorContextLayer {
 
 /// Provide error context wrapper for backend.
 pub struct ErrorContextAccessor<A: Access> {
-    meta: AccessorInfo,
+    meta: Arc<AccessorInfo>,
     inner: A,
 }
 
@@ -79,7 +80,7 @@ impl<A: Access> LayeredAccess for ErrorContextAccessor<A> {
         &self.inner
     }
 
-    fn metadata(&self) -> AccessorInfo {
+    fn metadata(&self) -> Arc<AccessorInfo> {
         self.meta.clone()
     }
 
diff --git a/core/src/layers/immutable_index.rs 
b/core/src/layers/immutable_index.rs
index 14d2c8442f..1889878c97 100644
--- a/core/src/layers/immutable_index.rs
+++ b/core/src/layers/immutable_index.rs
@@ -17,6 +17,7 @@
 
 use std::collections::HashSet;
 use std::fmt::Debug;
+use std::sync::Arc;
 use std::vec::IntoIter;
 
 use crate::raw::*;
@@ -145,14 +146,14 @@ impl<A: Access> LayeredAccess for 
ImmutableIndexAccessor<A> {
     }
 
     /// Add list capabilities for underlying storage services.
-    fn metadata(&self) -> AccessorInfo {
-        let mut meta = self.inner.info();
+    fn metadata(&self) -> Arc<AccessorInfo> {
+        let mut meta = (*self.inner.info()).clone();
 
         let cap = meta.full_capability_mut();
         cap.list = true;
         cap.list_with_recursive = true;
 
-        meta
+        meta.into()
     }
 
     async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
diff --git a/core/src/layers/logging.rs b/core/src/layers/logging.rs
index 507745c6d1..ca45a80f13 100644
--- a/core/src/layers/logging.rs
+++ b/core/src/layers/logging.rs
@@ -18,6 +18,7 @@
 use std::fmt::Debug;
 use std::sync::atomic::AtomicU64;
 use std::sync::atomic::Ordering;
+use std::sync::Arc;
 
 use bytes::Buf;
 use futures::FutureExt;
@@ -221,7 +222,7 @@ impl<A: Access> LayeredAccess for LoggingAccessor<A> {
         &self.inner
     }
 
-    fn metadata(&self) -> AccessorInfo {
+    fn metadata(&self) -> Arc<AccessorInfo> {
         debug!(
             target: LOGGING_TARGET,
             "service={} operation={} -> started",
diff --git a/core/src/layers/metrics.rs b/core/src/layers/metrics.rs
index decbad81a8..5dc220a123 100644
--- a/core/src/layers/metrics.rs
+++ b/core/src/layers/metrics.rs
@@ -414,7 +414,7 @@ impl<A: Access> LayeredAccess for MetricsAccessor<A> {
         &self.inner
     }
 
-    fn metadata(&self) -> AccessorInfo {
+    fn metadata(&self) -> Arc<AccessorInfo> {
         self.handle.requests_total_metadata.increment(1);
 
         let start = Instant::now();
diff --git a/core/src/layers/minitrace.rs b/core/src/layers/minitrace.rs
index bca4a2e584..a06e9890fd 100644
--- a/core/src/layers/minitrace.rs
+++ b/core/src/layers/minitrace.rs
@@ -17,6 +17,7 @@
 
 use std::fmt::Debug;
 use std::future::Future;
+use std::sync::Arc;
 
 use futures::FutureExt;
 use minitrace::prelude::*;
@@ -139,7 +140,7 @@ impl<A: Access> LayeredAccess for MinitraceAccessor<A> {
     }
 
     #[trace]
-    fn metadata(&self) -> AccessorInfo {
+    fn metadata(&self) -> Arc<AccessorInfo> {
         self.inner.info()
     }
 
diff --git a/core/src/layers/oteltrace.rs b/core/src/layers/oteltrace.rs
index b04ad22fdd..c03233d12f 100644
--- a/core/src/layers/oteltrace.rs
+++ b/core/src/layers/oteltrace.rs
@@ -16,6 +16,7 @@
 // under the License.
 
 use std::future::Future;
+use std::sync::Arc;
 
 use futures::FutureExt;
 use opentelemetry::global;
@@ -75,7 +76,7 @@ impl<A: Access> LayeredAccess for OtelTraceAccessor<A> {
         &self.inner
     }
 
-    fn metadata(&self) -> AccessorInfo {
+    fn metadata(&self) -> Arc<AccessorInfo> {
         let tracer = global::tracer("opendal");
         tracer.in_span("metadata", |_cx| self.inner.info())
     }
diff --git a/core/src/layers/retry.rs b/core/src/layers/retry.rs
index 4d42098394..af0fdc214d 100644
--- a/core/src/layers/retry.rs
+++ b/core/src/layers/retry.rs
@@ -800,7 +800,7 @@ mod tests {
         type BlockingWriter = ();
         type BlockingLister = ();
 
-        fn info(&self) -> AccessorInfo {
+        fn info(&self) -> Arc<AccessorInfo> {
             let mut am = AccessorInfo::default();
             am.set_native_capability(Capability {
                 read: true,
@@ -813,7 +813,7 @@ mod tests {
                 ..Default::default()
             });
 
-            am
+            am.into()
         }
 
         async fn stat(&self, _: &str, _: OpStat) -> Result<RpStat> {
diff --git a/core/src/layers/timeout.rs b/core/src/layers/timeout.rs
index 1cbc0c5ac1..095d1044fd 100644
--- a/core/src/layers/timeout.rs
+++ b/core/src/layers/timeout.rs
@@ -400,7 +400,7 @@ mod tests {
         type BlockingWriter = ();
         type BlockingLister = ();
 
-        fn info(&self) -> AccessorInfo {
+        fn info(&self) -> Arc<AccessorInfo> {
             let mut am = AccessorInfo::default();
             am.set_native_capability(Capability {
                 read: true,
@@ -408,7 +408,7 @@ mod tests {
                 ..Default::default()
             });
 
-            am
+            am.into()
         }
 
         /// This function will build a reader that always return pending.
diff --git a/core/src/layers/tracing.rs b/core/src/layers/tracing.rs
index 4a2dc4bc00..ff5c4c79eb 100644
--- a/core/src/layers/tracing.rs
+++ b/core/src/layers/tracing.rs
@@ -17,6 +17,7 @@
 
 use std::fmt::Debug;
 use std::future::Future;
+use std::sync::Arc;
 
 use futures::FutureExt;
 use tracing::Span;
@@ -140,7 +141,7 @@ impl<A: Access> LayeredAccess for TracingAccessor<A> {
     }
 
     #[tracing::instrument(level = "debug")]
-    fn metadata(&self) -> AccessorInfo {
+    fn metadata(&self) -> Arc<AccessorInfo> {
         self.inner.info()
     }
 
diff --git a/core/src/raw/accessor.rs b/core/src/raw/accessor.rs
index d2fed8f1f0..888dc4fa18 100644
--- a/core/src/raw/accessor.rs
+++ b/core/src/raw/accessor.rs
@@ -80,7 +80,7 @@ pub trait Access: Send + Sync + Debug + Unpin + 'static {
     ///
     /// - scheme: declare the scheme of backend.
     /// - capabilities: declare the capabilities of current backend.
-    fn info(&self) -> AccessorInfo;
+    fn info(&self) -> Arc<AccessorInfo>;
 
     /// Invoke the `create` operation on the specified path
     ///
@@ -399,7 +399,7 @@ pub trait Access: Send + Sync + Debug + Unpin + 'static {
 /// `Box<dyn AccessDyn>`.
 pub trait AccessDyn: Send + Sync + Debug + Unpin {
     /// Dyn version of [`Accessor::info`]
-    fn info_dyn(&self) -> AccessorInfo;
+    fn info_dyn(&self) -> Arc<AccessorInfo>;
     /// Dyn version of [`Accessor::create_dir`]
     fn create_dir_dyn<'a>(
         &'a self,
@@ -484,7 +484,7 @@ where
         BlockingLister = oio::BlockingLister,
     >,
 {
-    fn info_dyn(&self) -> AccessorInfo {
+    fn info_dyn(&self) -> Arc<AccessorInfo> {
         self.info()
     }
 
@@ -607,7 +607,7 @@ impl Access for dyn AccessDyn {
     type Lister = oio::Lister;
     type BlockingLister = oio::BlockingLister;
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         self.info_dyn()
     }
 
@@ -693,7 +693,7 @@ impl Access for () {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         AccessorInfo {
             scheme: Scheme::Custom("dummy"),
             root: "".to_string(),
@@ -701,6 +701,7 @@ impl Access for () {
             native_capability: Capability::default(),
             full_capability: Capability::default(),
         }
+        .into()
     }
 }
 
@@ -717,7 +718,7 @@ impl<T: Access + ?Sized> Access for Arc<T> {
     type BlockingWriter = T::BlockingWriter;
     type BlockingLister = T::BlockingLister;
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         self.as_ref().info()
     }
 
diff --git a/core/src/raw/adapters/kv/backend.rs 
b/core/src/raw/adapters/kv/backend.rs
index 625e7ea982..55de6b5c2c 100644
--- a/core/src/raw/adapters/kv/backend.rs
+++ b/core/src/raw/adapters/kv/backend.rs
@@ -64,7 +64,7 @@ impl<S: Adapter> Access for Backend<S> {
     type Lister = HierarchyLister<KvLister>;
     type BlockingLister = HierarchyLister<KvLister>;
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am: AccessorInfo = self.kv.metadata().into();
         am.set_root(&self.root);
 
@@ -84,7 +84,7 @@ impl<S: Adapter> Access for Backend<S> {
 
         am.set_native_capability(cap);
 
-        am
+        am.into()
     }
 
     async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
diff --git a/core/src/raw/adapters/typed_kv/backend.rs 
b/core/src/raw/adapters/typed_kv/backend.rs
index fd6271691b..e65ac6f4e6 100644
--- a/core/src/raw/adapters/typed_kv/backend.rs
+++ b/core/src/raw/adapters/typed_kv/backend.rs
@@ -59,7 +59,7 @@ impl<S: Adapter> Access for Backend<S> {
     type Lister = HierarchyLister<KvLister>;
     type BlockingLister = HierarchyLister<KvLister>;
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let kv_info = self.kv.info();
         let mut am: AccessorInfo = AccessorInfo::default();
         am.set_root(&self.root);
@@ -91,7 +91,7 @@ impl<S: Adapter> Access for Backend<S> {
 
         am.set_native_capability(cap);
 
-        am
+        am.into()
     }
 
     async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
diff --git a/core/src/raw/layer.rs b/core/src/raw/layer.rs
index aade6c3d34..f9872c6cf0 100644
--- a/core/src/raw/layer.rs
+++ b/core/src/raw/layer.rs
@@ -16,6 +16,7 @@
 // under the License.
 
 use std::fmt::Debug;
+use std::sync::Arc;
 
 use futures::Future;
 
@@ -139,7 +140,7 @@ pub trait LayeredAccess: Send + Sync + Debug + Unpin + 
'static {
 
     fn inner(&self) -> &Self::Inner;
 
-    fn metadata(&self) -> AccessorInfo {
+    fn metadata(&self) -> Arc<AccessorInfo> {
         self.inner().info()
     }
 
@@ -246,7 +247,7 @@ impl<L: LayeredAccess> Access for L {
     type Lister = L::Lister;
     type BlockingLister = L::BlockingLister;
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         (self as &L).metadata()
     }
 
@@ -358,10 +359,10 @@ mod tests {
         type Lister = ();
         type BlockingLister = ();
 
-        fn info(&self) -> AccessorInfo {
+        fn info(&self) -> Arc<AccessorInfo> {
             let mut am = AccessorInfo::default();
             am.set_scheme(Scheme::Custom("test"));
-            am
+            am.into()
         }
 
         async fn delete(&self, _: &str, _: OpDelete) -> Result<RpDelete> {
diff --git a/core/src/raw/oio/list/flat_list.rs 
b/core/src/raw/oio/list/flat_list.rs
index b310d534c0..a399539b9c 100644
--- a/core/src/raw/oio/list/flat_list.rs
+++ b/core/src/raw/oio/list/flat_list.rs
@@ -176,6 +176,7 @@ where
 #[cfg(test)]
 mod tests {
     use std::collections::HashMap;
+    use std::sync::Arc;
     use std::vec;
     use std::vec::IntoIter;
 
@@ -216,11 +217,11 @@ mod tests {
         type Lister = ();
         type BlockingLister = MockLister;
 
-        fn info(&self) -> AccessorInfo {
+        fn info(&self) -> Arc<AccessorInfo> {
             let mut am = AccessorInfo::default();
             am.full_capability_mut().list = true;
 
-            am
+            am.into()
         }
 
         fn blocking_list(&self, path: &str, _: OpList) -> Result<(RpList, 
Self::BlockingLister)> {
diff --git a/core/src/services/aliyun_drive/backend.rs 
b/core/src/services/aliyun_drive/backend.rs
index b04c50621e..7662d8f912 100644
--- a/core/src/services/aliyun_drive/backend.rs
+++ b/core/src/services/aliyun_drive/backend.rs
@@ -258,7 +258,7 @@ impl Access for AliyunDriveBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::AliyunDrive)
             .set_root(&self.core.root)
@@ -284,7 +284,7 @@ impl Access for AliyunDriveBackend {
 
                 ..Default::default()
             });
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _args: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/alluxio/backend.rs 
b/core/src/services/alluxio/backend.rs
index 78cad123c4..018c138ed5 100644
--- a/core/src/services/alluxio/backend.rs
+++ b/core/src/services/alluxio/backend.rs
@@ -188,7 +188,7 @@ impl Access for AlluxioBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Alluxio)
             .set_root(&self.core.root)
@@ -212,7 +212,7 @@ impl Access for AlluxioBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/azblob/backend.rs 
b/core/src/services/azblob/backend.rs
index feae2970e9..eb7c2f0241 100644
--- a/core/src/services/azblob/backend.rs
+++ b/core/src/services/azblob/backend.rs
@@ -557,7 +557,7 @@ impl Access for AzblobBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Azblob)
             .set_root(&self.core.root)
@@ -598,7 +598,7 @@ impl Access for AzblobBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/azdls/backend.rs 
b/core/src/services/azdls/backend.rs
index 86975606a8..4774383c81 100644
--- a/core/src/services/azdls/backend.rs
+++ b/core/src/services/azdls/backend.rs
@@ -251,7 +251,7 @@ impl Access for AzdlsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Azdls)
             .set_root(&self.core.root)
@@ -272,7 +272,7 @@ impl Access for AzdlsBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/azfile/backend.rs 
b/core/src/services/azfile/backend.rs
index 195483d1db..c47abf0ca5 100644
--- a/core/src/services/azfile/backend.rs
+++ b/core/src/services/azfile/backend.rs
@@ -272,7 +272,7 @@ impl Access for AzfileBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Azfile)
             .set_root(&self.core.root)
@@ -291,7 +291,7 @@ impl Access for AzfileBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/b2/backend.rs b/core/src/services/b2/backend.rs
index ddf441057a..e210f3e654 100644
--- a/core/src/services/b2/backend.rs
+++ b/core/src/services/b2/backend.rs
@@ -274,7 +274,7 @@ impl Access for B2Backend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::B2)
             .set_root(&self.core.root)
@@ -316,7 +316,7 @@ impl Access for B2Backend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     /// B2 have a get_file_info api required a file_id field, but field_id 
need call list api, list api also return file info
diff --git a/core/src/services/chainsafe/backend.rs 
b/core/src/services/chainsafe/backend.rs
index 03249ecf0a..a961ec35a9 100644
--- a/core/src/services/chainsafe/backend.rs
+++ b/core/src/services/chainsafe/backend.rs
@@ -210,7 +210,7 @@ impl Access for ChainsafeBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Chainsafe)
             .set_root(&self.core.root)
@@ -230,7 +230,7 @@ impl Access for ChainsafeBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/compfs/backend.rs 
b/core/src/services/compfs/backend.rs
index b69b55f66f..fb218b096e 100644
--- a/core/src/services/compfs/backend.rs
+++ b/core/src/services/compfs/backend.rs
@@ -106,7 +106,7 @@ impl Access for CompfsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Compfs)
             .set_root(&self.core.root.to_string_lossy())
@@ -129,7 +129,7 @@ impl Access for CompfsBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/cos/backend.rs b/core/src/services/cos/backend.rs
index 17b872bdb1..11478b0e8c 100644
--- a/core/src/services/cos/backend.rs
+++ b/core/src/services/cos/backend.rs
@@ -260,7 +260,7 @@ impl Access for CosBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Cos)
             .set_root(&self.core.root)
@@ -309,7 +309,7 @@ impl Access for CosBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/dbfs/backend.rs 
b/core/src/services/dbfs/backend.rs
index 925a1b0b50..5da63fe899 100644
--- a/core/src/services/dbfs/backend.rs
+++ b/core/src/services/dbfs/backend.rs
@@ -172,7 +172,7 @@ impl Access for DbfsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Dbfs)
             .set_root(&self.core.root)
@@ -188,7 +188,7 @@ impl Access for DbfsBackend {
 
                 ..Default::default()
             });
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/dropbox/backend.rs 
b/core/src/services/dropbox/backend.rs
index 8097e6c179..f62b9e3d47 100644
--- a/core/src/services/dropbox/backend.rs
+++ b/core/src/services/dropbox/backend.rs
@@ -43,7 +43,7 @@ impl Access for DropboxBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::Dropbox)
             .set_root(&self.core.root)
@@ -70,7 +70,7 @@ impl Access for DropboxBackend {
 
                 ..Default::default()
             });
-        ma
+        ma.into()
     }
 
     async fn create_dir(&self, path: &str, _args: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/fs/backend.rs b/core/src/services/fs/backend.rs
index 344e2799bb..eb338bf559 100644
--- a/core/src/services/fs/backend.rs
+++ b/core/src/services/fs/backend.rs
@@ -181,7 +181,7 @@ impl Access for FsBackend {
     type BlockingWriter = FsWriter<std::fs::File>;
     type BlockingLister = Option<FsLister<std::fs::ReadDir>>;
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Fs)
             .set_root(&self.core.root.to_string_lossy())
@@ -206,7 +206,7 @@ impl Access for FsBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/ftp/backend.rs b/core/src/services/ftp/backend.rs
index f5b4112e66..17c0fd5405 100644
--- a/core/src/services/ftp/backend.rs
+++ b/core/src/services/ftp/backend.rs
@@ -20,6 +20,7 @@ use std::fmt::Debug;
 use std::fmt::Formatter;
 use std::str;
 use std::str::FromStr;
+use std::sync::Arc;
 
 use async_tls::TlsConnector;
 use bb8::PooledConnection;
@@ -289,7 +290,7 @@ impl Access for FtpBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Ftp)
             .set_root(&self.root)
@@ -310,7 +311,7 @@ impl Access for FtpBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs
index 5d19564054..ecc74a9731 100644
--- a/core/src/services/gcs/backend.rs
+++ b/core/src/services/gcs/backend.rs
@@ -338,7 +338,7 @@ impl Access for GcsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Gcs)
             .set_root(&self.core.root)
@@ -387,7 +387,7 @@ impl Access for GcsBackend {
 
                 ..Default::default()
             });
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/gdrive/backend.rs 
b/core/src/services/gdrive/backend.rs
index fbf34c8255..082dd49b94 100644
--- a/core/src/services/gdrive/backend.rs
+++ b/core/src/services/gdrive/backend.rs
@@ -47,7 +47,7 @@ impl Access for GdriveBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::Gdrive)
             .set_root(&self.core.root)
@@ -67,7 +67,7 @@ impl Access for GdriveBackend {
                 ..Default::default()
             });
 
-        ma
+        ma.into()
     }
 
     async fn create_dir(&self, path: &str, _args: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/ghac/backend.rs 
b/core/src/services/ghac/backend.rs
index a9d9550dc2..9b3932c15c 100644
--- a/core/src/services/ghac/backend.rs
+++ b/core/src/services/ghac/backend.rs
@@ -17,6 +17,7 @@
 
 use std::collections::HashMap;
 use std::env;
+use std::sync::Arc;
 
 use bytes::Buf;
 use bytes::Bytes;
@@ -233,7 +234,7 @@ impl Access for GhacBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Ghac)
             .set_root(&self.root)
@@ -249,7 +250,7 @@ impl Access for GhacBackend {
 
                 ..Default::default()
             });
-        am
+        am.into()
     }
 
     /// Some self-hosted GHES instances are backed by AWS S3 services which 
only returns
diff --git a/core/src/services/github/backend.rs 
b/core/src/services/github/backend.rs
index e46125f56a..714ed6c4fc 100644
--- a/core/src/services/github/backend.rs
+++ b/core/src/services/github/backend.rs
@@ -229,7 +229,7 @@ impl Access for GithubBackend {
 
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Github)
             .set_root(&self.core.root)
@@ -251,7 +251,7 @@ impl Access for GithubBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/hdfs/backend.rs 
b/core/src/services/hdfs/backend.rs
index f0caf134d1..f56353e9eb 100644
--- a/core/src/services/hdfs/backend.rs
+++ b/core/src/services/hdfs/backend.rs
@@ -252,7 +252,7 @@ impl Access for HdfsBackend {
     type BlockingWriter = HdfsWriter<hdrs::File>;
     type BlockingLister = Option<HdfsLister>;
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Hdfs)
             .set_root(&self.root)
@@ -275,7 +275,7 @@ impl Access for HdfsBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/hdfs_native/backend.rs 
b/core/src/services/hdfs_native/backend.rs
index 257518e000..fab3e56c1b 100644
--- a/core/src/services/hdfs_native/backend.rs
+++ b/core/src/services/hdfs_native/backend.rs
@@ -178,7 +178,7 @@ impl Access for HdfsNativeBackend {
     type Lister = Option<HdfsNativeLister>;
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::HdfsNative)
             .set_root(&self.root)
@@ -192,7 +192,7 @@ impl Access for HdfsNativeBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _args: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/http/backend.rs 
b/core/src/services/http/backend.rs
index 6b2fce60f6..920a867345 100644
--- a/core/src/services/http/backend.rs
+++ b/core/src/services/http/backend.rs
@@ -18,6 +18,7 @@
 use std::collections::HashMap;
 use std::fmt::Debug;
 use std::fmt::Formatter;
+use std::sync::Arc;
 
 use http::header;
 use http::header::IF_MATCH;
@@ -228,7 +229,7 @@ impl Access for HttpBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::Http)
             .set_root(&self.root)
@@ -245,7 +246,7 @@ impl Access for HttpBackend {
                 ..Default::default()
             });
 
-        ma
+        ma.into()
     }
 
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/huggingface/backend.rs 
b/core/src/services/huggingface/backend.rs
index 93c26d3017..c97befbae5 100644
--- a/core/src/services/huggingface/backend.rs
+++ b/core/src/services/huggingface/backend.rs
@@ -250,7 +250,7 @@ impl Access for HuggingfaceBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Huggingface)
             .set_native_capability(Capability {
@@ -263,7 +263,7 @@ impl Access for HuggingfaceBackend {
 
                 ..Default::default()
             });
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, _: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/icloud/backend.rs 
b/core/src/services/icloud/backend.rs
index 6f56e8ae95..e7957b8dd9 100644
--- a/core/src/services/icloud/backend.rs
+++ b/core/src/services/icloud/backend.rs
@@ -273,7 +273,7 @@ impl Access for IcloudBackend {
     type Lister = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::Icloud)
             .set_root(&self.core.root)
@@ -282,7 +282,7 @@ impl Access for IcloudBackend {
                 read: true,
                 ..Default::default()
             });
-        ma
+        ma.into()
     }
 
     async fn stat(&self, path: &str, _: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/ipfs/backend.rs 
b/core/src/services/ipfs/backend.rs
index fec0b37bb3..b1d1e67397 100644
--- a/core/src/services/ipfs/backend.rs
+++ b/core/src/services/ipfs/backend.rs
@@ -166,7 +166,7 @@ impl Access for IpfsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::Ipfs)
             .set_root(&self.root)
@@ -180,7 +180,7 @@ impl Access for IpfsBackend {
                 ..Default::default()
             });
 
-        ma
+        ma.into()
     }
 
     /// IPFS's stat behavior highly depends on its implementation.
diff --git a/core/src/services/ipmfs/backend.rs 
b/core/src/services/ipmfs/backend.rs
index ae855d7b79..9ebef20e44 100644
--- a/core/src/services/ipmfs/backend.rs
+++ b/core/src/services/ipmfs/backend.rs
@@ -68,7 +68,7 @@ impl Access for IpmfsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Ipmfs)
             .set_root(&self.root)
@@ -85,7 +85,7 @@ impl Access for IpmfsBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/koofr/backend.rs 
b/core/src/services/koofr/backend.rs
index 71781b1366..98008187e8 100644
--- a/core/src/services/koofr/backend.rs
+++ b/core/src/services/koofr/backend.rs
@@ -242,7 +242,7 @@ impl Access for KoofrBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Koofr)
             .set_root(&self.core.root)
@@ -267,7 +267,7 @@ impl Access for KoofrBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/monoiofs/backend.rs 
b/core/src/services/monoiofs/backend.rs
index f68fd6b8fa..b7c85e8808 100644
--- a/core/src/services/monoiofs/backend.rs
+++ b/core/src/services/monoiofs/backend.rs
@@ -16,6 +16,7 @@
 // under the License.
 
 use std::fmt::Debug;
+use std::sync::Arc;
 
 use serde::Deserialize;
 
@@ -85,7 +86,7 @@ impl Access for MonoiofsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         todo!()
     }
 }
diff --git a/core/src/services/obs/backend.rs b/core/src/services/obs/backend.rs
index 8f21522329..09e68c235b 100644
--- a/core/src/services/obs/backend.rs
+++ b/core/src/services/obs/backend.rs
@@ -254,7 +254,7 @@ impl Access for ObsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Obs)
             .set_root(&self.core.root)
@@ -302,7 +302,7 @@ impl Access for ObsBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/onedrive/backend.rs 
b/core/src/services/onedrive/backend.rs
index 9ba74b5bbc..b28f25f6a5 100644
--- a/core/src/services/onedrive/backend.rs
+++ b/core/src/services/onedrive/backend.rs
@@ -16,6 +16,7 @@
 // under the License.
 
 use std::fmt::Debug;
+use std::sync::Arc;
 
 use bytes::Buf;
 use bytes::Bytes;
@@ -68,7 +69,7 @@ impl Access for OnedriveBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::Onedrive)
             .set_root(&self.root)
@@ -82,7 +83,7 @@ impl Access for OnedriveBackend {
                 ..Default::default()
             });
 
-        ma
+        ma.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/oss/backend.rs b/core/src/services/oss/backend.rs
index 319fd397e0..b2679f1b2a 100644
--- a/core/src/services/oss/backend.rs
+++ b/core/src/services/oss/backend.rs
@@ -382,7 +382,7 @@ impl Access for OssBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Oss)
             .set_root(&self.core.root)
@@ -436,7 +436,7 @@ impl Access for OssBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/pcloud/backend.rs 
b/core/src/services/pcloud/backend.rs
index 071925cbd9..688230aa10 100644
--- a/core/src/services/pcloud/backend.rs
+++ b/core/src/services/pcloud/backend.rs
@@ -235,7 +235,7 @@ impl Access for PcloudBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Pcloud)
             .set_root(&self.core.root)
@@ -257,7 +257,7 @@ impl Access for PcloudBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs
index ab255ff892..b2d7c9ca07 100644
--- a/core/src/services/s3/backend.rs
+++ b/core/src/services/s3/backend.rs
@@ -1032,7 +1032,7 @@ impl Access for S3Backend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::S3)
             .set_root(&self.core.root)
@@ -1090,7 +1090,7 @@ impl Access for S3Backend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/seafile/backend.rs 
b/core/src/services/seafile/backend.rs
index ca6e3f381a..18b9ace630 100644
--- a/core/src/services/seafile/backend.rs
+++ b/core/src/services/seafile/backend.rs
@@ -262,7 +262,7 @@ impl Access for SeafileBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Seafile)
             .set_root(&self.core.root)
@@ -281,7 +281,7 @@ impl Access for SeafileBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/sftp/backend.rs 
b/core/src/services/sftp/backend.rs
index 955a58e64c..37691effd7 100644
--- a/core/src/services/sftp/backend.rs
+++ b/core/src/services/sftp/backend.rs
@@ -21,6 +21,7 @@ use std::fmt::Formatter;
 use std::io::SeekFrom;
 use std::path::Path;
 use std::path::PathBuf;
+use std::sync::Arc;
 
 use bb8::PooledConnection;
 use bb8::RunError;
@@ -351,7 +352,7 @@ impl Access for SftpBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_root(self.root.as_str())
             .set_scheme(Scheme::Sftp)
@@ -375,7 +376,7 @@ impl Access for SftpBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/supabase/backend.rs 
b/core/src/services/supabase/backend.rs
index 7f79fa083a..21ef418972 100644
--- a/core/src/services/supabase/backend.rs
+++ b/core/src/services/supabase/backend.rs
@@ -163,7 +163,7 @@ impl Access for SupabaseBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Supabase)
             .set_root(&self.core.root)
@@ -179,7 +179,7 @@ impl Access for SupabaseBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/swift/backend.rs 
b/core/src/services/swift/backend.rs
index d784f305fa..bdebfd4ba1 100644
--- a/core/src/services/swift/backend.rs
+++ b/core/src/services/swift/backend.rs
@@ -193,7 +193,7 @@ impl Access for SwiftBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Swift)
             .set_root(&self.core.root)
@@ -211,7 +211,7 @@ impl Access for SwiftBackend {
 
                 ..Default::default()
             });
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/upyun/backend.rs 
b/core/src/services/upyun/backend.rs
index aaffb18e63..5359fef609 100644
--- a/core/src/services/upyun/backend.rs
+++ b/core/src/services/upyun/backend.rs
@@ -239,7 +239,7 @@ impl Access for UpyunBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Upyun)
             .set_root(&self.core.root)
@@ -270,7 +270,7 @@ impl Access for UpyunBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/vercel_artifacts/backend.rs 
b/core/src/services/vercel_artifacts/backend.rs
index 1967bab671..d1f680e6f4 100644
--- a/core/src/services/vercel_artifacts/backend.rs
+++ b/core/src/services/vercel_artifacts/backend.rs
@@ -16,6 +16,7 @@
 // under the License.
 
 use std::fmt::Debug;
+use std::sync::Arc;
 
 use http::header;
 use http::Request;
@@ -50,7 +51,7 @@ impl Access for VercelArtifactsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::VercelArtifacts)
             .set_native_capability(Capability {
@@ -63,7 +64,7 @@ impl Access for VercelArtifactsBackend {
                 ..Default::default()
             });
 
-        ma
+        ma.into()
     }
 
     async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/vercel_blob/backend.rs 
b/core/src/services/vercel_blob/backend.rs
index 9edeb651ac..b8da7729c2 100644
--- a/core/src/services/vercel_blob/backend.rs
+++ b/core/src/services/vercel_blob/backend.rs
@@ -185,7 +185,7 @@ impl Access for VercelBlobBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::VercelBlob)
             .set_root(&self.core.root)
@@ -208,7 +208,7 @@ impl Access for VercelBlobBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
diff --git a/core/src/services/webdav/backend.rs 
b/core/src/services/webdav/backend.rs
index 3d70ac813a..f1f37694a0 100644
--- a/core/src/services/webdav/backend.rs
+++ b/core/src/services/webdav/backend.rs
@@ -243,7 +243,7 @@ impl Access for WebdavBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut ma = AccessorInfo::default();
         ma.set_scheme(Scheme::Webdav)
             .set_root(&self.core.root)
@@ -268,7 +268,7 @@ impl Access for WebdavBackend {
                 ..Default::default()
             });
 
-        ma
+        ma.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/services/webhdfs/backend.rs 
b/core/src/services/webhdfs/backend.rs
index b2c35bcc7c..2fa89ad8f6 100644
--- a/core/src/services/webhdfs/backend.rs
+++ b/core/src/services/webhdfs/backend.rs
@@ -17,6 +17,7 @@
 
 use core::fmt::Debug;
 use std::collections::HashMap;
+use std::sync::Arc;
 
 use bytes::Buf;
 use http::header::CONTENT_LENGTH;
@@ -536,7 +537,7 @@ impl Access for WebhdfsBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::Webhdfs)
             .set_root(&self.root)
@@ -556,7 +557,7 @@ impl Access for WebhdfsBackend {
 
                 ..Default::default()
             });
-        am
+        am.into()
     }
 
     /// Create a file or directory
diff --git a/core/src/services/yandex_disk/backend.rs 
b/core/src/services/yandex_disk/backend.rs
index f4d1a6fd0b..a25d0a1926 100644
--- a/core/src/services/yandex_disk/backend.rs
+++ b/core/src/services/yandex_disk/backend.rs
@@ -187,7 +187,7 @@ impl Access for YandexDiskBackend {
     type BlockingWriter = ();
     type BlockingLister = ();
 
-    fn info(&self) -> AccessorInfo {
+    fn info(&self) -> Arc<AccessorInfo> {
         let mut am = AccessorInfo::default();
         am.set_scheme(Scheme::YandexDisk)
             .set_root(&self.core.root)
@@ -211,7 +211,7 @@ impl Access for YandexDiskBackend {
                 ..Default::default()
             });
 
-        am
+        am.into()
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> 
Result<RpCreateDir> {
diff --git a/core/src/types/operator/metadata.rs 
b/core/src/types/operator/metadata.rs
index 397b5ef7e7..b7114237b3 100644
--- a/core/src/types/operator/metadata.rs
+++ b/core/src/types/operator/metadata.rs
@@ -15,15 +15,17 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::sync::Arc;
+
 use crate::raw::*;
 use crate::*;
 
 /// Metadata for operator, users can use this metadata to get information of 
operator.
 #[derive(Clone, Debug, Default)]
-pub struct OperatorInfo(AccessorInfo);
+pub struct OperatorInfo(Arc<AccessorInfo>);
 
 impl OperatorInfo {
-    pub(super) fn new(acc: AccessorInfo) -> Self {
+    pub(super) fn new(acc: Arc<AccessorInfo>) -> Self {
         OperatorInfo(acc)
     }
 

Reply via email to