diff --git a/src/core/utils/two_phase_counter.rs b/src/core/utils/two_phase_counter.rs index e0d9e263..214351a9 100644 --- a/src/core/utils/two_phase_counter.rs +++ b/src/core/utils/two_phase_counter.rs @@ -152,9 +152,15 @@ impl Result + Sync> State { debug_assert!(removed == id, "sequence number removed must match id"); - if index == 0 { - (self.release)(id).expect("release callback should not error"); + // release only occurs when the oldest value retires + if index != 0 { + return; } + + // release occurs for the maximum retired value + let release = if self.pending.is_empty() { self.dispatched } else { id }; + + (self.release)(release).expect("release callback should not error"); } /// Calculate the retired sequence number, one less than the lowest pending