You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by ko...@apache.org on 2025/12/23 07:11:39 UTC
(opendal) branch extract-redis-service updated (d3a17e5c0 -> e83aa7938)
This is an automated email from the ASF dual-hosted git repository.
koushiro pushed a change to branch extract-redis-service
in repository https://gitbox.apache.org/repos/asf/opendal.git
discard d3a17e5c0 refactor: Split redis service to new crate
new e83aa7938 refactor: Split redis service to new crate
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (d3a17e5c0)
\
N -- N -- N refs/heads/extract-redis-service (e83aa7938)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omit" are not gone; other references still
refer to them. Any revisions marked "discard" are gone forever.
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
core/core/Cargo.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(opendal) 01/01: refactor: Split redis service to new crate
Posted by ko...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
koushiro pushed a commit to branch extract-redis-service
in repository https://gitbox.apache.org/repos/asf/opendal.git
commit e83aa79380d7b167281a23b79fc709139c53468c
Author: koushiro <ko...@gmail.com>
AuthorDate: Tue Dec 23 15:09:22 2025 +0800
refactor: Split redis service to new crate
---
core/Cargo.lock | 29 ++++++++---------
core/Cargo.toml | 28 ++++++-----------
core/core/Cargo.toml | 22 +------------
core/core/src/services/mod.rs | 5 ---
core/services/redis/Cargo.toml | 36 ++++++++++++++++++++++
.../redis => services/redis/src}/backend.rs | 4 +--
.../redis => services/redis/src}/config.rs | 29 +++++++++--------
.../services/redis => services/redis/src}/core.rs | 4 +--
.../redis => services/redis/src}/delete.rs | 12 +++++---
.../services/redis => services/redis/src}/docs.md | 4 +--
.../redis/mod.rs => services/redis/src/lib.rs} | 11 ++++---
.../redis => services/redis/src}/writer.rs | 11 ++++---
core/src/lib.rs | 4 +++
13 files changed, 106 insertions(+), 93 deletions(-)
diff --git a/core/Cargo.lock b/core/Cargo.lock
index 9f9e82226..852e81b01 100644
--- a/core/Cargo.lock
+++ b/core/Cargo.lock
@@ -5539,11 +5539,7 @@ version = "0.55.0"
dependencies = [
"anyhow",
"bytes",
- "criterion",
"divan",
- "dotenvy",
- "fastrace",
- "fastrace-jaeger",
"futures",
"http 1.4.0",
"libtest-mimic",
@@ -5617,6 +5613,7 @@ dependencies = [
"opendal-service-persy",
"opendal-service-postgresql",
"opendal-service-redb",
+ "opendal-service-redis",
"opendal-service-rocksdb",
"opendal-service-s3",
"opendal-service-seafile",
@@ -5633,16 +5630,11 @@ dependencies = [
"opendal-service-webhdfs",
"opendal-service-yandex-disk",
"opendal-testkit",
- "opentelemetry",
- "opentelemetry-otlp",
- "opentelemetry_sdk",
- "pretty_assertions",
"rand 0.8.5",
"reqwest",
"sha2",
"size",
"tokio",
- "tracing-opentelemetry",
"tracing-subscriber",
"uuid",
]
@@ -5678,13 +5670,10 @@ name = "opendal-core"
version = "0.55.0"
dependencies = [
"anyhow",
- "backon",
"base64 0.22.1",
"bytes",
"ctor",
- "fastpool",
"futures",
- "getrandom 0.2.16",
"http 1.4.0",
"http-body 1.0.1",
"jiff",
@@ -5696,8 +5685,6 @@ dependencies = [
"pretty_assertions",
"quick-xml",
"rand 0.8.5",
- "redis",
- "reqsign",
"reqwest",
"serde",
"serde_json",
@@ -6617,6 +6604,20 @@ dependencies = [
"tokio",
]
+[[package]]
+name = "opendal-service-redis"
+version = "0.55.0"
+dependencies = [
+ "bytes",
+ "ctor",
+ "fastpool",
+ "http 1.4.0",
+ "opendal-core",
+ "redis",
+ "serde",
+ "tokio",
+]
+
[[package]]
name = "opendal-service-rocksdb"
version = "0.55.0"
diff --git a/core/Cargo.toml b/core/Cargo.toml
index 3a301d73d..5a6d1cc3f 100644
--- a/core/Cargo.toml
+++ b/core/Cargo.toml
@@ -160,8 +160,8 @@ services-pcloud = ["dep:opendal-service-pcloud"]
services-persy = ["dep:opendal-service-persy"]
services-postgresql = ["dep:opendal-service-postgresql"]
services-redb = ["dep:opendal-service-redb"]
-services-redis = ["opendal-core/services-redis"]
-services-redis-native-tls = ["opendal-core/services-redis-native-tls"]
+services-redis = ["opendal-service-redis?/rustls"]
+services-redis-native-tls = ["opendal-service-redis?/native-tls"]
services-rocksdb = ["dep:opendal-service-rocksdb"]
services-s3 = ["dep:opendal-service-s3"]
services-seafile = ["dep:opendal-service-seafile"]
@@ -266,6 +266,7 @@ opendal-service-pcloud = { path = "services/pcloud", version = "0.55.0", optiona
opendal-service-persy = { path = "services/persy", 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-redb = { path = "services/redb", version = "0.55.0", optional = true, default-features = false }
+opendal-service-redis = { path = "services/redis", version = "0.55.0", optional = true, default-features = false }
opendal-service-rocksdb = { path = "services/rocksdb", 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-seafile = { path = "services/seafile", version = "0.55.0", optional = true, default-features = false }
@@ -283,35 +284,24 @@ opendal-service-webhdfs = { path = "services/webhdfs", version = "0.55.0", optio
opendal-service-yandex-disk = { path = "services/yandex-disk", version = "0.55.0", optional = true, default-features = false }
opendal-testkit = { path = "testkit", version = "0.55.0", optional = true }
+[target.'cfg(target_arch = "wasm32")'.dependencies]
+opendal-service-opfs = { path = "services/opfs", version = "0.55.0", optional = true, default-features = false }
+
[dev-dependencies]
-anyhow = { version = "1.0.100", features = ["std"] }
+anyhow = "1.0"
bytes = { workspace = true }
-criterion = { version = "0.7", features = ["async", "async_tokio"] }
-divan = { version = "0.1" }
-dotenvy = "0.15"
-fastrace = { version = "0.7", features = ["enable"] }
-fastrace-jaeger = "0.7"
+divan = "0.1"
futures = { workspace = true, default-features = true }
http = { workspace = true }
libtest-mimic = "0.8"
log = { workspace = true }
-opentelemetry = { version = "0.31.0", default-features = false, features = [
- "trace",
-] }
-opentelemetry-otlp = { version = "0.31.0", features = ["grpc-tonic"] }
-opentelemetry_sdk = { version = "0.31.0", features = ["rt-tokio"] }
-pretty_assertions = "1"
rand = { workspace = true }
-reqwest = { version = "0.12.24" }
+reqwest = "0.12.24"
sha2 = { workspace = true }
size = "0.5"
tokio = { workspace = true, features = ["fs", "macros", "rt-multi-thread"] }
-tracing-opentelemetry = "0.32.0"
tracing-subscriber = { version = "0.3", features = [
"env-filter",
"tracing-log",
] }
uuid = { workspace = true, features = ["serde", "v4"] }
-
-[target.'cfg(target_arch = "wasm32")'.dependencies]
-opendal-service-opfs = { path = "services/opfs", version = "0.55.0", optional = true, default-features = false }
diff --git a/core/core/Cargo.toml b/core/core/Cargo.toml
index e372b3b2f..650628588 100644
--- a/core/core/Cargo.toml
+++ b/core/core/Cargo.toml
@@ -55,8 +55,6 @@ internal-tokio-rt = ["tokio/rt-multi-thread"]
executors-tokio = ["tokio/rt"]
services-memory = []
-services-redis = ["dep:redis", "dep:fastpool", "redis?/tokio-rustls-comp"]
-services-redis-native-tls = ["services-redis", "redis?/tokio-native-tls-comp"]
[lib]
bench = false
@@ -87,27 +85,9 @@ url = "2.5"
uuid = { workspace = true, features = ["serde", "v4"] }
# Optional dependencies
-
-# Services
-# general dependencies.
-fastpool = { version = "1.0.2", optional = true }
-sha2 = { workspace = true, optional = true }
-
-# For http based services.
-reqsign = { workspace = true, features = ["reqwest_request"], optional = true }
-
-# for services-moka
-moka = { version = "0.12", optional = true, features = ["future", "sync"] }
-# for services-redis
-redis = { version = "1.0", features = [
- "cluster-async",
- "tokio-comp",
- "connection-manager",
-], optional = true }
+moka = { version = "0.12", optional = true, features = ["sync"] }
[target.'cfg(target_arch = "wasm32")'.dependencies]
-backon = { version = "1.6", features = ["gloo-timers-sleep"] }
-getrandom = { version = "0.2", features = ["js"] }
jiff = { version = "0.2.15", features = ["serde", "js"] }
tokio = { workspace = true, features = ["time"] }
uuid = { workspace = true, features = ["serde", "v4", "js"] }
diff --git a/core/core/src/services/mod.rs b/core/core/src/services/mod.rs
index ec77723ab..f7c8457e0 100644
--- a/core/core/src/services/mod.rs
+++ b/core/core/src/services/mod.rs
@@ -23,8 +23,3 @@
mod memory;
#[cfg(feature = "services-memory")]
pub use self::memory::*;
-
-#[cfg(feature = "services-redis")]
-mod redis;
-#[cfg(feature = "services-redis")]
-pub use self::redis::*;
diff --git a/core/services/redis/Cargo.toml b/core/services/redis/Cargo.toml
new file mode 100644
index 000000000..f8587a98e
--- /dev/null
+++ b/core/services/redis/Cargo.toml
@@ -0,0 +1,36 @@
+[package]
+description = "Apache OpenDAL Redis service implementation"
+name = "opendal-service-redis"
+
+authors = { workspace = true }
+edition = { workspace = true }
+homepage = { workspace = true }
+license = { workspace = true }
+repository = { workspace = true }
+rust-version = { workspace = true }
+version = { workspace = true }
+
+[package.metadata.docs.rs]
+all-features = true
+
+[features]
+default = ["rustls"]
+native-tls = ["redis/tokio-native-tls-comp"]
+rustls = ["redis/tokio-rustls-comp"]
+
+[dependencies]
+bytes = { workspace = true }
+ctor = { workspace = true }
+fastpool = "1.0.2"
+http = { workspace = true }
+opendal-core = { path = "../../core", version = "0.55.0", default-features = false }
+redis = { version = "1.0", features = [
+ "cluster-async",
+ "tokio-comp",
+ "connection-manager",
+] }
+serde = { workspace = true, features = ["derive"] }
+tokio = { workspace = true, features = ["macros", "time"] }
+
+[dev-dependencies]
+tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
diff --git a/core/core/src/services/redis/backend.rs b/core/services/redis/src/backend.rs
similarity index 99%
rename from core/core/src/services/redis/backend.rs
rename to core/services/redis/src/backend.rs
index a23f303bb..6d809a504 100644
--- a/core/core/src/services/redis/backend.rs
+++ b/core/services/redis/src/backend.rs
@@ -19,6 +19,8 @@ use std::path::PathBuf;
use std::sync::Arc;
use http::Uri;
+use opendal_core::raw::*;
+use opendal_core::*;
use redis::Client;
use redis::ConnectionAddr;
use redis::ConnectionInfo;
@@ -32,8 +34,6 @@ use super::config::RedisConfig;
use super::core::*;
use super::delete::RedisDeleter;
use super::writer::RedisWriter;
-use crate::raw::*;
-use crate::*;
const DEFAULT_REDIS_ENDPOINT: &str = "tcp://127.0.0.1:6379";
const DEFAULT_REDIS_PORT: u16 = 6379;
diff --git a/core/core/src/services/redis/config.rs b/core/services/redis/src/config.rs
similarity index 91%
rename from core/core/src/services/redis/config.rs
rename to core/services/redis/src/config.rs
index 7df08e87c..e5aab2a75 100644
--- a/core/core/src/services/redis/config.rs
+++ b/core/services/redis/src/config.rs
@@ -17,12 +17,13 @@
use std::fmt::Debug;
+use opendal_core::raw::*;
+use opendal_core::*;
use serde::Deserialize;
use serde::Serialize;
use super::REDIS_SCHEME;
use super::backend::RedisBuilder;
-use crate::raw::*;
/// Config for Redis services support.
#[derive(Default, Serialize, Deserialize, Clone, PartialEq, Eq)]
@@ -74,18 +75,18 @@ impl Debug for RedisConfig {
}
}
-impl crate::Configurator for RedisConfig {
+impl Configurator for RedisConfig {
type Builder = RedisBuilder;
- 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.entry("endpoint".to_string())
.or_insert_with(|| format!("redis://{authority}"));
} else if !map.contains_key("endpoint") && !map.contains_key("cluster_endpoints") {
- return Err(crate::Error::new(
- crate::ErrorKind::ConfigInvalid,
+ return Err(Error::new(
+ ErrorKind::ConfigInvalid,
"endpoint or cluster_endpoints is required",
)
.with_context("service", REDIS_SCHEME));
@@ -126,35 +127,33 @@ impl crate::Configurator for RedisConfig {
#[cfg(test)]
mod tests {
use super::*;
- use crate::Configurator;
- use crate::types::OperatorUri;
#[test]
- fn from_uri_sets_endpoint_db_and_root() {
+ fn from_uri_sets_endpoint_db_and_root() -> Result<()> {
let uri = OperatorUri::new(
"redis://localhost:6379/2/cache",
Vec::<(String, String)>::new(),
- )
- .unwrap();
+ )?;
- let cfg = RedisConfig::from_uri(&uri).unwrap();
+ let cfg = RedisConfig::from_uri(&uri)?;
assert_eq!(cfg.endpoint.as_deref(), Some("redis://localhost:6379"));
assert_eq!(cfg.db, 2);
assert_eq!(cfg.root.as_deref(), Some("cache"));
+ Ok(())
}
#[test]
- fn from_uri_treats_non_numeric_path_as_root() {
+ fn from_uri_treats_non_numeric_path_as_root() -> Result<()> {
let uri = OperatorUri::new(
"redis://localhost:6379/app/data",
Vec::<(String, String)>::new(),
- )
- .unwrap();
+ )?;
- let cfg = RedisConfig::from_uri(&uri).unwrap();
+ let cfg = RedisConfig::from_uri(&uri)?;
assert_eq!(cfg.endpoint.as_deref(), Some("redis://localhost:6379"));
assert_eq!(cfg.db, 0);
assert_eq!(cfg.root.as_deref(), Some("app/data"));
+ Ok(())
}
#[test]
diff --git a/core/core/src/services/redis/core.rs b/core/services/redis/src/core.rs
similarity index 99%
rename from core/core/src/services/redis/core.rs
rename to core/services/redis/src/core.rs
index 08fedc5d3..1f3574a56 100644
--- a/core/core/src/services/redis/core.rs
+++ b/core/services/redis/src/core.rs
@@ -32,8 +32,8 @@ use redis::aio::ConnectionManager;
use redis::cluster::ClusterClient;
use redis::cluster_async::ClusterConnection;
-use crate::raw::*;
-use crate::*;
+use opendal_core::raw::*;
+use opendal_core::*;
#[derive(Clone)]
pub enum RedisConnection {
diff --git a/core/core/src/services/redis/delete.rs b/core/services/redis/src/delete.rs
similarity index 87%
rename from core/core/src/services/redis/delete.rs
rename to core/services/redis/src/delete.rs
index 2a0f066e0..e481ddfc3 100644
--- a/core/core/src/services/redis/delete.rs
+++ b/core/services/redis/src/delete.rs
@@ -15,18 +15,20 @@
// specific language governing permissions and limitations
// under the License.
+use std::sync::Arc;
+
+use opendal_core::raw::*;
+use opendal_core::*;
+
use super::core::RedisCore;
-use crate::raw::oio;
-use crate::raw::*;
-use crate::*;
pub struct RedisDeleter {
- core: std::sync::Arc<RedisCore>,
+ core: Arc<RedisCore>,
root: String,
}
impl RedisDeleter {
- pub fn new(core: std::sync::Arc<RedisCore>, root: String) -> Self {
+ pub fn new(core: Arc<RedisCore>, root: String) -> Self {
Self { core, root }
}
}
diff --git a/core/core/src/services/redis/docs.md b/core/services/redis/src/docs.md
similarity index 94%
rename from core/core/src/services/redis/docs.md
rename to core/services/redis/src/docs.md
index 2f7e930d0..ff7fed8f3 100644
--- a/core/core/src/services/redis/docs.md
+++ b/core/services/redis/src/docs.md
@@ -28,9 +28,9 @@ You can refer to [`RedisBuilder`]'s docs for more information
### Via Builder
```rust,no_run
-use anyhow::Result;
-use opendal_core::services::Redis;
use opendal_core::Operator;
+use opendal_core::Result;
+use opendal_service_redis::Redis;
#[tokio::main]
async fn main() -> Result<()> {
diff --git a/core/core/src/services/redis/mod.rs b/core/services/redis/src/lib.rs
similarity index 84%
rename from core/core/src/services/redis/mod.rs
rename to core/services/redis/src/lib.rs
index 6d0563bcc..a2f99e58b 100644
--- a/core/core/src/services/redis/mod.rs
+++ b/core/services/redis/src/lib.rs
@@ -15,10 +15,10 @@
// specific language governing permissions and limitations
// under the License.
-/// Default scheme for redis service.
-pub const REDIS_SCHEME: &str = "redis";
+//! Redis service implementation for Apache OpenDAL.
-use crate::types::DEFAULT_OPERATOR_REGISTRY;
+#![cfg_attr(docsrs, feature(doc_cfg))]
+#![deny(missing_docs)]
mod backend;
mod config;
@@ -29,7 +29,10 @@ mod writer;
pub use backend::RedisBuilder as Redis;
pub use config::RedisConfig;
+/// Default scheme for redis service.
+pub const REDIS_SCHEME: &str = "redis";
+
#[ctor::ctor]
fn register_redis_service() {
- DEFAULT_OPERATOR_REGISTRY.register::<Redis>(REDIS_SCHEME);
+ opendal_core::DEFAULT_OPERATOR_REGISTRY.register::<Redis>(REDIS_SCHEME);
}
diff --git a/core/core/src/services/redis/writer.rs b/core/services/redis/src/writer.rs
similarity index 91%
rename from core/core/src/services/redis/writer.rs
rename to core/services/redis/src/writer.rs
index a2ad22dd1..b96b50378 100644
--- a/core/core/src/services/redis/writer.rs
+++ b/core/services/redis/src/writer.rs
@@ -15,18 +15,21 @@
// specific language governing permissions and limitations
// under the License.
+use std::sync::Arc;
+
+use opendal_core::raw::*;
+use opendal_core::*;
+
use super::core::RedisCore;
-use crate::raw::oio;
-use crate::*;
pub struct RedisWriter {
- core: std::sync::Arc<RedisCore>,
+ core: Arc<RedisCore>,
path: String,
buffer: oio::QueueBuf,
}
impl RedisWriter {
- pub fn new(core: std::sync::Arc<RedisCore>, path: String) -> Self {
+ pub fn new(core: Arc<RedisCore>, path: String) -> Self {
Self {
core,
path,
diff --git a/core/src/lib.rs b/core/src/lib.rs
index 502185981..f45746d41 100644
--- a/core/src/lib.rs
+++ b/core/src/lib.rs
@@ -120,6 +120,8 @@ pub mod services {
pub use opendal_service_postgresql::*;
#[cfg(feature = "services-redb")]
pub use opendal_service_redb::*;
+ #[cfg(feature = "services-redis")]
+ pub use opendal_service_redis::*;
#[cfg(feature = "services-rocksdb")]
pub use opendal_service_rocksdb::*;
#[cfg(feature = "services-s3")]
@@ -140,6 +142,8 @@ pub mod services {
pub use opendal_service_tikv::*;
#[cfg(feature = "services-upyun")]
pub use opendal_service_upyun::*;
+ #[cfg(feature = "services-vercel-artifacts")]
+ pub use opendal_service_vercel_artifacts::*;
#[cfg(feature = "services-vercel-blob")]
pub use opendal_service_vercel_blob::*;
#[cfg(feature = "services-webdav")]