mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 16:17:59 +00:00
f2a750ee86
Previously, it was only possible to retry the same request on a different protocol name that had the exact same binary payloads. Introduce a way of trying a different request on a different protocol if the first one fails with Unsupported protocol. This helps with adding new req-response versions in polkadot while preserving compatibility with unupgraded nodes. The way req-response protocols were bumped previously was that they were bundled with some other notifications protocol upgrade, like for async backing (but that is more complicated, especially if the feature does not require any changes to a notifications protocol). Will be needed for implementing https://github.com/polkadot-fellows/RFCs/pull/47 TODO: - [x] add tests - [x] add guidance docs in polkadot about req-response protocol versioning
46 lines
1.6 KiB
Rust
46 lines
1.6 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
//! Contains mock implementations of `ChainSync` and 'BlockDownloader'.
|
|
|
|
use crate::block_relay_protocol::{BlockDownloader as BlockDownloaderT, BlockResponseError};
|
|
|
|
use futures::channel::oneshot;
|
|
use libp2p::PeerId;
|
|
use sc_network::{ProtocolName, RequestFailure};
|
|
use sc_network_common::sync::message::{BlockData, BlockRequest};
|
|
use sp_runtime::traits::Block as BlockT;
|
|
|
|
mockall::mock! {
|
|
pub BlockDownloader<Block: BlockT> {}
|
|
|
|
#[async_trait::async_trait]
|
|
impl<Block: BlockT> BlockDownloaderT<Block> for BlockDownloader<Block> {
|
|
async fn download_blocks(
|
|
&self,
|
|
who: PeerId,
|
|
request: BlockRequest<Block>,
|
|
) -> Result<Result<(Vec<u8>, ProtocolName), RequestFailure>, oneshot::Canceled>;
|
|
fn block_response_into_blocks(
|
|
&self,
|
|
request: &BlockRequest<Block>,
|
|
response: Vec<u8>,
|
|
) -> Result<Vec<BlockData<Block>>, BlockResponseError>;
|
|
}
|
|
}
|