mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-10 20:22:02 +00:00
## Issue Addressed resolves #2129 resolves #2099 addresses some of #1712 unblocks #2076 unblocks #2153 ## Proposed Changes - Updates all the dependencies mentioned in #2129, except for web3. They haven't merged their tokio 1.0 update because they are waiting on some dependencies of their own. Since we only use web3 in tests, I think updating it in a separate issue is fine. If they are able to merge soon though, I can update in this PR. - Updates `tokio_util` to 0.6.2 and `bytes` to 1.0.1. - We haven't made a discv5 release since merging tokio 1.0 updates so I'm using a commit rather than release atm. **Edit:** I think we should merge an update of `tokio_util` to 0.6.2 into discv5 before this release because it has panic fixes in `DelayQueue` --> PR in discv5: https://github.com/sigp/discv5/pull/58 ## Additional Info tokio 1.0 changes that required some changes in lighthouse: - `interval.next().await.is_some()` -> `interval.tick().await` - `sleep` future is now `!Unpin` -> https://github.com/tokio-rs/tokio/issues/3028 - `try_recv` has been temporarily removed from `mpsc` -> https://github.com/tokio-rs/tokio/issues/3350 - stream features have moved to `tokio-stream` and `broadcast::Receiver::into_stream()` has been temporarily removed -> `https://github.com/tokio-rs/tokio/issues/2870 - I've copied over the `BroadcastStream` wrapper from this PR, but can update to use `tokio-stream` once it's merged https://github.com/tokio-rs/tokio/pull/3384 Co-authored-by: realbigsean <seananderson33@gmail.com>
101 lines
4.0 KiB
Rust
101 lines
4.0 KiB
Rust
use crate::ProductionValidatorClient;
|
|
use slog::{error, info};
|
|
use slot_clock::SlotClock;
|
|
use tokio::time::{interval_at, Duration, Instant};
|
|
use types::EthSpec;
|
|
|
|
/// Spawns a notifier service which periodically logs information about the node.
|
|
pub fn spawn_notifier<T: EthSpec>(client: &ProductionValidatorClient<T>) -> Result<(), String> {
|
|
let context = client.context.service_context("notifier".into());
|
|
let executor = context.executor.clone();
|
|
let duties_service = client.duties_service.clone();
|
|
|
|
let slot_duration = Duration::from_secs(context.eth2_config.spec.seconds_per_slot);
|
|
let duration_to_next_slot = duties_service
|
|
.slot_clock
|
|
.duration_to_next_slot()
|
|
.ok_or("slot_notifier unable to determine time to next slot")?;
|
|
|
|
// Run the notifier half way through each slot.
|
|
let start_instant = Instant::now() + duration_to_next_slot + (slot_duration / 2);
|
|
let mut interval = interval_at(start_instant, slot_duration);
|
|
|
|
let interval_fut = async move {
|
|
let log = context.log();
|
|
|
|
loop {
|
|
interval.tick().await;
|
|
let num_available = duties_service.beacon_nodes.num_available().await;
|
|
let num_synced = duties_service.beacon_nodes.num_synced().await;
|
|
let num_total = duties_service.beacon_nodes.num_total().await;
|
|
if num_synced > 0 {
|
|
info!(
|
|
log,
|
|
"Connected to beacon node(s)";
|
|
"total" => num_total,
|
|
"available" => num_available,
|
|
"synced" => num_synced,
|
|
)
|
|
} else {
|
|
error!(
|
|
log,
|
|
"No synced beacon nodes";
|
|
"total" => num_total,
|
|
"available" => num_available,
|
|
"synced" => num_synced,
|
|
)
|
|
}
|
|
|
|
if let Some(slot) = duties_service.slot_clock.now() {
|
|
let epoch = slot.epoch(T::slots_per_epoch());
|
|
|
|
let total_validators = duties_service.total_validator_count();
|
|
let proposing_validators = duties_service.proposer_count(epoch);
|
|
let attesting_validators = duties_service.attester_count(epoch);
|
|
|
|
if total_validators == 0 {
|
|
info!(
|
|
log,
|
|
"No validators present";
|
|
"msg" => "see `lighthouse account validator create --help` \
|
|
or the HTTP API documentation"
|
|
)
|
|
} else if total_validators == attesting_validators {
|
|
info!(
|
|
log,
|
|
"All validators active";
|
|
"proposers" => proposing_validators,
|
|
"active_validators" => attesting_validators,
|
|
"total_validators" => total_validators,
|
|
"epoch" => format!("{}", epoch),
|
|
"slot" => format!("{}", slot),
|
|
);
|
|
} else if attesting_validators > 0 {
|
|
info!(
|
|
log,
|
|
"Some validators active";
|
|
"proposers" => proposing_validators,
|
|
"active_validators" => attesting_validators,
|
|
"total_validators" => total_validators,
|
|
"epoch" => format!("{}", epoch),
|
|
"slot" => format!("{}", slot),
|
|
);
|
|
} else {
|
|
info!(
|
|
log,
|
|
"Awaiting activation";
|
|
"validators" => total_validators,
|
|
"epoch" => format!("{}", epoch),
|
|
"slot" => format!("{}", slot),
|
|
);
|
|
}
|
|
} else {
|
|
error!(log, "Unable to read slot clock");
|
|
}
|
|
}
|
|
};
|
|
|
|
executor.spawn(interval_fut, "validator_notifier");
|
|
Ok(())
|
|
}
|