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

koushiro pushed a commit to branch extract-memcached-service
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit b07ee5337c114b34ec0f1f86a3bfcc23df81e5f7
Author: koushiro <[email protected]>
AuthorDate: Tue Dec 16 14:40:20 2025 +0800

    refactor: Split memcached service to new crate
---
 core/Cargo.lock                                       | 13 +++++++++++++
 core/Cargo.toml                                       |  5 +++--
 core/core/Cargo.toml                                  |  1 -
 core/core/src/services/mod.rs                         |  5 -----
 core/services/{sqlite => memcached}/Cargo.toml        | 13 ++++++-------
 .../memcached => services/memcached/src}/backend.rs   |  5 +++--
 .../memcached => services/memcached/src}/binary.rs    |  7 +++----
 .../memcached => services/memcached/src}/config.rs    | 19 ++++++++++---------
 .../memcached => services/memcached/src}/core.rs      |  9 ++++++---
 .../memcached => services/memcached/src}/deleter.rs   |  6 +++---
 .../memcached => services/memcached/src}/docs.md      |  4 ++--
 .../mod.rs => services/memcached/src/lib.rs}          | 11 +++++++----
 .../memcached => services/memcached/src}/writer.rs    |  5 +++--
 core/services/sqlite/Cargo.toml                       |  1 -
 core/src/lib.rs                                       |  2 ++
 15 files changed, 61 insertions(+), 45 deletions(-)

