Skip to content

Commit a6f74e1

Browse files
authored
Merge pull request #247 from boinkor-net/revert-246-back-out-clock-clone-bound-change
Revert "Revert "remove `Clock: Clone` bound""
2 parents 5bc4234 + 2c6b4d2 commit a6f74e1

17 files changed

+43
-56
lines changed

governor/CHANGELOG.md

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,6 @@
44

55
## [Unreleased] - ReleaseDate
66

7-
This is a quick bugfix release for the 0.6 version series: A
8-
non-semver-compatible change snuck in, so 0.6.5 will back that change
9-
out, and 0.7.0 will add it back.
10-
11-
### Changed
12-
13-
* The
14-
[`Clock`](https://docs.rs/governor/0.6.5/governor/clock/trait.Clock.html)
15-
trait needs to be Clone for the 0.6.5 release, as removing that
16-
trait in 0.6.3 was not semver-compatible.
17-
187
## [[0.6.4](https://docs.rs/governor/0.6.4/governor/)] - 2024-10-19
198

209
### Added

governor/benches/multi_threaded.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ fn bench_direct(c: &mut Criterion) {
3232
b.iter_custom(|iters| {
3333
let lim = Arc::new(RateLimiter::direct_with_clock(
3434
Quota::per_second(nonzero!(50u32)),
35-
&clock,
35+
clock.clone(),
3636
));
3737
let mut children = vec![];
3838
let start = Instant::now();
@@ -68,7 +68,7 @@ fn bench_keyed<M: KeyedStateStore<u32> + Default + Send + Sync + 'static>(c: &mu
6868
let lim: Arc<RateLimiter<_, _, _, NoOpMiddleware>> = Arc::new(RateLimiter::new(
6969
Quota::per_second(nonzero!(50u32)),
7070
state,
71-
&clock,
71+
clock.clone(),
7272
));
7373

7474
let mut children = vec![];

governor/benches/realtime_clock.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ fn bench_mostly_allow(c: &mut Criterion) {
3838
with_realtime_clocks! {("mostly_allow", group) |b, clock| {
3939
let rl = RateLimiter::direct_with_clock(
4040
#[allow(deprecated)] Quota::new(nonzero!(u32::max_value()), Duration::from_nanos(1)).unwrap(),
41-
clock
41+
clock.clone()
4242
);
4343
b.iter(|| {
4444
black_box(rl.check().is_ok());
@@ -51,7 +51,7 @@ fn bench_mostly_deny(c: &mut Criterion) {
5151
let mut group = c.benchmark_group("realtime_clock");
5252
group.throughput(Throughput::Elements(1));
5353
with_realtime_clocks! {("mostly_deny", group) |b, clock| {
54-
let rl = RateLimiter::direct_with_clock(Quota::per_hour(nonzero!(1u32)), clock);
54+
let rl = RateLimiter::direct_with_clock(Quota::per_hour(nonzero!(1u32)), clock.clone());
5555
b.iter(|| {
5656
black_box(rl.check().is_ok());
5757
});

governor/benches/single_threaded.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ fn bench_direct(c: &mut Criterion) {
2020
group.bench_function("direct", |b| {
2121
let clock = clock::FakeRelativeClock::default();
2222
let step = Duration::from_millis(20);
23-
let rl = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(50u32)), &clock);
23+
let rl = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(50u32)), clock.clone());
2424
b.iter_batched(
2525
|| {
2626
clock.advance(step);
@@ -48,7 +48,7 @@ fn bench_keyed<M: KeyedStateStore<u32> + Default + Send + Sync + 'static>(c: &mu
4848
_,
4949
_,
5050
NoOpMiddleware<<clock::FakeRelativeClock as clock::Clock>::Instant>,
51-
> = RateLimiter::new(Quota::per_second(nonzero!(50u32)), state, &clock);
51+
> = RateLimiter::new(Quota::per_second(nonzero!(50u32)), state, clock.clone());
5252
b.iter_batched(
5353
|| {
5454
clock.advance(step);

governor/src/_guide.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
//! # use nonzero_ext::*;
6363
//! # use governor::{clock::FakeRelativeClock, RateLimiter, Quota};
6464
//! let clock = FakeRelativeClock::default();
65-
//! RateLimiter::direct_with_clock(Quota::per_second(nonzero!(50u32)), &clock);
65+
//! RateLimiter::direct_with_clock(Quota::per_second(nonzero!(50u32)), clock);
6666
//! ```
6767
//!
6868
//! #### Constructing a keyed rate limiter
@@ -144,7 +144,7 @@
144144
//! # use std::time::Duration;
145145
//!
146146
//! let mut clock = FakeRelativeClock::default();
147-
//! let lim = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(20u32)), &clock);
147+
//! let lim = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(20u32)), clock);
148148
//! let ms = Duration::from_millis(1);
149149
//!
150150
//! crossbeam::scope(|scope| {

governor/src/clock.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
//! }
3434
//! }
3535
//!
36-
//! #[derive(Clone)]
3736
//! struct MyCounter(u64);
3837
//!
3938
//! impl Clock for MyCounter {
@@ -75,7 +74,7 @@ pub trait Reference:
7574
}
7675

7776
/// A time source used by rate limiters.
78-
pub trait Clock: Clone {
77+
pub trait Clock {
7978
/// A measurement of a monotonically increasing clock.
8079
type Instant: Reference;
8180

governor/src/gcra.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ mod test {
209209

210210
let clock = FakeRelativeClock::default();
211211
let quota = Quota::per_second(nonzero!(1u32));
212-
let lb = RateLimiter::direct_with_clock(quota, &clock);
212+
let lb = RateLimiter::direct_with_clock(quota, clock);
213213
assert!(lb.check().is_ok());
214214
assert!(lb
215215
.check()

governor/src/state.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,9 @@ where
7777
///
7878
/// This is the most generic way to construct a rate-limiter; most users should prefer
7979
/// [`direct`] or other methods instead.
80-
pub fn new(quota: Quota, state: S, clock: &C) -> Self {
80+
pub fn new(quota: Quota, state: S, clock: C) -> Self {
8181
let gcra = Gcra::new(quota);
8282
let start = clock.now();
83-
let clock = clock.clone();
8483
RateLimiter {
8584
state,
8685
clock,

governor/src/state/direct.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ impl RateLimiter<NotKeyed, InMemoryState, clock::DefaultClock, NoOpMiddleware> {
4646
quota: Quota,
4747
) -> RateLimiter<NotKeyed, InMemoryState, clock::DefaultClock, NoOpMiddleware> {
4848
let clock = clock::DefaultClock::default();
49-
Self::direct_with_clock(quota, &clock)
49+
Self::direct_with_clock(quota, clock)
5050
}
5151
}
5252

@@ -55,7 +55,7 @@ where
5555
C: clock::Clock,
5656
{
5757
/// Constructs a new direct rate limiter for a quota with a custom clock.
58-
pub fn direct_with_clock(quota: Quota, clock: &C) -> Self {
58+
pub fn direct_with_clock(quota: Quota, clock: C) -> Self {
5959
let state: InMemoryState = Default::default();
6060
RateLimiter::new(quota, state, clock)
6161
}

governor/src/state/keyed.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ where
4343
pub fn keyed(quota: Quota) -> Self {
4444
let state = DefaultKeyedStateStore::default();
4545
let clock = clock::DefaultClock::default();
46-
RateLimiter::new(quota, state, &clock)
46+
RateLimiter::new(quota, state, clock)
4747
}
4848

4949
#[cfg(all(feature = "std", feature = "dashmap"))]
5050
/// Constructs a new keyed rate limiter explicitly backed by a [`DashMap`][::dashmap::DashMap].
5151
pub fn dashmap(quota: Quota) -> Self {
5252
let state = DashMapStateStore::default();
5353
let clock = clock::DefaultClock::default();
54-
RateLimiter::new(quota, state, &clock)
54+
RateLimiter::new(quota, state, clock)
5555
}
5656

5757
#[cfg(any(all(feature = "std", not(feature = "dashmap")), not(feature = "std")))]
@@ -60,7 +60,7 @@ where
6060
pub fn hashmap(quota: Quota) -> Self {
6161
let state = HashMapStateStore::default();
6262
let clock = clock::DefaultClock::default();
63-
RateLimiter::new(quota, state, &clock)
63+
RateLimiter::new(quota, state, clock)
6464
}
6565
}
6666

@@ -74,7 +74,7 @@ where
7474
pub fn hashmap(quota: Quota) -> Self {
7575
let state = HashMapStateStore::default();
7676
let clock = clock::DefaultClock::default();
77-
RateLimiter::new(quota, state, &clock)
77+
RateLimiter::new(quota, state, clock)
7878
}
7979
}
8080

@@ -281,7 +281,7 @@ mod test {
281281
> = RateLimiter::new(
282282
Quota::per_second(nonzero!(1_u32)),
283283
NaiveKeyedStateStore::default(),
284-
&FakeRelativeClock::default(),
284+
FakeRelativeClock::default(),
285285
);
286286
assert_eq!(lim.check_key(&1u32), Ok(()));
287287
assert!(lim.is_empty());

governor/src/state/keyed/dashmap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ where
3737
{
3838
/// Constructs a new rate limiter with a custom clock, backed by a
3939
/// [`DashMap`].
40-
pub fn dashmap_with_clock(quota: Quota, clock: &C) -> Self {
40+
pub fn dashmap_with_clock(quota: Quota, clock: C) -> Self {
4141
let state: DashMapStateStore<K> = DashMap::default();
4242
RateLimiter::new(quota, state, clock)
4343
}

governor/src/state/keyed/hashmap.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ where
7070
C: clock::Clock,
7171
{
7272
/// Constructs a new rate limiter with a custom clock, backed by a [`HashMap`].
73-
pub fn hashmap_with_clock(quota: Quota, clock: &C) -> Self {
73+
pub fn hashmap_with_clock(quota: Quota, clock: C) -> Self {
7474
let state: HashMapStateStore<K> = HashMapStateStore::new(HashMap::new());
7575
RateLimiter::new(quota, state, clock)
7676
}

governor/tests/direct.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ use std::time::Duration;
88
#[test]
99
fn accepts_first_cell() {
1010
let clock = FakeRelativeClock::default();
11-
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), &clock);
11+
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), clock);
1212
assert_eq!(Ok(()), lb.check());
1313
}
1414

1515
#[test]
1616
fn rejects_too_many() {
1717
let clock = FakeRelativeClock::default();
18-
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(2u32)), &clock);
18+
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(2u32)), clock.clone());
1919
let ms = Duration::from_millis(1);
2020

2121
// use up our burst capacity (2 in the first second):
@@ -39,7 +39,7 @@ fn rejects_too_many() {
3939
#[test]
4040
fn all_1_identical_to_1() {
4141
let clock = FakeRelativeClock::default();
42-
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(2u32)), &clock);
42+
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(2u32)), clock.clone());
4343
let ms = Duration::from_millis(1);
4444
let one = nonzero!(1u32);
4545

@@ -64,7 +64,7 @@ fn all_1_identical_to_1() {
6464
#[test]
6565
fn never_allows_more_than_capacity_all() {
6666
let clock = FakeRelativeClock::default();
67-
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(4u32)), &clock);
67+
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(4u32)), clock.clone());
6868
let ms = Duration::from_millis(1);
6969

7070
// Use up the burst capacity:
@@ -87,7 +87,7 @@ fn never_allows_more_than_capacity_all() {
8787
#[test]
8888
fn rejects_too_many_all() {
8989
let clock = FakeRelativeClock::default();
90-
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), &clock);
90+
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), clock.clone());
9191
let ms = Duration::from_millis(1);
9292

9393
// Should not allow the first 15 cells on a capacity 5 bucket:
@@ -101,7 +101,7 @@ fn rejects_too_many_all() {
101101
#[test]
102102
fn all_capacity_check_rejects_excess() {
103103
let clock = FakeRelativeClock::default();
104-
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), &clock);
104+
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), clock);
105105

106106
assert_eq!(Err(InsufficientCapacity(5)), lb.check_n(nonzero!(15u32)));
107107
assert_eq!(Err(InsufficientCapacity(5)), lb.check_n(nonzero!(6u32)));
@@ -112,7 +112,7 @@ fn all_capacity_check_rejects_excess() {
112112
fn correct_wait_time() {
113113
let clock = FakeRelativeClock::default();
114114
// Bucket adding a new element per 200ms:
115-
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), &clock);
115+
let lb = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(5u32)), clock.clone());
116116
let ms = Duration::from_millis(1);
117117
let mut conforming = 0;
118118
for _i in 0..20 {
@@ -137,7 +137,7 @@ fn actual_threadsafety() {
137137
use crossbeam;
138138

139139
let clock = FakeRelativeClock::default();
140-
let lim = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(20u32)), &clock);
140+
let lim = RateLimiter::direct_with_clock(Quota::per_second(nonzero!(20u32)), clock.clone());
141141
let ms = Duration::from_millis(1);
142142

143143
crossbeam::scope(|scope| {
@@ -159,7 +159,7 @@ fn actual_threadsafety() {
159159
fn default_direct() {
160160
let clock = governor::clock::DefaultClock::default();
161161
let limiter: DefaultDirectRateLimiter =
162-
RateLimiter::direct_with_clock(Quota::per_second(nonzero!(20u32)), &clock);
162+
RateLimiter::direct_with_clock(Quota::per_second(nonzero!(20u32)), clock);
163163
assert_eq!(Ok(()), limiter.check());
164164
}
165165

governor/tests/keyed_dashmap.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const KEYS: &[u32] = &[1u32, 2u32];
1414
#[test]
1515
fn accepts_first_cell() {
1616
let clock = FakeRelativeClock::default();
17-
let lb = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(5u32)), &clock);
17+
let lb = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(5u32)), clock.clone());
1818
for key in KEYS {
1919
assert_eq!(Ok(()), lb.check_key(&key), "key {:?}", key);
2020
}
@@ -23,7 +23,7 @@ fn accepts_first_cell() {
2323
#[test]
2424
fn rejects_too_many() {
2525
let clock = FakeRelativeClock::default();
26-
let lb = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(2u32)), &clock);
26+
let lb = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(2u32)), clock.clone());
2727
let ms = Duration::from_millis(1);
2828

2929
for key in KEYS {
@@ -71,7 +71,7 @@ fn expiration() {
7171
let ms = Duration::from_millis(1);
7272

7373
let make_bucket = || {
74-
let lim = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(1u32)), &clock);
74+
let lim = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(1u32)), clock.clone());
7575
lim.check_key(&"foo").unwrap();
7676
clock.advance(ms * 200);
7777
lim.check_key(&"bar").unwrap();
@@ -107,7 +107,7 @@ fn actual_threadsafety() {
107107
use crossbeam;
108108

109109
let clock = FakeRelativeClock::default();
110-
let lim = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(20u32)), &clock);
110+
let lim = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(20u32)), clock.clone());
111111
let ms = Duration::from_millis(1);
112112

113113
for key in KEYS {
@@ -150,7 +150,7 @@ fn dashmap_length() {
150150
fn dashmap_shrink_to_fit() {
151151
let clock = FakeRelativeClock::default();
152152
// a steady rate of 3ms between elements:
153-
let lim = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(20u32)), &clock);
153+
let lim = RateLimiter::dashmap_with_clock(Quota::per_second(nonzero!(20u32)), clock.clone());
154154
let ms = Duration::from_millis(1);
155155

156156
assert_eq!(

governor/tests/keyed_hashmap.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const KEYS: &[u32] = &[1u32, 2u32];
1212
#[test]
1313
fn accepts_first_cell() {
1414
let clock = FakeRelativeClock::default();
15-
let lb = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(5u32)), &clock);
15+
let lb = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(5u32)), clock.clone());
1616
for key in KEYS {
1717
assert_eq!(Ok(()), lb.check_key(&key), "key {:?}", key);
1818
}
@@ -21,7 +21,7 @@ fn accepts_first_cell() {
2121
#[test]
2222
fn rejects_too_many() {
2323
let clock = FakeRelativeClock::default();
24-
let lb = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(2u32)), &clock);
24+
let lb = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(2u32)), clock.clone());
2525
let ms = Duration::from_millis(1);
2626

2727
for key in KEYS {
@@ -65,7 +65,7 @@ fn expiration() {
6565
let ms = Duration::from_millis(1);
6666

6767
let make_bucket = || {
68-
let lim = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(1u32)), &clock);
68+
let lim = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(1u32)), clock.clone());
6969
lim.check_key(&"foo").unwrap();
7070
clock.advance(ms * 200);
7171
lim.check_key(&"bar").unwrap();
@@ -101,7 +101,7 @@ fn actual_threadsafety() {
101101
use crossbeam;
102102

103103
let clock = FakeRelativeClock::default();
104-
let lim = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(20u32)), &clock);
104+
let lim = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(20u32)), clock.clone());
105105
let ms = Duration::from_millis(1);
106106

107107
for key in KEYS {
@@ -144,7 +144,7 @@ fn hashmap_length() {
144144
fn hashmap_shrink_to_fit() {
145145
let clock = FakeRelativeClock::default();
146146
// a steady rate of 3ms between elements:
147-
let lim = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(20u32)), &clock);
147+
let lim = RateLimiter::hashmap_with_clock(Quota::per_second(nonzero!(20u32)), clock.clone());
148148
let ms = Duration::from_millis(1);
149149

150150
assert_eq!(

0 commit comments

Comments
 (0)