Skip to content

Commit ca23cb5

Browse files
committed
BlobNotFoundOnRead -> BlobsNotFound
1 parent d169df6 commit ca23cb5

File tree

14 files changed

+215
-125
lines changed

14 files changed

+215
-125
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

+51-15
Original file line numberDiff line numberDiff line change
@@ -446,10 +446,10 @@ where
446446
#[derive(Debug, Error)]
447447
pub enum ChainClientError {
448448
#[error("Local node operation failed: {0}")]
449-
LocalNodeError(#[from] LocalNodeError),
449+
LocalNodeError(LocalNodeError),
450450

451451
#[error("Remote node operation failed: {0}")]
452-
RemoteNodeError(#[from] NodeError),
452+
RemoteNodeError(NodeError),
453453

454454
#[error(transparent)]
455455
ArithmeticError(#[from] ArithmeticError),
@@ -458,7 +458,7 @@ pub enum ChainClientError {
458458
JsonError(#[from] serde_json::Error),
459459

460460
#[error("Chain operation failed: {0}")]
461-
ChainError(#[from] ChainError),
461+
ChainError(ChainError),
462462

463463
#[error(transparent)]
464464
CommunicationError(#[from] CommunicationError<NodeError>),
@@ -494,12 +494,51 @@ pub enum ChainClientError {
494494
FoundMultipleKeysForChain(ChainId),
495495

496496
#[error(transparent)]
497-
ViewError(#[from] ViewError),
497+
ViewError(ViewError),
498498

499499
#[error("Blobs not found: {0:?}")]
500500
BlobsNotFound(Vec<BlobId>),
501501
}
502502

503+
impl From<NodeError> for ChainClientError {
504+
fn from(error: NodeError) -> Self {
505+
match error {
506+
NodeError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
507+
error => Self::RemoteNodeError(error),
508+
}
509+
}
510+
}
511+
512+
impl From<ViewError> for ChainClientError {
513+
fn from(error: ViewError) -> Self {
514+
match error {
515+
ViewError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
516+
error => Self::ViewError(error),
517+
}
518+
}
519+
}
520+
521+
impl From<LocalNodeError> for ChainClientError {
522+
fn from(error: LocalNodeError) -> Self {
523+
match error {
524+
LocalNodeError::BlobsNotFound(blob_ids) => Self::BlobsNotFound(blob_ids),
525+
error => Self::LocalNodeError(error),
526+
}
527+
}
528+
}
529+
530+
impl From<ChainError> for ChainClientError {
531+
fn from(error: ChainError) -> Self {
532+
match error {
533+
ChainError::BlobsNotFound(blob_ids)
534+
| ChainError::ExecutionError(ExecutionError::BlobsNotFound(blob_ids), _) => {
535+
Self::BlobsNotFound(blob_ids)
536+
}
537+
error => Self::ChainError(error),
538+
}
539+
}
540+
}
541+
503542
impl From<Infallible> for ChainClientError {
504543
fn from(infallible: Infallible) -> Self {
505544
match infallible {}
@@ -1122,7 +1161,7 @@ where
11221161
// necessary.
11231162
if let Err(err) = self.process_certificate(certificate.clone(), vec![]).await {
11241163
match &err {
1125-
LocalNodeError::WorkerError(WorkerError::BlobsNotFound(blob_ids)) => {
1164+
LocalNodeError::BlobsNotFound(blob_ids) => {
11261165
let blobs = LocalNodeClient::<S>::download_blobs(blob_ids, &nodes).await;
11271166

11281167
ensure!(blobs.len() == blob_ids.len(), err);
@@ -1623,8 +1662,8 @@ where
16231662
.handle_block_proposal(*proposal.clone())
16241663
.await
16251664
{
1626-
if let Some(blob_ids) = original_err.get_blobs_not_found() {
1627-
self.update_local_node_with_blobs_from(blob_ids, remote_node)
1665+
if let LocalNodeError::BlobsNotFound(blob_ids) = &original_err {
1666+
self.update_local_node_with_blobs_from(blob_ids.clone(), remote_node)
16281667
.await?;
16291668
continue; // We found the missing blobs: retry.
16301669
}
@@ -1641,9 +1680,7 @@ where
16411680
let mut blobs = vec![];
16421681
while let Err(original_err) = self.client.handle_certificate(*cert.clone(), blobs).await
16431682
{
1644-
if let LocalNodeError::WorkerError(WorkerError::BlobsNotFound(blob_ids)) =
1645-
&original_err
1646-
{
1683+
if let LocalNodeError::BlobsNotFound(blob_ids) = &original_err {
16471684
blobs = remote_node
16481685
.find_missing_blobs(blob_ids.clone(), chain_id)
16491686
.await?;
@@ -1792,11 +1829,10 @@ where
17921829
.local_node
17931830
.stage_block_execution(block.clone())
17941831
.await;
1795-
if let Err(err) = &result {
1796-
if let Some(blob_ids) = err.get_blobs_not_found() {
1797-
self.receive_certificates_for_blobs(blob_ids).await?;
1798-
continue; // We found the missing blob: retry.
1799-
}
1832+
if let Err(LocalNodeError::BlobsNotFound(blob_ids)) = &result {
1833+
self.receive_certificates_for_blobs(blob_ids.clone())
1834+
.await?;
1835+
continue; // We found the missing blob: retry.
18001836
}
18011837
return Ok(result?);
18021838
}

linera-core/src/local_node.rs

+32-32
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ use linera_chain::{
1717
data_types::{
1818
Block, BlockProposal, Certificate, CertificateValue, ExecutedBlock, LiteCertificate,
1919
},
20-
ChainError, ChainStateView,
20+
ChainStateView,
2121
};
22-
use linera_execution::{ExecutionError, Query, Response, SystemExecutionError};
22+
use linera_execution::{Query, Response};
2323
use linera_storage::Storage;
2424
use linera_views::views::ViewError;
2525
use rand::{prelude::SliceRandom, thread_rng};
@@ -59,10 +59,10 @@ pub enum LocalNodeError {
5959
ArithmeticError(#[from] ArithmeticError),
6060

6161
#[error(transparent)]
62-
ViewError(#[from] linera_views::views::ViewError),
62+
ViewError(ViewError),
6363

6464
#[error("Local node operation failed: {0}")]
65-
WorkerError(#[from] WorkerError),
65+
WorkerError(WorkerError),
6666

6767
#[error(
6868
"Failed to download certificates and update local node to the next height \
@@ -83,35 +83,35 @@ pub enum LocalNodeError {
8383
InvalidChainInfoResponse,
8484

8585
#[error(transparent)]
86-
NodeError(#[from] NodeError),
86+
NodeError(NodeError),
87+
88+
#[error("Blobs not found: {0:?}")]
89+
BlobsNotFound(Vec<BlobId>),
8790
}
8891

89-
impl LocalNodeError {
90-
pub fn get_blobs_not_found(&self) -> Option<Vec<BlobId>> {
91-
match self {
92-
LocalNodeError::WorkerError(WorkerError::ChainError(chain_error)) => {
93-
match **chain_error {
94-
ChainError::ExecutionError(
95-
ExecutionError::SystemError(SystemExecutionError::BlobNotFoundOnRead(
96-
blob_id,
97-
)),
98-
_,
99-
)
100-
| ChainError::ExecutionError(
101-
ExecutionError::ViewError(ViewError::BlobNotFoundOnRead(blob_id)),
102-
_,
103-
) => Some(vec![blob_id]),
104-
_ => None,
105-
}
106-
}
107-
LocalNodeError::WorkerError(WorkerError::BlobsNotFound(blob_ids)) => {
108-
Some(blob_ids.clone())
109-
}
110-
LocalNodeError::NodeError(NodeError::BlobNotFoundOnRead(blob_id)) => {
111-
Some(vec![*blob_id])
112-
}
113-
LocalNodeError::NodeError(NodeError::BlobsNotFound(blob_ids)) => Some(blob_ids.clone()),
114-
_ => None,
92+
impl From<WorkerError> for LocalNodeError {
93+
fn from(error: WorkerError) -> Self {
94+
match error {
95+
WorkerError::BlobsNotFound(blob_ids) => LocalNodeError::BlobsNotFound(blob_ids),
96+
error => LocalNodeError::WorkerError(error),
97+
}
98+
}
99+
}
100+
101+
impl From<NodeError> for LocalNodeError {
102+
fn from(error: NodeError) -> Self {
103+
match error {
104+
NodeError::BlobsNotFound(blob_ids) => LocalNodeError::BlobsNotFound(blob_ids),
105+
error => LocalNodeError::NodeError(error),
106+
}
107+
}
108+
}
109+
110+
impl From<ViewError> for LocalNodeError {
111+
fn from(error: ViewError) -> Self {
112+
match error {
113+
ViewError::BlobsNotFound(blob_ids) => LocalNodeError::BlobsNotFound(blob_ids),
114+
error => LocalNodeError::ViewError(error),
115115
}
116116
}
117117
}
@@ -293,7 +293,7 @@ where
293293

294294
result = match &result {
295295
Err(err) => {
296-
if let Some(blob_ids) = err.get_blobs_not_found() {
296+
if let LocalNodeError::BlobsNotFound(blob_ids) = &err {
297297
let blobs = remote_node.try_download_blobs(blob_ids.as_slice()).await;
298298
if blobs.len() != blob_ids.len() {
299299
result

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
@@ -274,8 +274,8 @@ where
274274
// synchronize them now and retry.
275275
self.send_chain_information_for_senders(chain_id).await?;
276276
}
277-
Err(NodeError::BlobNotFoundOnRead(_)) if !blob_ids.is_empty() => {
278-
// For `BlobNotFoundOnRead`, we assume that the local node should already be
277+
Err(NodeError::BlobsNotFound(_)) if !blob_ids.is_empty() => {
278+
// For `BlobsNotFound`, we assume that the local node should already be
279279
// updated with the needed blobs, so sending the chain information about the
280280
// certificates that last used the blobs to the validator node should be enough.
281281
let missing_blob_ids = stream::iter(mem::take(&mut blob_ids))

0 commit comments

Comments
 (0)