diff --git a/core/Cargo.lock b/core/Cargo.lock
index fcc412432..aab5d4225 100644
--- a/core/Cargo.lock
+++ b/core/Cargo.lock
@@ -5563,6 +5563,7 @@ dependencies = [
  "opendal-service-ghac",
  "opendal-service-hdfs-native",
  "opendal-service-ipfs",
+ "opendal-service-memcached",
  "opendal-service-moka",
  "opendal-service-mysql",
  "opendal-service-obs",
@@ -6064,6 +6065,18 @@ dependencies = [
  "tokio",
 ]
 
+[[package]]
+name = "opendal-service-memcached"
+version = "0.55.0"
+dependencies = [
+ "ctor",
+ "fastpool",
+ "http 1.4.0",
+ "opendal-core",
+ "serde",
+ "tokio",
+]
+
 [[package]]
 name = "opendal-service-moka"
 version = "0.55.0"
diff --git a/core/Cargo.toml b/core/Cargo.toml
index e28afa65c..3db839b2d 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -131,7 +131,7 @@ services-ipfs = ["dep:opendal-service-ipfs"]
 services-ipmfs = ["opendal-core/services-ipmfs"]
 services-koofr = ["opendal-core/services-koofr"]
 services-lakefs = ["opendal-core/services-lakefs"]
-services-memcached = ["opendal-core/services-memcached"]
+services-memcached = ["dep:opendal-service-memcached"]
 services-memory = ["opendal-core/services-memory"]
 services-mini-moka = ["opendal-core/services-mini-moka"]
 services-moka = ["dep:opendal-service-moka"]
@@ -214,14 +214,15 @@ opendal-service-gcs = { path = "services/gcs", version = 
"0.55.0", optional = tr
 opendal-service-ghac = { path = "services/ghac", version = "0.55.0", optional 
= true, default-features = false }
 opendal-service-hdfs-native = { path = "services/hdfs-native", version = 
"0.55.0", optional = true, default-features = false }
 opendal-service-ipfs = { path = "services/ipfs", version = "0.55.0", optional 
= true, default-features = false }
+opendal-service-memcached = { path = "services/memcached", version = "0.55.0", 
optional = true, default-features = false }
 opendal-service-moka = { path = "services/moka", version = "0.55.0", optional 
= true, default-features = false }
 opendal-service-mysql = { path = "services/mysql", version = "0.55.0", 
optional = true, default-features = false }
 opendal-service-obs = { path = "services/obs", version = "0.55.0", optional = 
true, default-features = false }
 opendal-service-oss = { path = "services/oss", version = "0.55.0", optional = 
true, default-features = false }
 opendal-service-postgresql = { path = "services/postgresql", version = 
"0.55.0", optional = true, default-features = false }
 opendal-service-s3 = { path = "services/s3", version = "0.55.0", optional = 
true, default-features = false }
-opendal-service-sqlite = { path = "services/sqlite", version = "0.55.0", 
optional = true, default-features = false }
 opendal-service-sled = { path = "services/sled", version = "0.55.0", optional 
= true, default-features = false }
+opendal-service-sqlite = { path = "services/sqlite", version = "0.55.0", 
optional = true, default-features = false }
 opendal-service-tikv = { path = "services/tikv", version = "0.55.0", optional 
= true, default-features = false }
 opendal-service-vercel-blob = { path = "services/vercel-blob", version = 
"0.55.0", optional = true, default-features = false }
 
diff --git a/core/core/Cargo.toml b/core/core/Cargo.toml
index 855ed1a41..19f0381bd 100644
--- a/core/core/Cargo.toml
+++ b/core/core/Cargo.toml
@@ -95,7 +95,6 @@ services-huggingface = []
 services-ipmfs = []
 services-koofr = []
 services-lakefs = []
-services-memcached = ["dep:fastpool"]
 services-memory = []
 services-mini-moka = ["dep:mini-moka"]
 services-mongodb = ["dep:mongodb", "dep:mongodb-internal-macros"]
diff --git a/core/core/src/services/mod.rs b/core/core/src/services/mod.rs
index 2f211a4f5..95aaea11d 100644
--- a/core/core/src/services/mod.rs
+++ b/core/core/src/services/mod.rs
@@ -114,11 +114,6 @@ mod lakefs;
 #[cfg(feature = "services-lakefs")]
 pub use lakefs::*;
 
-#[cfg(feature = "services-memcached")]
-mod memcached;
-#[cfg(feature = "services-memcached")]
-pub use memcached::*;
-
 #[cfg(feature = "services-memory")]
 mod memory;
 #[cfg(feature = "services-memory")]
diff --git a/core/services/sqlite/Cargo.toml 
b/core/services/memcached/Cargo.toml
similarity index 86%
copy from core/services/sqlite/Cargo.toml
copy to core/services/memcached/Cargo.toml
index 5afc1e0a1..a9ddf394d 100644
--- a/core/services/sqlite/Cargo.toml
+++ b/core/services/memcached/Cargo.toml
@@ -16,8 +16,8 @@
 # under the License.
 
 [package]
-description = "Apache OpenDAL SQLite service implementation"
-name = "opendal-service-sqlite"
+description = "Apache OpenDAL Memcached service implementation"
+name = "opendal-service-memcached"
 
 authors = { workspace = true }
 edition = { workspace = true }
@@ -31,13 +31,12 @@ version = { workspace = true }
 all-features = true
 
 [dependencies]
-opendal-core = { path = "../../core", version = "0.55.0", default-features = 
false }
-
 ctor = { workspace = true }
-mea = { version = "0.5.1" }
+fastpool = "1.0.2"
+http = { workspace = true }
+opendal-core = { path = "../../core", version = "0.55.0", default-features = 
false }
 serde = { workspace = true, features = ["derive"] }
-sqlx = { version = "0.8.0", features = ["runtime-tokio-rustls", "sqlite"] }
+tokio = { workspace = true, features = ["net", "io-util"] }
 
 [dev-dependencies]
 tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
-
diff --git a/core/core/src/services/memcached/backend.rs 
b/core/services/memcached/src/backend.rs
similarity index 99%
rename from core/core/src/services/memcached/backend.rs
rename to core/services/memcached/src/backend.rs
index 9544b0c7d..12ab94f0b 100644
--- a/core/core/src/services/memcached/backend.rs
+++ b/core/services/memcached/src/backend.rs
@@ -17,13 +17,14 @@
 
 use std::sync::Arc;
 
+use opendal_core::raw::*;
+use opendal_core::*;
+
 use super::MEMCACHED_SCHEME;
 use super::config::MemcachedConfig;
 use super::core::*;
 use super::deleter::MemcachedDeleter;
 use super::writer::MemcachedWriter;
-use crate::raw::*;
-use crate::*;
 
 /// [Memcached](https://memcached.org/) service support.
 #[doc = include_str!("docs.md")]
diff --git a/core/core/src/services/memcached/binary.rs 
b/core/services/memcached/src/binary.rs
similarity index 99%
rename from core/core/src/services/memcached/binary.rs
rename to core/services/memcached/src/binary.rs
index d433f3fce..205b94fca 100644
--- a/core/core/src/services/memcached/binary.rs
+++ b/core/services/memcached/src/binary.rs
@@ -15,15 +15,14 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use opendal_core::raw::*;
+use opendal_core::*;
+use tokio::io;
 use tokio::io::AsyncReadExt;
 use tokio::io::AsyncWriteExt;
 use tokio::io::BufReader;
-use tokio::io::{self};
 use tokio::net::TcpStream;
 
-use crate::raw::*;
-use crate::*;
-
 pub(super) mod constants {
     pub const OK_STATUS: u16 = 0x0;
     pub const KEY_NOT_FOUND: u16 = 0x1;
diff --git a/core/core/src/services/memcached/config.rs 
b/core/services/memcached/src/config.rs
similarity index 89%
rename from core/core/src/services/memcached/config.rs
rename to core/services/memcached/src/config.rs
index 0ace5014d..374c1dbc3 100644
--- a/core/core/src/services/memcached/config.rs
+++ b/core/services/memcached/src/config.rs
@@ -17,11 +17,14 @@
 
 use std::fmt::Debug;
 
+use opendal_core::Configurator;
+use opendal_core::OperatorUri;
+use opendal_core::Result;
+use opendal_core::raw::*;
 use serde::Deserialize;
 use serde::Serialize;
 
 use super::backend::MemcachedBuilder;
-use crate::raw::*;
 
 /// Config for MemCached services support
 #[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
@@ -59,10 +62,10 @@ impl Debug for MemcachedConfig {
     }
 }
 
-impl crate::Configurator for MemcachedConfig {
+impl Configurator for MemcachedConfig {
     type Builder = MemcachedBuilder;
 
-    fn from_uri(uri: &crate::types::OperatorUri) -> crate::Result<Self> {
+    fn from_uri(uri: &OperatorUri) -> Result<Self> {
         let mut map = uri.options().clone();
         if let Some(authority) = uri.authority() {
             map.insert("endpoint".to_string(), format!("tcp://{authority}"));
@@ -85,19 +88,17 @@ impl crate::Configurator for MemcachedConfig {
 #[cfg(test)]
 mod tests {
     use super::*;
-    use crate::Configurator;
-    use crate::types::OperatorUri;
 
     #[test]
-    fn from_uri_sets_endpoint_and_root() {
+    fn from_uri_sets_endpoint_and_root() -> Result<()> {
         let uri = OperatorUri::new(
             "memcached://cache.local:11211/app/session",
             Vec::<(String, String)>::new(),
-        )
-        .unwrap();
+        )?;
 
-        let cfg = MemcachedConfig::from_uri(&uri).unwrap();
+        let cfg = MemcachedConfig::from_uri(&uri)?;
         assert_eq!(cfg.endpoint.as_deref(), Some("tcp://cache.local:11211"));
         assert_eq!(cfg.root.as_deref(), Some("app/session"));
+        Ok(())
     }
 }
diff --git a/core/core/src/services/memcached/core.rs 
b/core/services/memcached/src/core.rs
similarity index 96%
rename from core/core/src/services/memcached/core.rs
rename to core/services/memcached/src/core.rs
index 25b097314..f05b8f48f 100644
--- a/core/core/src/services/memcached/core.rs
+++ b/core/services/memcached/src/core.rs
@@ -15,13 +15,16 @@
 // specific language governing permissions and limitations
 // under the License.
 
-use fastpool::{ManageObject, ObjectStatus, bounded};
 use std::sync::Arc;
+
+use fastpool::ManageObject;
+use fastpool::ObjectStatus;
+use fastpool::bounded;
+use opendal_core::raw::*;
+use opendal_core::*;
 use tokio::net::TcpStream;
 
 use super::binary;
-use crate::raw::*;
-use crate::*;
 
 /// A connection manager for `memcache_async::ascii::Protocol`.
 #[derive(Clone)]
diff --git a/core/core/src/services/memcached/deleter.rs 
b/core/services/memcached/src/deleter.rs
similarity index 95%
rename from core/core/src/services/memcached/deleter.rs
rename to core/services/memcached/src/deleter.rs
index 725863711..263c2377c 100644
--- a/core/core/src/services/memcached/deleter.rs
+++ b/core/services/memcached/src/deleter.rs
@@ -17,10 +17,10 @@
 
 use std::sync::Arc;
 
+use opendal_core::raw::*;
+use opendal_core::*;
+
 use super::core::*;
-use crate::raw::oio;
-use crate::raw::*;
-use crate::*;
 
 pub struct MemcachedDeleter {
     core: Arc<MemcachedCore>,
diff --git a/core/core/src/services/memcached/docs.md 
b/core/services/memcached/src/docs.md
similarity index 93%
rename from core/core/src/services/memcached/docs.md
rename to core/services/memcached/src/docs.md
index 7c3e76230..e740a64fa 100644
--- a/core/core/src/services/memcached/docs.md
+++ b/core/services/memcached/src/docs.md
@@ -27,9 +27,9 @@ You can refer to [`MemcachedBuilder`]'s docs for more 
information
 ### Via Builder
 
 ```rust,no_run
-use anyhow::Result;
-use opendal_core::services::Memcached;
 use opendal_core::Operator;
+use opendal_core::Result;
+use opendal_service_memcached::Memcached;
 
 #[tokio::main]
 async fn main() -> Result<()> {
diff --git a/core/core/src/services/memcached/mod.rs 
b/core/services/memcached/src/lib.rs
similarity index 84%
rename from core/core/src/services/memcached/mod.rs
rename to core/services/memcached/src/lib.rs
index c10fef6a0..6555ef270 100644
--- a/core/core/src/services/memcached/mod.rs
+++ b/core/services/memcached/src/lib.rs
@@ -15,10 +15,10 @@
 // specific language governing permissions and limitations
 // under the License.
 
-/// Default scheme for memcached service.
-pub const MEMCACHED_SCHEME: &str = "memcached";
+//! Memcached service implementation for Apache OpenDAL.
 
-use crate::types::DEFAULT_OPERATOR_REGISTRY;
+#![cfg_attr(docsrs, feature(doc_cfg))]
+#![deny(missing_docs)]
 
 mod backend;
 mod binary;
@@ -30,7 +30,10 @@ mod writer;
 pub use backend::MemcachedBuilder as Memcached;
 pub use config::MemcachedConfig;
 
+/// Default scheme for memcached service.
+pub const MEMCACHED_SCHEME: &str = "memcached";
+
 #[ctor::ctor]
 fn register_memcached_service() {
-    DEFAULT_OPERATOR_REGISTRY.register::<Memcached>(MEMCACHED_SCHEME);
+    
opendal_core::DEFAULT_OPERATOR_REGISTRY.register::<Memcached>(MEMCACHED_SCHEME);
 }
diff --git a/core/core/src/services/memcached/writer.rs 
b/core/services/memcached/src/writer.rs
similarity index 97%
rename from core/core/src/services/memcached/writer.rs
rename to core/services/memcached/src/writer.rs
index bb2e843b3..bd5f0e476 100644
--- a/core/core/src/services/memcached/writer.rs
+++ b/core/services/memcached/src/writer.rs
@@ -17,9 +17,10 @@
 
 use std::sync::Arc;
 
+use opendal_core::raw::oio;
+use opendal_core::*;
+
 use super::core::*;
-use crate::raw::oio;
-use crate::*;
 
 pub struct MemcachedWriter {
     core: Arc<MemcachedCore>,
diff --git a/core/services/sqlite/Cargo.toml b/core/services/sqlite/Cargo.toml
index 5afc1e0a1..00867279c 100644
--- a/core/services/sqlite/Cargo.toml
+++ b/core/services/sqlite/Cargo.toml
@@ -40,4 +40,3 @@ sqlx = { version = "0.8.0", features = 
["runtime-tokio-rustls", "sqlite"] }
 
 [dev-dependencies]
 tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
-
diff --git a/core/src/lib.rs b/core/src/lib.rs
index 100f746b1..efb1205e1 100644
--- a/core/src/lib.rs
+++ b/core/src/lib.rs
@@ -51,6 +51,8 @@ pub mod services {
     pub use opendal_service_hdfs_native::*;
     #[cfg(feature = "services-ipfs")]
     pub use opendal_service_ipfs::*;
+    #[cfg(feature = "services-memcached")]
+    pub use opendal_service_memcached::*;
     #[cfg(feature = "services-moka")]
     pub use opendal_service_moka::*;
     #[cfg(feature = "services-mysql")]

Reply via email to