From 95d14f5f1fc9280a6941eb9990b57d9cb8719e8f Mon Sep 17 00:00:00 2001 From: Avinash Sajjanshetty Date: Fri, 29 Aug 2025 18:02:56 +0530 Subject: [PATCH] Propagate decryption error from the callback --- core/error.rs | 2 ++ core/storage/database.rs | 36 ++++++++++++++++++++---------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/core/error.rs b/core/error.rs index 368cdb21c..f82200895 100644 --- a/core/error.rs +++ b/core/error.rs @@ -120,6 +120,8 @@ pub enum CompletionError { UringIOError(&'static str), #[error("Completion was aborted")] Aborted, + #[error("Decryption failed for page={page_idx}")] + DecryptionError { page_idx: usize }, } #[macro_export] diff --git a/core/storage/database.rs b/core/storage/database.rs index 1cd1a2d42..3b2dbbdf0 100644 --- a/core/storage/database.rs +++ b/core/storage/database.rs @@ -103,25 +103,29 @@ impl DatabaseStorage for DatabaseFile { let Ok((buf, bytes_read)) = res else { return; }; - if bytes_read > 0 { - match encryption_ctx.decrypt_page(buf.as_slice(), page_idx) { - Ok(decrypted_data) => { - let original_buf = original_c.as_read().buf(); - original_buf.as_mut_slice().copy_from_slice(&decrypted_data); - original_c.complete(bytes_read); - } - Err(_) => { - tracing::error!( - "Failed to decrypt page data for page_id={page_idx}" - ); - original_c.complete(-1); - } + assert!( + bytes_read > 0, + "Expected to read some data on success for page_id={page_idx}" + ); + match encryption_ctx.decrypt_page(buf.as_slice(), page_idx) { + Ok(decrypted_data) => { + let original_buf = original_c.as_read().buf(); + original_buf.as_mut_slice().copy_from_slice(&decrypted_data); + original_c.complete(bytes_read); + } + Err(e) => { + tracing::error!( + "Failed to decrypt page data for page_id={page_idx}: {e}" + ); + assert_eq!( + original_c.has_error(), + false, + "Original completion already has an error" + ); + original_c.error(CompletionError::DecryptionError { page_idx }); } - } else { - original_c.complete(bytes_read); } }); - let new_completion = Completion::new_read(read_buffer, decrypt_complete); self.file.pread(pos, new_completion) } else {