Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Example: Peer fanout in peer set #3231

Closed
wants to merge 6 commits into from
Closed

Conversation

teor2345
Copy link
Contributor

Motivation

This PR has some example code for ticket #2214.

It should not be merged.

@teor2345 teor2345 added the S-blocked Status: Blocked on other tasks label Dec 14, 2021
Comment on lines +654 to +686
/// Fans out the same request to a few ready peers,
/// combining successful responses into a single response,
/// and ignoring errors.
///
/// But if all requests return an error, returns an error from an arbitrary peer.
fn route_fanout(&mut self, req: Request) -> <Self as tower::Service<Request>>::Future {
// TODO: does each individual fanout request need a smaller timeout,
// to avoid stalling all the requests when a single peer doesn't respond?

// Limit the fanout to half the ready peers, and to the fanout maximum.
let half_ready_peers = (self.ready_services.len() + 1) / 2;
let fanout_peers = min(constants::MAX_REQUEST_FANOUT, half_ready_peers);

self.route_multiple(req.clone(), fanout_peers)
.map(|results| {
let responses: Vec<Response> = results
.iter()
.filter_map(|result| result.as_ref().ok())
.cloned()
.collect();
let first_error = results.into_iter().find_map(Result::err);

if !responses.is_empty() {
Ok(combine_fanout_responses(req, responses))
} else if let Some(first_error) = first_error {
// We could return a list of errors, but one should be enough
Err(first_error)
} else {
unreachable!("expected at least one peer result")
}
})
.boxed()
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@oxarbitrage this is the code I was struggling to get to compile.

@teor2345
Copy link
Contributor Author

@oxarbitrage I'm going to close this PR, because we're not going to merge it :-)

@teor2345 teor2345 closed this Dec 23, 2021
@teor2345 teor2345 deleted the peer-fanout-in-peer-set branch March 21, 2022 21:31
@teor2345 teor2345 restored the peer-fanout-in-peer-set branch March 21, 2022 21:31
@teor2345 teor2345 deleted the peer-fanout-in-peer-set branch September 5, 2022 23:06
@teor2345 teor2345 restored the peer-fanout-in-peer-set branch September 5, 2022 23:06
@teor2345 teor2345 deleted the peer-fanout-in-peer-set branch September 5, 2022 23:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-blocked Status: Blocked on other tasks
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant