@@ -7,6 +7,7 @@ use std::io;
77use tokio_codec:: Framed ;
88use want:: Taker ;
99
10+ use disconnected;
1011use error:: { self , Error } ;
1112use proto:: codec:: PostgresCodec ;
1213use proto:: socket:: Socket ;
@@ -17,7 +18,7 @@ pub struct Request {
1718 pub sender : mpsc:: Sender < Message > ,
1819}
1920
20- #[ derive( PartialEq ) ]
21+ #[ derive( PartialEq , Debug ) ]
2122enum State {
2223 Active ,
2324 Terminating ,
@@ -67,22 +68,28 @@ impl Connection {
6768
6869 fn poll_response ( & mut self ) -> Poll < Option < Message > , io:: Error > {
6970 if let Some ( message) = self . pending_response . take ( ) {
71+ trace ! ( "retrying pending response" ) ;
7072 return Ok ( Async :: Ready ( Some ( message) ) ) ;
7173 }
7274
7375 self . stream . poll ( )
7476 }
7577
76- fn poll_read ( & mut self ) -> Result < ( ) , Error > {
78+ fn poll_read ( & mut self ) -> Poll < ( ) , Error > {
79+ if self . state != State :: Active {
80+ trace ! ( "poll_read: done" ) ;
81+ return Ok ( Async :: Ready ( ( ) ) ) ;
82+ }
83+
7784 loop {
7885 let message = match self . poll_response ( ) ? {
7986 Async :: Ready ( Some ( message) ) => message,
8087 Async :: Ready ( None ) => {
81- return Err ( Error :: from ( io :: Error :: from ( io :: ErrorKind :: UnexpectedEof ) ) ) ;
88+ return Err ( disconnected ( ) ) ;
8289 }
8390 Async :: NotReady => {
84- self . taker . want ( ) ;
85- return Ok ( ( ) ) ;
91+ trace ! ( "poll_read: waiting on response" ) ;
92+ return Ok ( Async :: NotReady ) ;
8693 }
8794 } ;
8895
@@ -123,65 +130,95 @@ impl Connection {
123130 Ok ( AsyncSink :: NotReady ( message) ) => {
124131 self . responses . push_front ( sender) ;
125132 self . pending_response = Some ( message) ;
126- return Ok ( ( ) ) ;
133+ trace ! ( "poll_read: waiting on socket" ) ;
134+ return Ok ( Async :: NotReady ) ;
127135 }
128136 }
129137 }
130138 }
131139
132140 fn poll_request ( & mut self ) -> Poll < Option < Vec < u8 > > , Error > {
133141 if let Some ( message) = self . pending_request . take ( ) {
142+ trace ! ( "retrying pending request" ) ;
134143 return Ok ( Async :: Ready ( Some ( message) ) ) ;
135144 }
136145
137- match self . receiver . poll ( ) {
138- Ok ( Async :: Ready ( Some ( request) ) ) => {
146+ match try_receive ! ( self . receiver. poll( ) ) {
147+ Some ( request) => {
148+ trace ! ( "polled new request" ) ;
139149 self . responses . push_back ( request. sender ) ;
140150 Ok ( Async :: Ready ( Some ( request. messages ) ) )
141151 }
142- Ok ( Async :: Ready ( None ) ) => Ok ( Async :: Ready ( None ) ) ,
143- Ok ( Async :: NotReady ) => Ok ( Async :: NotReady ) ,
144- Err ( ( ) ) => unreachable ! ( "mpsc::Receiver doesn't return errors" ) ,
152+ None => Ok ( Async :: Ready ( None ) ) ,
145153 }
146154 }
147155
148- fn poll_write ( & mut self ) -> Result < ( ) , Error > {
156+ fn poll_write ( & mut self ) -> Poll < ( ) , Error > {
149157 loop {
158+ if self . state == State :: Closing {
159+ trace ! ( "poll_write: done" ) ;
160+ return Ok ( Async :: Ready ( ( ) ) ) ;
161+ }
162+
150163 let request = match self . poll_request ( ) ? {
151164 Async :: Ready ( Some ( request) ) => request,
152165 Async :: Ready ( None ) if self . responses . is_empty ( ) && self . state == State :: Active => {
166+ trace ! ( "poll_write: at eof, terminating" ) ;
153167 self . state = State :: Terminating ;
154168 let mut request = vec ! [ ] ;
155169 frontend:: terminate ( & mut request) ;
156170 request
157171 }
158- Async :: Ready ( None ) => return Ok ( ( ) ) ,
159- Async :: NotReady => return Ok ( ( ) ) ,
172+ Async :: Ready ( None ) => {
173+ trace ! (
174+ "poll_write: at eof, pending responses {}" ,
175+ self . responses. len( ) ,
176+ ) ;
177+ return Ok ( Async :: Ready ( ( ) ) ) ;
178+ }
179+ Async :: NotReady => {
180+ trace ! ( "poll_write: waiting on request" ) ;
181+ self . taker . want ( ) ;
182+ return Ok ( Async :: NotReady ) ;
183+ }
160184 } ;
161185
162186 match self . stream . start_send ( request) ? {
163187 AsyncSink :: Ready => {
164188 if self . state == State :: Terminating {
189+ trace ! ( "poll_write: sent eof, closing" ) ;
165190 self . state = State :: Closing ;
166191 }
167192 }
168193 AsyncSink :: NotReady ( request) => {
194+ trace ! ( "poll_write: waiting on socket" ) ;
169195 self . pending_request = Some ( request) ;
170- return Ok ( ( ) ) ;
196+ return Ok ( Async :: NotReady ) ;
171197 }
172198 }
173199 }
174200 }
175201
176- fn poll_flush ( & mut self ) -> Result < ( ) , Error > {
177- self . stream . poll_complete ( ) ? ;
178- Ok ( ( ) )
202+ fn poll_flush ( & mut self ) -> Poll < ( ) , Error > {
203+ trace ! ( "flushing" ) ;
204+ self . stream . poll_complete ( ) . map_err ( Into :: into )
179205 }
180206
181207 fn poll_shutdown ( & mut self ) -> Poll < ( ) , Error > {
182- match self . state {
183- State :: Active | State :: Terminating => Ok ( Async :: NotReady ) ,
184- State :: Closing => self . stream . close ( ) . map_err ( Into :: into) ,
208+ if self . state != State :: Closing {
209+ return Ok ( Async :: NotReady ) ;
210+ }
211+
212+ match self . stream . close ( ) {
213+ Ok ( Async :: Ready ( ( ) ) ) => {
214+ trace ! ( "poll_shutdown: complete" ) ;
215+ Ok ( Async :: Ready ( ( ) ) )
216+ }
217+ Ok ( Async :: NotReady ) => {
218+ trace ! ( "poll_shutdown: waiting on socket" ) ;
219+ Ok ( Async :: NotReady )
220+ }
221+ Err ( e) => Err ( Error :: from ( e) ) ,
185222 }
186223 }
187224}
0 commit comments