casper_node/components/fetcher/fetcher_impls/
trie_or_chunk_fetcher.rs

1use std::{collections::HashMap, time::Duration};
2
3use async_trait::async_trait;
4use tracing::error;
5
6use casper_storage::data_access_layer::{TrieElement, TrieRequest, TrieResult};
7
8use crate::{
9    components::fetcher::{metrics::Metrics, Fetcher, ItemFetcher, ItemHandle, StoringState},
10    effect::{requests::ContractRuntimeRequest, EffectBuilder},
11    types::{NodeId, TrieOrChunk, TrieOrChunkId},
12};
13
14#[async_trait]
15impl ItemFetcher<TrieOrChunk> for Fetcher<TrieOrChunk> {
16    const SAFE_TO_RESPOND_TO_ALL: bool = true;
17
18    fn item_handles(
19        &mut self,
20    ) -> &mut HashMap<TrieOrChunkId, HashMap<NodeId, ItemHandle<TrieOrChunk>>> {
21        &mut self.item_handles
22    }
23
24    fn metrics(&mut self) -> &Metrics {
25        &self.metrics
26    }
27
28    fn peer_timeout(&self) -> Duration {
29        self.get_from_peer_timeout
30    }
31
32    async fn get_locally<REv: From<ContractRuntimeRequest> + Send>(
33        effect_builder: EffectBuilder<REv>,
34        id: TrieOrChunkId,
35    ) -> Option<TrieOrChunk> {
36        let TrieOrChunkId(chunk_index, trie_key) = id;
37        let request = TrieRequest::new(trie_key, Some(chunk_index));
38        let result = effect_builder.get_trie(request).await;
39        match result {
40            TrieResult::ValueNotFound(_) => None,
41            TrieResult::Failure(err) => {
42                error!(%err, "failed to get trie element locally");
43                None
44            }
45            TrieResult::Success { element } => match element {
46                TrieElement::Raw(raw) => match TrieOrChunk::new(raw.into(), 0) {
47                    Ok(voc) => Some(voc),
48                    Err(err) => {
49                        error!(%err, "raw chunking error");
50                        None
51                    }
52                },
53                TrieElement::Chunked(raw, chunk_id) => match TrieOrChunk::new(raw.into(), chunk_id)
54                {
55                    Ok(voc) => Some(voc),
56                    Err(err) => {
57                        error!(%err, "chunking error");
58                        None
59                    }
60                },
61            },
62        }
63    }
64
65    fn put_to_storage<'a, REv>(
66        _effect_builder: EffectBuilder<REv>,
67        item: TrieOrChunk,
68    ) -> StoringState<'a, TrieOrChunk> {
69        // Stored by the GlobalStateSynchronizer once all chunks are fetched.
70        StoringState::WontStore(item)
71    }
72
73    async fn announce_fetched_new_item<REv: Send>(
74        _effect_builder: EffectBuilder<REv>,
75        _item: TrieOrChunk,
76        _peer: NodeId,
77    ) {
78    }
79}