@@ -8,7 +8,6 @@ use aws_smithy_types::config_bag::{Storable, StoreReplace};
88use aws_smithy_types:: retry:: ErrorKind ;
99use std:: fmt;
1010use std:: sync:: atomic:: AtomicU32 ;
11- use std:: sync:: atomic:: AtomicU64 ;
1211use std:: sync:: atomic:: Ordering ;
1312use std:: sync:: Arc ;
1413use 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
4344impl 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