Add voting metric even when there are not enough validators
This commit is contained in:
committed by
sakridge
parent
1152457691
commit
7c31f217d5
@ -63,6 +63,7 @@ fn get_last_id_to_vote_on(
|
|||||||
bank: &Arc<Bank>,
|
bank: &Arc<Bank>,
|
||||||
now: u64,
|
now: u64,
|
||||||
last_vote: &mut u64,
|
last_vote: &mut u64,
|
||||||
|
last_valid_validator_timestamp: &mut u64,
|
||||||
) -> result::Result<(Hash, u64), VoteError> {
|
) -> result::Result<(Hash, u64), VoteError> {
|
||||||
let mut valid_ids = bank.count_valid_ids(&ids);
|
let mut valid_ids = bank.count_valid_ids(&ids);
|
||||||
let super_majority_index = (2 * ids.len()) / 3;
|
let super_majority_index = (2 * ids.len()) / 3;
|
||||||
@ -96,6 +97,17 @@ fn get_last_id_to_vote_on(
|
|||||||
return Ok((last_id, valid_ids[super_majority_index].1));
|
return Ok((last_id, valid_ids[super_majority_index].1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *last_valid_validator_timestamp != 0 {
|
||||||
|
metrics::submit(
|
||||||
|
influxdb::Point::new(&"leader-finality")
|
||||||
|
.add_field(
|
||||||
|
"duration_ms",
|
||||||
|
influxdb::Value::Integer((now - *last_valid_validator_timestamp) as i64),
|
||||||
|
)
|
||||||
|
.to_owned(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Err(VoteError::NoValidLastIdsToVoteOn)
|
Err(VoteError::NoValidLastIdsToVoteOn)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,6 +119,7 @@ pub fn send_leader_vote(
|
|||||||
blob_recycler: &BlobRecycler,
|
blob_recycler: &BlobRecycler,
|
||||||
vote_blob_sender: &BlobSender,
|
vote_blob_sender: &BlobSender,
|
||||||
last_vote: &mut u64,
|
last_vote: &mut u64,
|
||||||
|
last_valid_validator_timestamp: &mut u64,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let now = timing::timestamp();
|
let now = timing::timestamp();
|
||||||
if now - *last_vote > VOTE_TIMEOUT_MS {
|
if now - *last_vote > VOTE_TIMEOUT_MS {
|
||||||
@ -117,15 +130,22 @@ pub fn send_leader_vote(
|
|||||||
.values()
|
.values()
|
||||||
.map(|x| x.ledger_state.last_id)
|
.map(|x| x.ledger_state.last_id)
|
||||||
.collect();
|
.collect();
|
||||||
if let Ok((last_id, super_majority_timestamp)) =
|
if let Ok((last_id, super_majority_timestamp)) = get_last_id_to_vote_on(
|
||||||
get_last_id_to_vote_on(debug_id, &ids, bank, now, last_vote)
|
debug_id,
|
||||||
{
|
&ids,
|
||||||
|
bank,
|
||||||
|
now,
|
||||||
|
last_vote,
|
||||||
|
last_valid_validator_timestamp,
|
||||||
|
) {
|
||||||
if let Ok((tx, shared_blob)) =
|
if let Ok((tx, shared_blob)) =
|
||||||
create_vote_tx_and_blob(&last_id, keypair, crdt, blob_recycler)
|
create_vote_tx_and_blob(&last_id, keypair, crdt, blob_recycler)
|
||||||
{
|
{
|
||||||
bank.process_transaction(&tx)?;
|
bank.process_transaction(&tx)?;
|
||||||
vote_blob_sender.send(VecDeque::from(vec![shared_blob]))?;
|
vote_blob_sender.send(VecDeque::from(vec![shared_blob]))?;
|
||||||
let finality_ms = now - super_majority_timestamp;
|
let finality_ms = now - super_majority_timestamp;
|
||||||
|
|
||||||
|
*last_valid_validator_timestamp = super_majority_timestamp;
|
||||||
debug!(
|
debug!(
|
||||||
"{:x} leader_sent_vote finality: {} ms",
|
"{:x} leader_sent_vote finality: {} ms",
|
||||||
debug_id, finality_ms
|
debug_id, finality_ms
|
||||||
@ -311,6 +331,7 @@ pub mod tests {
|
|||||||
let blob_recycler = BlobRecycler::default();
|
let blob_recycler = BlobRecycler::default();
|
||||||
let (vote_blob_sender, vote_blob_receiver) = channel();
|
let (vote_blob_sender, vote_blob_receiver) = channel();
|
||||||
let mut last_vote: u64 = timing::timestamp() - VOTE_TIMEOUT_MS - 1;
|
let mut last_vote: u64 = timing::timestamp() - VOTE_TIMEOUT_MS - 1;
|
||||||
|
let mut last_valid_validator_timestamp = 0;
|
||||||
let res = send_leader_vote(
|
let res = send_leader_vote(
|
||||||
1234,
|
1234,
|
||||||
&mint.keypair(),
|
&mint.keypair(),
|
||||||
@ -319,6 +340,7 @@ pub mod tests {
|
|||||||
&blob_recycler,
|
&blob_recycler,
|
||||||
&vote_blob_sender,
|
&vote_blob_sender,
|
||||||
&mut last_vote,
|
&mut last_vote,
|
||||||
|
&mut last_valid_validator_timestamp,
|
||||||
);
|
);
|
||||||
trace!("vote result: {:?}", res);
|
trace!("vote result: {:?}", res);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
@ -358,6 +380,7 @@ pub mod tests {
|
|||||||
&blob_recycler,
|
&blob_recycler,
|
||||||
&vote_blob_sender,
|
&vote_blob_sender,
|
||||||
&mut last_vote,
|
&mut last_vote,
|
||||||
|
&mut last_valid_validator_timestamp,
|
||||||
);
|
);
|
||||||
trace!("vote result: {:?}", res);
|
trace!("vote result: {:?}", res);
|
||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
@ -375,6 +398,7 @@ pub mod tests {
|
|||||||
let mint = Mint::new(1234);
|
let mint = Mint::new(1234);
|
||||||
let bank = Arc::new(Bank::new(&mint));
|
let bank = Arc::new(Bank::new(&mint));
|
||||||
let mut last_vote = 0;
|
let mut last_vote = 0;
|
||||||
|
let mut last_valid_validator_timestamp = 0;
|
||||||
|
|
||||||
// generate 10 last_ids, register 6 with the bank
|
// generate 10 last_ids, register 6 with the bank
|
||||||
let ids: Vec<_> = (0..10)
|
let ids: Vec<_> = (0..10)
|
||||||
@ -390,12 +414,28 @@ pub mod tests {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
// see that we fail to have 2/3rds consensus
|
// see that we fail to have 2/3rds consensus
|
||||||
assert!(get_last_id_to_vote_on(1234, &ids, &bank, 0, &mut last_vote).is_err());
|
assert!(
|
||||||
|
get_last_id_to_vote_on(
|
||||||
|
1234,
|
||||||
|
&ids,
|
||||||
|
&bank,
|
||||||
|
0,
|
||||||
|
&mut last_vote,
|
||||||
|
&mut last_valid_validator_timestamp
|
||||||
|
).is_err()
|
||||||
|
);
|
||||||
|
|
||||||
// register another, see passing
|
// register another, see passing
|
||||||
bank.register_entry_id(&ids[6]);
|
bank.register_entry_id(&ids[6]);
|
||||||
|
|
||||||
let res = get_last_id_to_vote_on(1234, &ids, &bank, 0, &mut last_vote);
|
let res = get_last_id_to_vote_on(
|
||||||
|
1234,
|
||||||
|
&ids,
|
||||||
|
&bank,
|
||||||
|
0,
|
||||||
|
&mut last_vote,
|
||||||
|
&mut last_valid_validator_timestamp,
|
||||||
|
);
|
||||||
if let Ok((hash, timestamp)) = res {
|
if let Ok((hash, timestamp)) = res {
|
||||||
assert!(hash == ids[6]);
|
assert!(hash == ids[6]);
|
||||||
assert!(timestamp != 0);
|
assert!(timestamp != 0);
|
||||||
|
@ -90,6 +90,7 @@ impl WriteStage {
|
|||||||
.name("solana-writer".to_string())
|
.name("solana-writer".to_string())
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
let mut last_vote = 0;
|
let mut last_vote = 0;
|
||||||
|
let mut last_valid_validator_timestamp = 0;
|
||||||
let debug_id = crdt.read().unwrap().debug_id();
|
let debug_id = crdt.read().unwrap().debug_id();
|
||||||
loop {
|
loop {
|
||||||
if let Err(e) = Self::write_and_send_entries(
|
if let Err(e) = Self::write_and_send_entries(
|
||||||
@ -117,6 +118,7 @@ impl WriteStage {
|
|||||||
&blob_recycler,
|
&blob_recycler,
|
||||||
&vote_blob_sender,
|
&vote_blob_sender,
|
||||||
&mut last_vote,
|
&mut last_vote,
|
||||||
|
&mut last_valid_validator_timestamp,
|
||||||
) {
|
) {
|
||||||
inc_new_counter!("write_stage-leader_vote-error", 1);
|
inc_new_counter!("write_stage-leader_vote-error", 1);
|
||||||
error!("{:?}", e);
|
error!("{:?}", e);
|
||||||
|
Reference in New Issue
Block a user