From ee4c5d80e687c1881acbc99616ac02d9f0b19359 Mon Sep 17 00:00:00 2001 From: Paolo Barbolini Date: Sat, 1 Feb 2025 13:35:19 +0100 Subject: [PATCH] chore: replace once_cell `OnceCell`/`Lazy` with std `OnceLock`/`LazyLock` --- Cargo.lock | 5 ----- .../postgres/axum-social-with-tests/Cargo.toml | 1 - sqlx-bench/Cargo.toml | 1 - sqlx-core/Cargo.toml | 1 - sqlx-core/src/any/driver.rs | 4 ++-- sqlx-macros-core/Cargo.toml | 1 - sqlx-macros-core/src/database/mod.rs | 8 +++----- sqlx-macros-core/src/lib.rs | 5 +++-- sqlx-macros-core/src/query/data.rs | 7 +++---- sqlx-macros-core/src/query/mod.rs | 5 ++--- sqlx-mysql/Cargo.toml | 1 - sqlx-mysql/src/testing/mod.rs | 17 +++++++++++++---- sqlx-postgres/Cargo.toml | 1 - sqlx-postgres/src/advisory_lock.rs | 6 +++--- sqlx-postgres/src/testing/mod.rs | 17 +++++++++++++---- 15 files changed, 42 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 355cee90b6..e455340a00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3455,7 +3455,6 @@ dependencies = [ "mac_address", "memchr", "native-tls", - "once_cell", "percent-encoding", "regex", "rust_decimal", @@ -3495,7 +3494,6 @@ dependencies = [ "argon2", "axum", "dotenvy", - "once_cell", "rand", "regex", "serde", @@ -3622,7 +3620,6 @@ dependencies = [ "either", "heck 0.5.0", "hex", - "once_cell", "proc-macro2", "quote", "serde", @@ -3665,7 +3662,6 @@ dependencies = [ "log", "md-5", "memchr", - "once_cell", "percent-encoding", "rand", "rsa", @@ -3713,7 +3709,6 @@ dependencies = [ "md-5", "memchr", "num-bigint", - "once_cell", "rand", "rust_decimal", "serde", diff --git a/examples/postgres/axum-social-with-tests/Cargo.toml b/examples/postgres/axum-social-with-tests/Cargo.toml index 6cb3b73ce5..05257a617c 100644 --- a/examples/postgres/axum-social-with-tests/Cargo.toml +++ b/examples/postgres/axum-social-with-tests/Cargo.toml @@ -24,7 +24,6 @@ validator = { version = "0.16.0", features = ["derive"] } # Auxilliary crates anyhow = "1.0.58" dotenvy = "0.15.1" -once_cell = "1.13.0" thiserror = "2.0.0" tracing = "0.1.35" diff --git a/sqlx-bench/Cargo.toml b/sqlx-bench/Cargo.toml index 0aa9532034..aeae61a91c 100644 --- a/sqlx-bench/Cargo.toml +++ b/sqlx-bench/Cargo.toml @@ -28,7 +28,6 @@ sqlite = ["sqlx/sqlite"] [dependencies] criterion = "0.5.1" dotenvy = "0.15.0" -once_cell = "1.4" sqlx = { workspace = true, default-features = false, features = ["macros"] } chrono = "0.4.19" diff --git a/sqlx-core/Cargo.toml b/sqlx-core/Cargo.toml index f6017a9fee..60d5bf5c42 100644 --- a/sqlx-core/Cargo.toml +++ b/sqlx-core/Cargo.toml @@ -66,7 +66,6 @@ futures-intrusive = "0.5.0" futures-util = { version = "0.3.19", default-features = false, features = ["alloc", "sink", "io"] } log = { version = "0.4.18", default-features = false } memchr = { version = "2.4.1", default-features = false } -once_cell = "1.9.0" percent-encoding = "2.1.0" regex = { version = "1.5.5", optional = true } serde = { version = "1.0.132", features = ["derive", "rc"], optional = true } diff --git a/sqlx-core/src/any/driver.rs b/sqlx-core/src/any/driver.rs index cf97b84812..1fe5288cd2 100644 --- a/sqlx-core/src/any/driver.rs +++ b/sqlx-core/src/any/driver.rs @@ -5,11 +5,11 @@ use crate::connection::Connection; use crate::database::Database; use crate::Error; use futures_core::future::BoxFuture; -use once_cell::sync::OnceCell; use std::fmt::{Debug, Formatter}; +use std::sync::OnceLock; use url::Url; -static DRIVERS: OnceCell<&'static [AnyDriver]> = OnceCell::new(); +static DRIVERS: OnceLock<&'static [AnyDriver]> = OnceLock::new(); #[macro_export] macro_rules! declare_driver_with_optional_migrate { diff --git a/sqlx-macros-core/Cargo.toml b/sqlx-macros-core/Cargo.toml index 85efa80912..893a5f4b39 100644 --- a/sqlx-macros-core/Cargo.toml +++ b/sqlx-macros-core/Cargo.toml @@ -59,7 +59,6 @@ dotenvy = { workspace = true } hex = { version = "0.4.3" } heck = { version = "0.5" } either = "1.6.1" -once_cell = "1.9.0" proc-macro2 = { version = "1.0.79", default-features = false } serde = { version = "1.0.132", features = ["derive"] } serde_json = { version = "1.0.73" } diff --git a/sqlx-macros-core/src/database/mod.rs b/sqlx-macros-core/src/database/mod.rs index a2d0a1fa0d..02486bd373 100644 --- a/sqlx-macros-core/src/database/mod.rs +++ b/sqlx-macros-core/src/database/mod.rs @@ -1,8 +1,6 @@ use std::collections::hash_map; use std::collections::HashMap; -use std::sync::Mutex; - -use once_cell::sync::Lazy; +use std::sync::{LazyLock, Mutex}; use sqlx_core::connection::Connection; use sqlx_core::database::Database; @@ -30,14 +28,14 @@ pub trait DatabaseExt: Database + TypeChecking { #[allow(dead_code)] pub struct CachingDescribeBlocking { - connections: Lazy>>, + connections: LazyLock>>, } #[allow(dead_code)] impl CachingDescribeBlocking { pub const fn new() -> Self { CachingDescribeBlocking { - connections: Lazy::new(|| Mutex::new(HashMap::new())), + connections: LazyLock::new(|| Mutex::new(HashMap::new())), } } diff --git a/sqlx-macros-core/src/lib.rs b/sqlx-macros-core/src/lib.rs index e8804f57fe..0bd8f38bb7 100644 --- a/sqlx-macros-core/src/lib.rs +++ b/sqlx-macros-core/src/lib.rs @@ -57,12 +57,13 @@ where { #[cfg(feature = "_rt-tokio")] { - use once_cell::sync::Lazy; + use std::sync::LazyLock; + use tokio::runtime::{self, Runtime}; // We need a single, persistent Tokio runtime since we're caching connections, // otherwise we'll get "IO driver has terminated" errors. - static TOKIO_RT: Lazy = Lazy::new(|| { + static TOKIO_RT: LazyLock = LazyLock::new(|| { runtime::Builder::new_current_thread() .enable_all() .build() diff --git a/sqlx-macros-core/src/query/data.rs b/sqlx-macros-core/src/query/data.rs index ddf55c8bb2..470f86f973 100644 --- a/sqlx-macros-core/src/query/data.rs +++ b/sqlx-macros-core/src/query/data.rs @@ -4,9 +4,8 @@ use std::fs; use std::io::Write as _; use std::marker::PhantomData; use std::path::{Path, PathBuf}; -use std::sync::Mutex; +use std::sync::{LazyLock, Mutex}; -use once_cell::sync::Lazy; use serde::{Serialize, Serializer}; use sqlx_core::database::Database; @@ -65,8 +64,8 @@ impl Serialize for SerializeDbName { } } -static OFFLINE_DATA_CACHE: Lazy>> = - Lazy::new(Default::default); +static OFFLINE_DATA_CACHE: LazyLock>> = + LazyLock::new(Default::default); /// Offline query data #[derive(Clone, serde::Deserialize)] diff --git a/sqlx-macros-core/src/query/mod.rs b/sqlx-macros-core/src/query/mod.rs index d2392e2d0e..bca27cd789 100644 --- a/sqlx-macros-core/src/query/mod.rs +++ b/sqlx-macros-core/src/query/mod.rs @@ -1,9 +1,8 @@ use std::collections::HashMap; use std::path::PathBuf; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, LazyLock, Mutex}; use std::{fs, io}; -use once_cell::sync::Lazy; use proc_macro2::TokenStream; use syn::Type; @@ -107,7 +106,7 @@ impl Metadata { } } -static METADATA: Lazy>> = Lazy::new(Default::default); +static METADATA: LazyLock>> = LazyLock::new(Default::default); // If we are in a workspace, lookup `workspace_root` since `CARGO_MANIFEST_DIR` won't // reflect the workspace dir: https://github.com/rust-lang/cargo/issues/3946 diff --git a/sqlx-mysql/Cargo.toml b/sqlx-mysql/Cargo.toml index 3971c2ff87..862cb9d5d7 100644 --- a/sqlx-mysql/Cargo.toml +++ b/sqlx-mysql/Cargo.toml @@ -62,7 +62,6 @@ hex = "0.4.3" itoa = "1.0.1" log = "0.4.18" memchr = { version = "2.4.1", default-features = false } -once_cell = "1.9.0" percent-encoding = "2.1.0" smallvec = "1.7.0" stringprep = "0.1.2" diff --git a/sqlx-mysql/src/testing/mod.rs b/sqlx-mysql/src/testing/mod.rs index 1981cf73c5..9ff3f47d8b 100644 --- a/sqlx-mysql/src/testing/mod.rs +++ b/sqlx-mysql/src/testing/mod.rs @@ -1,10 +1,10 @@ use std::ops::Deref; use std::str::FromStr; +use std::sync::OnceLock; use std::time::Duration; use futures_core::future::BoxFuture; -use once_cell::sync::OnceCell; use sqlx_core::connection::Connection; use sqlx_core::query_builder::QueryBuilder; use sqlx_core::query_scalar::query_scalar; @@ -18,8 +18,8 @@ use crate::{MySql, MySqlConnectOptions, MySqlConnection}; pub(crate) use sqlx_core::testing::*; -// Using a blocking `OnceCell` here because the critical sections are short. -static MASTER_POOL: OnceCell> = OnceCell::new(); +// Using a blocking `OnceLock` here because the critical sections are short. +static MASTER_POOL: OnceLock> = OnceLock::new(); impl TestSupport for MySql { fn test_context(args: &TestArgs) -> BoxFuture<'_, Result, Error>> { @@ -119,7 +119,7 @@ async fn test_context(args: &TestArgs) -> Result, Error> { .after_release(|_conn, _| Box::pin(async move { Ok(false) })) .connect_lazy_with(master_opts); - let master_pool = match MASTER_POOL.try_insert(pool) { + let master_pool = match once_lock_try_insert_polyfill(&MASTER_POOL, pool) { Ok(inserted) => inserted, Err((existing, pool)) => { // Sanity checks. @@ -195,3 +195,12 @@ async fn do_cleanup(conn: &mut MySqlConnection, db_name: &str) -> Result<(), Err Ok(()) } + +fn once_lock_try_insert_polyfill(this: &OnceLock, value: T) -> Result<&T, (&T, T)> { + let mut value = Some(value); + let res = this.get_or_init(|| value.take().unwrap()); + match value { + None => Ok(res), + Some(value) => Err((res, value)), + } +} diff --git a/sqlx-postgres/Cargo.toml b/sqlx-postgres/Cargo.toml index 818aadbab7..9e4783590e 100644 --- a/sqlx-postgres/Cargo.toml +++ b/sqlx-postgres/Cargo.toml @@ -63,7 +63,6 @@ itoa = "1.0.1" log = "0.4.18" memchr = { version = "2.4.1", default-features = false } num-bigint = { version = "0.4.3", optional = true } -once_cell = "1.9.0" smallvec = { version = "1.7.0", features = ["serde"] } stringprep = "0.1.2" thiserror = "2.0.0" diff --git a/sqlx-postgres/src/advisory_lock.rs b/sqlx-postgres/src/advisory_lock.rs index d1aef176fb..374e7f562f 100644 --- a/sqlx-postgres/src/advisory_lock.rs +++ b/sqlx-postgres/src/advisory_lock.rs @@ -2,9 +2,9 @@ use crate::error::Result; use crate::Either; use crate::PgConnection; use hkdf::Hkdf; -use once_cell::sync::OnceCell; use sha2::Sha256; use std::ops::{Deref, DerefMut}; +use std::sync::OnceLock; /// A mutex-like type utilizing [Postgres advisory locks]. /// @@ -37,7 +37,7 @@ use std::ops::{Deref, DerefMut}; pub struct PgAdvisoryLock { key: PgAdvisoryLockKey, /// The query to execute to release this lock. - release_query: OnceCell, + release_query: OnceLock, } /// A key type natively used by Postgres advisory locks. @@ -163,7 +163,7 @@ impl PgAdvisoryLock { pub fn with_key(key: PgAdvisoryLockKey) -> Self { Self { key, - release_query: OnceCell::new(), + release_query: OnceLock::new(), } } diff --git a/sqlx-postgres/src/testing/mod.rs b/sqlx-postgres/src/testing/mod.rs index af20fe87ea..0c15dd807b 100644 --- a/sqlx-postgres/src/testing/mod.rs +++ b/sqlx-postgres/src/testing/mod.rs @@ -1,11 +1,11 @@ use std::fmt::Write; use std::ops::Deref; use std::str::FromStr; +use std::sync::OnceLock; use std::time::Duration; use futures_core::future::BoxFuture; -use once_cell::sync::OnceCell; use sqlx_core::connection::Connection; use sqlx_core::query_scalar::query_scalar; @@ -17,8 +17,8 @@ use crate::{PgConnectOptions, PgConnection, Postgres}; pub(crate) use sqlx_core::testing::*; -// Using a blocking `OnceCell` here because the critical sections are short. -static MASTER_POOL: OnceCell> = OnceCell::new(); +// Using a blocking `OnceLock` here because the critical sections are short. +static MASTER_POOL: OnceLock> = OnceLock::new(); // Automatically delete any databases created before the start of the test binary. impl TestSupport for Postgres { @@ -106,7 +106,7 @@ async fn test_context(args: &TestArgs) -> Result, Error> { .after_release(|_conn, _| Box::pin(async move { Ok(false) })) .connect_lazy_with(master_opts); - let master_pool = match MASTER_POOL.try_insert(pool) { + let master_pool = match once_lock_try_insert_polyfill(&MASTER_POOL, pool) { Ok(inserted) => inserted, Err((existing, pool)) => { // Sanity checks. @@ -199,3 +199,12 @@ async fn do_cleanup(conn: &mut PgConnection, db_name: &str) -> Result<(), Error> Ok(()) } + +fn once_lock_try_insert_polyfill(this: &OnceLock, value: T) -> Result<&T, (&T, T)> { + let mut value = Some(value); + let res = this.get_or_init(|| value.take().unwrap()); + match value { + None => Ok(res), + Some(value) => Err((res, value)), + } +}