moves up mutations to self

This commit is contained in:
Arya 2023-11-17 13:03:51 -05:00
parent 72a6bf90d5
commit df09e7c9b8
1 changed files with 22 additions and 17 deletions

View File

@ -137,14 +137,7 @@ impl Handler {
/// interpretable as a response, we return ownership to the caller.
///
/// Unexpected messages are left unprocessed, and may be rejected later.
///
/// `addr` responses are limited to avoid peer set takeover. Any excess
/// addresses are stored in `cached_addrs`.
fn process_message(
&mut self,
msg: Message,
cached_addrs: &mut Vec<MetaAddr>,
) -> Option<Message> {
fn process_message(&mut self, msg: Message) -> Option<Message> {
let mut ignored_msg = None;
// TODO: can this be avoided?
let tmp_state = std::mem::replace(self, Handler::Finished(Ok(Response::Nil)));
@ -161,20 +154,13 @@ impl Handler {
}
(Handler::Peers, Message::Addr(new_addrs)) => {
// Security: This method performs security-sensitive operations, see its comments
// for details.
let response_addrs =
Handler::update_addr_cache(cached_addrs, &new_addrs, PEER_ADDR_RESPONSE_LIMIT);
debug!(
new_addrs = new_addrs.len(),
response_addrs = response_addrs.len(),
remaining_addrs = cached_addrs.len(),
PEER_ADDR_RESPONSE_LIMIT,
"responding to Peers request using new and cached addresses",
);
Handler::Finished(Ok(Response::Peers(response_addrs)))
Handler::Finished(Ok(Response::Peers(new_addrs)))
}
// `zcashd` returns requested transactions in a single batch of messages.
@ -843,6 +829,25 @@ where
Either::Right((Some(Ok(peer_msg)), _cancel)) => {
self.update_state_metrics(format!("Out::Rsp::{}", peer_msg.command()));
// `addr` responses are limited to avoid peer set takeover. Any excess
// addresses are stored in `cached_addrs`.
let mut with_cached_addrs = |handler: &Handler, msg| {
if let (Handler::Peers, Message::Addr(new_addrs)) = (handler, &msg)
{
// Security: This method performs security-sensitive operations, see its comments
// for details.
let response_addrs = Handler::update_addr_cache(
&mut self.cached_addrs,
new_addrs,
PEER_ADDR_RESPONSE_LIMIT,
);
Message::Addr(response_addrs)
} else {
msg
}
};
// Try to process the message using the handler.
// This extremely awkward construction avoids
// keeping a live reference to handler across the
@ -853,7 +858,7 @@ where
let request_msg = match self.state {
State::AwaitingResponse {
ref mut handler, ..
} => span.in_scope(|| handler.process_message(peer_msg, &mut self.cached_addrs)),
} => span.in_scope(|| handler.process_message(with_cached_addrs(handler, peer_msg))),
_ => unreachable!("unexpected state after AwaitingResponse: {:?}, peer_msg: {:?}, client_receiver: {:?}",
self.state,
peer_msg,