From 1c87ef5536c853816e3aceb6d800f832c99e01a9 Mon Sep 17 00:00:00 2001 From: Lewis Date: Sun, 12 Apr 2026 17:35:19 +0300 Subject: [PATCH] fix(tranquil-store): blockstore tweaks Lewis: May this revision serve well! --- crates/tranquil-pds/src/repo_ops.rs | 55 ++++++++++++++++++----------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/crates/tranquil-pds/src/repo_ops.rs b/crates/tranquil-pds/src/repo_ops.rs index 249bfb9..06f8958 100644 --- a/crates/tranquil-pds/src/repo_ops.rs +++ b/crates/tranquil-pds/src/repo_ops.rs @@ -266,35 +266,48 @@ pub async fn finalize_repo_write( let storage_for_diff = Arc::new(ctx.tracking_store.clone()); let original_settled = Mst::load(storage_for_diff.clone(), ctx.prev_data_cid, None); let new_settled = Mst::load(storage_for_diff, new_mst_root, None); - let (obsolete_cids, new_tree_cids) = tokio::try_join!( - async { - compute_obsolete_cids( - &original_settled, - &new_settled, - CommitCid::from(ctx.current_root_cid), - ) - .await - .map_err(|e| { - error!("MST diff failed during finalize_repo_write: {}", e); - ApiError::InternalError(Some("MST diff failed".into())) - }) - }, + + let (obsolete_result, new_tree_result) = tokio::join!( + compute_obsolete_cids( + &original_settled, + &new_settled, + CommitCid::from(ctx.current_root_cid), + ), async { let (nodes, leaves) = - tokio::try_join!(new_settled.collect_node_cids(), new_settled.leaves(),).map_err( - |e| { - error!("new tree walk failed: {}", e); - ApiError::InternalError(None) - }, - )?; - Ok::, ApiError>( + tokio::try_join!(new_settled.collect_node_cids(), new_settled.leaves(),)?; + Ok::, jacquard_repo::error::RepoError>( nodes .into_iter() .chain(leaves.iter().map(|(_, cid)| *cid)) .collect(), ) }, - )?; + ); + + let new_tree_cids = match new_tree_result { + Ok(cids) => cids, + Err(e) => { + error!( + "new tree walk failed: {e}. \ + Falling back to written-block CIDs only; \ + shared subtree ownership already tracked by prior commits." + ); + block_bytes.keys().copied().collect() + } + }; + + let obsolete_cids = match obsolete_result { + Ok(cids) => cids, + Err(e) => { + error!( + "MST diff failed during finalize_repo_write: {e}. \ + Proceeding with empty obsolete set; leaked blocks \ + will be reclaimed by reachability GC." + ); + vec![ctx.current_root_cid] + } + }; let result = commit_and_log( state,