client/network: Use request response for light client requests (#7895)

* client/network: Re-enable light_client_handler.rs unit tests

* client/network: Add scaffolding for light client using req-resp

* client/network: Make it compile

* client/network: Rename OutEvent SendRequest

* client/network: Restructure light client request client and handler

* client/network: Rename light client request client to sender

* client/network: Remove light client prepare_request

* client/network/src/light: Rework configuration

* client/network: Formatting

* client/network/light: Remove RequestId

* client/network/light: Make request functions methods

* client/network/light: Refactor request wrapping

* client/network/light: Fix warnings

* client/network/light: Serialize request in method

* client/network/light: Make returning response a method

* client/network/light: Depend on request response to timeout requests

* client/network: Fix test compilation

* client/network/light: Re-enable connection test

* client/network/light: Re-enable timeout test

* client/network/light: Re-enable incorrect_response test

* client/network/light: Re-enable wrong_response_type test

* client/network/light: Re-enable retry_count_failures test

* client/network/light: Re-enable issue_request tests

* client/network/light: Re-enable send_receive tests

* client/network/light: Deduplicate test logic

* client/network/light: Remove unused imports

* client/network/light: Handle request failure

* client/network/light: Move generate_protocol_config

* client/network: Fix test compilation

* client/network: Rename light client request client to sender

* client/network: Handle too-many-requests error

* client/network: Update outdated comments

* client/network/light: Choose any peer if none has best block defined

* .maintain: Replace sentry-node with local-docker-test-network

Sentry nodes are deprecated. Thus there is no need for
`.maintain/sentry-node` to spin up a sentry node test environment.
Instead this commit rewrites the setup to contain two full-connected
validators and one light client.

With the steps below one can now spin up a local test network with
two validators, one light-client, Prometheus and Grafana.

- cargo build --release
- sudo docker-compose -f .maintain/local-docker-test-network/docker-compose.yml up

* client/network/light: Handle oneshot cancellation

* client/network/light: Do not reduce retry count on missing peer

* client/network/request-response: Assert in debug request id to be unique

* client/network/light: Choose same limit as block request protocol

* client/network: Report reputation changes via response

Allow request response protocol handlers to issue reputation changes, by
sending them back along with the response payload.

* client/network: Remove resolved TODOs
This commit is contained in:
Max Inden
2021-02-01 16:59:47 +01:00
committed by GitHub
parent c83bca67b5
commit 3006100977
15 changed files with 2235 additions and 2136 deletions
+10 -10
View File
@@ -18,7 +18,7 @@
//! On-demand requests service.
use crate::light_client_handler;
use crate::light_client_requests;
use futures::{channel::oneshot, prelude::*};
use parking_lot::Mutex;
@@ -45,10 +45,10 @@ pub struct OnDemand<B: BlockT> {
/// Note that a better alternative would be to use a MPMC queue here, and add a `poll` method
/// from the `OnDemand`. However there exists no popular implementation of MPMC channels in
/// asynchronous Rust at the moment
requests_queue: Mutex<Option<TracingUnboundedReceiver<light_client_handler::Request<B>>>>,
requests_queue: Mutex<Option<TracingUnboundedReceiver<light_client_requests::sender::Request<B>>>>,
/// Sending side of `requests_queue`.
requests_send: TracingUnboundedSender<light_client_handler::Request<B>>,
requests_send: TracingUnboundedSender<light_client_requests::sender::Request<B>>,
}
@@ -149,7 +149,7 @@ where
/// If this function returns `None`, that means that the receiver has already been extracted in
/// the past, and therefore that something already handles the requests.
pub(crate) fn extract_receiver(&self)
-> Option<TracingUnboundedReceiver<light_client_handler::Request<B>>>
-> Option<TracingUnboundedReceiver<light_client_requests::sender::Request<B>>>
{
self.requests_queue.lock().take()
}
@@ -170,7 +170,7 @@ where
let (sender, receiver) = oneshot::channel();
let _ = self
.requests_send
.unbounded_send(light_client_handler::Request::Header { request, sender });
.unbounded_send(light_client_requests::sender::Request::Header { request, sender });
RemoteResponse { receiver }
}
@@ -178,7 +178,7 @@ where
let (sender, receiver) = oneshot::channel();
let _ = self
.requests_send
.unbounded_send(light_client_handler::Request::Read { request, sender });
.unbounded_send(light_client_requests::sender::Request::Read { request, sender });
RemoteResponse { receiver }
}
@@ -189,7 +189,7 @@ where
let (sender, receiver) = oneshot::channel();
let _ = self
.requests_send
.unbounded_send(light_client_handler::Request::ReadChild { request, sender });
.unbounded_send(light_client_requests::sender::Request::ReadChild { request, sender });
RemoteResponse { receiver }
}
@@ -197,7 +197,7 @@ where
let (sender, receiver) = oneshot::channel();
let _ = self
.requests_send
.unbounded_send(light_client_handler::Request::Call { request, sender });
.unbounded_send(light_client_requests::sender::Request::Call { request, sender });
RemoteResponse { receiver }
}
@@ -208,7 +208,7 @@ where
let (sender, receiver) = oneshot::channel();
let _ = self
.requests_send
.unbounded_send(light_client_handler::Request::Changes { request, sender });
.unbounded_send(light_client_requests::sender::Request::Changes { request, sender });
RemoteResponse { receiver }
}
@@ -216,7 +216,7 @@ where
let (sender, receiver) = oneshot::channel();
let _ = self
.requests_send
.unbounded_send(light_client_handler::Request::Body { request, sender });
.unbounded_send(light_client_requests::sender::Request::Body { request, sender });
RemoteResponse { receiver }
}
}