@@ -7,13 +7,17 @@ use crate::{
77 modules_global_bridge:: process_func:: {
88 ModulesGlobalBrigeAppMetaManager , ModulesGlobalBrigeInstanceManager ,
99 } ,
10- result:: WSResult ,
10+ result:: { WSResult , WsRpcErr } ,
1111 sys:: LogicalModulesRef ,
1212 worker:: func:: shared:: process_rpc:: proc_proto:: AppStarted ,
1313} ;
1414use async_trait:: async_trait;
15- use parking_lot:: Mutex ;
16- use prost:: Message ;
15+ use parking_lot:: { Mutex , RwLock } ;
16+ use proc_proto:: { kv_request:: Op , kv_response:: { self , CommonKvResponse , Resp } , KvPair , KvResponse , KvResponses } ;
17+ use prost:: {
18+ bytes:: { BufMut , BytesMut } ,
19+ Message ,
20+ } ;
1721use std:: { collections:: HashMap , path:: Path , time:: Duration } ;
1822use tokio:: sync:: oneshot;
1923
@@ -37,6 +41,8 @@ lazy_static::lazy_static! {
3741#[ async_trait]
3842impl RpcCustom for ProcessRpc {
3943 type SpawnArgs = String ;
44+
45+ // 创建了一个 Unix socket 监听器,用于接收客户端的连接。当有连接时,会通过这个 socket 接收数据。
4046 fn bind ( a : String ) -> tokio:: net:: UnixListener {
4147 clean_sock_file ( & a) ;
4248 tokio:: net:: UnixListener :: bind ( & a) . unwrap ( )
@@ -53,15 +59,21 @@ impl RpcCustom for ProcessRpc {
5359 // };
5460 // }
5561
62+
63+ // 一旦有数据到达,后端会先进行数据验证
5664 async fn verify ( buf : & [ u8 ] ) -> Option < HashValue > {
65+
66+ // 首先尝试将其解码为 proc_proto::AppStarted 结构体
5767 let res = proc_proto:: AppStarted :: decode ( buf) ;
5868 let res: proc_proto:: AppStarted = match res {
5969 Ok ( res) => res,
70+
71+ // 如果解码失败,则请求被忽略
6072 Err ( _) => {
6173 return None ;
6274 }
6375 } ;
64-
76+ // 然后再根据 appid 查找对应的实例,并设置其验证状态
6577 unsafe {
6678 let appman = ProcessRpc :: global_m_app_meta_manager ( ) ;
6779 let ishttp = {
@@ -98,15 +110,18 @@ impl RpcCustom for ProcessRpc {
98110 Some ( HashValue :: Str ( res. appid ) )
99111 }
100112
101- fn handle_remote_call ( _conn : & HashValue , id : u8 , buf : & [ u8 ] ) -> bool {
113+ // 处理远程调用的主要逻辑。它根据消息的 id 来识别不同类型的请求,并根据请求的类型来处理。
114+ fn handle_remote_call ( conn : & HashValue , id : u8 , buf : & [ u8 ] ) -> bool {
102115 tracing:: debug!( "handle_remote_call: id: {}" , id) ;
103116 let _ = match id {
104117 4 => ( ) ,
118+ 5 => ( ) ,
105119 id => {
106120 tracing:: warn!( "handle_remote_call: unsupported id: {}" , id) ;
107121 return false ;
108122 }
109123 } ;
124+ // TODO 再加一类处理新消息类型的
110125 let err = match id {
111126 4 => match proc_proto:: UpdateCheckpoint :: decode ( buf) {
112127 Ok ( _req) => {
@@ -122,6 +137,124 @@ impl RpcCustom for ProcessRpc {
122137 }
123138 Err ( e) => e,
124139 } ,
140+ 5 => match proc_proto:: KvRequests :: decode ( buf) {
141+ Ok ( req) => {
142+ tracing:: debug!( "test java kv" ) ;
143+ // TODO 要不要有处理逻辑,类似 4 下面的 spawn 这块
144+
145+ // 先接收到KvRequests,根据内容转换为 KvResponses,再传出去
146+ let mut kv_responses: Vec < KvResponse > = Vec :: new ( ) ;
147+
148+ // 遍历 KvRequests 中的每一个请求
149+ for request in req. requests . clone ( ) . iter ( ) {
150+ match request. op . clone ( ) {
151+ Some ( op) =>{
152+ match op {
153+ Op :: Set ( kv_put) => {
154+ // 将 kv_put.kv.key、kv_put.kv.value 解码为 String
155+ let key_str = String :: from_utf8 ( kv_put. kv . key . clone ( ) ) . unwrap ( ) ;
156+ let value_str = String :: from_utf8 ( kv_put. kv . value . clone ( ) ) . unwrap ( ) ;
157+ tracing:: debug!( "kv_put, key={:?}, value={:?}" , key_str, value_str) ;
158+
159+ let key = ( key_str + "_response" ) . into_bytes ( ) ;
160+ let value = ( value_str + "_response" ) . into_bytes ( ) ;
161+
162+ // 构造 KvResponse
163+ let kv_response = KvResponse {
164+ resp : Some ( Resp :: CommonResp ( CommonKvResponse { kvs : vec ! [ KvPair { key, value} ] } ) )
165+ } ;
166+ kv_responses. push ( kv_response) ;
167+ } ,
168+ Op :: Get ( kv_get) => {
169+ let start_str = String :: from_utf8 ( kv_get. range . start . clone ( ) ) . unwrap ( ) ;
170+ let end_str = String :: from_utf8 ( kv_get. range . end . clone ( ) ) . unwrap ( ) ;
171+ tracing:: debug!( "kv_get, start={:?}, end={:?}" , start_str, end_str) ;
172+
173+ let key = ( start_str + "_response" ) . into_bytes ( ) ;
174+ let value = ( end_str + "_response" ) . into_bytes ( ) ;
175+
176+ // 构造 KvResponse
177+ let kv_response = KvResponse {
178+ resp : Some ( Resp :: CommonResp ( CommonKvResponse { kvs : vec ! [ KvPair { key, value} ] } ) )
179+ } ;
180+ kv_responses. push ( kv_response) ;
181+ } ,
182+ Op :: Delete ( kv_delete) => {
183+ let start_str = String :: from_utf8 ( kv_delete. range . start . clone ( ) ) . unwrap ( ) ;
184+ let end_str = String :: from_utf8 ( kv_delete. range . end . clone ( ) ) . unwrap ( ) ;
185+ tracing:: debug!( "kv_delete, start={:?}, end={:?}" , start_str, end_str) ;
186+
187+ let key = ( start_str + "_response" ) . into_bytes ( ) ;
188+ let value = ( end_str + "_response" ) . into_bytes ( ) ;
189+
190+ // 构造 KvResponse
191+ let kv_response = KvResponse {
192+ resp : Some ( Resp :: CommonResp ( CommonKvResponse { kvs : vec ! [ KvPair { key, value} ] } ) )
193+ } ;
194+ kv_responses. push ( kv_response) ;
195+ } ,
196+ Op :: Lock ( kv_lock) => {
197+ let read_or_write = kv_lock. read_or_write ;
198+ let release_ids = kv_lock. release_id ;
199+ let start_str = String :: from_utf8 ( kv_lock. range . start . clone ( ) ) . unwrap ( ) ;
200+ let end_str = String :: from_utf8 ( kv_lock. range . end . clone ( ) ) . unwrap ( ) ;
201+ tracing:: debug!( "kv_lock, read_or_write={:?}, release_id={:?}, start={:?}, end={:?}" , read_or_write, release_ids, start_str, end_str) ;
202+
203+ let key = ( start_str + "_response" ) . into_bytes ( ) ;
204+ let value = ( end_str + "_response" ) . into_bytes ( ) ;
205+
206+ // 构造 KvResponse
207+ let kv_response = KvResponse {
208+ resp : Some ( Resp :: CommonResp ( CommonKvResponse { kvs : vec ! [ KvPair { key, value} ] } ) )
209+ } ;
210+ kv_responses. push ( kv_response) ;
211+ } ,
212+ }
213+ } ,
214+ None => { } ,
215+ }
216+ }
217+
218+ let kv_responses = KvResponses { responses : kv_responses } ;
219+ struct ConnState {
220+ tx : tokio:: sync:: mpsc:: Sender < Vec < u8 > > ,
221+ }
222+
223+ let conn_map: RwLock < HashMap < HashValue , ConnState > > = RwLock :: new ( HashMap :: new ( ) ) ;
224+
225+ let conn = conn. clone ( ) ;
226+ let _: tokio:: task:: JoinHandle < Result < ( ) , WsRpcErr > > = tokio:: spawn ( async move {
227+ let tx = {
228+ let mut conn_map = conn_map. write ( ) ; // 确保使用 await
229+ match conn_map. get_mut ( & conn) {
230+ Some ( state) => {
231+ state. tx . clone ( )
232+ } ,
233+ None => {
234+ // 返回一个错误结果
235+ return Err ( WsRpcErr :: ConnectionNotEstablished ( conn) . into ( ) ) ;
236+ }
237+ }
238+ } ;
239+
240+ // 其他逻辑
241+ let mut buf = BytesMut :: with_capacity ( kv_responses. encoded_len ( ) + 8 ) ;
242+ // 长度
243+ buf. put_i32 ( kv_responses. encoded_len ( ) as i32 ) ;
244+ // taskid
245+ buf. put_i32 ( 9999 ) ;
246+ // 区别类型 reqType
247+ buf. put_i32 ( 1 ) ;
248+
249+ tx. send ( buf. into ( ) ) . await . unwrap ( ) ;
250+
251+ Ok ( ( ) )
252+ } ) ;
253+
254+ return true ;
255+ }
256+ Err ( e) => e,
257+ } ,
125258 _ => unreachable ! ( ) ,
126259 } ;
127260 tracing:: warn!( "handle_remote_call error: {:?}" , err) ;
@@ -147,11 +280,21 @@ impl MsgIdBind for proc_proto::FuncCallResp {
147280 }
148281}
149282
283+ impl MsgIdBind for proc_proto:: KvRequests {
284+ fn id ( ) -> u16 {
285+ 5
286+ }
287+ }
288+
150289impl ReqMsg for FuncCallReq {
151290 type Resp = FuncCallResp ;
152291}
153292
293+ // TODO 看一下是不是根据这个 app或者func 来区分是什么类型的请求
154294pub async fn call_func ( app : & str , func : & str , arg : String ) -> WSResult < FuncCallResp > {
295+
296+ tracing:: debug!( "CALL_FUNC: app:{}, func:{}, arg:{}" , app, func, arg) ;
297+
155298 rpc_model:: call (
156299 FuncCallReq {
157300 func : func. to_owned ( ) ,
0 commit comments