@@ -14,7 +14,7 @@ use plane_common::{
1414 ApiErrorKind , CertManagerRequest , CertManagerResponse , MessageFromProxy , MessageToProxy ,
1515 RouteInfoRequest , RouteInfoResponse ,
1616 } ,
17- typed_socket:: { server:: new_server, TypedSocketSender } ,
17+ typed_socket:: { server:: new_server, TypedSocket } ,
1818 types:: { BackendState , BearerToken , ClusterName , NodeId } ,
1919} ;
2020use std:: {
@@ -28,7 +28,7 @@ use valuable::Valuable;
2828pub async fn handle_route_info_request (
2929 token : BearerToken ,
3030 controller : & Controller ,
31- socket : TypedSocketSender < MessageToProxy > ,
31+ socket : & mut TypedSocket < MessageToProxy > ,
3232) -> anyhow:: Result < ( ) > {
3333 match controller. db . backend ( ) . route_info_for_token ( & token) . await {
3434 // When a proxy requests a route, either:
@@ -79,58 +79,65 @@ pub async fn handle_route_info_request(
7979 }
8080 }
8181
82- let socket = socket. wrap ( MessageToProxy :: RouteInfoResponse ) ;
83-
84- loop {
85- // Note: this timeout is arbitrary to avoid a memory leak. Under normal system operation, the critical
86- // timeout will be that of the backend failing to start. We use a large timeout to avoid it becoming
87- // the critical timeout when the system is functioning.
88- let result = match tokio:: time:: timeout (
89- std:: time:: Duration :: from_secs ( 30 * 60 /* 30 minutes */ ) ,
90- sub. next ( ) ,
91- )
92- . await
93- {
94- Ok ( Some ( result) ) => result,
95- Ok ( None ) => {
96- tracing:: error!( "Event subscription closed!" ) ;
97- break ;
98- }
99- Err ( _) => {
100- tracing:: error!( "Timeout waiting for backend state" ) ;
101- break ;
102- }
103- } ;
82+ let socket = socket. sender ( MessageToProxy :: RouteInfoResponse ) ;
83+ tokio :: spawn ( async move {
84+ loop {
85+ // Note: this timeout is arbitrary to avoid a memory leak. Under normal system operation, the critical
86+ // timeout will be that of the backend failing to start. We use a large timeout to avoid it becoming
87+ // the critical timeout when the system is functioning.
88+ let result = match tokio:: time:: timeout (
89+ std:: time:: Duration :: from_secs ( 30 * 60 /* 30 minutes */ ) ,
90+ sub. next ( ) ,
91+ )
92+ . await
93+ {
94+ Ok ( Some ( result) ) => result,
95+ Ok ( None ) => {
96+ tracing:: error!( "Event subscription closed!" ) ;
97+ break ;
98+ }
99+ Err ( _) => {
100+ tracing:: error!( "Timeout waiting for backend state" ) ;
101+ break ;
102+ }
103+ } ;
104104
105- let Notification { payload, .. } = result;
105+ let Notification { payload, .. } = result;
106106
107- match payload {
108- BackendState :: Ready { address } => {
109- let route_info = partial_route_info. set_address ( address) ;
110- let response = RouteInfoResponse {
111- token,
112- route_info : Some ( route_info) ,
113- } ;
114- if let Err ( err) = socket. send ( response) {
115- tracing:: error!( ?err, "Error sending route info response to proxy." ) ;
107+ match payload {
108+ BackendState :: Ready { address } => {
109+ let route_info = partial_route_info. set_address ( address) ;
110+ let response = RouteInfoResponse {
111+ token,
112+ route_info : Some ( route_info) ,
113+ } ;
114+ if let Err ( err) = socket. send ( response) {
115+ tracing:: error!(
116+ ?err,
117+ "Error sending route info response to proxy."
118+ ) ;
119+ }
120+ break ;
116121 }
117- break ;
118- }
119- BackendState :: Terminated { .. }
120- | BackendState :: Terminating { .. }
121- | BackendState :: HardTerminating { .. } => {
122- let response = RouteInfoResponse {
123- token,
124- route_info : None ,
125- } ;
126- if let Err ( err) = socket. send ( response) {
127- tracing:: error!( ?err, "Error sending route info response to proxy." ) ;
122+ BackendState :: Terminated { .. }
123+ | BackendState :: Terminating { .. }
124+ | BackendState :: HardTerminating { .. } => {
125+ let response = RouteInfoResponse {
126+ token,
127+ route_info : None ,
128+ } ;
129+ if let Err ( err) = socket. send ( response) {
130+ tracing:: error!(
131+ ?err,
132+ "Error sending route info response to proxy."
133+ ) ;
134+ }
135+ break ;
128136 }
129- break ;
137+ _ => { }
130138 }
131- _ => { }
132139 }
133- }
140+ } ) ;
134141 }
135142 Ok ( RouteInfoResult :: NotFound ) => {
136143 let response = RouteInfoResponse {
@@ -152,7 +159,7 @@ pub async fn handle_route_info_request(
152159pub async fn handle_message_from_proxy (
153160 message : MessageFromProxy ,
154161 controller : & Controller ,
155- socket : TypedSocketSender < MessageToProxy > ,
162+ socket : & mut TypedSocket < MessageToProxy > ,
156163 cluster : & ClusterName ,
157164 node_id : NodeId ,
158165) -> anyhow:: Result < ( ) > {
@@ -294,15 +301,7 @@ pub async fn proxy_socket_inner(
294301 * message_counts. entry( "cert_manager_request" ) . or_insert( 0 ) += 1 ;
295302 }
296303 }
297-
298- let sender = socket. sender( ) ;
299- let controller = controller. clone( ) ;
300- let cluster = cluster. clone( ) ;
301- tokio:: spawn( async move {
302- if let Err ( err) = handle_message_from_proxy( message, & controller, sender, & cluster, node_guard. id) . await {
303- tracing:: error!( ?err, "Error handling message from proxy" ) ;
304- }
305- } ) ;
304+ handle_message_from_proxy( message, & controller, & mut socket, & cluster, node_guard. id) . await ?
306305 }
307306 None => {
308307 tracing:: info!( "Proxy socket closed" ) ;
0 commit comments