chore(cache): replace the oxcache tiered cache with the shared Redis client
Drops the L1 memory layer, the `[cache]` config section and the `oxcache` dependency; `CacheClient` now reads and writes through the existing `AppRedis` connection.
ZhenYi committed
Modified app/synchost/src/main.rs app/synchost/src/main.rs +1 −5 View app/synchost/src/main.rs
@@ -27,11 +27,7 @@
2727 let redis = export::AppRedis::connect(cfg.redis.clone())
2828 .await
2929 .context("connecting to redis")?;
30 let cache = Arc::new(
31 CacheClient::new(&cfg.cache)
32 .await
33 .context("building cache client")?,
34 );
30 let cache = Arc::new(CacheClient::new(redis.clone()));
3531 let repo_root = PathBuf::from(cfg.git.repo_root.clone());
3632 info!("dependencies ready");
3733
Modified chart/values.yaml chart/values.yaml +0 −2 View chart/values.yaml
@@ -109,8 +109,6 @@
109109 minReplicas: 2
110110 maxReplicas: 8
111111 targetCPUUtilizationPercentage: 70
112 # 0 disables the memory metric. The limit is 1Gi while the request is 256Mi,
113 # so a memory target is what actually keeps the L1 cache from being OOM-killed.
114112 targetMemoryUtilizationPercentage: 0
115113 # Empty map renders no `behavior:` block (k8s default scaling policy).
116114 behavior: {}
Modified config/default.toml config/default.toml +0 −17 View config/default.toml
@@ -17,22 +17,6 @@
1717username = ""
1818password = ""
1919
20[cache]
21l1_capacity = 10000
22l1_ttl_secs = 0
23l1_tti_secs = 0
24default_ttl_secs = 0
25backfill_enabled = true
26
27[cache.redis]
28url = "redis://localhost:6379"
29mode = "standalone"
30database = 0
31pool_size = 8
32connection_timeout_secs = 2
33username = ""
34password = ""
35
3620[search]
3721enabled = false
3822url = "http://127.0.0.1:7700"
@@ -411,4 +395,3 @@
411395presence_ttl_secs = 43200
412396hand_ttl_secs = 3600
413397recording_enabled = false
414
Modified deploy/values/prod.yaml deploy/values/prod.yaml +0 −1 View deploy/values/prod.yaml
@@ -10,7 +10,6 @@
1010 env:
1111 APP_REDIS__MODE: "cluster"
1212 APP_REDIS__POOL_SIZE: "8"
13 APP_CACHE__REDIS__MODE: "standalone"
1413 APP_S3__ENDPOINT: "http://rustfs-svc.rustfs.svc.cluster.local:9000"
1514 APP_S3__PUBLIC_ENDPOINT: "https://s3.gitdata.ai"
1615 APP_S3__BUCKET: "gitdata"
Added lib/cache/src/client.rs lib/cache/src/client.rs +88 −0 View lib/cache/src/client.rs
@@ -0,0 +1,88 @@
1use std::time::Duration;
2
3use export::{AppRedis, RedisConnection};
4use serde::Serialize;
5use serde::de::DeserializeOwned;
6
7use crate::error::CacheError;
8
9#[derive(Clone)]
10pub struct CacheClient {
11 redis: AppRedis,
12}
13
14impl CacheClient {
15 pub fn new(redis: AppRedis) -> Self {
16 Self { redis }
17 }
18
19 pub fn raw(&self) -> &AppRedis {
20 &self.redis
21 }
22
23 pub async fn get<V>(&self, key: &str) -> Result<Option<V>, CacheError>
24 where
25 V: DeserializeOwned,
26 {
27 self.get_bytes(key)
28 .await?
29 .map(|bytes| serde_json::from_slice(&bytes).map_err(CacheError::from))
30 .transpose()
31 }
32
33 pub async fn set<V>(
34 &self,
35 key: &str,
36 value: &V,
37 ttl: Option<Duration>,
38 ) -> Result<(), CacheError>
39 where
40 V: Serialize,
41 {
42 self.set_bytes(key, serde_json::to_vec(value)?, ttl).await
43 }
44
45 pub async fn delete(&self, key: &str) -> Result<(), CacheError> {
46 Ok(export::redis::delete(&self.redis, key).await?)
47 }
48
49 pub async fn exists(&self, key: &str) -> Result<bool, CacheError> {
50 Ok(export::redis::exists(&self.redis, key).await?)
51 }
52
53 pub async fn get_bytes(&self, key: &str) -> Result<Option<Vec<u8>>, CacheError> {
54 let mut conn = self.redis.connection_clone();
55 let mut cmd = redis::cmd("GET");
56 cmd.arg(key);
57 let value = match &mut conn {
58 RedisConnection::Standalone(conn) => cmd.query_async(conn).await?,
59 RedisConnection::Cluster(conn) => cmd.query_async(conn).await?,
60 };
61 Ok(value)
62 }
63
64 pub async fn set_bytes(
65 &self,
66 key: &str,
67 value: Vec<u8>,
68 ttl: Option<Duration>,
69 ) -> Result<(), CacheError> {
70 if ttl.is_some_and(|ttl| ttl.is_zero()) {
71 return self.delete(key).await;
72 }
73
74 let mut cmd = redis::cmd("SET");
75 cmd.arg(key).arg(value);
76 if let Some(ttl) = ttl {
77 let millis = ttl.as_millis().max(1).min(u64::MAX as u128) as u64;
78 cmd.arg("PX").arg(millis);
79 }
80
81 let mut conn = self.redis.connection_clone();
82 match &mut conn {
83 RedisConnection::Standalone(conn) => cmd.exec_async(conn).await?,
84 RedisConnection::Cluster(conn) => cmd.exec_async(conn).await?,
85 }
86 Ok(())
87 }
88}
Modified lib/cache/src/error.rs lib/cache/src/error.rs +4 −6 View lib/cache/src/error.rs
@@ -1,18 +1,16 @@
11use std::fmt;
22
3use oxcache::error::OxCacheError;
3use redis::RedisError;
44
55#[derive(Debug)]
66pub enum CacheError {
7 InvalidConfig(String),
87 Serialization(String),
9 Backend(OxCacheError),
8 Backend(RedisError),
109}
1110
1211impl fmt::Display for CacheError {
1312 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1413 match self {
15 CacheError::InvalidConfig(msg) => write!(f, "invalid cache config: {msg}"),
1614 CacheError::Serialization(msg) => write!(f, "cache serialization error: {msg}"),
1715 CacheError::Backend(err) => write!(f, "cache backend error: {err}"),
1816 }
@@ -28,8 +26,8 @@
2826 }
2927}
3028
31impl From<OxCacheError> for CacheError {
32 fn from(err: OxCacheError) -> Self {
29impl From<RedisError> for CacheError {
30 fn from(err: RedisError) -> Self {
3331 CacheError::Backend(err)
3432 }
3533}
Modified lib/cache/src/lib.rs lib/cache/src/lib.rs +2 −2 View lib/cache/src/lib.rs
@@ -1,5 +1,5 @@
1pub mod client;
12pub mod error;
2pub mod tiered;
33
4pub use client::CacheClient;
45pub use error::CacheError;
5pub use tiered::CacheClient;
Deleted lib/cache/src/tiered.rs lib/cache/src/tiered.rs +0 −134
@@ -1,134 +0,0 @@
1use std::sync::Arc;
2use std::time::Duration;
3
4use config::cache::CacheConfig;
5use config::redis::RedisMode;
6use oxcache::backend::{
7 CacheReader, CacheWriter, MokaMemoryBackend, RedisBackend, RedisMode as OxRedisMode,
8};
9use oxcache::cache::{ChainCache, ChainLink};
10use serde::Serialize;
11use serde::de::DeserializeOwned;
12
13use crate::error::CacheError;
14
15pub struct CacheClient {
16 chain: Arc<ChainCache>,
17}
18
19impl CacheClient {
20 pub async fn new(config: &CacheConfig) -> Result<Self, CacheError> {
21 unsafe {
22 std::env::set_var("OXCACHE_ALLOW_INSECURE_REDIS", "I_UNDERSTAND_THE_RISKS");
23 }
24 config.validate().map_err(CacheError::InvalidConfig)?;
25
26 let l1 = build_l1(config)?;
27 let l2 = build_l2(config).await?;
28
29 let mut builder = ChainCache::builder()
30 .link(ChainLink::from_backend(l1))
31 .link(ChainLink::from_backend(l2));
32
33 if config.backfill_enabled {
34 builder = builder.enable_backfill();
35 }
36 if let Some(ttl) = config.default_ttl_secs {
37 builder = builder.default_time_to_live(Duration::from_secs(ttl));
38 }
39
40 Ok(Self {
41 chain: Arc::new(builder.build()),
42 })
43 }
44
45 pub fn raw(&self) -> &ChainCache {
46 &self.chain
47 }
48
49 pub async fn get<V>(&self, key: &str) -> Result<Option<V>, CacheError>
50 where
51 V: DeserializeOwned,
52 {
53 let raw = self.chain.get(key).await?;
54 match raw {
55 Some(bytes) => {
56 let value = serde_json::from_slice::<V>(&bytes)?;
57 Ok(Some(value))
58 }
59 None => Ok(None),
60 }
61 }
62
63 pub async fn set<V>(
64 &self,
65 key: &str,
66 value: &V,
67 ttl: Option<Duration>,
68 ) -> Result<(), CacheError>
69 where
70 V: Serialize,
71 {
72 let bytes = serde_json::to_vec(value)?;
73 self.chain.set(key, bytes, ttl).await?;
74 Ok(())
75 }
76
77 pub async fn delete(&self, key: &str) -> Result<(), CacheError> {
78 self.chain.delete(key).await?;
79 Ok(())
80 }
81
82 pub async fn exists(&self, key: &str) -> Result<bool, CacheError> {
83 Ok(self.chain.exists(key).await?)
84 }
85
86 pub async fn get_bytes(&self, key: &str) -> Result<Option<Vec<u8>>, CacheError> {
87 Ok(self.chain.get(key).await?)
88 }
89
90 pub async fn set_bytes(
91 &self,
92 key: &str,
93 value: Vec<u8>,
94 ttl: Option<Duration>,
95 ) -> Result<(), CacheError> {
96 self.chain.set(key, value, ttl).await?;
97 Ok(())
98 }
99}
100
101fn build_l1(config: &CacheConfig) -> Result<MokaMemoryBackend, CacheError> {
102 let mut builder = MokaMemoryBackend::builder().capacity(config.l1_capacity);
103 if let Some(ttl) = config.l1_ttl_secs {
104 builder = builder.ttl(Duration::from_secs(ttl));
105 }
106 if let Some(tti) = config.l1_tti_secs {
107 builder = builder.time_to_idle(Duration::from_secs(tti));
108 }
109 Ok(builder.build())
110}
111
112async fn build_l2(config: &CacheConfig) -> Result<RedisBackend, CacheError> {
113 let url = config.redis.validate().map_err(CacheError::InvalidConfig)?;
114 let mut builder = RedisBackend::builder()
115 .connection_string(url)
116 .mode(to_oxcache_mode(config.redis.mode()))
117 .pool_size(config.redis.pool_size())
118 .connection_timeout(config.redis.connection_timeout());
119
120 if let Some(db) = config.redis.database {
121 builder = builder.database(db);
122 }
123
124 Ok(builder.build().await?)
125}
126
127fn to_oxcache_mode(mode: RedisMode) -> OxRedisMode {
128 match mode {
129 RedisMode::Standalone => OxRedisMode::Standalone,
130 RedisMode::Sentinel => OxRedisMode::Sentinel,
131 RedisMode::Cluster => OxRedisMode::Cluster,
132 RedisMode::ValkeyStandalone => OxRedisMode::ValkeyStandalone,
133 }
134}
Modified lib/cache/Cargo.toml lib/cache/Cargo.toml +2 −3 View lib/cache/Cargo.toml
@@ -4,8 +4,7 @@
44edition.workspace = true
55
66[dependencies]
7config = { workspace = true }
8oxcache = { workspace = true }
9tokio = { workspace = true }
7export = { workspace = true }
8redis = { workspace = true }
109serde = { workspace = true }
1110serde_json = { workspace = true }
Deleted lib/config/src/cache.rs lib/config/src/cache.rs +0 −68
@@ -1,68 +0,0 @@
1use serde::{Deserialize, Serialize};
2
3use crate::redis::RedisConfig;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[serde(default)]
7pub struct CacheConfig {
8 pub l1_capacity: u64,
9 pub l1_ttl_secs: Option<u64>,
10 pub l1_tti_secs: Option<u64>,
11 pub default_ttl_secs: Option<u64>,
12 pub backfill_enabled: bool,
13 pub redis: RedisConfig,
14}
15
16impl Default for CacheConfig {
17 fn default() -> Self {
18 Self {
19 l1_capacity: 10_000,
20 l1_ttl_secs: None,
21 l1_tti_secs: None,
22 default_ttl_secs: None,
23 backfill_enabled: true,
24 redis: RedisConfig::default(),
25 }
26 }
27}
28
29impl CacheConfig {
30 pub fn new(redis: RedisConfig) -> Self {
31 Self {
32 redis,
33 ..Self::default()
34 }
35 }
36
37 pub fn with_l1_capacity(mut self, capacity: u64) -> Self {
38 self.l1_capacity = capacity;
39 self
40 }
41
42 pub fn with_l1_ttl_secs(mut self, secs: u64) -> Self {
43 self.l1_ttl_secs = Some(secs);
44 self
45 }
46
47 pub fn with_l1_tti_secs(mut self, secs: u64) -> Self {
48 self.l1_tti_secs = Some(secs);
49 self
50 }
51
52 pub fn with_default_ttl_secs(mut self, secs: u64) -> Self {
53 self.default_ttl_secs = Some(secs);
54 self
55 }
56
57 pub fn with_backfill(mut self, enabled: bool) -> Self {
58 self.backfill_enabled = enabled;
59 self
60 }
61
62 pub fn validate(&self) -> Result<(), String> {
63 if self.l1_capacity == 0 {
64 return Err("cache.l1_capacity must be greater than 0".to_string());
65 }
66 self.redis.validate().map(|_| ())
67 }
68}
Modified lib/config/src/lib.rs lib/config/src/lib.rs +0 −4 View lib/config/src/lib.rs
@@ -3,7 +3,6 @@
33pub mod aihost;
44pub mod apihost;
55pub mod auth;
6pub mod cache;
76pub mod chat;
87pub mod ci;
98pub mod database;
@@ -40,7 +39,6 @@
4039use crate::aihost::AiHostServerConfig;
4140use crate::apihost::ApihostConfig;
4241use crate::auth::AuthConfig;
43use crate::cache::CacheConfig;
4442use crate::chat::ChatConfig;
4543use crate::ci::CiConfig;
4644use crate::database::DatabaseConfig;
@@ -71,7 +69,6 @@
7169pub struct AppConfig {
7270 pub s3: S3Config,
7371 pub redis: RedisConfig,
74 pub cache: CacheConfig,
7572 pub chat: ChatConfig,
7673 pub database: DatabaseConfig,
7774 pub session: SessionConfig,
@@ -111,7 +108,6 @@
111108 self.database.validate().map_err(ConfigError::Validation)?;
112109 self.pow.validate().map_err(ConfigError::Validation)?;
113110 self.auth.validate().map_err(ConfigError::Validation)?;
114 self.cache.validate().map_err(ConfigError::Validation)?;
115111 self.chat.is_valid().map_err(ConfigError::Validation)?;
116112 self.email.is_valid().map_err(ConfigError::Validation)?;
117113 self.email_queue
Modified lib/config/src/scoped.rs lib/config/src/scoped.rs +0 −14 View lib/config/src/scoped.rs
@@ -6,7 +6,6 @@
66use crate::aihost::AiHostServerConfig;
77use crate::apihost::ApihostConfig as ApihostSection;
88use crate::auth::AuthConfig;
9use crate::cache::CacheConfig;
109use crate::chat::ChatConfig;
1110use crate::ci::CiConfig;
1211use crate::database::DatabaseConfig;
@@ -81,7 +80,6 @@
8180 pub s3: S3Config,
8281 pub email: EmailConfig,
8382 pub email_queue: EmailQueueConfig,
84 pub cache: CacheConfig,
8583 pub web: WebConfig,
8684 pub git: GitConfig,
8785 pub ci: CiConfig,
@@ -97,7 +95,6 @@
9795 s3: self.s3,
9896 email: self.email,
9997 email_queue: self.email_queue,
100 cache: self.cache,
10198 web: self.web,
10299 git: self.git,
103100 ci: self.ci,
@@ -125,7 +122,6 @@
125122pub struct SynchostConfig {
126123 pub database: DatabaseConfig,
127124 pub redis: RedisConfig,
128 pub cache: CacheConfig,
129125 pub git: GitConfig,
130126 pub health: HealthConfig,
131127 pub search: SearchConfig,
@@ -136,7 +132,6 @@
136132 fn validate_scoped(&self) -> Result<(), String> {
137133 self.database.validate()?;
138134 self.redis.validate()?;
139 self.cache.validate()?;
140135 self.search.validate()?;
141136 self.import.validate()?;
142137 self.health.is_valid()
@@ -151,7 +146,6 @@
151146 pub s3: S3Config,
152147 pub email: EmailConfig,
153148 pub email_queue: EmailQueueConfig,
154 pub cache: CacheConfig,
155149 pub web: WebConfig,
156150 pub git: GitConfig,
157151 pub githost: GithostSection,
@@ -167,7 +161,6 @@
167161 s3: self.s3,
168162 email: self.email,
169163 email_queue: self.email_queue,
170 cache: self.cache,
171164 web: self.web,
172165 git: self.git,
173166 githost: self.githost,
@@ -182,7 +175,6 @@
182175 fn validate_scoped(&self) -> Result<(), String> {
183176 self.database.validate()?;
184177 self.redis.validate()?;
185 self.cache.validate()?;
186178 self.email.is_valid()?;
187179 self.email_queue.is_valid()?;
188180 self.githost.is_valid()?;
@@ -195,7 +187,6 @@
195187pub struct ApihostConfig {
196188 pub s3: S3Config,
197189 pub redis: RedisConfig,
198 pub cache: CacheConfig,
199190 pub chat: ChatConfig,
200191 pub database: DatabaseConfig,
201192 pub session: SessionConfig,
@@ -222,7 +213,6 @@
222213 AppConfig {
223214 s3: self.s3,
224215 redis: self.redis,
225 cache: self.cache,
226216 chat: self.chat,
227217 database: self.database,
228218 session: self.session,
@@ -253,7 +243,6 @@
253243 self.database.validate()?;
254244 self.pow.validate()?;
255245 self.auth.validate()?;
256 self.cache.validate()?;
257246 self.chat.is_valid()?;
258247 self.email.is_valid()?;
259248 self.email_queue.is_valid()?;
@@ -364,7 +353,6 @@
364353pub struct AiHostConfig {
365354 pub database: DatabaseConfig,
366355 pub redis: RedisConfig,
367 pub cache: CacheConfig,
368356 pub git: GitConfig,
369357 pub email: EmailConfig,
370358 pub email_queue: EmailQueueConfig,
@@ -379,7 +367,6 @@
379367 AppConfig {
380368 database: self.database,
381369 redis: self.redis,
382 cache: self.cache,
383370 git: self.git,
384371 email: self.email,
385372 email_queue: self.email_queue,
@@ -396,7 +383,6 @@
396383 fn validate_scoped(&self) -> Result<(), String> {
397384 self.database.validate()?;
398385 self.redis.validate()?;
399 self.cache.validate()?;
400386 self.ai.validate()?;
401387 self.aihost.is_valid()?;
402388 self.health.is_valid()
Modified lib/export/src/redis.rs lib/export/src/redis.rs +39 −17 View lib/export/src/redis.rs
@@ -2,7 +2,7 @@
22use std::sync::atomic::{AtomicUsize, Ordering};
33
44use config::redis::{RedisConfig, RedisMode};
5use redis::aio::{ConnectionManager, MultiplexedConnection};
5use redis::aio::{ConnectionManager, ConnectionManagerConfig, MultiplexedConnection};
66use redis::cluster_async::ClusterConnection;
77use redis::{ConnectionAddr, ConnectionInfo, Value};
88
@@ -47,12 +47,14 @@
4747 .split(',')
4848 .map(str::trim)
4949 .filter(|node| !node.is_empty())
50 .map(String::from)
51 .collect::<Vec<_>>();
52
53 let client =
54 redis::cluster::ClusterClient::new(nodes).map_err(ExportError::from)?;
55 let node_info = connection_info(url)?;
50 .map(|node| connection_info(node, &config))
51 .collect::<Result<Vec<_>, _>>()?;
52
53 let node_info = nodes.first().cloned();
54 let client = redis::cluster::ClusterClient::builder(nodes)
55 .connection_timeout(config.connection_timeout())
56 .build()
57 .map_err(ExportError::from)?;
5658
5759 let mut connections = Vec::with_capacity(pool_size);
5860 for _ in 0..pool_size {
@@ -64,20 +66,22 @@
6466 connections.push(RedisConnection::Cluster(connection));
6567 }
6668
67 (connections, Some(node_info))
69 (connections, node_info)
6870 }
6971 RedisMode::Standalone | RedisMode::Sentinel | RedisMode::ValkeyStandalone => {
72 let node_info = connection_info(url, &config)?;
73 let client = redis::Client::open(node_info.clone()).map_err(ExportError::from)?;
74 let manager_config = ConnectionManagerConfig::new()
75 .set_connection_timeout(Some(config.connection_timeout()));
7076 let mut connections = Vec::with_capacity(pool_size);
7177 for _ in 0..pool_size {
72 let client = redis::Client::open(url).map_err(ExportError::from)?;
73 let manager = ConnectionManager::new(client)
74 .await
75 .map_err(ExportError::from)?;
78 let manager =
79 ConnectionManager::new_with_config(client.clone(), manager_config.clone())
80 .await
81 .map_err(ExportError::from)?;
7682
7783 connections.push(RedisConnection::Standalone(manager));
7884 }
79
80 let node_info = connection_info(url)?;
8185
8286 (connections, Some(node_info))
8387 }
@@ -297,7 +301,7 @@
297301 .map(str::trim)
298302 .find(|node| !node.is_empty())
299303 .ok_or_else(|| ExportError::InvalidConfig("redis url contains no nodes".into()))?;
300 redis::Client::open(url).map_err(ExportError::from)?
304 redis::Client::open(connection_info(url, &self.config)?).map_err(ExportError::from)?
301305 };
302306 let config = redis::AsyncConnectionConfig::new()
303307 .set_response_timeout(None)
@@ -543,14 +547,32 @@
543547
544548/// Builds the connection info of the first configured node, used as a template
545549/// (scheme, auth, tls settings) for connections to other cluster nodes.
546fn connection_info(urls: &str) -> Result<ConnectionInfo, ExportError> {
550fn connection_info(urls: &str, config: &RedisConfig) -> Result<ConnectionInfo, ExportError> {
547551 let first = urls
548552 .split(',')
549553 .map(str::trim)
550554 .find(|node| !node.is_empty())
551555 .ok_or_else(|| ExportError::InvalidConfig("redis url contains no nodes".into()))?;
552556
553 Ok(redis::Client::open(first)?.get_connection_info().clone())
557 let url = if config.mode() == RedisMode::Cluster
558 && !(first.starts_with("redis://") || first.starts_with("rediss://"))
559 {
560 format!("redis://{first}")
561 } else {
562 first.to_string()
563 };
564 let info = redis::Client::open(url)?.get_connection_info().clone();
565 let mut settings = info.redis_settings().clone();
566 if let Some(database) = config.database {
567 settings = settings.set_db(i64::from(database));
568 }
569 if let Some(username) = config.username.as_deref().filter(|value| !value.is_empty()) {
570 settings = settings.set_username(username);
571 }
572 if let Some(password) = config.password.as_deref().filter(|value| !value.is_empty()) {
573 settings = settings.set_password(password);
574 }
575 Ok(info.set_redis_settings(settings))
554576}
555577
556578macro_rules! dispatch {
Modified lib/git/src/service/context.rs lib/git/src/service/context.rs +1 −1 View lib/git/src/service/context.rs
@@ -50,7 +50,7 @@
5050 found.ok_or(GitError::NotFound)?
5151 };
5252
53 let cache = Arc::new(CacheClient::new(&self.state.config.cache).await?);
53 let cache = Arc::new(CacheClient::new(self.state.redis.clone()));
5454 let git = &self.state.config.git;
5555
5656 Ok(GitContext {
Modified lib/git/src/service/repos.rs lib/git/src/service/repos.rs +1 −1 View lib/git/src/service/repos.rs
@@ -417,7 +417,7 @@
417417 (dir, repo)
418418 };
419419
420 let cache = std::sync::Arc::new(cache::CacheClient::new(&self.state.config.cache).await?);
420 let cache = std::sync::Arc::new(cache::CacheClient::new(self.state.redis.clone()));
421421 let git_cfg = &self.state.config.git;
422422 let ctx = GitContext {
423423 model: repo.clone(),
Modified lib/git/src/ssh/handler/channel.rs lib/git/src/ssh/handler/channel.rs +1 −7 View lib/git/src/ssh/handler/channel.rs
@@ -729,13 +729,7 @@
729729 .one(db.read())
730730 .await
731731 .ok()??;
732 let cache = match CacheClient::new(&service.smart.git.state.config.cache).await {
733 Ok(c) => Arc::new(c),
734 Err(error) => {
735 tracing::warn!(%error, "cache client init failed, skipping pre-receive check");
736 return None;
737 }
738 };
732 let cache = Arc::new(CacheClient::new(service.smart.git.state.redis.clone()));
739733 let git_cfg = &service.smart.git.state.config.git;
740734 let ctx = GitContext {
741735 model: repo,
Modified Cargo.lock Cargo.lock +9 −525 View Cargo.lock
@@ -290,15 +290,6 @@
290290]
291291
292292[[package]]
293name = "ar_archive_writer"
294version = "0.5.3"
295source = "registry+https://github.com/rust-lang/crates.io-index"
296checksum = "73cd58deff2140a0a8eae87e417bd01db68a33e148aa93d1e8cd837e55e312b6"
297dependencies = [
298 "object",
299]
300
301[[package]]
302293name = "arbitrary"
303294version = "1.4.2"
304295source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1222,24 +1213,13 @@
12221213name = "cache"
12231214version = "1.0.0"
12241215dependencies = [
1225 "config",
1226 "oxcache",
1216 "export",
1217 "redis",
12271218 "serde",
12281219 "serde_json",
1229 "tokio",
12301220]
12311221
12321222[[package]]
1233name = "calendrical_calculations"
1234version = "0.2.4"
1235source = "registry+https://github.com/rust-lang/crates.io-index"
1236checksum = "5abbd6eeda6885048d357edc66748eea6e0268e3dd11f326fff5bd248d779c26"
1237dependencies = [
1238 "core_maths",
1239 "displaydoc",
1240]
1241
1242[[package]]
12431223name = "cbc"
12441224version = "0.2.1"
12451225source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1607,15 +1587,6 @@
16071587]
16081588
16091589[[package]]
1610name = "core_maths"
1611version = "0.1.1"
1612source = "registry+https://github.com/rust-lang/crates.io-index"
1613checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30"
1614dependencies = [
1615 "libm",
1616]
1617
1618[[package]]
16191590name = "cpubits"
16201591version = "0.1.1"
16211592source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1679,15 +1650,6 @@
16791650]
16801651
16811652[[package]]
1682name = "crossbeam-epoch"
1683version = "0.9.20"
1684source = "registry+https://github.com/rust-lang/crates.io-index"
1685checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
1686dependencies = [
1687 "crossbeam-utils",
1688]
1689
1690[[package]]
16911653name = "crossbeam-queue"
16921654version = "0.3.13"
16931655source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2583,17 +2545,6 @@
25832545version = "0.1.11"
25842546source = "registry+https://github.com/rust-lang/crates.io-index"
25852547checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890"
2586
2587[[package]]
2588name = "fixed_decimal"
2589version = "0.7.2"
2590source = "registry+https://github.com/rust-lang/crates.io-index"
2591checksum = "79c3c892f121fff406e5dd6b28c1b30096b95111c30701a899d4f2b18da6d1bd"
2592dependencies = [
2593 "displaydoc",
2594 "smallvec",
2595 "writeable",
2596]
25972548
25982549[[package]]
25992550name = "fixedbitset"
@@ -4624,244 +4575,18 @@
46244575dependencies = [
46254576 "cc",
46264577]
4627
4628[[package]]
4629name = "icu"
4630version = "2.3.0"
4631source = "registry+https://github.com/rust-lang/crates.io-index"
4632checksum = "8d5080b89807979ab05f8b6f3c6bbd580ece1512a6cf4cf800baa76937e488b3"
4633dependencies = [
4634 "icu_calendar",
4635 "icu_casemap",
4636 "icu_collator",
4637 "icu_collections",
4638 "icu_datetime",
4639 "icu_decimal",
4640 "icu_experimental",
4641 "icu_list",
4642 "icu_locale",
4643 "icu_normalizer",
4644 "icu_pattern",
4645 "icu_plurals",
4646 "icu_properties",
4647 "icu_provider",
4648 "icu_segmenter",
4649 "icu_time",
4650]
4651
4652[[package]]
4653name = "icu_calendar"
4654version = "2.3.0"
4655source = "registry+https://github.com/rust-lang/crates.io-index"
4656checksum = "58655df2f728e46e4eee80bddebefacf52ec3e77cdb925014b47c5a5905eb55c"
4657dependencies = [
4658 "calendrical_calculations",
4659 "displaydoc",
4660 "icu_calendar_data",
4661 "icu_locale_core",
4662 "icu_locale_fallback",
4663 "icu_provider",
4664 "ixdtf",
4665 "serde",
4666 "tinystr",
4667 "zerovec",
4668]
4669
4670[[package]]
4671name = "icu_calendar_data"
4672version = "2.3.0"
4673source = "registry+https://github.com/rust-lang/crates.io-index"
4674checksum = "dc00caaa3fb3201ff7a18aa458e8c3ab042b9da154cfdf948bdde3936c31c36e"
4675
4676[[package]]
4677name = "icu_casemap"
4678version = "2.3.0"
4679source = "registry+https://github.com/rust-lang/crates.io-index"
4680checksum = "f2edfd120d8445de853cf53a1abec916f638f933a70a6f4bf8f7e2d7b7f884e9"
4681dependencies = [
4682 "icu_casemap_data",
4683 "icu_collections",
4684 "icu_locale_core",
4685 "icu_properties",
4686 "icu_provider",
4687 "potential_utf",
4688 "writeable",
4689 "zerovec",
4690]
4691
4692[[package]]
4693name = "icu_casemap_data"
4694version = "2.3.0"
4695source = "registry+https://github.com/rust-lang/crates.io-index"
4696checksum = "059fcda0fc8d33effc6633a8cf0d8a3c17caf7d7c91918fba9918744f501e4e8"
4697
4698[[package]]
4699name = "icu_collator"
4700version = "2.3.0"
4701source = "registry+https://github.com/rust-lang/crates.io-index"
4702checksum = "59eea194d189ca897bcb960fd2130f9e7d53998460d4d32e85a60b10d5507cf4"
4703dependencies = [
4704 "icu_collator_data",
4705 "icu_collections",
4706 "icu_locale_core",
4707 "icu_locale_fallback",
4708 "icu_normalizer",
4709 "icu_properties",
4710 "icu_provider",
4711 "smallvec",
4712 "utf16_iter",
4713 "utf8_iter",
4714 "zerovec",
4715]
4716
4717[[package]]
4718name = "icu_collator_data"
4719version = "2.3.0"
4720source = "registry+https://github.com/rust-lang/crates.io-index"
4721checksum = "f7d7e54efdddeb1208c08dd5d32b53a879ac00d2d3d051b2255fd26821d16368"
4722
4723[[package]]
4724name = "icu_collections"
4725version = "2.3.0"
4726source = "registry+https://github.com/rust-lang/crates.io-index"
4727checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513"
4728dependencies = [
4729 "displaydoc",
4730 "potential_utf",
4731 "serde",
4732 "utf8_iter",
4733 "yoke",
4734 "zerofrom",
4735 "zerovec",
4736]
4737
4738[[package]]
4739name = "icu_datetime"
4740version = "2.3.0"
4741source = "registry+https://github.com/rust-lang/crates.io-index"
4742checksum = "c44df99c4c5297b05653d1a1629f13bdc9fd4044acfbbaf30b15194a1eed4cd6"
4743dependencies = [
4744 "displaydoc",
4745 "fixed_decimal",
4746 "icu_calendar",
4747 "icu_datetime_data",
4748 "icu_decimal",
4749 "icu_locale_core",
4750 "icu_locale_fallback",
4751 "icu_pattern",
4752 "icu_plurals",
4753 "icu_provider",
4754 "icu_time",
4755 "potential_utf",
4756 "tinystr",
4757 "writeable",
4758 "zerovec",
4759]
4760
4761[[package]]
4762name = "icu_datetime_data"
4763version = "2.3.0"
4764source = "registry+https://github.com/rust-lang/crates.io-index"
4765checksum = "8bb5555f6e4b42233f58564351ce16d73e9e6ebfce6bdcf29875d0cfc554d6a8"
4766
4767[[package]]
4768name = "icu_decimal"
4769version = "2.3.0"
4770source = "registry+https://github.com/rust-lang/crates.io-index"
4771checksum = "9eb8f655bba2d0c0459e43a5b0e6cd3cd388109898fb3d85d048165e8b0abd08"
4772dependencies = [
4773 "displaydoc",
4774 "fixed_decimal",
4775 "icu_decimal_data",
4776 "icu_locale_core",
4777 "icu_locale_fallback",
4778 "icu_pattern",
4779 "icu_plurals",
4780 "icu_provider",
4781 "serde",
4782 "writeable",
4783 "zerovec",
4784]
4785
4786[[package]]
4787name = "icu_decimal_data"
4788version = "2.3.0"
4789source = "registry+https://github.com/rust-lang/crates.io-index"
4790checksum = "e4c887fc7d4c297cf3f9436864af9e3dba7f8be9415a6c2a7f392f3b1636298c"
4791
4792[[package]]
4793name = "icu_experimental"
4794version = "0.6.0"
4795source = "registry+https://github.com/rust-lang/crates.io-index"
4796checksum = "7c09609ad18e249b97a0afa20e19502c4d11ab039e6e35f5ecf48bebd4eedd7e"
4797dependencies = [
4798 "displaydoc",
4799 "either",
4800 "fixed_decimal",
4801 "icu_casemap",
4802 "icu_collections",
4803 "icu_decimal",
4804 "icu_experimental_data",
4805 "icu_list",
4806 "icu_locale",
4807 "icu_locale_core",
4808 "icu_locale_fallback",
4809 "icu_normalizer",
4810 "icu_pattern",
4811 "icu_plurals",
4812 "icu_properties",
4813 "icu_provider",
4814 "litemap",
4815 "num-bigint 0.4.8",
4816 "num-rational",
4817 "num-traits",
4818 "potential_utf",
4819 "smallvec",
4820 "tinystr",
4821 "writeable",
4822 "zerotrie",
4823 "zerovec",
4824]
4825
4826[[package]]
4827name = "icu_experimental_data"
4828version = "0.6.0"
4829source = "registry+https://github.com/rust-lang/crates.io-index"
4830checksum = "377481a8935d6774f410424d79a6dc8a09d9bd8def9560cff17abe755a246280"
4831
4832[[package]]
4833name = "icu_list"
4834version = "2.3.0"
4835source = "registry+https://github.com/rust-lang/crates.io-index"
4836checksum = "5a5c625125085fac4bf9ad111888a90c6ab9dc7bcaec392ca79cab417f46e3fb"
4837dependencies = [
4838 "icu_list_data",
4839 "icu_locale_fallback",
4840 "icu_provider",
4841 "regex-automata",
4842 "serde",
4843 "writeable",
4844 "zerovec",
4845]
4846
4847[[package]]
4848name = "icu_list_data"
4849version = "2.3.0"
4850source = "registry+https://github.com/rust-lang/crates.io-index"
4851checksum = "4ffef91ee351bd195a803115615a034dfb9f02bb48850980548c31cb78568a91"
48524578
48534579[[package]]
4854name = "icu_locale"
4580name = "icu_collections"
48554581version = "2.3.0"
48564582source = "registry+https://github.com/rust-lang/crates.io-index"
4857checksum = "250ec6d4ac288584d1d0ba29dbfad7737635b7b0e822441f4026a523e3fdb147"
4583checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513"
48584584dependencies = [
4859 "icu_collections",
4860 "icu_locale_core",
4861 "icu_locale_data",
4862 "icu_locale_fallback",
4863 "icu_provider",
4864 "tinystr",
4585 "displaydoc",
4586 "potential_utf",
4587 "utf8_iter",
4588 "yoke",
4589 "zerofrom",
48654590 "zerovec",
48664591]
48674592
@@ -4873,39 +4598,12 @@
48734598dependencies = [
48744599 "displaydoc",
48754600 "litemap",
4876 "serde",
48774601 "tinystr",
48784602 "writeable",
48794603 "zerovec",
48804604]
48814605
48824606[[package]]
4883name = "icu_locale_data"
4884version = "2.3.0"
4885source = "registry+https://github.com/rust-lang/crates.io-index"
4886checksum = "d37d91460e362a5cf58907cd7ce871411775ee6294e49a5cc8e6cec16dfa75ea"
4887
4888[[package]]
4889name = "icu_locale_fallback"
4890version = "2.3.0"
4891source = "registry+https://github.com/rust-lang/crates.io-index"
4892checksum = "251af8e57c9400e3eb58242fe5b8b1152b2a64fdf4cf632f923c38ccee6f2fa9"
4893dependencies = [
4894 "icu_locale_core",
4895 "icu_locale_fallback_data",
4896 "icu_provider",
4897 "potential_utf",
4898 "tinystr",
4899 "zerovec",
4900]
4901
4902[[package]]
4903name = "icu_locale_fallback_data"
4904version = "2.3.0"
4905source = "registry+https://github.com/rust-lang/crates.io-index"
4906checksum = "decf2a22ec8fa68f1a0c1129a3f8583f8f8bc24e8b9ccbe98ead99f62a4dc3a8"
4907
4908[[package]]
49094607name = "icu_normalizer"
49104608version = "2.3.0"
49114609source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4916,9 +4614,6 @@
49164614 "icu_properties",
49174615 "icu_provider",
49184616 "smallvec",
4919 "utf16_iter",
4920 "utf8_iter",
4921 "write16",
49224617 "zerovec",
49234618]
49244619
@@ -4929,39 +4624,6 @@
49294624checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0"
49304625
49314626[[package]]
4932name = "icu_pattern"
4933version = "0.5.0"
4934source = "registry+https://github.com/rust-lang/crates.io-index"
4935checksum = "2b3db611446bd92c246b03e4aa0bafa71ddb194af431ddbb42b9d70e4bfce1a0"
4936dependencies = [
4937 "displaydoc",
4938 "either",
4939 "serde",
4940 "writeable",
4941 "yoke",
4942 "zerovec",
4943]
4944
4945[[package]]
4946name = "icu_plurals"
4947version = "2.3.0"
4948source = "registry+https://github.com/rust-lang/crates.io-index"
4949checksum = "e475e6766ef87b1d3c1f97be6363995b0bfaeddbc789671615df598a97ff0593"
4950dependencies = [
4951 "fixed_decimal",
4952 "icu_locale_fallback",
4953 "icu_plurals_data",
4954 "icu_provider",
4955 "zerovec",
4956]
4957
4958[[package]]
4959name = "icu_plurals_data"
4960version = "2.3.0"
4961source = "registry+https://github.com/rust-lang/crates.io-index"
4962checksum = "1251aa39a95e1333888e499b1263e1c196447a28948acf5bdabd82c046f153bf"
4963
4964[[package]]
49654627name = "icu_properties"
49664628version = "2.3.0"
49674629source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4972,7 +4634,6 @@
49724634 "icu_locale_core",
49734635 "icu_properties_data",
49744636 "icu_provider",
4975 "serde",
49764637 "zerotrie",
49774638 "zerovec",
49784639]
@@ -4991,8 +4652,6 @@
49914652dependencies = [
49924653 "displaydoc",
49934654 "icu_locale_core",
4994 "serde",
4995 "stable_deref_trait",
49964655 "writeable",
49974656 "yoke",
49984657 "zerofrom",
@@ -5001,53 +4660,6 @@
50014660]
50024661
50034662[[package]]
5004name = "icu_segmenter"
5005version = "2.3.0"
5006source = "registry+https://github.com/rust-lang/crates.io-index"
5007checksum = "82d07aafccd67af15d02512a6adf5896fbc5ed00f2e99b471d2efa14016db3db"
5008dependencies = [
5009 "core_maths",
5010 "icu_collections",
5011 "icu_locale_fallback",
5012 "icu_provider",
5013 "icu_segmenter_data",
5014 "potential_utf",
5015 "smallvec",
5016 "utf8_iter",
5017 "zerovec",
5018]
5019
5020[[package]]
5021name = "icu_segmenter_data"
5022version = "2.3.0"
5023source = "registry+https://github.com/rust-lang/crates.io-index"
5024checksum = "ae293c039020f9ec10710af98d29ce6aa2051486638b49c9a6409f3b4a9e98ad"
5025
5026[[package]]
5027name = "icu_time"
5028version = "2.3.0"
5029source = "registry+https://github.com/rust-lang/crates.io-index"
5030checksum = "af37e1c3b9f3ab564b619fdf4b22de169f6381eb0f7048e3ca454290c438126b"
5031dependencies = [
5032 "calendrical_calculations",
5033 "displaydoc",
5034 "icu_calendar",
5035 "icu_locale_core",
5036 "icu_provider",
5037 "icu_time_data",
5038 "ixdtf",
5039 "serde",
5040 "zerotrie",
5041 "zerovec",
5042]
5043
5044[[package]]
5045name = "icu_time_data"
5046version = "2.3.0"
5047source = "registry+https://github.com/rust-lang/crates.io-index"
5048checksum = "005ff86fa5851a77fc0a977b72d717f777bd9230415a247219d7898aefb1517a"
5049
5050[[package]]
50514663name = "ident_case"
50524664version = "1.0.1"
50534665source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5327,12 +4939,6 @@
53274939checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
53284940
53294941[[package]]
5330name = "ixdtf"
5331version = "0.6.6"
5332source = "registry+https://github.com/rust-lang/crates.io-index"
5333checksum = "4d3667095d64c3ecffc96463a21157b04bf3e252f6e8d5750b20c02e33c194e3"
5334
5335[[package]]
53364942name = "jiff"
53374943version = "0.2.35"
53384944source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -6116,26 +5722,6 @@
61165722]
61175723
61185724[[package]]
6119name = "moka"
6120version = "0.12.16"
6121source = "registry+https://github.com/rust-lang/crates.io-index"
6122checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9"
6123dependencies = [
6124 "async-lock",
6125 "crossbeam-channel",
6126 "crossbeam-epoch",
6127 "crossbeam-utils",
6128 "equivalent",
6129 "event-listener",
6130 "futures-util",
6131 "parking_lot",
6132 "portable-atomic",
6133 "smallvec",
6134 "tagptr",
6135 "uuid",
6136]
6137
6138[[package]]
61395725name = "moxcms"
61405726version = "0.8.1"
61415727source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -6329,17 +5915,6 @@
63295915]
63305916
63315917[[package]]
6332name = "num-rational"
6333version = "0.4.2"
6334source = "registry+https://github.com/rust-lang/crates.io-index"
6335checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
6336dependencies = [
6337 "num-bigint 0.4.8",
6338 "num-integer",
6339 "num-traits",
6340]
6341
6342[[package]]
63435918name = "num-traits"
63445919version = "0.2.19"
63455920source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -6519,15 +6094,6 @@
65196094]
65206095
65216096[[package]]
6522name = "object"
6523version = "0.39.1"
6524source = "registry+https://github.com/rust-lang/crates.io-index"
6525checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b"
6526dependencies = [
6527 "memchr",
6528]
6529
6530[[package]]
65316097name = "once_cell"
65326098version = "1.21.4"
65336099source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -6735,28 +6301,6 @@
67356301]
67366302
67376303[[package]]
6738name = "oxcache"
6739version = "0.4.3"
6740source = "registry+https://github.com/rust-lang/crates.io-index"
6741checksum = "985b963bd0d5a36076847f9bb33cb1de9a1d91ceb2a03d6d8b1b50e86118a5fb"
6742dependencies = [
6743 "async-trait",
6744 "chrono",
6745 "dashmap",
6746 "icu",
6747 "moka",
6748 "once_cell",
6749 "redis",
6750 "regex",
6751 "serde",
6752 "serde_json",
6753 "serde_stacker",
6754 "tokio",
6755 "uuid",
6756 "writeable",
6757]
6758
6759[[package]]
67606304name = "p256"
67616305version = "0.13.2"
67626306source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -7353,8 +6897,6 @@
73536897source = "registry+https://github.com/rust-lang/crates.io-index"
73546898checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
73556899dependencies = [
7356 "serde_core",
7357 "writeable",
73586900 "zerovec",
73596901]
73606902
@@ -7547,16 +7089,6 @@
75477089]
75487090
75497091[[package]]
7550name = "psm"
7551version = "0.1.32"
7552source = "registry+https://github.com/rust-lang/crates.io-index"
7553checksum = "4dcd034599e63b970727f70d79e02d62390a4a84f7c6b827c27c46d5ac3fa622"
7554dependencies = [
7555 "ar_archive_writer",
7556 "cc",
7557]
7558
7559[[package]]
75607092name = "ptr_meta"
75617093version = "0.1.4"
75627094source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -8854,17 +8386,6 @@
88548386]
88558387
88568388[[package]]
8857name = "serde_stacker"
8858version = "0.1.14"
8859source = "registry+https://github.com/rust-lang/crates.io-index"
8860checksum = "d4936375d50c4be7eff22293a9344f8e46f323ed2b3c243e52f89138d9bb0f4a"
8861dependencies = [
8862 "serde",
8863 "serde_core",
8864 "stacker",
8865]
8866
8867[[package]]
88688389name = "serde_urlencoded"
88698390version = "0.7.1"
88708391source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -9530,19 +9051,6 @@
95309051checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
95319052
95329053[[package]]
9533name = "stacker"
9534version = "0.1.25"
9535source = "registry+https://github.com/rust-lang/crates.io-index"
9536checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967"
9537dependencies = [
9538 "cc",
9539 "cfg-if",
9540 "libc",
9541 "psm",
9542 "windows-sys 0.61.2",
9543]
9544
9545[[package]]
95469054name = "static_assertions"
95479055version = "1.1.0"
95489056source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -9725,12 +9233,6 @@
97259233]
97269234
97279235[[package]]
9728name = "tagptr"
9729version = "0.2.0"
9730source = "registry+https://github.com/rust-lang/crates.io-index"
9731checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
9732
9733[[package]]
97349236name = "tap"
97359237version = "1.0.1"
97369238source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -9855,7 +9357,6 @@
98559357checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643"
98569358dependencies = [
98579359 "displaydoc",
9858 "serde_core",
98599360 "zerovec",
98609361]
98619362
@@ -10502,12 +10003,6 @@
1050210003]
1050310004
1050410005[[package]]
10505name = "utf16_iter"
10506version = "1.0.5"
10507source = "registry+https://github.com/rust-lang/crates.io-index"
10508checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
10509
10510[[package]]
1051110006name = "utf8_iter"
1051210007version = "1.0.4"
1051310008source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -11286,19 +10781,10 @@
1128610781]
1128710782
1128810783[[package]]
11289name = "write16"
11290version = "1.0.0"
11291source = "registry+https://github.com/rust-lang/crates.io-index"
11292checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
11293
11294[[package]]
1129510784name = "writeable"
1129610785version = "0.6.4"
1129710786source = "registry+https://github.com/rust-lang/crates.io-index"
1129810787checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
11299dependencies = [
11300 "either",
11301]
1130210788
1130310789[[package]]
1130410790name = "wyz"
@@ -11420,7 +10906,6 @@
1142010906 "displaydoc",
1142110907 "yoke",
1142210908 "zerofrom",
11423 "zerovec",
1142410909]
1142510910
1142610911[[package]]
@@ -11429,7 +10914,6 @@
1142910914source = "registry+https://github.com/rust-lang/crates.io-index"
1143010915checksum = "94b5c6b5976d66c1d703c4fd17d3f5e43c8cedaacf604961b171adc7130896d8"
1143110916dependencies = [
11432 "serde",
1143310917 "yoke",
1143410918 "zerofrom",
1143510919 "zerovec-derive",
Modified Cargo.toml Cargo.toml +0 −1 View Cargo.toml
@@ -68,7 +68,6 @@
6868rust-s3-async = "0.35.0"
6969redis = { version = "1.6.0", features = ["aio", "tokio-comp", "connection-manager", "cluster-async"] }
7070sea-orm = { version = "2.0.2", features = ["sqlx-postgres", "runtime-tokio-rustls"] }
71oxcache = { version = "0.4.3", features = ["core"] }
7271async-trait = "0.1.92"
7372async-graphql = "7.0"
7473base64 = "0.23.1"