Skip to content

Commit b834d77

Browse files
committed
Make last_refill_time_secs an AtomicU32
1 parent ff312b5 commit b834d77

1 file changed

Lines changed: 17 additions & 15 deletions

File tree

rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use aws_smithy_types::config_bag::{Storable, StoreReplace};
88
use aws_smithy_types::retry::ErrorKind;
99
use std::fmt;
1010
use std::sync::atomic::AtomicU32;
11-
use std::sync::atomic::AtomicU64;
1211
use std::sync::atomic::Ordering;
1312
use std::sync::Arc;
1413
use std::time::{Duration, SystemTime};
@@ -37,7 +36,9 @@ pub struct TokenBucket {
3736
success_reward: f32,
3837
fractional_tokens: Arc<AtomicF32>,
3938
refill_rate: f32,
40-
last_refill_time_secs: Arc<AtomicU64>,
39+
// Note this value is only an AtomicU32 so it works on 32bit powerpc architectures.
40+
// If we ever remove the need for that compatibility it should become an AtomicU64
41+
last_refill_time_secs: Arc<AtomicU32>,
4142
}
4243

4344
impl std::panic::UnwindSafe for AtomicF32 {}
@@ -94,7 +95,7 @@ impl Default for TokenBucket {
9495
success_reward: DEFAULT_SUCCESS_REWARD,
9596
fractional_tokens: Arc::new(AtomicF32::new(0.0)),
9697
refill_rate: 0.0,
97-
last_refill_time_secs: Arc::new(AtomicU64::new(0)),
98+
last_refill_time_secs: Arc::new(AtomicU32::new(0)),
9899
}
99100
}
100101
}
@@ -119,7 +120,7 @@ impl TokenBucket {
119120
success_reward: 0.0,
120121
fractional_tokens: Arc::new(AtomicF32::new(0.0)),
121122
refill_rate: 0.0,
122-
last_refill_time_secs: Arc::new(AtomicU64::new(0)),
123+
last_refill_time_secs: Arc::new(AtomicU32::new(0)),
123124
}
124125
}
125126

@@ -189,11 +190,12 @@ impl TokenBucket {
189190
#[inline]
190191
fn refill_tokens_based_on_time(&self, time_source: &impl TimeSource) {
191192
if self.refill_rate > 0.0 {
193+
// The cast to u32 here is safe until 2106, and I will be long dead then so ¯\_(ツ)_/¯
192194
let current_time_secs = time_source
193195
.now()
194196
.duration_since(SystemTime::UNIX_EPOCH)
195197
.unwrap_or(Duration::ZERO)
196-
.as_secs();
198+
.as_secs() as u32;
197199

198200
let last_refill_secs = self.last_refill_time_secs.load(Ordering::Relaxed);
199201

@@ -280,7 +282,7 @@ impl TokenBucket {
280282
#[allow(dead_code)]
281283
#[doc(hidden)]
282284
#[cfg(any(test, feature = "test-util", feature = "legacy-test-util"))]
283-
pub fn last_refill_time_secs(&self) -> Arc<AtomicU64> {
285+
pub fn last_refill_time_secs(&self) -> Arc<AtomicU32> {
284286
self.last_refill_time_secs.clone()
285287
}
286288
}
@@ -350,7 +352,7 @@ impl TokenBucketBuilder {
350352
success_reward: self.success_reward.unwrap_or(DEFAULT_SUCCESS_REWARD),
351353
fractional_tokens: Arc::new(AtomicF32::new(0.0)),
352354
refill_rate: self.refill_rate.unwrap_or(0.0),
353-
last_refill_time_secs: Arc::new(AtomicU64::new(0)),
355+
last_refill_time_secs: Arc::new(AtomicU32::new(0)),
354356
}
355357
}
356358
}
@@ -763,12 +765,12 @@ mod tests {
763765
let current_time_secs = UNIX_EPOCH
764766
.duration_since(SystemTime::UNIX_EPOCH)
765767
.unwrap()
766-
.as_secs();
768+
.as_secs() as u32;
767769

768770
let bucket = TokenBucket {
769771
refill_rate: 1.0,
770772
success_reward: 0.5,
771-
last_refill_time_secs: Arc::new(AtomicU64::new(current_time_secs)),
773+
last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),
772774
semaphore: Arc::new(Semaphore::new(0)),
773775
max_permits: 100,
774776
..Default::default()
@@ -809,11 +811,11 @@ mod tests {
809811
let current_time_secs = UNIX_EPOCH
810812
.duration_since(SystemTime::UNIX_EPOCH)
811813
.unwrap()
812-
.as_secs();
814+
.as_secs() as u32;
813815

814816
let bucket = TokenBucket {
815817
refill_rate,
816-
last_refill_time_secs: Arc::new(AtomicU64::new(current_time_secs)),
818+
last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),
817819
semaphore: Arc::new(Semaphore::new(0)),
818820
max_permits: 100,
819821
..Default::default()
@@ -854,12 +856,12 @@ mod tests {
854856
let current_time_secs = UNIX_EPOCH
855857
.duration_since(SystemTime::UNIX_EPOCH)
856858
.unwrap()
857-
.as_secs();
859+
.as_secs() as u32;
858860

859861
let bucket = TokenBucket {
860862
refill_rate: 50.0,
861863
success_reward: 2.0,
862-
last_refill_time_secs: Arc::new(AtomicU64::new(current_time_secs)),
864+
last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),
863865
semaphore: Arc::new(Semaphore::new(5)),
864866
max_permits: 10,
865867
..Default::default()
@@ -903,12 +905,12 @@ mod tests {
903905
let current_time_secs = UNIX_EPOCH
904906
.duration_since(SystemTime::UNIX_EPOCH)
905907
.unwrap()
906-
.as_secs();
908+
.as_secs() as u32;
907909

908910
// Create bucket with 1 token/sec refill
909911
let bucket = Arc::new(TokenBucket {
910912
refill_rate: 1.0,
911-
last_refill_time_secs: Arc::new(AtomicU64::new(current_time_secs)),
913+
last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),
912914
semaphore: Arc::new(Semaphore::new(0)),
913915
max_permits: 100,
914916
..Default::default()

0 commit comments

Comments
 (0)