Skip to content

Commit 500aef3

Browse files
ysaito1001jdisanti
andauthored
Add SharedAsyncSleep wrapping Arc<dyn AsyncSleep> (#2742)
## Motivation and Context Add `SharedAsyncSleep` wrapping `Arc<dyn AsyncSleep>` and update call sites of `Arc<dyn AsyncSleep>` to use `SharedAsyncSleep` ## Description Public APIs that take/return a trait object for `AsyncSleep` have been using `Arc<dyn AsyncSleep>` in the codebase. This has a downside of exposing a bare `Arc`, making it difficult to change the APIs in the future without breaking backwards compatibility. This PR adds a newtype wrapper `SharedAsyncSleep` that hides `Arc<dyn AsyncSleep>` to alleviate the said issue (the idiom of having `SharedXXX` has been seen in the codebase, e.g. `SharedTimeSource`, `SharedCredentialsProvider`, and so on). ## Testing - [x] Passed tests in CI ## Checklist <!--- If a checkbox below is not applicable, then please DELETE it rather than leaving it unchecked --> - [x] I have updated `CHANGELOG.next.toml` if I made changes to the smithy-rs codegen or runtime crates - [x] I have updated `CHANGELOG.next.toml` if I made changes to the AWS SDK, generated SDK code, or SDK runtime crates ---- _By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._ --------- Co-authored-by: Yuki Saito <awsaito@amazon.com> Co-authored-by: John DiSanti <jdisanti@amazon.com>
1 parent 7ea3ed9 commit 500aef3

File tree

35 files changed

+205
-182
lines changed

35 files changed

+205
-182
lines changed

CHANGELOG.next.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,15 @@ message = "The SDK has added support for timestreamwrite and timestreamquery. Su
121121
meta = { "breaking" = false, "tada" = true, "bug" = false }
122122
references = ["smithy-rs#2707", "aws-sdk-rust#114"]
123123
author = "rcoh"
124+
125+
[[smithy-rs]]
126+
message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc<dyn AsyncSleep>` that appear in public APIs have been replaced with it."
127+
references = ["smithy-rs#2742"]
128+
meta = { "breaking" = true, "tada" = false, "bug" = false, "target" = "client" }
129+
author = "ysaito1001"
130+
131+
[[aws-sdk-rust]]
132+
message = "A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc<dyn AsyncSleep>` that appear in public APIs have been replaced with it."
133+
references = ["smithy-rs#2742"]
134+
meta = { "breaking" = true, "tada" = false, "bug" = false }
135+
author = "ysaito1001"

aws/rust-runtime/aws-config/src/connector.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ pub use aws_smithy_client::conns::default_connector;
1919
#[cfg(all(feature = "native-tls", not(feature = "allow-compilation")))]
2020
compile_error!("Feature native-tls has been removed. For upgrade instructions, see: https://awslabs.github.io/smithy-rs/design/transport/connector.html");
2121

22-
/// Given `ConnectorSettings` and an `AsyncSleep`, create a `DynConnector` from defaults depending on what cargo features are activated.
22+
/// Given `ConnectorSettings` and a [`SharedAsyncSleep`](aws_smithy_async::rt::sleep::SharedAsyncSleep), create a `DynConnector` from defaults depending on what cargo features are activated.
2323
#[cfg(not(feature = "client-hyper"))]
2424
pub fn default_connector(
2525
_settings: &aws_smithy_client::http_connector::ConnectorSettings,
26-
_sleep: Option<std::sync::Arc<dyn aws_smithy_async::rt::sleep::AsyncSleep>>,
26+
_sleep: Option<aws_smithy_async::rt::sleep::SharedAsyncSleep>,
2727
) -> Option<DynConnector> {
2828
None
2929
}

aws/rust-runtime/aws-config/src/imds/client/token.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::imds::client::error::{ImdsError, TokenError, TokenErrorKind};
1818
use crate::imds::client::ImdsResponseRetryClassifier;
1919
use aws_credential_types::cache::ExpiringCache;
2020
use aws_http::user_agent::UserAgentStage;
21-
use aws_smithy_async::rt::sleep::AsyncSleep;
21+
use aws_smithy_async::rt::sleep::SharedAsyncSleep;
2222
use aws_smithy_async::time::SharedTimeSource;
2323
use aws_smithy_client::erase::DynConnector;
2424
use aws_smithy_client::retry;
@@ -84,7 +84,7 @@ impl TokenMiddleware {
8484
token_ttl: Duration,
8585
retry_config: retry::Config,
8686
timeout_config: TimeoutConfig,
87-
sleep_impl: Option<Arc<dyn AsyncSleep>>,
87+
sleep_impl: Option<SharedAsyncSleep>,
8888
) -> Self {
8989
let mut inner_builder = aws_smithy_client::Client::builder()
9090
.connector(connector)

aws/rust-runtime/aws-config/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ mod loader {
154154

155155
use aws_credential_types::cache::CredentialsCache;
156156
use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider};
157-
use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep};
157+
use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep};
158158
use aws_smithy_async::time::{SharedTimeSource, TimeSource};
159159
use aws_smithy_client::http_connector::HttpConnector;
160160
use aws_smithy_types::retry::RetryConfig;
@@ -185,7 +185,7 @@ mod loader {
185185
endpoint_url: Option<String>,
186186
region: Option<Box<dyn ProvideRegion>>,
187187
retry_config: Option<RetryConfig>,
188-
sleep: Option<Arc<dyn AsyncSleep>>,
188+
sleep: Option<SharedAsyncSleep>,
189189
timeout_config: Option<TimeoutConfig>,
190190
provider_config: Option<ProviderConfig>,
191191
http_connector: Option<HttpConnector>,
@@ -260,7 +260,7 @@ mod loader {
260260
/// is used to create timeout futures.
261261
pub fn sleep_impl(mut self, sleep: impl AsyncSleep + 'static) -> Self {
262262
// it's possible that we could wrapping an `Arc in an `Arc` and that's OK
263-
self.sleep = Some(Arc::new(sleep));
263+
self.sleep = Some(SharedAsyncSleep::new(sleep));
264264
self
265265
}
266266

aws/rust-runtime/aws-config/src/provider_config.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
//! Configuration Options for Credential Providers
77
88
use aws_credential_types::time_source::TimeSource;
9-
use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep};
9+
use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep};
1010
use aws_smithy_async::time::SharedTimeSource;
1111
use aws_smithy_client::erase::DynConnector;
1212
use aws_smithy_types::error::display::DisplayErrorContext;
@@ -41,7 +41,7 @@ pub struct ProviderConfig {
4141
fs: Fs,
4242
time_source: SharedTimeSource,
4343
connector: HttpConnector,
44-
sleep: Option<Arc<dyn AsyncSleep>>,
44+
sleep: Option<SharedAsyncSleep>,
4545
region: Option<Region>,
4646
/// An AWS profile created from `ProfileFiles` and a `profile_name`
4747
parsed_profile: Arc<OnceCell<Result<ProfileSet, ProfileFileLoadError>>>,
@@ -65,7 +65,7 @@ impl Debug for ProviderConfig {
6565
impl Default for ProviderConfig {
6666
fn default() -> Self {
6767
let connector = HttpConnector::ConnectorFn(Arc::new(
68-
|settings: &ConnectorSettings, sleep: Option<Arc<dyn AsyncSleep>>| {
68+
|settings: &ConnectorSettings, sleep: Option<SharedAsyncSleep>| {
6969
default_connector(settings, sleep)
7070
},
7171
));
@@ -195,7 +195,7 @@ impl ProviderConfig {
195195
}
196196

197197
#[allow(dead_code)]
198-
pub(crate) fn sleep(&self) -> Option<Arc<dyn AsyncSleep>> {
198+
pub(crate) fn sleep(&self) -> Option<SharedAsyncSleep> {
199199
self.sleep.clone()
200200
}
201201

@@ -332,8 +332,7 @@ impl ProviderConfig {
332332
C::Future: Unpin + Send + 'static,
333333
C::Error: Into<Box<dyn std::error::Error + Send + Sync + 'static>>,
334334
{
335-
let connector_fn = move |settings: &ConnectorSettings,
336-
sleep: Option<Arc<dyn AsyncSleep>>| {
335+
let connector_fn = move |settings: &ConnectorSettings, sleep: Option<SharedAsyncSleep>| {
337336
let mut builder = aws_smithy_client::hyper_ext::Adapter::builder()
338337
.connector_settings(settings.clone());
339338
if let Some(sleep) = sleep {
@@ -350,7 +349,7 @@ impl ProviderConfig {
350349
/// Override the sleep implementation for this configuration
351350
pub fn with_sleep(self, sleep: impl AsyncSleep + 'static) -> Self {
352351
ProviderConfig {
353-
sleep: Some(Arc::new(sleep)),
352+
sleep: Some(SharedAsyncSleep::new(sleep)),
354353
..self
355354
}
356355
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
allowed_external_types = [
2-
"aws_smithy_async::rt::sleep::AsyncSleep",
2+
"aws_smithy_async::rt::sleep::SharedAsyncSleep",
33
]

aws/rust-runtime/aws-credential-types/src/cache/lazy_caching.rs

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55

66
//! Lazy, credentials cache implementation
77
8-
use std::sync::Arc;
98
use std::time::{Duration, Instant};
109

1110
use aws_smithy_async::future::timeout::Timeout;
12-
use aws_smithy_async::rt::sleep::AsyncSleep;
11+
use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};
1312
use tracing::{debug, info, info_span, Instrument};
1413

1514
use crate::cache::{ExpiringCache, ProvideCachedCredentials};
@@ -25,7 +24,7 @@ const DEFAULT_BUFFER_TIME_JITTER_FRACTION: fn() -> f64 = fastrand::f64;
2524
#[derive(Debug)]
2625
pub(crate) struct LazyCredentialsCache {
2726
time: TimeSource,
28-
sleeper: Arc<dyn AsyncSleep>,
27+
sleeper: SharedAsyncSleep,
2928
cache: ExpiringCache<Credentials, CredentialsError>,
3029
provider: SharedCredentialsProvider,
3130
load_timeout: Duration,
@@ -37,7 +36,7 @@ pub(crate) struct LazyCredentialsCache {
3736
impl LazyCredentialsCache {
3837
fn new(
3938
time: TimeSource,
40-
sleeper: Arc<dyn AsyncSleep>,
39+
sleeper: SharedAsyncSleep,
4140
provider: SharedCredentialsProvider,
4241
load_timeout: Duration,
4342
buffer_time: Duration,
@@ -133,12 +132,11 @@ use crate::Credentials;
133132
pub use builder::Builder;
134133

135134
mod builder {
136-
use std::sync::Arc;
137135
use std::time::Duration;
138136

139137
use crate::cache::{CredentialsCache, Inner};
140138
use crate::provider::SharedCredentialsProvider;
141-
use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep};
139+
use aws_smithy_async::rt::sleep::{default_async_sleep, SharedAsyncSleep};
142140

143141
use super::TimeSource;
144142
use super::{
@@ -160,7 +158,7 @@ mod builder {
160158
/// `build` to create a `LazyCredentialsCache`.
161159
#[derive(Clone, Debug, Default)]
162160
pub struct Builder {
163-
sleep: Option<Arc<dyn AsyncSleep>>,
161+
sleep: Option<SharedAsyncSleep>,
164162
time_source: Option<TimeSource>,
165163
load_timeout: Option<Duration>,
166164
buffer_time: Option<Duration>,
@@ -174,22 +172,22 @@ mod builder {
174172
Default::default()
175173
}
176174

177-
/// Implementation of [`AsyncSleep`] to use for timeouts.
175+
/// Implementation of [`AsyncSleep`](aws_smithy_async::rt::sleep::AsyncSleep) to use for timeouts.
178176
///
179177
/// This enables use of the `LazyCredentialsCache` with other async runtimes.
180178
/// If using Tokio as the async runtime, this should be set to an instance of
181179
/// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep).
182-
pub fn sleep(mut self, sleep: Arc<dyn AsyncSleep>) -> Self {
180+
pub fn sleep(mut self, sleep: SharedAsyncSleep) -> Self {
183181
self.set_sleep(Some(sleep));
184182
self
185183
}
186184

187-
/// Implementation of [`AsyncSleep`] to use for timeouts.
185+
/// Implementation of [`AsyncSleep`](aws_smithy_async::rt::sleep::AsyncSleep) to use for timeouts.
188186
///
189187
/// This enables use of the `LazyCredentialsCache` with other async runtimes.
190188
/// If using Tokio as the async runtime, this should be set to an instance of
191189
/// [`TokioSleep`](aws_smithy_async::rt::sleep::TokioSleep).
192-
pub fn set_sleep(&mut self, sleep: Option<Arc<dyn AsyncSleep>>) -> &mut Self {
190+
pub fn set_sleep(&mut self, sleep: Option<SharedAsyncSleep>) -> &mut Self {
193191
self.sleep = sleep;
194192
self
195193
}
@@ -347,7 +345,7 @@ mod tests {
347345
use std::sync::{Arc, Mutex};
348346
use std::time::{Duration, SystemTime, UNIX_EPOCH};
349347

350-
use aws_smithy_async::rt::sleep::TokioSleep;
348+
use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};
351349
use tracing::info;
352350
use tracing_test::traced_test;
353351

@@ -372,7 +370,7 @@ mod tests {
372370
let load_list = Arc::new(Mutex::new(load_list));
373371
LazyCredentialsCache::new(
374372
time,
375-
Arc::new(TokioSleep::new()),
373+
SharedAsyncSleep::new(TokioSleep::new()),
376374
SharedCredentialsProvider::new(provide_credentials_fn(move || {
377375
let list = load_list.clone();
378376
async move {
@@ -414,7 +412,7 @@ mod tests {
414412
}));
415413
let credentials_cache = LazyCredentialsCache::new(
416414
TimeSource::testing(&time),
417-
Arc::new(TokioSleep::new()),
415+
SharedAsyncSleep::new(TokioSleep::new()),
418416
provider,
419417
DEFAULT_LOAD_TIMEOUT,
420418
DEFAULT_BUFFER_TIME,
@@ -534,7 +532,7 @@ mod tests {
534532
let time = TestingTimeSource::new(epoch_secs(100));
535533
let credentials_cache = LazyCredentialsCache::new(
536534
TimeSource::testing(&time),
537-
Arc::new(TokioSleep::new()),
535+
SharedAsyncSleep::new(TokioSleep::new()),
538536
SharedCredentialsProvider::new(provide_credentials_fn(|| async {
539537
aws_smithy_async::future::never::Never::new().await;
540538
Ok(credentials(1000))

aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
//! Maintain a cache of discovered endpoints
77
8-
use aws_smithy_async::rt::sleep::AsyncSleep;
9-
use aws_smithy_async::time::TimeSource;
8+
use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};
9+
use aws_smithy_async::time::SharedTimeSource;
1010
use aws_smithy_client::erase::boxclone::BoxFuture;
1111
use aws_smithy_http::endpoint::{ResolveEndpoint, ResolveEndpointError};
1212
use aws_smithy_types::endpoint::Endpoint;
@@ -24,8 +24,8 @@ pub struct ReloadEndpoint {
2424
endpoint: Arc<Mutex<Option<ExpiringEndpoint>>>,
2525
error: Arc<Mutex<Option<ResolveEndpointError>>>,
2626
rx: Receiver<()>,
27-
sleep: Arc<dyn AsyncSleep>,
28-
time: Arc<dyn TimeSource>,
27+
sleep: SharedAsyncSleep,
28+
time: SharedTimeSource,
2929
}
3030

3131
impl Debug for ReloadEndpoint {
@@ -106,8 +106,8 @@ impl ExpiringEndpoint {
106106

107107
pub(crate) async fn create_cache<F>(
108108
loader_fn: impl Fn() -> F + Send + Sync + 'static,
109-
sleep: Arc<dyn AsyncSleep>,
110-
time: Arc<dyn TimeSource>,
109+
sleep: SharedAsyncSleep,
110+
time: SharedTimeSource,
111111
) -> Result<(EndpointCache, ReloadEndpoint), ResolveEndpointError>
112112
where
113113
F: Future<Output = Result<(Endpoint, SystemTime), ResolveEndpointError>> + Send + 'static,
@@ -155,9 +155,9 @@ impl EndpointCache {
155155
#[cfg(test)]
156156
mod test {
157157
use crate::endpoint_discovery::create_cache;
158-
use aws_smithy_async::rt::sleep::TokioSleep;
158+
use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};
159159
use aws_smithy_async::test_util::controlled_time_and_sleep;
160-
use aws_smithy_async::time::SystemTimeSource;
160+
use aws_smithy_async::time::{SharedTimeSource, SystemTimeSource};
161161
use aws_smithy_types::endpoint::Endpoint;
162162
use std::sync::atomic::{AtomicUsize, Ordering};
163163
use std::sync::Arc;
@@ -178,8 +178,8 @@ mod test {
178178
SystemTime::now(),
179179
))
180180
},
181-
Arc::new(TokioSleep::new()),
182-
Arc::new(SystemTimeSource::new()),
181+
SharedAsyncSleep::new(TokioSleep::new()),
182+
SharedTimeSource::new(SystemTimeSource::new()),
183183
)
184184
.await
185185
.unwrap();
@@ -204,8 +204,8 @@ mod test {
204204
))
205205
}
206206
},
207-
Arc::new(TokioSleep::new()),
208-
Arc::new(SystemTimeSource::new()),
207+
SharedAsyncSleep::new(TokioSleep::new()),
208+
SharedTimeSource::new(SystemTimeSource::new()),
209209
)
210210
.await
211211
.expect("returns an endpoint");
@@ -248,8 +248,8 @@ mod test {
248248
))
249249
}
250250
},
251-
Arc::new(sleep.clone()),
252-
Arc::new(time.clone()),
251+
SharedAsyncSleep::new(sleep.clone()),
252+
SharedTimeSource::new(time.clone()),
253253
)
254254
.await
255255
.expect("first load success");

aws/rust-runtime/aws-types/external-types.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
allowed_external_types = [
22
"aws_credential_types::cache::CredentialsCache",
33
"aws_credential_types::provider::SharedCredentialsProvider",
4-
"aws_smithy_async::rt::sleep::AsyncSleep",
4+
"aws_smithy_async::rt::sleep::SharedAsyncSleep",
55
"aws_smithy_async::time::TimeSource",
66
"aws_smithy_async::time::SharedTimeSource",
77
"aws_smithy_client::http_connector",

0 commit comments

Comments
 (0)