Skip to content

Commit 4648257

Browse files
authored
Merge pull request #106 from PrimeIntellect-ai/develop
Release v.0.1.2
2 parents 744d11e + bdeb8aa commit 4648257

File tree

14 files changed

+279
-17
lines changed

14 files changed

+279
-17
lines changed

Cargo.lock

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ members = ["discovery", "miner", "validator", "shared", "orchestrator", "dev-uti
33
resolver = "2"
44

55
[workspace.package]
6-
version = "0.1.1"
6+
version = "0.1.2"
77
edition = "2021"
88

99
[workspace.features]

miner/src/cli/command.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,9 @@ pub async fn execute_command(
113113
}
114114

115115
let mut recover_last_state = *auto_recover;
116+
let version = env!("CARGO_PKG_VERSION");
116117
Console::section("🚀 PRIME MINER INITIALIZATION");
118+
Console::info("Version:", version);
117119
/*
118120
Initialize Wallet instances
119121
*/
@@ -283,7 +285,16 @@ pub async fn execute_command(
283285
std::process::exit(1);
284286
};
285287

286-
match compute_node_ops.add_compute_node().await {
288+
let gpu_count: u32 = match &node_config.compute_specs {
289+
Some(specs) => specs
290+
.gpu
291+
.as_ref()
292+
.map(|gpu| gpu.count.unwrap_or(0))
293+
.unwrap_or(0),
294+
None => 0,
295+
};
296+
297+
match compute_node_ops.add_compute_node(gpu_count).await {
287298
Ok(added_node) => {
288299
if added_node {
289300
// If we are adding a new compute node we wait for a proper

miner/src/operations/compute_node.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,10 @@ impl<'c> ComputeNodeOperations<'c> {
2929
}
3030

3131
// Returns true if the compute node was added, false if it already exists
32-
pub async fn add_compute_node(&self) -> Result<bool, Box<dyn std::error::Error>> {
32+
pub async fn add_compute_node(
33+
&self,
34+
gpu_count: u32,
35+
) -> Result<bool, Box<dyn std::error::Error>> {
3336
Console::section("🔄 Adding compute node");
3437
let compute_node = self
3538
.compute_registry
@@ -77,7 +80,7 @@ impl<'c> ComputeNodeOperations<'c> {
7780
.as_bytes();
7881

7982
// Create the signature bytes
80-
let compute_units: U256 = U256::from(10);
83+
let compute_units: U256 = U256::from(1000 * gpu_count);
8184
let add_node_tx = self
8285
.prime_network
8386
.add_compute_node(node_address, compute_units, signature.to_vec())

miner/src/operations/heartbeat/service.rs

+2
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,15 @@ impl HeartbeatService {
143143
task_id: Some(task.id.to_string()),
144144
task_state: Some(task.state.to_string()),
145145
metrics: Some(metrics_for_task),
146+
version: Some(env!("CARGO_PKG_VERSION").to_string()),
146147
}
147148
} else {
148149
HeartbeatRequest {
149150
address: wallet.address().to_string(),
150151
task_id: None,
151152
task_state: None,
152153
metrics: None,
154+
version: Some(env!("CARGO_PKG_VERSION").to_string()),
153155
}
154156
};
155157

orchestrator/src/api/routes/heartbeat.rs

+20-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,16 @@ mod tests {
7474
.store_context
7575
.heartbeat_store
7676
.get_heartbeat(&node_address);
77-
assert_eq!(value, Some("{\"address\":\"0x0000000000000000000000000000000000000000\",\"task_id\":null,\"task_state\":null,\"metrics\":null}".to_string()));
77+
assert_eq!(
78+
value,
79+
Some(HeartbeatRequest {
80+
address: "0x0000000000000000000000000000000000000000".to_string(),
81+
task_id: None,
82+
task_state: None,
83+
metrics: None,
84+
version: None
85+
})
86+
);
7887
}
7988

8089
#[actix_web::test]
@@ -120,6 +129,15 @@ mod tests {
120129
.heartbeat_store
121130
.get_heartbeat(&node_address);
122131
// Task has not started yet
123-
assert_eq!(value, Some("{\"address\":\"0x0000000000000000000000000000000000000000\",\"task_id\":null,\"task_state\":null,\"metrics\":null}".to_string()));
132+
133+
let value = value.unwrap();
134+
let heartbeat = HeartbeatRequest {
135+
address: "0x0000000000000000000000000000000000000000".to_string(),
136+
task_id: None,
137+
task_state: None,
138+
metrics: None,
139+
version: None,
140+
};
141+
assert_eq!(value, heartbeat);
124142
}
125143
}

orchestrator/src/api/routes/nodes.rs

+44
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,22 @@ async fn get_node_logs(node_id: web::Path<String>, app_state: Data<AppState>) ->
133133
}
134134
}
135135

136+
async fn get_node_metrics(node_id: web::Path<String>, app_state: Data<AppState>) -> HttpResponse {
137+
println!("get_node_metrics: {}", node_id);
138+
let node_address = Address::from_str(&node_id).unwrap();
139+
let metrics = app_state
140+
.store_context
141+
.metrics_store
142+
.get_metrics_for_node(node_address);
143+
HttpResponse::Ok().json(json!({"success": true, "metrics": metrics}))
144+
}
145+
136146
pub fn nodes_routes() -> Scope {
137147
web::scope("/nodes")
138148
.route("", get().to(get_nodes))
139149
.route("/{node_id}/restart", post().to(restart_node_task))
140150
.route("/{node_id}/logs", get().to(get_node_logs))
151+
.route("/{node_id}/metrics", get().to(get_node_metrics))
141152
}
142153

143154
#[cfg(test)]
@@ -168,6 +179,7 @@ mod tests {
168179
status: NodeStatus::Discovered,
169180
task_id: None,
170181
task_state: None,
182+
version: None,
171183
};
172184
app_state.store_context.node_store.add_node(node.clone());
173185

@@ -201,4 +213,36 @@ mod tests {
201213
nodes_array[0]["address"]
202214
);
203215
}
216+
217+
#[actix_web::test]
218+
async fn test_get_metrics_for_node_not_exist() {
219+
let app_state = create_test_app_state().await;
220+
let app = test::init_service(
221+
App::new()
222+
.app_data(app_state.clone())
223+
.route("/nodes/{node_id}/metrics", get().to(get_node_metrics)),
224+
)
225+
.await;
226+
227+
let node_id = "0x0000000000000000000000000000000000000000";
228+
let req = test::TestRequest::get()
229+
.uri(&format!("/nodes/{}/metrics", node_id))
230+
.to_request();
231+
let resp = test::call_service(&app, req).await;
232+
233+
let body = test::read_body(resp).await;
234+
let json: serde_json::Value = serde_json::from_slice(&body).unwrap();
235+
println!("json {:?}", json);
236+
assert_eq!(
237+
json["success"], true,
238+
"Expected success to be true but got {:?}",
239+
json["success"]
240+
);
241+
assert_eq!(
242+
json["metrics"],
243+
json!({}),
244+
"Expected empty metrics object but got {:?}",
245+
json["metrics"]
246+
);
247+
}
204248
}

orchestrator/src/models/node.rs

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub struct OrchestratorNode {
1212

1313
pub task_id: Option<String>,
1414
pub task_state: Option<TaskState>,
15+
pub version: Option<String>,
1516
}
1617

1718
impl From<DiscoveryNode> for OrchestratorNode {
@@ -23,6 +24,7 @@ impl From<DiscoveryNode> for OrchestratorNode {
2324
status: NodeStatus::Discovered,
2425
task_id: None,
2526
task_state: None,
27+
version: None,
2628
}
2729
}
2830
}

orchestrator/src/node/status_update.rs

+21-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ impl NodeStatusUpdater {
5252
let nodes = self.store_context.node_store.get_nodes();
5353
for node in nodes {
5454
if node.status == NodeStatus::Dead {
55-
println!("Node is dead, checking if we need to remove from chain");
5655
let node_in_pool: bool = match self
5756
.contracts
5857
.compute_pool
@@ -98,8 +97,17 @@ impl NodeStatusUpdater {
9897
.heartbeat_store
9998
.get_unhealthy_counter(&node.address);
10099
match heartbeat {
101-
Some(_) => {
100+
Some(beat) => {
102101
// We have a heartbeat
102+
if let Some(version) = &beat.version {
103+
if node.version.as_ref() != Some(version) {
104+
let _: () = self
105+
.store_context
106+
.node_store
107+
.update_node_version(&node.address, version);
108+
}
109+
}
110+
103111
if node.status == NodeStatus::Unhealthy
104112
|| node.status == NodeStatus::WaitingForHeartbeat
105113
{
@@ -181,6 +189,7 @@ mod tests {
181189
status: NodeStatus::WaitingForHeartbeat,
182190
task_id: None,
183191
task_state: None,
192+
version: None,
184193
};
185194

186195
let _: () = app_state.store_context.node_store.add_node(node.clone());
@@ -189,6 +198,7 @@ mod tests {
189198
task_id: None,
190199
task_state: None,
191200
metrics: None,
201+
version: Some(env!("CARGO_PKG_VERSION").to_string()),
192202
};
193203
let _: () = app_state.store_context.heartbeat_store.beat(&heartbeat);
194204

@@ -228,6 +238,7 @@ mod tests {
228238
status: NodeStatus::Healthy,
229239
task_id: None,
230240
task_state: None,
241+
version: None,
231242
};
232243

233244
let _: () = app_state.store_context.node_store.add_node(node.clone());
@@ -267,6 +278,7 @@ mod tests {
267278
status: NodeStatus::Unhealthy,
268279
task_id: None,
269280
task_state: None,
281+
version: None,
270282
};
271283

272284
let _: () = app_state.store_context.node_store.add_node(node.clone());
@@ -311,6 +323,7 @@ mod tests {
311323
status: NodeStatus::Unhealthy,
312324
task_id: None,
313325
task_state: None,
326+
version: None,
314327
};
315328

316329
let _: () = app_state.store_context.node_store.add_node(node.clone());
@@ -355,6 +368,7 @@ mod tests {
355368
status: NodeStatus::Unhealthy,
356369
task_id: None,
357370
task_state: None,
371+
version: None,
358372
};
359373
let _: () = app_state
360374
.store_context
@@ -366,6 +380,7 @@ mod tests {
366380
task_id: None,
367381
task_state: None,
368382
metrics: None,
383+
version: Some(env!("CARGO_PKG_VERSION").to_string()),
369384
};
370385
let _: () = app_state.store_context.heartbeat_store.beat(&heartbeat);
371386
let _: () = app_state.store_context.node_store.add_node(node.clone());
@@ -412,6 +427,7 @@ mod tests {
412427
status: NodeStatus::Unhealthy,
413428
task_id: None,
414429
task_state: None,
430+
version: None,
415431
};
416432
let _: () = app_state
417433
.store_context
@@ -426,6 +442,7 @@ mod tests {
426442
status: NodeStatus::Healthy,
427443
task_id: None,
428444
task_state: None,
445+
version: None,
429446
};
430447

431448
let _: () = app_state.store_context.node_store.add_node(node2.clone());
@@ -483,6 +500,7 @@ mod tests {
483500
status: NodeStatus::Unhealthy,
484501
task_id: None,
485502
task_state: None,
503+
version: None,
486504
};
487505

488506
let _: () = app_state.store_context.node_store.add_node(node.clone());
@@ -519,6 +537,7 @@ mod tests {
519537
task_id: None,
520538
task_state: None,
521539
metrics: None,
540+
version: Some(env!("CARGO_PKG_VERSION").to_string()),
522541
};
523542
let _: () = app_state.store_context.heartbeat_store.beat(&heartbeat);
524543

orchestrator/src/store/domains/heartbeat_store.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ impl HeartbeatStore {
3232
.unwrap();
3333
}
3434

35-
pub fn get_heartbeat(&self, address: &Address) -> Option<String> {
35+
pub fn get_heartbeat(&self, address: &Address) -> Option<HeartbeatRequest> {
3636
let mut con = self.redis.client.get_connection().unwrap();
3737
let key = format!("{}:{}", ORCHESTRATOR_HEARTBEAT_KEY, address);
3838
let value: Option<String> = con.get(key).unwrap();
39-
value
39+
value.and_then(|v| serde_json::from_str(&v).ok())
4040
}
4141

4242
pub fn get_unhealthy_counter(&self, address: &Address) -> u32 {

0 commit comments

Comments
 (0)