huskies: merge 1052
This commit is contained in:
@@ -650,6 +650,61 @@ pub fn migrate_merge_job(db_path: &std::path::Path) {
|
||||
slog!("[crdt] Migrated {count} MergeJob entries to typed MergeResult format");
|
||||
}
|
||||
|
||||
/// Delete MergeJob CRDT entries for stories that have reached a terminal stage
|
||||
/// (Done, Archived, Abandoned, Superseded, Rejected).
|
||||
///
|
||||
/// Pre-1036 code left stale MergeJob entries after a story recovered from a
|
||||
/// merge failure and transitioned to Done. Those entries caused the gateway
|
||||
/// UI to mislabel recovered stories as "FAILED" because `load_pipeline_state`
|
||||
/// unconditionally read the MergeJob error field for every story. This
|
||||
/// migration removes the orphaned entries so the state is clean on the next
|
||||
/// server start.
|
||||
///
|
||||
/// Running this migration repeatedly is safe — tombstoned entries are filtered
|
||||
/// out by the read path, so subsequent calls are no-ops.
|
||||
pub fn purge_done_stage_merge_jobs() {
|
||||
use crate::pipeline_state::Stage;
|
||||
|
||||
let Some(jobs) = crate::crdt_state::read_all_merge_jobs() else {
|
||||
return;
|
||||
};
|
||||
if jobs.is_empty() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Collect IDs of every story currently in a terminal stage.
|
||||
let terminal_ids: std::collections::HashSet<String> = crate::pipeline_state::read_all_typed()
|
||||
.into_iter()
|
||||
.filter(|item| {
|
||||
matches!(
|
||||
item.stage,
|
||||
Stage::Done { .. }
|
||||
| Stage::Archived { .. }
|
||||
| Stage::Abandoned { .. }
|
||||
| Stage::Superseded { .. }
|
||||
| Stage::Rejected { .. }
|
||||
)
|
||||
})
|
||||
.map(|item| item.story_id.0.clone())
|
||||
.collect();
|
||||
|
||||
let to_delete: Vec<String> = jobs
|
||||
.into_iter()
|
||||
.filter(|j| terminal_ids.contains(&j.story_id))
|
||||
.map(|j| j.story_id)
|
||||
.collect();
|
||||
|
||||
if to_delete.is_empty() {
|
||||
return;
|
||||
}
|
||||
|
||||
let count = to_delete.len();
|
||||
for story_id in &to_delete {
|
||||
crate::crdt_state::delete_merge_job(story_id);
|
||||
}
|
||||
slog!("[crdt] Purged {count} stale MergeJob entries for terminal-stage stories");
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod merge_job_migration_tests {
|
||||
use super::super::super::state::init_for_test;
|
||||
|
||||
Reference in New Issue
Block a user