huskies: merge 1094 bug delete_story leaks zombie rows in pipeline_items shadow table — 176 tombstoned items still report non-terminal stages
This commit is contained in:
@@ -29,7 +29,7 @@ pub mod shadow_write;
|
||||
|
||||
pub use content_store::{ContentKey, all_content_ids, delete_content, read_content, write_content};
|
||||
pub use ops::{
|
||||
ItemMeta, delete_item, move_item_stage, next_item_number, sync_item_name,
|
||||
ItemMeta, delete_item, delete_item_sync, move_item_stage, next_item_number, sync_item_name,
|
||||
write_item_with_content,
|
||||
};
|
||||
pub use shadow_write::{check_schema_drift, get_shared_pool, init};
|
||||
|
||||
@@ -198,6 +198,42 @@ pub fn delete_item(story_id: &str) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Delete a story from the shadow table, awaiting the SQLite write.
|
||||
///
|
||||
/// Unlike [`delete_item`], this function issues a direct `DELETE FROM
|
||||
/// pipeline_items` via the shared pool and awaits the result — so the row
|
||||
/// is gone before this function returns. Use this from async call sites
|
||||
/// where durability of the deletion matters (e.g. story deletion, startup
|
||||
/// migration). Falls back to the fire-and-forget channel when the shared
|
||||
/// pool is not yet initialised.
|
||||
pub async fn delete_item_sync(story_id: &str) {
|
||||
delete_content(ContentKey::Story(story_id));
|
||||
|
||||
if let Some(pool) = super::shadow_write::get_shared_pool() {
|
||||
if let Err(e) = sqlx::query("DELETE FROM pipeline_items WHERE id = ?1")
|
||||
.bind(story_id)
|
||||
.execute(pool)
|
||||
.await
|
||||
{
|
||||
crate::slog_warn!(
|
||||
"[db] Synchronous delete from pipeline_items failed for '{}': {e}",
|
||||
story_id
|
||||
);
|
||||
}
|
||||
} else if let Some(db) = PIPELINE_DB.get() {
|
||||
let msg = PipelineWriteMsg {
|
||||
story_id: story_id.to_string(),
|
||||
stage: "deleted".to_string(),
|
||||
name: None,
|
||||
agent: None,
|
||||
retry_count: None,
|
||||
depends_on: None,
|
||||
content: None,
|
||||
};
|
||||
let _ = db.tx.send(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// Sync the shadow table's `name` column after a CRDT name-register write.
|
||||
///
|
||||
/// Reads the current item from the CRDT (which already holds the new name after
|
||||
|
||||
Reference in New Issue
Block a user