@@ -54,6 +54,38 @@ impl Recycler {
5454 eof : false ,
5555 }
5656 }
57+
58+ fn conn_return ( & mut self , conn : Conn , pool_is_closed : bool ) {
59+ let mut exchange = self . inner . exchange . lock ( ) . unwrap ( ) ;
60+ if pool_is_closed || exchange. available . len ( ) >= self . pool_opts . active_bound ( ) {
61+ drop ( exchange) ;
62+ self . inner
63+ . metrics
64+ . discarded_superfluous_connection
65+ . fetch_add ( 1 , Ordering :: Relaxed ) ;
66+ self . discard . push ( conn. close_conn ( ) . boxed ( ) ) ;
67+ } else {
68+ self . inner
69+ . metrics
70+ . connection_returned_to_pool
71+ . fetch_add ( 1 , Ordering :: Relaxed ) ;
72+ #[ cfg( feature = "hdrhistogram" ) ]
73+ self . inner
74+ . metrics
75+ . connection_active_duration
76+ . lock ( )
77+ . unwrap ( )
78+ . saturating_record ( conn. inner . active_since . elapsed ( ) . as_micros ( ) as u64 ) ;
79+ exchange. available . push_back ( conn. into ( ) ) ;
80+ self . inner
81+ . metrics
82+ . connections_in_pool
83+ . store ( exchange. available . len ( ) , Ordering :: Relaxed ) ;
84+ if let Some ( w) = exchange. waiting . pop ( ) {
85+ w. wake ( ) ;
86+ }
87+ }
88+ }
5789}
5890
5991impl Future for Recycler {
@@ -62,44 +94,6 @@ impl Future for Recycler {
6294 fn poll ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Self :: Output > {
6395 let mut close = self . inner . close . load ( Ordering :: Acquire ) ;
6496
65- macro_rules! conn_return {
66- ( $self: ident, $conn: ident, $pool_is_closed: expr) => { {
67- let mut exchange = $self. inner. exchange. lock( ) . unwrap( ) ;
68- if $pool_is_closed || exchange. available. len( ) >= $self. pool_opts. active_bound( ) {
69- drop( exchange) ;
70- $self
71- . inner
72- . metrics
73- . discarded_superfluous_connection
74- . fetch_add( 1 , Ordering :: Relaxed ) ;
75- $self. discard. push( $conn. close_conn( ) . boxed( ) ) ;
76- } else {
77- $self
78- . inner
79- . metrics
80- . connection_returned_to_pool
81- . fetch_add( 1 , Ordering :: Relaxed ) ;
82- #[ cfg( feature = "hdrhistogram" ) ]
83- $self
84- . inner
85- . metrics
86- . connection_active_duration
87- . lock( )
88- . unwrap( )
89- . saturating_record( $conn. inner. active_since. elapsed( ) . as_micros( ) as u64 ) ;
90- exchange. available. push_back( $conn. into( ) ) ;
91- $self
92- . inner
93- . metrics
94- . connections_in_pool
95- . store( exchange. available. len( ) , Ordering :: Relaxed ) ;
96- if let Some ( w) = exchange. waiting. pop( ) {
97- w. wake( ) ;
98- }
99- }
100- } } ;
101- }
102-
10397 macro_rules! conn_decision {
10498 ( $self: ident, $conn: ident) => {
10599 if $conn. inner. stream. is_none( ) || $conn. inner. disconnected {
@@ -132,7 +126,7 @@ impl Future for Recycler {
132126 . fetch_add( 1 , Ordering :: Relaxed ) ;
133127 $self. reset. push( $conn. reset_for_pool( ) . boxed( ) ) ;
134128 } else {
135- conn_return! ( $self, $conn, false ) ;
129+ $self. conn_return ( $conn, false ) ;
136130 }
137131 } ;
138132 }
@@ -202,7 +196,7 @@ impl Future for Recycler {
202196 loop {
203197 match Pin :: new ( & mut self . reset ) . poll_next ( cx) {
204198 Poll :: Pending | Poll :: Ready ( None ) => break ,
205- Poll :: Ready ( Some ( Ok ( conn) ) ) => conn_return ! ( self , conn, close) ,
199+ Poll :: Ready ( Some ( Ok ( conn) ) ) => self . conn_return ( conn, close) ,
206200 Poll :: Ready ( Some ( Err ( e) ) ) => {
207201 // an error during reset.
208202 // replace with a new connection
0 commit comments