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);
+}