Skip to content

Commit 597d7ed

Browse files
feat: Integrated Java KV interface
1 parent 1778957 commit 597d7ed

11 files changed

Lines changed: 229 additions & 13 deletions

File tree

scripts/deploy_cluster/node_config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
nodes:
2-
9:
3-
addr: 192.168.31.9:2500
2+
4:
3+
addr: 192.168.31.109:2500
44
spec:
55
- meta
66
- master

src/general/m_appmeta_manager/http.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ async fn call_app_fn(Path((app, func)): Path<(String, String)>, body: String) ->
8484
}
8585
}
8686

87+
// KV DEBUG
8788
async fn upload_app(mut multipart: Multipart) -> Response {
8889
tracing::debug!("upload_app called");
8990
// only worker can upload app

src/general/m_appmeta_manager/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ impl<'de> Deserialize<'de> for FnMetaYaml {
138138
.ok_or_else(|| serde::de::Error::custom("not a map"))?;
139139
// let calls = map.remove("calls").ok_or_else(|| serde::de::Error::missing_field("calls"))?;
140140
let mut calls = vec![];
141+
142+
// KV DEBUG
141143
fn parse_http_call<'de, D: Deserializer<'de>>(
142144
map: &serde_yaml::Value,
143145
) -> Result<HttpCall, D::Error> {
@@ -695,6 +697,7 @@ impl AppMetaManager {
695697
// let appdir = self.fs_layer.concat_app_dir(app);
696698
let appmeta = self.fs_layer.read_app_meta(tmpapp).await?;
697699

700+
// KV DEBUG
698701
// TODO: 2.check project dir
699702
// 3. if java, take snapshot
700703
if let AppType::Jar = appmeta.app_type {
@@ -736,6 +739,8 @@ impl AppMetaManager {
736739
.await
737740
.is_some())
738741
}
742+
743+
// KV DEBUG
739744
pub async fn app_uploaded(&self, appname: String, data: Bytes) -> WSResult<()> {
740745
// 1. tmpapp name & dir
741746
// TODO: fobidden tmpapp public access

src/general/m_os/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ impl OperatingSystem {
111111
pub fn app_path(&self, app: &str) -> PathBuf {
112112
self.view.appmeta_manager().fs_layer.concat_app_dir(app)
113113
}
114+
115+
// KV DEBUG
114116
pub fn start_process(&self, p: OsProcessType) -> process::Child {
115117
let (mut binding, log_file) = match p {
116118
OsProcessType::JavaApp(app) => {

src/general/network/proto_src/kv.proto

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,25 @@ message KvPairs{
4141

4242
message KvResponse{
4343
message KvResponse{
44-
repeated KvPair kvs=1;
44+
repeated KvPair kvs=1;
4545
}
4646
oneof resp {
4747
KvResponse common_resp=1;
4848
uint32 lock_id=2;
4949
}
5050
}
5151

52+
message KvResponses{
53+
repeated KvResponse responses=1;
54+
}
55+
5256
message KvRequests{
5357
string app=1;
5458
string func=2;
5559
repeated KvRequest requests=3;
5660
int64 prev_kv_opeid=4;
5761
}
5862

59-
message KvResponses{
60-
repeated KvResponse responses=1;
61-
}
62-
6363
// message MetaKvRequest{
6464
// KvRequest request=1;
6565
// }

src/worker/func/shared/java.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::{
99

1010
use super::process::PID;
1111

12+
// KV DEBUG
1213
pub(super) fn cold_start(app: &str, os: &OperatingSystem) -> WSResult<process::Child> {
1314
tracing::debug!("java cold start {}", app);
1415
let p = os.start_process(OsProcessType::JavaApp(app.to_owned()));

src/worker/func/shared/process.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ impl ProcessInstance {
147147
true
148148
}
149149

150+
// KV DEBUG
150151
pub async fn wait_for_verify(&self) -> proc_proto::AppStarted {
151152
if let Some(v) = self.state.0.read().0.as_connected() {
152153
return v.clone();

src/worker/func/shared/process_instance_man_related.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ impl InstanceManager {
8080
Ok(())
8181
}
8282

83+
// KV DEBUG
8384
pub async fn make_checkpoint_for_app(&self, app: &str) -> WSResult<()> {
8485
tracing::debug!("make checkpoint for app: {}", app);
8586
let p = self.get_process_instance(&AppType::Jar, app);

src/worker/func/shared/process_rpc.rs

Lines changed: 148 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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
};
1414
use 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+
};
1721
use std::{collections::HashMap, path::Path, time::Duration};
1822
use tokio::sync::oneshot;
1923

@@ -37,6 +41,8 @@ lazy_static::lazy_static! {
3741
#[async_trait]
3842
impl 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+
150289
impl ReqMsg for FuncCallReq {
151290
type Resp = FuncCallResp;
152291
}
153292

293+
// TODO 看一下是不是根据这个 app或者func 来区分是什么类型的请求
154294
pub 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

Comments
 (0)