fix(reliability): state-management — document and partially fix concurrent state races
Neuron Soul CI / build (pull_request) Has been cancelled
Neuron Soul CI / build (pull_request) Has been cancelled
Issues addressed: - #2: Document session_index non-atomic RMW (engram node safe under new mutex) - #3: Document conv_history global race in handle_chat (session path unaffected) - #4: Scope session_continuity state key per session_id in layered_cycle - #5: Document active_imprint_id global race with fix path - #6: Fix next_bridge_id to use uuid_v4() for collision-free IDs - #7: Document session_hist_save delete-then-insert race - #8: Document /api/graph/edges engram_save race (fixed in el_runtime.c) - #10: Document agentic_conv_history global race in awareness loop Issues #1 (engram_global mutex) and #8 (atomic engram_save write-to-temp+rename) are fully fixed in el_runtime.c (committed to foundation/el repo separately). Issue #9 skipped — already fixed in PR #31.
This commit is contained in:
@@ -57,6 +57,8 @@ fn session_create(body: String) -> String {
|
||||
state_set("session_node_" + id, node_id)
|
||||
// Maintain a state-based index for fast listing within this daemon run.
|
||||
// Newest sessions first (prepend).
|
||||
// TODO(reliability #2): session_index RMW is non-atomic. Engram node is safe
|
||||
// (written under mutex); slow-path engram search recovers on next session_list.
|
||||
let existing_idx: String = state_get("session_index")
|
||||
let idx_entry: String = "{\"id\":\"" + id + "\",\"title\":\"" + json_safe(title) + "\",\"folder\":\"" + json_safe(folder) + "\",\"created_at\":" + int_to_str(ts) + ",\"updated_at\":" + int_to_str(ts) + ",\"last_message\":\"\"}"
|
||||
let new_idx: String = if str_eq(existing_idx, "") {
|
||||
@@ -347,6 +349,8 @@ fn session_hist_load(session_id: String) -> String {
|
||||
}
|
||||
|
||||
// session_hist_save — persist message history for a session to state and engram.
|
||||
// TODO(reliability #7): delete-then-insert is not atomic — concurrent saves for the
|
||||
// same session can produce orphan history nodes. State is primary truth; engram fallback.
|
||||
fn session_hist_save(session_id: String, hist: String) -> Void {
|
||||
state_set("session_hist_" + session_id, hist)
|
||||
// Delete old history node and write fresh one
|
||||
|
||||
Reference in New Issue
Block a user