Clean up SeedService.poll_ready with a 'ref mut'
Co-Authored-By: Henry de Valence <hdevalence@hdevalence.ca>
This commit is contained in:
parent
9d8e32d05f
commit
0f20ff59c7
|
|
@ -17,8 +17,6 @@ use crate::{config::ZebradConfig, prelude::*};
|
||||||
/// Whether our `SeedService` is poll_ready or not.
|
/// Whether our `SeedService` is poll_ready or not.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum SeederState {
|
enum SeederState {
|
||||||
// This is kinda gross but ¯\_(ツ)_/¯
|
|
||||||
TempState,
|
|
||||||
/// Waiting for the address book to be shared with us via the oneshot channel.
|
/// Waiting for the address book to be shared with us via the oneshot channel.
|
||||||
AwaitingAddressBook(oneshot::Receiver<Arc<Mutex<AddressBook>>>),
|
AwaitingAddressBook(oneshot::Receiver<Arc<Mutex<AddressBook>>>),
|
||||||
/// Address book received, ready to service requests.
|
/// Address book received, ready to service requests.
|
||||||
|
|
@ -39,37 +37,27 @@ impl Service<Request> for SeedService {
|
||||||
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
|
fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
|
||||||
debug!("SeedService.state: {:?}", self.state);
|
debug!("SeedService.state: {:?}", self.state);
|
||||||
|
|
||||||
let mut poll_result = Poll::Pending;
|
match self.state {
|
||||||
|
SeederState::Ready(_) => return Poll::Ready(Ok(())),
|
||||||
// We want to be able to consume the state, but it's behind a mutable
|
SeederState::AwaitingAddressBook(ref mut rx) => match rx.try_recv() {
|
||||||
// reference, so we can't move it out of self without swapping in a
|
Err(e) => {
|
||||||
// placeholder, even if we immediately overwrite the placeholder.
|
error!("SeedService oneshot sender dropped: {:?}", e);
|
||||||
let tmp_state = std::mem::replace(&mut self.state, SeederState::TempState);
|
return Poll::Ready(Err(e.into()));
|
||||||
|
}
|
||||||
self.state = match tmp_state {
|
Ok(None) => {
|
||||||
SeederState::AwaitingAddressBook(mut rx) => match rx.try_recv() {
|
debug!("SeedService got a message with `None` in it. 🤔");
|
||||||
|
return Poll::Pending;
|
||||||
|
}
|
||||||
Ok(Some(address_book)) => {
|
Ok(Some(address_book)) => {
|
||||||
info!(
|
info!(
|
||||||
"SeedService received address_book via oneshot {:?}",
|
"SeedService received address_book via oneshot {:?}",
|
||||||
address_book
|
address_book
|
||||||
);
|
);
|
||||||
poll_result = Poll::Ready(Ok(()));
|
self.state = SeederState::Ready(address_book);
|
||||||
SeederState::Ready(address_book)
|
return Poll::Ready(Ok(()));
|
||||||
}
|
}
|
||||||
// Sets self.state to a new instance of what it
|
|
||||||
// already was; we can't just return `tmp_state`
|
|
||||||
// because we've plucked it apart via `rx` and moved
|
|
||||||
// parts around already in this block.
|
|
||||||
_ => SeederState::AwaitingAddressBook(rx),
|
|
||||||
},
|
},
|
||||||
SeederState::Ready(_) => {
|
|
||||||
poll_result = Poll::Ready(Ok(()));
|
|
||||||
tmp_state
|
|
||||||
}
|
}
|
||||||
SeederState::TempState => tmp_state,
|
|
||||||
};
|
|
||||||
|
|
||||||
return poll_result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn call(&mut self, req: Request) -> Self::Future {
|
fn call(&mut self, req: Request) -> Self::Future {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue