You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2023/08/01 11:03:30 UTC

[incubator-opendal] branch main updated: feat(service/etcd): support list (#2755)

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/incubator-opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new 47faa7784 feat(service/etcd): support list (#2755)
47faa7784 is described below

commit 47faa77847457cdb7648c9ad5506ee980f9756fd
Author: G-XD <38...@users.noreply.github.com>
AuthorDate: Tue Aug 1 19:03:25 2023 +0800

    feat(service/etcd): support list (#2755)
    
    Co-authored-by: G-XD <GX...@gmail.com>
---
 core/src/services/etcd/backend.rs | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/core/src/services/etcd/backend.rs b/core/src/services/etcd/backend.rs
index e2bc89af3..e5a0334be 100644
--- a/core/src/services/etcd/backend.rs
+++ b/core/src/services/etcd/backend.rs
@@ -24,6 +24,7 @@ use etcd_client::Certificate;
 use etcd_client::Client;
 use etcd_client::ConnectOptions;
 use etcd_client::Error as EtcdError;
+use etcd_client::GetOptions;
 use etcd_client::Identity;
 use etcd_client::TlsOptions;
 use tokio::sync::OnceCell;
@@ -211,11 +212,11 @@ impl Builder for EtcdBuilder {
 
         let client = OnceCell::new();
         Ok(EtcdBackend::new(Adapter {
-            root,
             endpoints,
             client,
             options,
-        }))
+        })
+        .with_root(root.as_str()))
     }
 }
 
@@ -231,7 +232,6 @@ pub type EtcdBackend = kv::Backend<Adapter>;
 
 #[derive(Clone)]
 pub struct Adapter {
-    root: String,
     endpoints: Vec<String>,
     client: OnceCell<Client>,
     options: ConnectOptions,
@@ -242,7 +242,6 @@ impl Debug for Adapter {
     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
         let mut ds = f.debug_struct("Adapter");
 
-        ds.field("root", &self.root);
         ds.field("endpoints", &self.endpoints.join(","));
         ds.field("options", &self.options.clone());
         ds.finish()
@@ -271,6 +270,7 @@ impl kv::Adapter for Adapter {
                 read: true,
                 write: true,
                 create_dir: true,
+                list: true,
 
                 ..Default::default()
             },
@@ -278,9 +278,8 @@ impl kv::Adapter for Adapter {
     }
 
     async fn get(&self, key: &str) -> Result<Option<Vec<u8>>> {
-        let p = build_rooted_abs_path(&self.root, key);
         let mut client = self.conn().await?;
-        let resp = client.get(p, None).await?;
+        let resp = client.get(key, None).await?;
         if let Some(kv) = resp.kvs().first() {
             Ok(Some(kv.value().to_vec()))
         } else {
@@ -289,18 +288,31 @@ impl kv::Adapter for Adapter {
     }
 
     async fn set(&self, key: &str, value: &[u8]) -> Result<()> {
-        let p = build_rooted_abs_path(&self.root, key);
         let mut client = self.conn().await?;
-        let _ = client.put(p, value, None).await?;
+        let _ = client.put(key, value, None).await?;
         Ok(())
     }
 
     async fn delete(&self, key: &str) -> Result<()> {
-        let p = build_rooted_abs_path(&self.root, key);
         let mut client = self.conn().await?;
-        let _ = client.delete(p, None).await?;
+        let _ = client.delete(key, None).await?;
         Ok(())
     }
+
+    async fn scan(&self, path: &str) -> Result<Vec<String>> {
+        let mut client = self.conn().await?;
+        let get_options = Some(GetOptions::new().with_prefix().with_keys_only());
+        let resp = client.get(path, get_options).await?;
+        let mut res = Vec::default();
+        for kv in resp.kvs() {
+            res.push(kv.key_str().map(String::from).map_err(|err| {
+                Error::new(ErrorKind::Unexpected, "store key is not valid utf-8 string")
+                    .set_source(err)
+            })?);
+        }
+
+        Ok(res)
+    }
 }
 
 impl From<EtcdError> for Error {