Skip to content

Commit e9a3222

Browse files
committed
BlobNotFoundOnRead -> BlobsNotFound
1 parent 17185e6 commit e9a3222

File tree

14 files changed

+209
-128
lines changed

14 files changed

+209
-128
lines changed

linera-chain/src/lib.rs

+13-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use data_types::{MessageBundle, Origin, PostedMessage};
1818
use linera_base::{
1919
crypto::{CryptoError, CryptoHash},
2020
data_types::{ArithmeticError, BlockHeight, Round, Timestamp},
21-
identifiers::{ApplicationId, ChainId},
21+
identifiers::{ApplicationId, BlobId, ChainId},
2222
};
2323
use linera_execution::ExecutionError;
2424
use linera_views::views::ViewError;
@@ -32,7 +32,7 @@ pub enum ChainError {
3232
#[error("Arithmetic error: {0}")]
3333
ArithmeticError(#[from] ArithmeticError),
3434
#[error("Error in view operation: {0}")]
35-
ViewError(#[from] ViewError),
35+
ViewError(ViewError),
3636
#[error("Execution error: {0} during {1:?}")]
3737
ExecutionError(ExecutionError, ChainExecutionContext),
3838

@@ -150,6 +150,17 @@ pub enum ChainError {
150150
expected: CryptoHash,
151151
actual: CryptoHash,
152152
},
153+
#[error("Blobs not found: {0:?}")]
154+
BlobsNotFound(Vec<BlobId>),
155+
}
156+
157+
impl From<ViewError> for ChainError {
158+
fn from(error: ViewError) -> Self {
159+
match error {
160+
ViewError::BlobsNotFound(blob_ids) => ChainError::BlobsNotFound(blob_ids),
161+
error => ChainError::ViewError(error),
162+
}
163+
}
153164
}
154165

155166
#[derive(Copy, Clone, Debug)]

linera-core/src/client/mod.rs

+56-24
Original file line numberDiff line numberDiff line change
@@ -380,16 +380,12 @@ where
380380
let mut result = self.handle_certificate(certificate.clone(), vec![]).await;
381381

382382
result = match &result {
383-
Err(err) => {
384-
if let Some(blob_ids) = err.get_blobs_not_found() {
385-
let blobs = remote_node.try_download_blobs(blob_ids.as_slice()).await;
386-
if blobs.len() != blob_ids.len() {
387-
result
388-
} else {
389-
self.handle_certificate(certificate, blobs).await
390-
}
391-
} else {
383+
Err(LocalNodeError::BlobsNotFound(blob_ids)) => {
384+
let blobs = remote_node.try_download_blobs(blob_ids.as_slice()).await;
385+
if blobs.len() != blob_ids.len() {
392386
result
387+
} else {
388+
self.handle_certificate(certificate, blobs).await
393389
}
394390
}
395391
_ => result,
@@ -540,10 +536,10 @@ where
540536
#[derive(Debug, Error)]
541537
pub enum ChainClientError {
542538
#[error("Local node operation failed: {0}")]
543-
LocalNodeError(#[from] LocalNodeError),
539+
LocalNodeError(LocalNodeError),
544540

545541
#[error("Remote node operation failed: {0}")]
546-
RemoteNodeError(#[from] NodeError),
542+
RemoteNodeError(NodeError),
547543

548544
#[error(transparent)]
549545
ArithmeticError(#[from] ArithmeticError),
@@ -552,7 +548,7 @@ pub enum ChainClientError {
552548
JsonError(#[from] serde_json::Error),
553549

554550
#[error("Chain operation failed: {0}")]
555-
ChainError(#[from] ChainError),
551+
ChainError(ChainError),
556552

557553
#[error(transparent)]
558554
CommunicationError(#[from] CommunicationError<NodeError>),
@@ -588,7 +584,7 @@ pub enum ChainClientError {
588584
FoundMultipleKeysForChain(ChainId),
589585

590586
#[error(transparent)]
591-
ViewError(#[from] ViewError),
587+
ViewError(ViewError),
592588

593589
#[error("Blobs not found: {0:?}")]
594590
BlobsNotFound(Vec<BlobId>),
@@ -603,6 +599,45 @@ pub enum ChainClientError {
603599
},
604600
}
605601

602+
impl From<NodeError> for ChainClientError {
603+
fn from(error: NodeError) -> Self {
604+
match error {
605+
NodeError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
606+
error => Self::RemoteNodeError(error),
607+
}
608+
}
609+
}
610+
611+
impl From<ViewError> for ChainClientError {
612+
fn from(error: ViewError) -> Self {
613+
match error {
614+
ViewError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
615+
error => Self::ViewError(error),
616+
}
617+
}
618+
}
619+
620+
impl From<LocalNodeError> for ChainClientError {
621+
fn from(error: LocalNodeError) -> Self {
622+
match error {
623+
LocalNodeError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
624+
error => Self::LocalNodeError(error),
625+
}
626+
}
627+
}
628+
629+
impl From<ChainError> for ChainClientError {
630+
fn from(error: ChainError) -> Self {
631+
match error {
632+
ChainError::BlobsNotFound(blob_ids)
633+
| ChainError::ExecutionError(ExecutionError::BlobsNotFound(blob_ids), _) => {
634+
Self::BlobsNotFound(blob_ids)
635+
}
636+
error => Self::ChainError(error),
637+
}
638+
}
639+
}
640+
606641
impl From<Infallible> for ChainClientError {
607642
fn from(infallible: Infallible) -> Self {
608643
match infallible {}
@@ -1231,7 +1266,7 @@ where
12311266
// necessary.
12321267
if let Err(err) = self.process_certificate(certificate.clone(), vec![]).await {
12331268
match &err {
1234-
LocalNodeError::WorkerError(WorkerError::BlobsNotFound(blob_ids)) => {
1269+
LocalNodeError::BlobsNotFound(blob_ids) => {
12351270
let blobs = RemoteNode::download_blobs(blob_ids, &nodes).await;
12361271

12371272
ensure!(blobs.len() == blob_ids.len(), err);
@@ -1722,8 +1757,8 @@ where
17221757
.handle_block_proposal(*proposal.clone())
17231758
.await
17241759
{
1725-
if let Some(blob_ids) = original_err.get_blobs_not_found() {
1726-
self.update_local_node_with_blobs_from(blob_ids, remote_node)
1760+
if let LocalNodeError::BlobsNotFound(blob_ids) = &original_err {
1761+
self.update_local_node_with_blobs_from(blob_ids.clone(), remote_node)
17271762
.await?;
17281763
continue; // We found the missing blobs: retry.
17291764
}
@@ -1740,9 +1775,7 @@ where
17401775
let mut blobs = vec![];
17411776
while let Err(original_err) = self.client.handle_certificate(*cert.clone(), blobs).await
17421777
{
1743-
if let LocalNodeError::WorkerError(WorkerError::BlobsNotFound(blob_ids)) =
1744-
&original_err
1745-
{
1778+
if let LocalNodeError::BlobsNotFound(blob_ids) = &original_err {
17461779
blobs = remote_node
17471780
.find_missing_blobs(blob_ids.clone(), chain_id)
17481781
.await?;
@@ -1891,11 +1924,10 @@ where
18911924
.local_node
18921925
.stage_block_execution(block.clone())
18931926
.await;
1894-
if let Err(err) = &result {
1895-
if let Some(blob_ids) = err.get_blobs_not_found() {
1896-
self.receive_certificates_for_blobs(blob_ids).await?;
1897-
continue; // We found the missing blob: retry.
1898-
}
1927+
if let Err(LocalNodeError::BlobsNotFound(blob_ids)) = &result {
1928+
self.receive_certificates_for_blobs(blob_ids.clone())
1929+
.await?;
1930+
continue; // We found the missing blob: retry.
18991931
}
19001932
return Ok(result?);
19011933
}

linera-core/src/local_node.rs

+21-26
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ use linera_chain::{
1515
data_types::{
1616
Block, BlockProposal, Certificate, CertificateValue, ExecutedBlock, LiteCertificate,
1717
},
18-
ChainError, ChainStateView,
18+
ChainStateView,
1919
};
20-
use linera_execution::{ExecutionError, Query, Response, SystemExecutionError};
20+
use linera_execution::{Query, Response};
2121
use linera_storage::Storage;
2222
use linera_views::views::ViewError;
2323
use thiserror::Error;
@@ -55,10 +55,10 @@ pub enum LocalNodeError {
5555
ArithmeticError(#[from] ArithmeticError),
5656

5757
#[error(transparent)]
58-
ViewError(#[from] linera_views::views::ViewError),
58+
ViewError(ViewError),
5959

6060
#[error("Local node operation failed: {0}")]
61-
WorkerError(#[from] WorkerError),
61+
WorkerError(WorkerError),
6262

6363
#[error("Failed to read blob {blob_id:?} of chain {chain_id:?}")]
6464
CannotReadLocalBlob { chain_id: ChainId, blob_id: BlobId },
@@ -68,30 +68,25 @@ pub enum LocalNodeError {
6868

6969
#[error("The chain info response received from the local node is invalid")]
7070
InvalidChainInfoResponse,
71+
72+
#[error("Blobs not found: {0:?}")]
73+
BlobsNotFound(Vec<BlobId>),
7174
}
7275

73-
impl LocalNodeError {
74-
pub fn get_blobs_not_found(&self) -> Option<Vec<BlobId>> {
75-
match self {
76-
LocalNodeError::WorkerError(WorkerError::ChainError(chain_error)) => {
77-
match **chain_error {
78-
ChainError::ExecutionError(
79-
ExecutionError::SystemError(SystemExecutionError::BlobNotFoundOnRead(
80-
blob_id,
81-
)),
82-
_,
83-
)
84-
| ChainError::ExecutionError(
85-
ExecutionError::ViewError(ViewError::BlobNotFoundOnRead(blob_id)),
86-
_,
87-
) => Some(vec![blob_id]),
88-
_ => None,
89-
}
90-
}
91-
LocalNodeError::WorkerError(WorkerError::BlobsNotFound(blob_ids)) => {
92-
Some(blob_ids.clone())
93-
}
94-
_ => None,
76+
impl From<WorkerError> for LocalNodeError {
77+
fn from(error: WorkerError) -> Self {
78+
match error {
79+
WorkerError::BlobsNotFound(blob_ids) => LocalNodeError::BlobsNotFound(blob_ids),
80+
error => LocalNodeError::WorkerError(error),
81+
}
82+
}
83+
}
84+
85+
impl From<ViewError> for LocalNodeError {
86+
fn from(error: ViewError) -> Self {
87+
match error {
88+
ViewError::BlobsNotFound(blob_ids) => LocalNodeError::BlobsNotFound(blob_ids),
89+
error => LocalNodeError::ViewError(error),
9590
}
9691
}
9792
}

linera-core/src/node.rs

+12-15
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use linera_chain::{
1818
};
1919
use linera_execution::{
2020
committee::{Committee, ValidatorName},
21-
ExecutionError, SystemExecutionError,
21+
ExecutionError,
2222
};
2323
use linera_version::VersionInfo;
2424
use linera_views::views::ViewError;
@@ -178,7 +178,7 @@ pub enum NodeError {
178178
height: BlockHeight,
179179
},
180180

181-
#[error("The following blobs are missing: {0:?}.")]
181+
#[error("Blobs not found: {0:?}")]
182182
BlobsNotFound(Vec<BlobId>),
183183

184184
// This error must be normalized during conversions.
@@ -216,8 +216,6 @@ pub enum NodeError {
216216
#[error("Failed to make a chain info query on the local node: {error}")]
217217
LocalNodeQuery { error: String },
218218

219-
#[error("Blob not found on storage read: {0}")]
220-
BlobNotFoundOnRead(BlobId),
221219
#[error("Node failed to provide a 'last used by' certificate for the blob")]
222220
InvalidCertificateForBlob(BlobId),
223221
#[error("Local error handling validator response")]
@@ -252,8 +250,11 @@ impl CrossChainMessageDelivery {
252250

253251
impl From<ViewError> for NodeError {
254252
fn from(error: ViewError) -> Self {
255-
Self::ViewError {
256-
error: error.to_string(),
253+
match error {
254+
ViewError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
255+
error => Self::ViewError {
256+
error: error.to_string(),
257+
},
257258
}
258259
}
259260
}
@@ -287,14 +288,10 @@ impl From<ChainError> for NodeError {
287288
height,
288289
},
289290
ChainError::InactiveChain(chain_id) => Self::InactiveChain(chain_id),
290-
ChainError::ExecutionError(
291-
ExecutionError::SystemError(SystemExecutionError::BlobNotFoundOnRead(blob_id)),
292-
_,
293-
)
294-
| ChainError::ExecutionError(
295-
ExecutionError::ViewError(ViewError::BlobNotFoundOnRead(blob_id)),
296-
_,
297-
) => Self::BlobNotFoundOnRead(blob_id),
291+
ChainError::BlobsNotFound(blob_ids)
292+
| ChainError::ExecutionError(ExecutionError::BlobsNotFound(blob_ids), _) => {
293+
Self::BlobsNotFound(blob_ids)
294+
}
298295
error => Self::ChainError {
299296
error: error.to_string(),
300297
},
@@ -307,7 +304,7 @@ impl From<WorkerError> for NodeError {
307304
match error {
308305
WorkerError::ChainError(error) => (*error).into(),
309306
WorkerError::MissingCertificateValue => Self::MissingCertificateValue,
310-
WorkerError::BlobsNotFound(blob_ids) => NodeError::BlobsNotFound(blob_ids),
307+
WorkerError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
311308
error => Self::WorkerError {
312309
error: error.to_string(),
313310
},

linera-core/src/unit_tests/test_utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ where
262262
let handle_block_proposal_result =
263263
Self::handle_block_proposal(proposal, &mut validator).await;
264264
let result = match handle_block_proposal_result {
265-
Some(Err(NodeError::BlobsNotFound(_) | NodeError::BlobNotFoundOnRead(_))) => {
265+
Some(Err(NodeError::BlobsNotFound(_))) => {
266266
handle_block_proposal_result.expect("handle_block_proposal_result should be Some")
267267
}
268268
_ => match validator.fault_type {
@@ -354,7 +354,7 @@ where
354354
let handle_certificate_result =
355355
Self::handle_certificate(certificate, validator, blobs).await;
356356
match handle_certificate_result {
357-
Some(Err(NodeError::BlobsNotFound(_) | NodeError::BlobNotFoundOnRead(_))) => {
357+
Some(Err(NodeError::BlobsNotFound(_))) => {
358358
handle_certificate_result.expect("handle_certificate_result should be Some")
359359
}
360360
_ => match validator.fault_type {

linera-core/src/updater.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -276,8 +276,8 @@ where
276276
// synchronize them now and retry.
277277
self.send_chain_information_for_senders(chain_id).await?;
278278
}
279-
Err(NodeError::BlobNotFoundOnRead(_)) if !blob_ids.is_empty() => {
280-
// For `BlobNotFoundOnRead`, we assume that the local node should already be
279+
Err(NodeError::BlobsNotFound(_)) if !blob_ids.is_empty() => {
280+
// For `BlobsNotFound`, we assume that the local node should already be
281281
// updated with the needed blobs, so sending the chain information about the
282282
// certificates that last used the blobs to the validator node should be enough.
283283
let missing_blob_ids = stream::iter(mem::take(&mut blob_ids))

0 commit comments

Comments
 (0)