mirror of
https://github.com/sigp/lighthouse.git
synced 2026-07-02 20:34:27 +00:00
Beacon chain tasks use task executor
This commit is contained in:
62
Cargo.lock
generated
62
Cargo.lock
generated
@@ -25,7 +25,7 @@ dependencies = [
|
|||||||
"slog-async",
|
"slog-async",
|
||||||
"slog-term",
|
"slog-term",
|
||||||
"tempdir",
|
"tempdir",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"types",
|
"types",
|
||||||
"validator_client",
|
"validator_client",
|
||||||
"validator_dir",
|
"validator_dir",
|
||||||
@@ -285,7 +285,7 @@ dependencies = [
|
|||||||
"state_processing",
|
"state_processing",
|
||||||
"store",
|
"store",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
"websocket_server",
|
"websocket_server",
|
||||||
@@ -318,7 +318,7 @@ dependencies = [
|
|||||||
"slog-async",
|
"slog-async",
|
||||||
"slog-term",
|
"slog-term",
|
||||||
"store",
|
"store",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"toml",
|
"toml",
|
||||||
"types",
|
"types",
|
||||||
"version",
|
"version",
|
||||||
@@ -623,7 +623,7 @@ dependencies = [
|
|||||||
"slot_clock",
|
"slot_clock",
|
||||||
"store",
|
"store",
|
||||||
"timer",
|
"timer",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"toml",
|
"toml",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
@@ -1012,7 +1012,7 @@ dependencies = [
|
|||||||
"rlp",
|
"rlp",
|
||||||
"sha2",
|
"sha2",
|
||||||
"smallvec 1.4.0",
|
"smallvec 1.4.0",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"uint",
|
"uint",
|
||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
@@ -1127,7 +1127,7 @@ dependencies = [
|
|||||||
"slog-json",
|
"slog-json",
|
||||||
"slog-term",
|
"slog-term",
|
||||||
"sloggers",
|
"sloggers",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"types",
|
"types",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1163,7 +1163,7 @@ dependencies = [
|
|||||||
"slog",
|
"slog",
|
||||||
"sloggers",
|
"sloggers",
|
||||||
"state_processing",
|
"state_processing",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"toml",
|
"toml",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
@@ -1177,7 +1177,7 @@ dependencies = [
|
|||||||
"deposit_contract",
|
"deposit_contract",
|
||||||
"futures 0.3.5",
|
"futures 0.3.5",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"types",
|
"types",
|
||||||
"web3",
|
"web3",
|
||||||
]
|
]
|
||||||
@@ -1214,7 +1214,7 @@ dependencies = [
|
|||||||
"snap",
|
"snap",
|
||||||
"tempdir",
|
"tempdir",
|
||||||
"tiny-keccak 2.0.2",
|
"tiny-keccak 2.0.2",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tokio-io-timeout",
|
"tokio-io-timeout",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"types",
|
"types",
|
||||||
@@ -1687,7 +1687,7 @@ dependencies = [
|
|||||||
"serde_derive",
|
"serde_derive",
|
||||||
"slog",
|
"slog",
|
||||||
"state_processing",
|
"state_processing",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
]
|
]
|
||||||
@@ -1758,7 +1758,7 @@ dependencies = [
|
|||||||
"indexmap",
|
"indexmap",
|
||||||
"log 0.4.8",
|
"log 0.4.8",
|
||||||
"slab 0.4.2",
|
"slab 0.4.2",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -1777,7 +1777,7 @@ name = "hashset_delay"
|
|||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"futures 0.3.5",
|
"futures 0.3.5",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1968,7 +1968,7 @@ dependencies = [
|
|||||||
"net2",
|
"net2",
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"time",
|
"time",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
"want 0.3.0",
|
"want 0.3.0",
|
||||||
]
|
]
|
||||||
@@ -1995,7 +1995,7 @@ dependencies = [
|
|||||||
"bytes 0.5.4",
|
"bytes 0.5.4",
|
||||||
"hyper 0.13.5",
|
"hyper 0.13.5",
|
||||||
"native-tls",
|
"native-tls",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tokio-tls 0.3.1",
|
"tokio-tls 0.3.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -2194,7 +2194,7 @@ dependencies = [
|
|||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
"simple_logger",
|
"simple_logger",
|
||||||
"state_processing",
|
"state_processing",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
"validator_dir",
|
"validator_dir",
|
||||||
@@ -2469,7 +2469,7 @@ dependencies = [
|
|||||||
"ipnet",
|
"ipnet",
|
||||||
"libp2p-core",
|
"libp2p-core",
|
||||||
"log 0.4.8",
|
"log 0.4.8",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2563,7 +2563,7 @@ dependencies = [
|
|||||||
"slog-term",
|
"slog-term",
|
||||||
"sloggers",
|
"sloggers",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"types",
|
"types",
|
||||||
"validator_client",
|
"validator_client",
|
||||||
"validator_dir",
|
"validator_dir",
|
||||||
@@ -2868,6 +2868,7 @@ name = "network"
|
|||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"beacon_chain",
|
"beacon_chain",
|
||||||
|
"environment",
|
||||||
"error-chain",
|
"error-chain",
|
||||||
"eth2-libp2p",
|
"eth2-libp2p",
|
||||||
"eth2_ssz",
|
"eth2_ssz",
|
||||||
@@ -2889,7 +2890,7 @@ dependencies = [
|
|||||||
"smallvec 1.4.0",
|
"smallvec 1.4.0",
|
||||||
"store",
|
"store",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
]
|
]
|
||||||
@@ -3679,7 +3680,7 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_urlencoded",
|
"serde_urlencoded",
|
||||||
"time",
|
"time",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tokio-tls 0.3.1",
|
"tokio-tls 0.3.1",
|
||||||
"url 2.1.1",
|
"url 2.1.1",
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
@@ -3694,6 +3695,7 @@ version = "0.1.2"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"beacon_chain",
|
"beacon_chain",
|
||||||
"bls",
|
"bls",
|
||||||
|
"environment",
|
||||||
"eth2-libp2p",
|
"eth2-libp2p",
|
||||||
"eth2_config",
|
"eth2_config",
|
||||||
"eth2_ssz",
|
"eth2_ssz",
|
||||||
@@ -3720,7 +3722,7 @@ dependencies = [
|
|||||||
"slot_clock",
|
"slot_clock",
|
||||||
"state_processing",
|
"state_processing",
|
||||||
"store",
|
"store",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
"url 2.1.1",
|
"url 2.1.1",
|
||||||
@@ -4154,7 +4156,7 @@ dependencies = [
|
|||||||
"node_test_rig",
|
"node_test_rig",
|
||||||
"parking_lot 0.10.2",
|
"parking_lot 0.10.2",
|
||||||
"rayon",
|
"rayon",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"types",
|
"types",
|
||||||
"validator_client",
|
"validator_client",
|
||||||
]
|
]
|
||||||
@@ -4622,11 +4624,12 @@ name = "timer"
|
|||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"beacon_chain",
|
"beacon_chain",
|
||||||
|
"environment",
|
||||||
"futures 0.3.5",
|
"futures 0.3.5",
|
||||||
"parking_lot 0.10.2",
|
"parking_lot 0.10.2",
|
||||||
"slog",
|
"slog",
|
||||||
"slot_clock",
|
"slot_clock",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"types",
|
"types",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -4700,9 +4703,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "0.2.20"
|
version = "0.2.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "05c1d570eb1a36f0345a5ce9c6c6e665b70b73d11236912c0b477616aeec47b1"
|
checksum = "d099fa27b9702bed751524694adbe393e18b36b204da91eb1cbbbbb4a5ee2d58"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 0.5.4",
|
"bytes 0.5.4",
|
||||||
"fnv",
|
"fnv",
|
||||||
@@ -4812,7 +4815,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "9390a43272c8a6ac912ed1d1e2b6abeafd5047e05530a2fa304deee041a06215"
|
checksum = "9390a43272c8a6ac912ed1d1e2b6abeafd5047e05530a2fa304deee041a06215"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 0.5.4",
|
"bytes 0.5.4",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -4926,7 +4929,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343"
|
checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"native-tls",
|
"native-tls",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -4991,7 +4994,7 @@ dependencies = [
|
|||||||
"futures-sink",
|
"futures-sink",
|
||||||
"log 0.4.8",
|
"log 0.4.8",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -5283,7 +5286,7 @@ dependencies = [
|
|||||||
"slog-term",
|
"slog-term",
|
||||||
"slot_clock",
|
"slot_clock",
|
||||||
"tempdir",
|
"tempdir",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"tree_hash",
|
"tree_hash",
|
||||||
"types",
|
"types",
|
||||||
"validator_dir",
|
"validator_dir",
|
||||||
@@ -5584,12 +5587,13 @@ dependencies = [
|
|||||||
name = "websocket_server"
|
name = "websocket_server"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"environment",
|
||||||
"futures 0.3.5",
|
"futures 0.3.5",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"slog",
|
"slog",
|
||||||
"tokio 0.2.20",
|
"tokio 0.2.21",
|
||||||
"types",
|
"types",
|
||||||
"ws",
|
"ws",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -46,7 +46,8 @@ tempfile = "3.1.0"
|
|||||||
bitvec = "0.17.4"
|
bitvec = "0.17.4"
|
||||||
bls = { path = "../../crypto/bls" }
|
bls = { path = "../../crypto/bls" }
|
||||||
safe_arith = { path = "../../consensus/safe_arith" }
|
safe_arith = { path = "../../consensus/safe_arith" }
|
||||||
|
environment = { path = "../../lighthouse/environment" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
environment = { path = "../../lighthouse/environment" }
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use crate::metrics;
|
use crate::metrics;
|
||||||
|
use environment::TaskExecutor;
|
||||||
use eth1::{Config as Eth1Config, Eth1Block, Service as HttpService};
|
use eth1::{Config as Eth1Config, Eth1Block, Service as HttpService};
|
||||||
use eth2_hashing::hash;
|
use eth2_hashing::hash;
|
||||||
use slog::{debug, error, trace, Logger};
|
use slog::{debug, error, trace, Logger};
|
||||||
@@ -285,8 +286,8 @@ impl<T: EthSpec, S: Store<T>> CachingEth1Backend<T, S> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Starts the routine which connects to the external eth1 node and updates the caches.
|
/// Starts the routine which connects to the external eth1 node and updates the caches.
|
||||||
pub fn start(&self, handle: &tokio::runtime::Handle, exit: tokio::sync::oneshot::Receiver<()>) {
|
pub fn start(&self, handle: TaskExecutor) {
|
||||||
HttpService::auto_update(self.core.clone(), handle, exit);
|
HttpService::auto_update(self.core.clone(), handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Instantiates `self` from an existing service.
|
/// Instantiates `self` from an existing service.
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ pub struct ClientBuilder<T: BeaconChainTypes> {
|
|||||||
beacon_chain_builder: Option<BeaconChainBuilder<T>>,
|
beacon_chain_builder: Option<BeaconChainBuilder<T>>,
|
||||||
beacon_chain: Option<Arc<BeaconChain<T>>>,
|
beacon_chain: Option<Arc<BeaconChain<T>>>,
|
||||||
eth1_service: Option<Eth1Service>,
|
eth1_service: Option<Eth1Service>,
|
||||||
exit_channels: Vec<tokio::sync::oneshot::Sender<()>>,
|
|
||||||
event_handler: Option<T::EventHandler>,
|
event_handler: Option<T::EventHandler>,
|
||||||
network_globals: Option<Arc<NetworkGlobals<T::EthSpec>>>,
|
network_globals: Option<Arc<NetworkGlobals<T::EthSpec>>>,
|
||||||
network_send: Option<UnboundedSender<NetworkMessage<T::EthSpec>>>,
|
network_send: Option<UnboundedSender<NetworkMessage<T::EthSpec>>>,
|
||||||
@@ -84,7 +83,6 @@ where
|
|||||||
beacon_chain_builder: None,
|
beacon_chain_builder: None,
|
||||||
beacon_chain: None,
|
beacon_chain: None,
|
||||||
eth1_service: None,
|
eth1_service: None,
|
||||||
exit_channels: vec![],
|
|
||||||
event_handler: None,
|
event_handler: None,
|
||||||
network_globals: None,
|
network_globals: None,
|
||||||
network_send: None,
|
network_send: None,
|
||||||
@@ -223,13 +221,12 @@ where
|
|||||||
.ok_or_else(|| "network requires a runtime_context")?
|
.ok_or_else(|| "network requires a runtime_context")?
|
||||||
.clone();
|
.clone();
|
||||||
|
|
||||||
let (network_globals, network_send, network_exit) =
|
let (network_globals, network_send) =
|
||||||
NetworkService::start(beacon_chain, config, &context.runtime_handle, context.log)
|
NetworkService::start(beacon_chain, config, context.runtime_handle, context.log)
|
||||||
.map_err(|e| format!("Failed to start network: {:?}", e))?;
|
.map_err(|e| format!("Failed to start network: {:?}", e))?;
|
||||||
|
|
||||||
self.network_globals = Some(network_globals);
|
self.network_globals = Some(network_globals);
|
||||||
self.network_send = Some(network_send);
|
self.network_send = Some(network_send);
|
||||||
self.exit_channels.push(network_exit);
|
|
||||||
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
@@ -251,16 +248,14 @@ where
|
|||||||
.ok_or_else(|| "node timer requires a chain spec".to_string())?
|
.ok_or_else(|| "node timer requires a chain spec".to_string())?
|
||||||
.milliseconds_per_slot;
|
.milliseconds_per_slot;
|
||||||
|
|
||||||
let timer_exit = timer::spawn(
|
let _ = timer::spawn(
|
||||||
&context.runtime_handle,
|
context.runtime_handle,
|
||||||
beacon_chain,
|
beacon_chain,
|
||||||
milliseconds_per_slot,
|
milliseconds_per_slot,
|
||||||
context.log.clone(),
|
context.log.clone(),
|
||||||
)
|
)
|
||||||
.map_err(|e| format!("Unable to start node timer: {}", e))?;
|
.map_err(|e| format!("Unable to start node timer: {}", e))?;
|
||||||
|
|
||||||
self.exit_channels.push(timer_exit);
|
|
||||||
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,8 +289,8 @@ where
|
|||||||
};
|
};
|
||||||
|
|
||||||
let log = context.log.clone();
|
let log = context.log.clone();
|
||||||
let (exit_channel, listening_addr) = rest_api::start_server(
|
let listening_addr = rest_api::start_server(
|
||||||
&context.runtime_handle,
|
context.runtime_handle,
|
||||||
&client_config.rest_api,
|
&client_config.rest_api,
|
||||||
beacon_chain,
|
beacon_chain,
|
||||||
network_info,
|
network_info,
|
||||||
@@ -310,7 +305,6 @@ where
|
|||||||
)
|
)
|
||||||
.map_err(|e| format!("Failed to start HTTP API: {:?}", e))?;
|
.map_err(|e| format!("Failed to start HTTP API: {:?}", e))?;
|
||||||
|
|
||||||
self.exit_channels.push(exit_channel);
|
|
||||||
self.http_listen_addr = Some(listening_addr);
|
self.http_listen_addr = Some(listening_addr);
|
||||||
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
@@ -337,8 +331,8 @@ where
|
|||||||
.ok_or_else(|| "slot_notifier requires a chain spec".to_string())?
|
.ok_or_else(|| "slot_notifier requires a chain spec".to_string())?
|
||||||
.milliseconds_per_slot;
|
.milliseconds_per_slot;
|
||||||
|
|
||||||
let exit_channel = spawn_notifier(
|
let _ = spawn_notifier(
|
||||||
&context.runtime_handle,
|
context.runtime_handle,
|
||||||
beacon_chain,
|
beacon_chain,
|
||||||
network_globals,
|
network_globals,
|
||||||
milliseconds_per_slot,
|
milliseconds_per_slot,
|
||||||
@@ -346,8 +340,6 @@ where
|
|||||||
)
|
)
|
||||||
.map_err(|e| format!("Unable to start slot notifier: {}", e))?;
|
.map_err(|e| format!("Unable to start slot notifier: {}", e))?;
|
||||||
|
|
||||||
self.exit_channels.push(exit_channel);
|
|
||||||
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,7 +356,6 @@ where
|
|||||||
network_globals: self.network_globals,
|
network_globals: self.network_globals,
|
||||||
http_listen_addr: self.http_listen_addr,
|
http_listen_addr: self.http_listen_addr,
|
||||||
websocket_listen_addr: self.websocket_listen_addr,
|
websocket_listen_addr: self.websocket_listen_addr,
|
||||||
_exit_channels: self.exit_channels,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -435,21 +426,14 @@ where
|
|||||||
.ok_or_else(|| "websocket_event_handler requires a runtime_context")?
|
.ok_or_else(|| "websocket_event_handler requires a runtime_context")?
|
||||||
.service_context("ws".into());
|
.service_context("ws".into());
|
||||||
|
|
||||||
let (sender, exit_channel, listening_addr): (
|
let (sender, listening_addr): (WebSocketSender<TEthSpec>, Option<_>) = if config.enabled {
|
||||||
WebSocketSender<TEthSpec>,
|
let (sender, listening_addr) =
|
||||||
Option<_>,
|
websocket_server::start_server(context.runtime_handle, &config, &context.log)?;
|
||||||
Option<_>,
|
(sender, Some(listening_addr))
|
||||||
) = if config.enabled {
|
|
||||||
let (sender, exit, listening_addr) =
|
|
||||||
websocket_server::start_server(&context.runtime_handle, &config, &context.log)?;
|
|
||||||
(sender, Some(exit), Some(listening_addr))
|
|
||||||
} else {
|
} else {
|
||||||
(WebSocketSender::dummy(), None, None)
|
(WebSocketSender::dummy(), None)
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(channel) = exit_channel {
|
|
||||||
self.exit_channels.push(channel);
|
|
||||||
}
|
|
||||||
self.event_handler = Some(sender);
|
self.event_handler = Some(sender);
|
||||||
self.websocket_listen_addr = listening_addr;
|
self.websocket_listen_addr = listening_addr;
|
||||||
|
|
||||||
@@ -653,14 +637,8 @@ where
|
|||||||
|
|
||||||
self.eth1_service = None;
|
self.eth1_service = None;
|
||||||
|
|
||||||
let exit = {
|
|
||||||
let (tx, rx) = tokio::sync::oneshot::channel();
|
|
||||||
self.exit_channels.push(tx);
|
|
||||||
rx
|
|
||||||
};
|
|
||||||
|
|
||||||
// Starts the service that connects to an eth1 node and periodically updates caches.
|
// Starts the service that connects to an eth1 node and periodically updates caches.
|
||||||
backend.start(&context.runtime_handle, exit);
|
backend.start(context.runtime_handle);
|
||||||
|
|
||||||
self.beacon_chain_builder = Some(beacon_chain_builder.eth1_backend(Some(backend)));
|
self.beacon_chain_builder = Some(beacon_chain_builder.eth1_backend(Some(backend)));
|
||||||
|
|
||||||
|
|||||||
@@ -25,8 +25,6 @@ pub struct Client<T: BeaconChainTypes> {
|
|||||||
network_globals: Option<Arc<NetworkGlobals<T::EthSpec>>>,
|
network_globals: Option<Arc<NetworkGlobals<T::EthSpec>>>,
|
||||||
http_listen_addr: Option<SocketAddr>,
|
http_listen_addr: Option<SocketAddr>,
|
||||||
websocket_listen_addr: Option<SocketAddr>,
|
websocket_listen_addr: Option<SocketAddr>,
|
||||||
/// Exit channels will complete/error when dropped, causing each service to exit gracefully.
|
|
||||||
_exit_channels: Vec<tokio::sync::oneshot::Sender<()>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: BeaconChainTypes> Client<T> {
|
impl<T: BeaconChainTypes> Client<T> {
|
||||||
|
|||||||
@@ -25,12 +25,12 @@ const SPEEDO_OBSERVATIONS: usize = 4;
|
|||||||
|
|
||||||
/// Spawns a notifier service which periodically logs information about the node.
|
/// Spawns a notifier service which periodically logs information about the node.
|
||||||
pub fn spawn_notifier<T: BeaconChainTypes>(
|
pub fn spawn_notifier<T: BeaconChainTypes>(
|
||||||
handle: &tokio::runtime::Handle,
|
handle: environment::TaskExecutor,
|
||||||
beacon_chain: Arc<BeaconChain<T>>,
|
beacon_chain: Arc<BeaconChain<T>>,
|
||||||
network: Arc<NetworkGlobals<T::EthSpec>>,
|
network: Arc<NetworkGlobals<T::EthSpec>>,
|
||||||
milliseconds_per_slot: u64,
|
milliseconds_per_slot: u64,
|
||||||
log: slog::Logger,
|
log: slog::Logger,
|
||||||
) -> Result<tokio::sync::oneshot::Sender<()>, String> {
|
) -> Result<(), String> {
|
||||||
let log_1 = log.clone();
|
let log_1 = log.clone();
|
||||||
let slot_duration = Duration::from_millis(milliseconds_per_slot);
|
let slot_duration = Duration::from_millis(milliseconds_per_slot);
|
||||||
let duration_to_next_slot = beacon_chain
|
let duration_to_next_slot = beacon_chain
|
||||||
@@ -148,20 +148,10 @@ pub fn spawn_notifier<T: BeaconChainTypes>(
|
|||||||
Ok::<(), ()>(())
|
Ok::<(), ()>(())
|
||||||
};
|
};
|
||||||
|
|
||||||
let (exit_signal, exit) = tokio::sync::oneshot::channel();
|
|
||||||
|
|
||||||
let exit_future = async move {
|
|
||||||
let _ = exit.await.ok();
|
|
||||||
info!(log_1, "Notifier service shutdown");
|
|
||||||
};
|
|
||||||
|
|
||||||
// run the notifier on the current executor
|
// run the notifier on the current executor
|
||||||
handle.spawn(futures::future::select(
|
handle.spawn(interval_future.unwrap_or_else(|_| ()), "beacon_notifier");
|
||||||
Box::pin(interval_future),
|
|
||||||
Box::pin(exit_future),
|
|
||||||
));
|
|
||||||
|
|
||||||
Ok(exit_signal)
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the peer count, returning something helpful if it's `usize::max_value` (effectively a
|
/// Returns the peer count, returning something helpful if it's `usize::max_value` (effectively a
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ edition = "2018"
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
eth1_test_rig = { path = "../../testing/eth1_test_rig" }
|
eth1_test_rig = { path = "../../testing/eth1_test_rig" }
|
||||||
environment = { path = "../../lighthouse/environment" }
|
|
||||||
toml = "0.5.6"
|
toml = "0.5.6"
|
||||||
web3 = "0.10.0"
|
web3 = "0.10.0"
|
||||||
sloggers = "1.0.0"
|
sloggers = "1.0.0"
|
||||||
@@ -30,3 +29,4 @@ state_processing = { path = "../../consensus/state_processing" }
|
|||||||
libflate = "1.0.0"
|
libflate = "1.0.0"
|
||||||
lighthouse_metrics = { path = "../../common/lighthouse_metrics"}
|
lighthouse_metrics = { path = "../../common/lighthouse_metrics"}
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
|
environment = { path = "../../lighthouse/environment" }
|
||||||
|
|||||||
@@ -283,13 +283,8 @@ impl Service {
|
|||||||
/// - Err(_) if there is an error.
|
/// - Err(_) if there is an error.
|
||||||
///
|
///
|
||||||
/// Emits logs for debugging and errors.
|
/// Emits logs for debugging and errors.
|
||||||
pub fn auto_update(
|
pub fn auto_update(service: Self, handle: environment::TaskExecutor) {
|
||||||
service: Self,
|
|
||||||
handle: &tokio::runtime::Handle,
|
|
||||||
exit: tokio::sync::oneshot::Receiver<()>,
|
|
||||||
) {
|
|
||||||
let update_interval = Duration::from_millis(service.config().auto_update_interval_millis);
|
let update_interval = Duration::from_millis(service.config().auto_update_interval_millis);
|
||||||
let log = service.log.clone();
|
|
||||||
|
|
||||||
let mut interval = interval_at(Instant::now(), update_interval);
|
let mut interval = interval_at(Instant::now(), update_interval);
|
||||||
|
|
||||||
@@ -301,14 +296,7 @@ impl Service {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let exit_future = async move {
|
handle.spawn(update_future, "eth1_service");
|
||||||
let _ = exit.await.ok();
|
|
||||||
info!(log, "Eth1 service shutdown");
|
|
||||||
};
|
|
||||||
|
|
||||||
let future = futures::future::select(Box::pin(update_future), Box::pin(exit_future));
|
|
||||||
|
|
||||||
handle.spawn(future);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn do_update(service: Self, update_interval: Duration) -> Result<(), ()> {
|
async fn do_update(service: Self, update_interval: Duration) -> Result<(), ()> {
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ pub struct Service<TSpec: EthSpec> {
|
|||||||
|
|
||||||
impl<TSpec: EthSpec> Service<TSpec> {
|
impl<TSpec: EthSpec> Service<TSpec> {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
handle: &tokio::runtime::Handle,
|
handle: tokio::runtime::Handle,
|
||||||
config: &NetworkConfig,
|
config: &NetworkConfig,
|
||||||
enr_fork_id: EnrForkId,
|
enr_fork_id: EnrForkId,
|
||||||
log: &slog::Logger,
|
log: &slog::Logger,
|
||||||
@@ -131,7 +131,7 @@ impl<TSpec: EthSpec> Service<TSpec> {
|
|||||||
}
|
}
|
||||||
SwarmBuilder::new(transport, behaviour, local_peer_id.clone())
|
SwarmBuilder::new(transport, behaviour, local_peer_id.clone())
|
||||||
.peer_connection_limit(MAX_CONNECTIONS_PER_PEER)
|
.peer_connection_limit(MAX_CONNECTIONS_PER_PEER)
|
||||||
.executor(Box::new(Executor(handle.clone())))
|
.executor(Box::new(Executor(handle)))
|
||||||
.build()
|
.build()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -34,3 +34,4 @@ fnv = "1.0.6"
|
|||||||
rlp = "0.4.5"
|
rlp = "0.4.5"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
lighthouse_metrics = { path = "../../common/lighthouse_metrics" }
|
lighthouse_metrics = { path = "../../common/lighthouse_metrics" }
|
||||||
|
environment = { path = "../../lighthouse/environment" }
|
||||||
@@ -58,7 +58,7 @@ impl<T: BeaconChainTypes> Router<T> {
|
|||||||
beacon_chain: Arc<BeaconChain<T>>,
|
beacon_chain: Arc<BeaconChain<T>>,
|
||||||
network_globals: Arc<NetworkGlobals<T::EthSpec>>,
|
network_globals: Arc<NetworkGlobals<T::EthSpec>>,
|
||||||
network_send: mpsc::UnboundedSender<NetworkMessage<T::EthSpec>>,
|
network_send: mpsc::UnboundedSender<NetworkMessage<T::EthSpec>>,
|
||||||
runtime_handle: &tokio::runtime::Handle,
|
runtime_handle: environment::TaskExecutor,
|
||||||
log: slog::Logger,
|
log: slog::Logger,
|
||||||
) -> error::Result<mpsc::UnboundedSender<RouterMessage<T::EthSpec>>> {
|
) -> error::Result<mpsc::UnboundedSender<RouterMessage<T::EthSpec>>> {
|
||||||
let message_handler_log = log.new(o!("service"=> "router"));
|
let message_handler_log = log.new(o!("service"=> "router"));
|
||||||
@@ -68,7 +68,8 @@ impl<T: BeaconChainTypes> Router<T> {
|
|||||||
|
|
||||||
// Initialise a message instance, which itself spawns the syncing thread.
|
// Initialise a message instance, which itself spawns the syncing thread.
|
||||||
let processor = Processor::new(
|
let processor = Processor::new(
|
||||||
runtime_handle,
|
// TODO: spawn_blocking here
|
||||||
|
&runtime_handle.runtime_handle(),
|
||||||
beacon_chain,
|
beacon_chain,
|
||||||
network_globals.clone(),
|
network_globals.clone(),
|
||||||
network_send.clone(),
|
network_send.clone(),
|
||||||
@@ -84,12 +85,15 @@ impl<T: BeaconChainTypes> Router<T> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// spawn handler task and move the message handler instance into the spawned thread
|
// spawn handler task and move the message handler instance into the spawned thread
|
||||||
runtime_handle.spawn(async move {
|
runtime_handle.spawn(
|
||||||
handler_recv
|
async move {
|
||||||
.for_each(move |msg| future::ready(handler.handle_message(msg)))
|
handler_recv
|
||||||
.await;
|
.for_each(move |msg| future::ready(handler.handle_message(msg)))
|
||||||
debug!(log, "Network message handler terminated.");
|
.await;
|
||||||
});
|
debug!(log, "Network message handler terminated.");
|
||||||
|
},
|
||||||
|
"router_service",
|
||||||
|
);
|
||||||
|
|
||||||
Ok(handler_send)
|
Ok(handler_send)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,12 +53,11 @@ impl<T: BeaconChainTypes> NetworkService<T> {
|
|||||||
pub fn start(
|
pub fn start(
|
||||||
beacon_chain: Arc<BeaconChain<T>>,
|
beacon_chain: Arc<BeaconChain<T>>,
|
||||||
config: &NetworkConfig,
|
config: &NetworkConfig,
|
||||||
runtime_handle: &Handle,
|
handle: environment::TaskExecutor,
|
||||||
network_log: slog::Logger,
|
network_log: slog::Logger,
|
||||||
) -> error::Result<(
|
) -> error::Result<(
|
||||||
Arc<NetworkGlobals<T::EthSpec>>,
|
Arc<NetworkGlobals<T::EthSpec>>,
|
||||||
mpsc::UnboundedSender<NetworkMessage<T::EthSpec>>,
|
mpsc::UnboundedSender<NetworkMessage<T::EthSpec>>,
|
||||||
oneshot::Sender<()>,
|
|
||||||
)> {
|
)> {
|
||||||
// build the network channel
|
// build the network channel
|
||||||
let (network_send, network_recv) = mpsc::unbounded_channel::<NetworkMessage<T::EthSpec>>();
|
let (network_send, network_recv) = mpsc::unbounded_channel::<NetworkMessage<T::EthSpec>>();
|
||||||
@@ -75,7 +74,7 @@ impl<T: BeaconChainTypes> NetworkService<T> {
|
|||||||
|
|
||||||
// launch libp2p service
|
// launch libp2p service
|
||||||
let (network_globals, mut libp2p) =
|
let (network_globals, mut libp2p) =
|
||||||
LibP2PService::new(runtime_handle, config, enr_fork_id, &network_log)?;
|
LibP2PService::new(handle.runtime_handle(), config, enr_fork_id, &network_log)?;
|
||||||
|
|
||||||
for enr in load_dht::<T::Store, T::EthSpec>(store.clone()) {
|
for enr in load_dht::<T::Store, T::EthSpec>(store.clone()) {
|
||||||
libp2p.swarm.add_enr(enr);
|
libp2p.swarm.add_enr(enr);
|
||||||
@@ -88,7 +87,7 @@ impl<T: BeaconChainTypes> NetworkService<T> {
|
|||||||
beacon_chain.clone(),
|
beacon_chain.clone(),
|
||||||
network_globals.clone(),
|
network_globals.clone(),
|
||||||
network_send.clone(),
|
network_send.clone(),
|
||||||
runtime_handle,
|
handle.clone(),
|
||||||
network_log.clone(),
|
network_log.clone(),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
@@ -111,17 +110,18 @@ impl<T: BeaconChainTypes> NetworkService<T> {
|
|||||||
propagation_percentage,
|
propagation_percentage,
|
||||||
};
|
};
|
||||||
|
|
||||||
let network_exit = spawn_service(runtime_handle, network_service)?;
|
let _ = spawn_service(handle, network_service)?;
|
||||||
|
|
||||||
Ok((network_globals, network_send, network_exit))
|
Ok((network_globals, network_send))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn spawn_service<T: BeaconChainTypes>(
|
fn spawn_service<T: BeaconChainTypes>(
|
||||||
handle: &tokio::runtime::Handle,
|
handle: environment::TaskExecutor,
|
||||||
mut service: NetworkService<T>,
|
mut service: NetworkService<T>,
|
||||||
) -> error::Result<tokio::sync::oneshot::Sender<()>> {
|
) -> error::Result<()> {
|
||||||
let (network_exit, mut exit_rx) = tokio::sync::oneshot::channel();
|
let mut exit_rx = handle.exit();
|
||||||
|
let handle = handle.runtime_handle();
|
||||||
|
|
||||||
// spawn on the current executor
|
// spawn on the current executor
|
||||||
handle.spawn(async move {
|
handle.spawn(async move {
|
||||||
@@ -364,7 +364,7 @@ fn spawn_service<T: BeaconChainTypes>(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(network_exit)
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a `Delay` that triggers shortly after the next change in the beacon chain fork version.
|
/// Returns a `Delay` that triggers shortly after the next change in the beacon chain fork version.
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ parking_lot = "0.10.2"
|
|||||||
futures = "0.3.5"
|
futures = "0.3.5"
|
||||||
operation_pool = { path = "../operation_pool" }
|
operation_pool = { path = "../operation_pool" }
|
||||||
rayon = "1.3.0"
|
rayon = "1.3.0"
|
||||||
|
environment = { path = "../../lighthouse/environment" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
remote_beacon_node = { path = "../../common/remote_beacon_node" }
|
remote_beacon_node = { path = "../../common/remote_beacon_node" }
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ pub struct NetworkInfo<T: BeaconChainTypes> {
|
|||||||
// Allowing more than 7 arguments.
|
// Allowing more than 7 arguments.
|
||||||
#[allow(clippy::too_many_arguments)]
|
#[allow(clippy::too_many_arguments)]
|
||||||
pub fn start_server<T: BeaconChainTypes>(
|
pub fn start_server<T: BeaconChainTypes>(
|
||||||
handle: &Handle,
|
handle: environment::TaskExecutor,
|
||||||
config: &Config,
|
config: &Config,
|
||||||
beacon_chain: Arc<BeaconChain<T>>,
|
beacon_chain: Arc<BeaconChain<T>>,
|
||||||
network_info: NetworkInfo<T>,
|
network_info: NetworkInfo<T>,
|
||||||
@@ -60,7 +60,7 @@ pub fn start_server<T: BeaconChainTypes>(
|
|||||||
freezer_db_path: PathBuf,
|
freezer_db_path: PathBuf,
|
||||||
eth2_config: Eth2Config,
|
eth2_config: Eth2Config,
|
||||||
log: slog::Logger,
|
log: slog::Logger,
|
||||||
) -> Result<(oneshot::Sender<()>, SocketAddr), hyper::Error> {
|
) -> Result<SocketAddr, hyper::Error> {
|
||||||
let inner_log = log.clone();
|
let inner_log = log.clone();
|
||||||
let eth2_config = Arc::new(eth2_config);
|
let eth2_config = Arc::new(eth2_config);
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ pub fn start_server<T: BeaconChainTypes>(
|
|||||||
let actual_listen_addr = server.local_addr();
|
let actual_listen_addr = server.local_addr();
|
||||||
|
|
||||||
// Build a channel to kill the HTTP server.
|
// Build a channel to kill the HTTP server.
|
||||||
let (exit_signal, exit) = oneshot::channel::<()>();
|
let exit = handle.exit();
|
||||||
let inner_log = log.clone();
|
let inner_log = log.clone();
|
||||||
let server_exit = async move {
|
let server_exit = async move {
|
||||||
let _ = exit.await;
|
let _ = exit.await;
|
||||||
@@ -127,9 +127,9 @@ pub fn start_server<T: BeaconChainTypes>(
|
|||||||
"port" => actual_listen_addr.port(),
|
"port" => actual_listen_addr.port(),
|
||||||
);
|
);
|
||||||
|
|
||||||
handle.spawn(server_future);
|
handle.runtime_handle().spawn(server_future);
|
||||||
|
|
||||||
Ok((exit_signal, actual_listen_addr))
|
Ok(actual_listen_addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|||||||
@@ -12,3 +12,4 @@ tokio = { version = "0.2.21", features = ["full"] }
|
|||||||
slog = "2.5.2"
|
slog = "2.5.2"
|
||||||
parking_lot = "0.10.2"
|
parking_lot = "0.10.2"
|
||||||
futures = "0.3.5"
|
futures = "0.3.5"
|
||||||
|
environment = { path = "../../lighthouse/environment" }
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ use tokio::time::{interval_at, Instant};
|
|||||||
|
|
||||||
/// Spawns a timer service which periodically executes tasks for the beacon chain
|
/// Spawns a timer service which periodically executes tasks for the beacon chain
|
||||||
pub fn spawn<T: BeaconChainTypes>(
|
pub fn spawn<T: BeaconChainTypes>(
|
||||||
handle: &Handle,
|
handle: environment::TaskExecutor,
|
||||||
beacon_chain: Arc<BeaconChain<T>>,
|
beacon_chain: Arc<BeaconChain<T>>,
|
||||||
milliseconds_per_slot: u64,
|
milliseconds_per_slot: u64,
|
||||||
log: slog::Logger,
|
log: slog::Logger,
|
||||||
@@ -34,14 +34,7 @@ pub fn spawn<T: BeaconChainTypes>(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let log_1 = log.clone();
|
handle.spawn(timer_future, "timer_service");
|
||||||
let exit_future = async move {
|
|
||||||
let _ = exit.await.ok();
|
|
||||||
info!(log_1, "Timer service shutdown");
|
|
||||||
};
|
|
||||||
|
|
||||||
let future = futures::future::select(Box::pin(timer_future), Box::pin(exit_future));
|
|
||||||
handle.spawn(future);
|
|
||||||
info!(log, "Timer service started");
|
info!(log, "Timer service started");
|
||||||
|
|
||||||
Ok(exit_signal)
|
Ok(exit_signal)
|
||||||
|
|||||||
@@ -15,3 +15,4 @@ slog = "2.5.2"
|
|||||||
tokio = { version = "0.2.21", features = ["full"] }
|
tokio = { version = "0.2.21", features = ["full"] }
|
||||||
types = { path = "../../consensus/types" }
|
types = { path = "../../consensus/types" }
|
||||||
ws = "0.9.1"
|
ws = "0.9.1"
|
||||||
|
environment = { path = "../../lighthouse/environment" }
|
||||||
|
|||||||
@@ -34,17 +34,10 @@ impl<T: EthSpec> WebSocketSender<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_server<T: EthSpec>(
|
pub fn start_server<T: EthSpec>(
|
||||||
handle: &tokio::runtime::Handle,
|
handle: environment::TaskExecutor,
|
||||||
config: &Config,
|
config: &Config,
|
||||||
log: &Logger,
|
log: &Logger,
|
||||||
) -> Result<
|
) -> Result<(WebSocketSender<T>, SocketAddr), String> {
|
||||||
(
|
|
||||||
WebSocketSender<T>,
|
|
||||||
tokio::sync::oneshot::Sender<()>,
|
|
||||||
SocketAddr,
|
|
||||||
),
|
|
||||||
String,
|
|
||||||
> {
|
|
||||||
let server_string = format!("{}:{}", config.listen_address, config.port);
|
let server_string = format!("{}:{}", config.listen_address, config.port);
|
||||||
|
|
||||||
// Create a server that simply ignores any incoming messages.
|
// Create a server that simply ignores any incoming messages.
|
||||||
@@ -68,31 +61,26 @@ pub fn start_server<T: EthSpec>(
|
|||||||
let broadcaster = server.broadcaster();
|
let broadcaster = server.broadcaster();
|
||||||
|
|
||||||
// Produce a signal/channel that can gracefully shutdown the websocket server.
|
// Produce a signal/channel that can gracefully shutdown the websocket server.
|
||||||
let exit_channel = {
|
let exit = handle.exit();
|
||||||
let (exit_channel, exit) = tokio::sync::oneshot::channel();
|
let log_inner = log.clone();
|
||||||
|
let broadcaster_inner = server.broadcaster();
|
||||||
let log_inner = log.clone();
|
let exit_future = async move {
|
||||||
let broadcaster_inner = server.broadcaster();
|
let _ = exit.await;
|
||||||
let exit_future = async move {
|
if let Err(e) = broadcaster_inner.shutdown() {
|
||||||
let _ = exit.await;
|
warn!(
|
||||||
if let Err(e) = broadcaster_inner.shutdown() {
|
log_inner,
|
||||||
warn!(
|
"Websocket server errored on shutdown";
|
||||||
log_inner,
|
"error" => format!("{:?}", e)
|
||||||
"Websocket server errored on shutdown";
|
);
|
||||||
"error" => format!("{:?}", e)
|
} else {
|
||||||
);
|
info!(log_inner, "Websocket server shutdown");
|
||||||
} else {
|
}
|
||||||
info!(log_inner, "Websocket server shutdown");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Place a future on the handle that will shutdown the websocket server when the
|
|
||||||
// application exits.
|
|
||||||
handle.spawn(exit_future);
|
|
||||||
|
|
||||||
exit_channel
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Place a future on the handle that will shutdown the websocket server when the
|
||||||
|
// application exits.
|
||||||
|
handle.runtime_handle().spawn(exit_future);
|
||||||
|
|
||||||
let log_inner = log.clone();
|
let log_inner = log.clone();
|
||||||
|
|
||||||
let _ = std::thread::spawn(move || match server.run() {
|
let _ = std::thread::spawn(move || match server.run() {
|
||||||
@@ -123,7 +111,6 @@ pub fn start_server<T: EthSpec>(
|
|||||||
sender: Some(broadcaster),
|
sender: Some(broadcaster),
|
||||||
_phantom: PhantomData,
|
_phantom: PhantomData,
|
||||||
},
|
},
|
||||||
exit_channel,
|
|
||||||
actual_listen_addr,
|
actual_listen_addr,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -216,11 +216,15 @@ fn run<E: EthSpec>(
|
|||||||
))
|
))
|
||||||
.map_err(|e| format!("Failed to init validator client: {}", e))?;
|
.map_err(|e| format!("Failed to init validator client: {}", e))?;
|
||||||
|
|
||||||
environment.core_context().runtime_handle.enter(|| {
|
environment
|
||||||
validator
|
.core_context()
|
||||||
.start_service()
|
.runtime_handle
|
||||||
.map_err(|e| format!("Failed to start validator client service: {}", e))
|
.runtime_handle()
|
||||||
})?;
|
.enter(|| {
|
||||||
|
validator
|
||||||
|
.start_service()
|
||||||
|
.map_err(|e| format!("Failed to start validator client service: {}", e))
|
||||||
|
})?;
|
||||||
|
|
||||||
Some(validator)
|
Some(validator)
|
||||||
} else {
|
} else {
|
||||||
@@ -234,9 +238,9 @@ fn run<E: EthSpec>(
|
|||||||
|
|
||||||
// Block this thread until Crtl+C is pressed.
|
// Block this thread until Crtl+C is pressed.
|
||||||
environment.block_until_ctrl_c()?;
|
environment.block_until_ctrl_c()?;
|
||||||
|
|
||||||
info!(log, "Shutting down..");
|
info!(log, "Shutting down..");
|
||||||
|
|
||||||
|
environment.fire_signal();
|
||||||
drop(beacon_node);
|
drop(beacon_node);
|
||||||
drop(validator_client);
|
drop(validator_client);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user