1717
1818use futures:: StreamExt ;
1919use jsonrpsee:: {
20- core:: {
21- server:: {
22- helpers:: MethodSink ,
23- resource_limiting:: Resources ,
24- rpc_module:: { MethodKind , Methods } ,
25- } ,
26- TEN_MB_SIZE_BYTES ,
20+ core:: server:: {
21+ helpers:: MethodSink ,
22+ resource_limiting:: Resources ,
23+ rpc_module:: { MethodCallback , MethodKind , Methods } ,
2724 } ,
2825 types:: { error:: ErrorCode , Id , Params } ,
2926} ;
@@ -71,8 +68,12 @@ impl RouterState {
7168 let _ = methods_state. merge ( methods. initialize_resources ( & self . resources ) . unwrap ( ) ) ;
7269 }
7370
74- fn get_methods ( & self ) -> Methods {
75- self . methods . read ( ) . unwrap ( ) . clone ( )
71+ pub fn get_method_entry ( & self , method_name : & str ) -> Option < ( String , MethodCallback ) > {
72+ // Acquire a read lock without cloning the entire Methods registry
73+ let methods_guard = self . methods . read ( ) . ok ( ) ?;
74+ methods_guard
75+ . method_with_name ( method_name)
76+ . map ( |( name, method) | ( name. to_owned ( ) , method. clone ( ) ) )
7677 }
7778}
7879
@@ -84,7 +85,7 @@ impl Default for RouterState {
8485
8586async fn resolve_route (
8687 platform_state : & mut PlatformState ,
87- methods : Methods ,
88+ method_entry : Option < ( String , MethodCallback ) > ,
8889 resources : Resources ,
8990 req : RpcRequest ,
9091) -> Result < ApiMessage , RippleError > {
@@ -93,26 +94,29 @@ async fn resolve_route(
9394 let request_c = req. clone ( ) ;
9495 let sink_size = 1024 * 1024 ;
9596 let ( sink_tx, mut sink_rx) = futures_channel:: mpsc:: unbounded :: < String > ( ) ;
96- let sink = MethodSink :: new_with_limit ( sink_tx, TEN_MB_SIZE_BYTES , 512 * 1024 ) ;
97- let method = request_c. method . clone ( ) ;
97+ let sink = MethodSink :: new_with_limit ( sink_tx, 1024 * 1024 , 100 * 1024 ) ;
98+ let method_name = request_c. method . clone ( ) ;
9899
99100 tokio:: spawn ( async move {
100101 let params_json = request_c. params_json . as_ref ( ) ;
101102 let params = Params :: new ( Some ( params_json) ) ;
102103
103- match methods . method_with_name ( & method ) {
104+ match method_entry {
104105 None => {
105106 LogSignal :: new (
106107 "rpc_router" . to_string ( ) ,
107108 "resolve_route" . into ( ) ,
108109 request_c. clone ( ) ,
109110 )
110- . with_diagnostic_context_item ( "error" , & format ! ( "Method not found: {}" , method) )
111+ . with_diagnostic_context_item (
112+ "error" ,
113+ & format ! ( "Method not found: {}" , method_name) ,
114+ )
111115 . emit_error ( ) ;
112116 sink. send_error ( id, ErrorCode :: MethodNotFound . into ( ) ) ;
113117 }
114118 Some ( ( name, method) ) => match & method. inner ( ) {
115- MethodKind :: Sync ( callback) => match method. claim ( name, & resources) {
119+ MethodKind :: Sync ( callback) => match method. claim ( & name, & resources) {
116120 Ok ( _guard) => {
117121 if let Err ( e) =
118122 sink. send_raw ( ( callback) ( id. clone ( ) , params, 512 * 1024 ) . result )
@@ -134,7 +138,7 @@ async fn resolve_route(
134138 sink. send_error ( id, ErrorCode :: MethodNotFound . into ( ) ) ;
135139 }
136140 } ,
137- MethodKind :: Async ( callback) => match method. claim ( name, & resources) {
141+ MethodKind :: Async ( callback) => match method. claim ( & name, & resources) {
138142 Ok ( guard) => {
139143 let id = id. into_owned ( ) ;
140144 let params = params. into_owned ( ) ;
@@ -209,7 +213,7 @@ impl RpcRouter {
209213 session : Session ,
210214 timer : Option < Timer > ,
211215 ) {
212- let methods = state. router_state . get_methods ( ) ;
216+ let method_entry = state. router_state . get_method_entry ( & req . method ) ;
213217 let resources = state. router_state . resources . clone ( ) ;
214218
215219 if let Some ( overridden_method) = state. get_manifest ( ) . has_rpc_override_method ( & req. method ) {
@@ -218,7 +222,7 @@ impl RpcRouter {
218222 LogSignal :: new ( "rpc_router" . to_string ( ) , "routing" . into ( ) , req. clone ( ) ) ;
219223 tokio:: spawn ( async move {
220224 let start = Utc :: now ( ) . timestamp_millis ( ) ;
221- let resp = resolve_route ( & mut state, methods , resources, req. clone ( ) ) . await ;
225+ let resp = resolve_route ( & mut state, method_entry , resources, req. clone ( ) ) . await ;
222226
223227 let status = match resp. clone ( ) {
224228 Ok ( msg) => {
@@ -247,7 +251,7 @@ impl RpcRouter {
247251 req : RpcRequest ,
248252 extn_msg : ExtnMessage ,
249253 ) {
250- let methods = state. router_state . get_methods ( ) ;
254+ let method_entry = state. router_state . get_method_entry ( & req . method ) ;
251255 let resources = state. router_state . resources . clone ( ) ;
252256
253257 let mut platform_state = state. clone ( ) ;
@@ -258,7 +262,8 @@ impl RpcRouter {
258262 )
259263 . emit_debug ( ) ;
260264 tokio:: spawn ( async move {
261- if let Ok ( msg) = resolve_route ( & mut platform_state, methods, resources, req) . await {
265+ if let Ok ( msg) = resolve_route ( & mut platform_state, method_entry, resources, req) . await
266+ {
262267 return_extn_response ( msg, extn_msg) ;
263268 }
264269 } ) ;
0 commit comments