@@ -6,7 +6,7 @@ use tokio::task::JoinHandle;
6
6
use tracing:: { error, info, Instrument } ;
7
7
8
8
use crate :: cli:: BridgeConfig ;
9
- use network:: Network ;
9
+ use network:: { Network , NetworkAction , NetworkInitializationConfig , NetworkManager } ;
10
10
11
11
mod network;
12
12
mod peers;
@@ -40,6 +40,9 @@ pub struct Census {
40
40
}
41
41
42
42
impl Census {
43
+ const SUPPORTED_SUBNETWORKS : [ Subnetwork ; 3 ] =
44
+ [ Subnetwork :: Beacon , Subnetwork :: History , Subnetwork :: State ] ;
45
+
43
46
pub fn new ( client : HttpClient , bridge_config : & BridgeConfig ) -> Self {
44
47
Self {
45
48
history : Network :: new ( client. clone ( ) , Subnetwork :: History , bridge_config) ,
@@ -71,50 +74,74 @@ impl Census {
71
74
& mut self ,
72
75
subnetworks : impl IntoIterator < Item = Subnetwork > ,
73
76
) -> Result < JoinHandle < ( ) > , CensusError > {
77
+ info ! ( "Initializing census" ) ;
78
+
74
79
if self . initialized {
75
80
return Err ( CensusError :: AlreadyInitialized ) ;
76
81
}
77
82
self . initialized = true ;
78
83
79
- let subnetworks = HashSet :: from_iter ( subnetworks) ;
84
+ let subnetworks = HashSet :: < Subnetwork > :: from_iter ( subnetworks) ;
80
85
if subnetworks. is_empty ( ) {
81
86
return Err ( CensusError :: FailedInitialization ( "No subnetwork" ) ) ;
82
87
}
83
88
for subnetwork in & subnetworks {
84
- info ! ( "Initializing {subnetwork} subnetwork" ) ;
85
- match subnetwork {
86
- Subnetwork :: History => self . history . init ( ) . await ?,
87
- Subnetwork :: State => self . state . init ( ) . await ?,
88
- Subnetwork :: Beacon => self . beacon . init ( ) . await ?,
89
- _ => return Err ( CensusError :: UnsupportedSubnetwork ( * subnetwork) ) ,
89
+ if !Self :: SUPPORTED_SUBNETWORKS . contains ( subnetwork) {
90
+ return Err ( CensusError :: UnsupportedSubnetwork ( * subnetwork) ) ;
90
91
}
91
92
}
92
93
93
- Ok ( self . start_background_service ( subnetworks) )
94
- }
94
+ let initialization_config = NetworkInitializationConfig :: default ( ) ;
95
+
96
+ let mut beacon_manager = if subnetworks. contains ( & Subnetwork :: Beacon ) {
97
+ self . beacon . init ( & initialization_config) . await ?;
98
+ Some ( self . beacon . create_manager ( ) )
99
+ } else {
100
+ None
101
+ } ;
102
+ let mut history_manager = if subnetworks. contains ( & Subnetwork :: History ) {
103
+ self . history . init ( & initialization_config) . await ?;
104
+ Some ( self . history . create_manager ( ) )
105
+ } else {
106
+ None
107
+ } ;
108
+ let mut state_manager = if subnetworks. contains ( & Subnetwork :: State ) {
109
+ self . state . init ( & initialization_config) . await ?;
110
+ Some ( self . state . create_manager ( ) )
111
+ } else {
112
+ None
113
+ } ;
95
114
96
- /// Starts background service that is responsible for keeping view of the network up to date.
97
- ///
98
- /// Selects available tasks and runs them. Tasks are provided by enabled subnetworks.
99
- fn start_background_service ( & self , subnetworks : HashSet < Subnetwork > ) -> JoinHandle < ( ) > {
100
- let mut history_network = self . history . clone ( ) ;
101
- let mut state_network = self . state . clone ( ) ;
102
- let mut beacon_network = self . beacon . clone ( ) ;
103
115
let service = async move {
104
116
loop {
105
117
tokio:: select! {
106
- peer = history_network. peer_to_process( ) , if subnetworks. contains( & Subnetwork :: History ) => {
107
- history_network. process_peer( peer) . await ;
118
+ Some ( action) = next_action( & mut beacon_manager) => {
119
+ if let Some ( manager) = & mut beacon_manager {
120
+ manager. execute_action( action) . await ;
121
+ }
108
122
}
109
- peer = state_network. peer_to_process( ) , if subnetworks. contains( & Subnetwork :: State ) => {
110
- state_network. process_peer( peer) . await ;
123
+ Some ( action) = next_action( & mut history_manager) => {
124
+ if let Some ( manager) = & mut history_manager {
125
+ manager. execute_action( action) . await ;
126
+ }
111
127
}
112
- peer = beacon_network. peer_to_process( ) , if subnetworks. contains( & Subnetwork :: Beacon ) => {
113
- beacon_network. process_peer( peer) . await ;
128
+ Some ( action) = next_action( & mut state_manager) => {
129
+ if let Some ( manager) = & mut state_manager {
130
+ manager. execute_action( action) . await ;
131
+ }
114
132
}
115
133
}
116
134
}
117
135
} ;
118
- tokio:: spawn ( service. instrument ( tracing:: trace_span!( "census" ) . or_current ( ) ) )
136
+ Ok ( tokio:: spawn (
137
+ service. instrument ( tracing:: trace_span!( "census" ) . or_current ( ) ) ,
138
+ ) )
139
+ }
140
+ }
141
+
142
+ async fn next_action ( manager : & mut Option < NetworkManager > ) -> Option < NetworkAction > {
143
+ match manager {
144
+ Some ( manager) => Some ( manager. next_action ( ) . await ) ,
145
+ None => None ,
119
146
}
120
147
}
0 commit comments