Skip to content

Commit

Permalink
back-off block proposal (paritytech#4235)
Browse files Browse the repository at this point in the history
  • Loading branch information
rphmeier authored and gavofyork committed Nov 27, 2019
1 parent b853a4f commit 4723156
Showing 1 changed file with 26 additions and 0 deletions.
26 changes: 26 additions & 0 deletions client/consensus/babe/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,32 @@ impl<B, C, E, I, Error, SO> slots::SimpleSlotWorker<B> for BabeWorker<B, C, E, I
consensus_common::Error::ClientImport(format!("{:?}", e))
})
}

fn proposing_remaining_duration(
&self,
head: &B::Header,
slot_info: &SlotInfo
) -> Option<std::time::Duration> {
// never give more than 20 times more lenience.
const BACKOFF_CAP: u64 = 20;

let slot_remaining = self.slot_remaining_duration(slot_info);
let parent_slot = match find_pre_digest::<B>(head) {
Err(_) => return Some(slot_remaining),
Ok(d) => d.slot_number(),
};

// we allow a lenience of the number of slots since the head of the
// chain was produced, minus 1 (since there is always a difference of at least 1)
//
// linear back-off.
// in normal cases we only attempt to issue blocks up to the end of the slot.
// when the chain has been stalled for a few slots, we give more lenience.
let slot_lenience = slot_info.number.saturating_sub(parent_slot + 1);
let slot_lenience = std::cmp::min(slot_lenience, BACKOFF_CAP);
let slot_lenience = Duration::from_secs(slot_lenience * slot_info.duration);
Some(slot_lenience + slot_remaining)
}
}

impl<B, C, E, I, Error, SO> SlotWorker<B> for BabeWorker<B, C, E, I, SO> where
Expand Down

0 comments on commit 4723156

Please sign in to comment.