Skip to content

Commit d19320d

Browse files
committed
fix: persist chain_state after rename/activate/deactivate/sudo operations
- Add set_challenge_active() to ChainState - Call persist_core_state_to_storage() after activate/deactivate/rename/sudo_action - Update both chain_state and state_manager for activate/deactivate - Ensures challenge changes survive validator restarts
1 parent b6ed215 commit d19320d

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

bins/validator-node/src/main.rs

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2279,21 +2279,50 @@ async fn handle_network_event(
22792279
} // end else for is_valid
22802280
}
22812281
"activate" => {
2282+
{
2283+
let mut cs = chain_state.write();
2284+
cs.set_challenge_active(&update.challenge_id, true);
2285+
}
22822286
state_manager.apply(|state| {
22832287
state.set_challenge_active(&update.challenge_id, true);
22842288
});
2289+
// Persist state change
2290+
if let Err(e) =
2291+
persist_core_state_to_storage(storage, chain_state).await
2292+
{
2293+
warn!("Failed to persist state after activate: {}", e);
2294+
}
22852295
info!(challenge_id = %update.challenge_id, "Challenge activated");
22862296
}
22872297
"deactivate" => {
2298+
{
2299+
let mut cs = chain_state.write();
2300+
cs.set_challenge_active(&update.challenge_id, false);
2301+
}
22882302
state_manager.apply(|state| {
22892303
state.set_challenge_active(&update.challenge_id, false);
22902304
});
2305+
// Persist state change
2306+
if let Err(e) =
2307+
persist_core_state_to_storage(storage, chain_state).await
2308+
{
2309+
warn!("Failed to persist state after deactivate: {}", e);
2310+
}
22912311
info!(challenge_id = %update.challenge_id, "Challenge deactivated");
22922312
}
22932313
"rename" => {
22942314
if let Ok(new_name) = String::from_utf8(update.data.clone()) {
2295-
let mut cs = chain_state.write();
2296-
if cs.rename_challenge(&update.challenge_id, new_name.clone()) {
2315+
let renamed = {
2316+
let mut cs = chain_state.write();
2317+
cs.rename_challenge(&update.challenge_id, new_name.clone())
2318+
};
2319+
if renamed {
2320+
// Persist state change
2321+
if let Err(e) =
2322+
persist_core_state_to_storage(storage, chain_state).await
2323+
{
2324+
warn!("Failed to persist state after rename: {}", e);
2325+
}
22972326
info!(
22982327
challenge_id = %update.challenge_id,
22992328
new_name = %new_name,
@@ -2312,11 +2341,19 @@ async fn handle_network_event(
23122341
match bincode::deserialize::<platform_core::SudoAction>(&update.data) {
23132342
Ok(action) => {
23142343
info!("Applying sudo action from P2P: {:?}", action);
2315-
let mut cs = chain_state.write();
2316-
if let Err(e) = cs.apply_sudo_action(&action) {
2317-
error!("Failed to apply sudo action from P2P: {}", e);
2318-
} else {
2319-
info!("Sudo action applied from P2P successfully");
2344+
{
2345+
let mut cs = chain_state.write();
2346+
if let Err(e) = cs.apply_sudo_action(&action) {
2347+
error!("Failed to apply sudo action from P2P: {}", e);
2348+
} else {
2349+
info!("Sudo action applied from P2P successfully");
2350+
}
2351+
}
2352+
// Persist state change
2353+
if let Err(e) =
2354+
persist_core_state_to_storage(storage, chain_state).await
2355+
{
2356+
warn!("Failed to persist state after sudo action: {}", e);
23202357
}
23212358
}
23222359
Err(e) => {

crates/core/src/state.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,21 @@ impl ChainState {
545545
self.challenge_routes.get(challenge_id)
546546
}
547547

548+
/// Set challenge active status
549+
pub fn set_challenge_active(&mut self, id: &ChallengeId, active: bool) -> bool {
550+
if let Some(config) = self.wasm_challenge_configs.get_mut(id) {
551+
config.is_active = active;
552+
self.increment_mutation_sequence();
553+
return true;
554+
}
555+
if let Some(config) = self.challenges.get_mut(id) {
556+
config.is_active = active;
557+
self.increment_mutation_sequence();
558+
return true;
559+
}
560+
false
561+
}
562+
548563
/// Rename a challenge (storage unaffected - uses UUID namespace)
549564
pub fn rename_challenge(&mut self, id: &ChallengeId, new_name: String) -> bool {
550565
// Check name uniqueness in wasm_challenge_configs

0 commit comments

Comments
 (0)