1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
use polkadot_node_network_protocol::PeerId;
use polkadot_node_subsystem_util::runtime;
use polkadot_primitives::v1::{CandidateHash, Hash};
use polkadot_subsystem::SubsystemError;
use thiserror::Error;
use crate::LOG_TARGET;
pub type Result<T> = std::result::Result<T, Error>;
pub type NonFatalResult<T> = std::result::Result<T, NonFatal>;
pub type FatalResult<T> = std::result::Result<T, Fatal>;
#[derive(Debug, Error, derive_more::From)]
#[error(transparent)]
pub enum Error {
Fatal(Fatal),
NonFatal(NonFatal),
}
impl From<runtime::Error> for Error {
fn from(o: runtime::Error) -> Self {
match o {
runtime::Error::Fatal(f) => Self::Fatal(Fatal::Runtime(f)),
runtime::Error::NonFatal(f) => Self::NonFatal(NonFatal::Runtime(f)),
}
}
}
#[derive(Debug, Error)]
pub enum Fatal {
#[error("Requester receiver stream finished")]
RequesterReceiverFinished,
#[error("Responder receiver stream finished")]
ResponderReceiverFinished,
#[error("Spawning subsystem task failed")]
SpawnTask(#[source] SubsystemError),
#[error("Receiving message from overseer failed")]
SubsystemReceive(#[source] SubsystemError),
#[error("Error while accessing runtime information")]
Runtime(#[from] runtime::Fatal),
}
#[derive(Debug, Error)]
pub enum NonFatal {
#[error("Error while accessing runtime information")]
Runtime(#[from] runtime::NonFatal),
#[error("Relay parent could not be found in active heads")]
NoSuchHead(Hash),
#[error("Message from not connected peer")]
NoSuchPeer(PeerId),
#[error("Peer requested data for candidate it never received a notification for (malicious?)")]
RequestedUnannouncedCandidate(PeerId, CandidateHash),
#[error("Statement status does not exist")]
NoSuchLargeStatementStatus(Hash, CandidateHash),
#[error("Fetched large statement does not exist")]
NoSuchFetchedLargeStatement(Hash, CandidateHash),
#[error("Oneshot `GetData` channel closed")]
ResponderGetDataCanceled,
}
pub fn log_error(result: Result<()>, ctx: &'static str) -> std::result::Result<(), Fatal> {
match result {
Err(Error::Fatal(f)) => Err(f),
Err(Error::NonFatal(error)) => {
match error {
NonFatal::RequestedUnannouncedCandidate(_, _) =>
tracing::warn!(target: LOG_TARGET, error = %error, ctx),
_ => tracing::debug!(target: LOG_TARGET, error = %error, ctx),
}
Ok(())
},
Ok(()) => Ok(()),
}
}