@@ -90,20 +90,20 @@ impl ConnSpawner {
90
90
& self ,
91
91
key : WorkloadKey ,
92
92
stream : impl tokio:: io:: AsyncRead + tokio:: io:: AsyncWrite + Send + Unpin + ' static ,
93
- ) -> Result < ConnClient , Error > {
93
+ driver_drain : tokio:: sync:: watch:: Receiver < bool > ,
94
+ ) -> Result < ( ConnClient , tokio:: task:: JoinHandle < ( ) > ) , Error > {
94
95
let dest = rustls:: pki_types:: ServerName :: IpAddress ( key. dst . ip ( ) . into ( ) ) ;
95
96
96
97
let cert = self . local_workload . fetch_certificate ( ) . await ?;
97
98
let connector = cert. outbound_connector ( vec ! [ ] ) ?;
98
99
let tls_stream = connector. connect ( stream, dest) . await ?;
99
- let sender =
100
- h2:: client:: spawn_connection ( self . cfg . clone ( ) , tls_stream, self . timeout_rx . clone ( ) )
101
- . await ?;
100
+ let ( sender, driver_drain) =
101
+ h2:: client:: spawn_connection ( self . cfg . clone ( ) , tls_stream, driver_drain) . await ?;
102
102
let client = ConnClient {
103
103
sender,
104
104
wl_key : key,
105
105
} ;
106
- Ok ( client)
106
+ Ok ( ( client, driver_drain ) )
107
107
}
108
108
109
109
async fn new_pool_conn ( & self , key : WorkloadKey ) -> Result < ConnClient , Error > {
@@ -127,7 +127,7 @@ impl ConnSpawner {
127
127
) ;
128
128
let tls_stream = connector. connect ( tcp_stream, dest) . await ?;
129
129
trace ! ( "connector connected, handshaking" ) ;
130
- let sender =
130
+ let ( sender, _ ) =
131
131
h2:: client:: spawn_connection ( self . cfg . clone ( ) , tls_stream, self . timeout_rx . clone ( ) )
132
132
. await ?;
133
133
let client = ConnClient {
@@ -406,10 +406,28 @@ impl WorkloadHBONEPool {
406
406
stream : impl tokio:: io:: AsyncWrite + tokio:: io:: AsyncRead + Send + Unpin + ' static ,
407
407
workload_key : & WorkloadKey ,
408
408
request : http:: Request < ( ) > ,
409
- ) -> Result < H2Stream , Error > {
410
- let mut connection = self . state . spawner . new_unpooled_conn ( workload_key. clone ( ) , stream) . await ?;
409
+ ) -> Result <
410
+ (
411
+ ConnClient ,
412
+ Result < H2Stream , Error > ,
413
+ tokio:: sync:: watch:: Sender < bool > ,
414
+ tokio:: task:: JoinHandle < ( ) > ,
415
+ ) ,
416
+ Error ,
417
+ > {
418
+ let ( tx, rx) = tokio:: sync:: watch:: channel ( false ) ;
419
+ let ( mut connection, driver_task) = self
420
+ . state
421
+ . spawner
422
+ . new_unpooled_conn ( workload_key. clone ( ) , stream, rx)
423
+ . await ?;
411
424
412
- connection. sender . send_request ( request) . await
425
+ Ok ( (
426
+ connection. clone ( ) ,
427
+ connection. sender . send_request ( request) . await ,
428
+ tx,
429
+ driver_task,
430
+ ) )
413
431
}
414
432
415
433
pub async fn send_request_pooled (
@@ -552,7 +570,7 @@ impl WorkloadHBONEPool {
552
570
#[ derive( Debug , Clone ) ]
553
571
// A sort of faux-client, that represents a single checked-out 'request sender' which might
554
572
// send requests over some underlying stream using some underlying http/2 client
555
- struct ConnClient {
573
+ pub struct ConnClient {
556
574
sender : H2ConnectClient ,
557
575
// A WL key may have many clients, but every client has no more than one WL key
558
576
wl_key : WorkloadKey , // the WL key associated with this client.
0 commit comments