diff --git a/tower/src/hedge/mod.rs b/tower/src/hedge/mod.rs index 9698a9b7d..41276552d 100644 --- a/tower/src/hedge/mod.rs +++ b/tower/src/hedge/mod.rs @@ -85,6 +85,10 @@ pub struct SelectPolicy

{ impl Hedge { /// Create a new hedge middleware. + /// + /// # Panics + /// + /// Panics if `period` is zero. pub fn new( service: S, policy: P, @@ -97,6 +101,10 @@ impl Hedge { S::Error: Into, P: Policy + Clone, { + assert!( + period > Duration::ZERO, + "histogram rotation period must be greater than zero" + ); let histo = Arc::new(Mutex::new(RotatingHistogram::new(period))); Self::new_with_histo(service, policy, min_data_points, latency_percentile, histo) } @@ -116,6 +124,11 @@ impl Hedge { S::Error: Into, P: Policy + Clone, { + assert!( + period > Duration::ZERO, + "histogram rotation period must be greater than zero" + ); + let histo = Arc::new(Mutex::new(RotatingHistogram::new(period))); { let mut locked = histo.lock().unwrap(); diff --git a/tower/tests/hedge/main.rs b/tower/tests/hedge/main.rs index d4082ca2a..7448eeeee 100644 --- a/tower/tests/hedge/main.rs +++ b/tower/tests/hedge/main.rs @@ -182,3 +182,26 @@ fn new_service + Clone>(policy: P) -> (mock::Spawn (mock::Spawn::new(service), handle) } + +#[test] +#[should_panic(expected = "histogram rotation period must be greater than zero")] +fn hedge_new_with_mock_latencies_zero_period_panics() { + let (service, _handle) = tower_test::mock::pair::(); + let mock_latencies: [u64; 2] = [10, 20]; + + let _service = Hedge::new_with_mock_latencies( + service, + TestPolicy, + 10, + 0.9, + Duration::ZERO, + &mock_latencies, + ); +} +#[test] +#[should_panic(expected = "histogram rotation period must be greater than zero")] +fn hedge_new_zero_period_panics() { + let (service, _handle) = tower_test::mock::pair::(); + + let _service = Hedge::new(service, TestPolicy, 10, 0.9, Duration::ZERO); +}