-
Notifications
You must be signed in to change notification settings - Fork 741
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
litep2p/req-resp: Always provide main protocol name in responses #6603
Conversation
Signed-off-by: Alexandru Vasile <[email protected]>
response, | ||
fallback.map_or_else(|| self.protocol.clone(), Into::into), | ||
))); | ||
let _ = tx.send(Ok((response, self.protocol.clone()))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately, this is not a fix for our issue because the fallback mentioned here is actually a fallback protocol, and not a fallback name. Here we need to pass the actual name of the fallback protocol for the client code to correctly implement protocol backward-compatibility (e.g., correctly process a different protobuf schema).
I have created an issue in litep2p for adding support for actual fallback names:
paritytech/litep2p#289
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To sum up the difference in operation of libp2p & litep2p network backends:
libp2p network backend
- libp2p backend is responsible for sending the fallback request, not libp2p.
- If only the fallback protocol name was used on the wire and no fallback request happened, the main protocol name is returned to the client code
- If the fallback request was sent, the name of the fallback request protocol is returned to the client code (as it is just another protocol from the libp2p backend perspective).
litep2p network backend
-
litep2p sends the fallback request internally and it is the one responsible for actually performing the fallback request, not the network backend.
Surprisingly enough, litep2p network backend also has the logic of handling fallback requests in case litep2p returned
UnsupportedProtocol
for some reason. -
If only the fallback protocol name was used on the wire and no fallback request happened, the fallback protocol name is returned to the client code. This is what makes litep2p different and leads to panics in network/sync: Panic on unexpected generic response protocol #6581.
-
If the fallback request was sent, the name of the fallback request protocol is returned to the client code (the same as libp2p).
I will create a PR to make litep2p/backend behave in a way libp2p backend behaves.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
itep2p sends the fallback request internally and it is the one responsible for actually performing the fallback request, not the network backend.
This turned out to be not the case: litep2p network backend does not use the litep2p's try_send_request_with_fallback
and uses try_send_request
instead. This means fallback requests are handled completely by the backend in substrate, and not by litep2p.
So, we can be sure that a fallback reported by litep2p is just the fallback name of the main protocol and safely override it with the main protocol name in substrate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oki doki, thanks a lot for the detailed info and for confirming, this helps a lot🙏
Signed-off-by: Alexandru Vasile <[email protected]>
Request responses are initialized with a main protocol name, and optional protocol names as a fallback. Running litep2p in kusama as a validator has surfaced a `debug_asserts` coming from the sync component: https://github.com/paritytech/polkadot-sdk/blob/3906c578c96d97a8a099a4bdac4685acbe375a7c/substrate/client/network/sync/src/strategy/chain_sync.rs#L640-L646 The issue is that we initiate a request-response over the main protocol name `/genesis/sync/2` but receive a response over the legacy procotol `ksm/sync/2`. This behavior is correct because litep2p propagates to the higher levels the protocol that responded. In contrast, libp2p provides the main protocol name regardless of negotiating a legacy protocol. Because of this, higher level components assume that only the main protocol name will respond. To not break this assumption, this PR alings litep2p shim layer with the libp2p behavior. Closes: #6581 --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Dmitry Markin <[email protected]> (cherry picked from commit 2a0b268)
Successfully created backport PR for |
Request responses are initialized with a main protocol name, and optional protocol names as a fallback. Running litep2p in kusama as a validator has surfaced a `debug_asserts` coming from the sync component: https://github.com/paritytech/polkadot-sdk/blob/3906c578c96d97a8a099a4bdac4685acbe375a7c/substrate/client/network/sync/src/strategy/chain_sync.rs#L640-L646 The issue is that we initiate a request-response over the main protocol name `/genesis/sync/2` but receive a response over the legacy procotol `ksm/sync/2`. This behavior is correct because litep2p propagates to the higher levels the protocol that responded. In contrast, libp2p provides the main protocol name regardless of negotiating a legacy protocol. Because of this, higher level components assume that only the main protocol name will respond. To not break this assumption, this PR alings litep2p shim layer with the libp2p behavior. Closes: #6581 --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Dmitry Markin <[email protected]> (cherry picked from commit 2a0b268)
Successfully created backport PR for |
Request responses are initialized with a main protocol name, and optional protocol names as a fallback. Running litep2p in kusama as a validator has surfaced a `debug_asserts` coming from the sync component: https://github.com/paritytech/polkadot-sdk/blob/3906c578c96d97a8a099a4bdac4685acbe375a7c/substrate/client/network/sync/src/strategy/chain_sync.rs#L640-L646 The issue is that we initiate a request-response over the main protocol name `/genesis/sync/2` but receive a response over the legacy procotol `ksm/sync/2`. This behavior is correct because litep2p propagates to the higher levels the protocol that responded. In contrast, libp2p provides the main protocol name regardless of negotiating a legacy protocol. Because of this, higher level components assume that only the main protocol name will respond. To not break this assumption, this PR alings litep2p shim layer with the libp2p behavior. Closes: #6581 --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Dmitry Markin <[email protected]> (cherry picked from commit 2a0b268)
Successfully created backport PR for |
Backport #6603 into `stable2409` from lexnv. See the [documentation](https://github.com/paritytech/polkadot-sdk/blob/master/docs/BACKPORT.md) on how to use this bot. <!-- # To be used by other automation, do not modify: original-pr-number: #${pull_number} --> Co-authored-by: Alexandru Vasile <[email protected]>
Backport #6603 into `stable2412` from lexnv. See the [documentation](https://github.com/paritytech/polkadot-sdk/blob/master/docs/BACKPORT.md) on how to use this bot. <!-- # To be used by other automation, do not modify: original-pr-number: #${pull_number} --> Co-authored-by: Alexandru Vasile <[email protected]> Co-authored-by: Egor_P <[email protected]>
Backport #6603 into `stable2407` from lexnv. See the [documentation](https://github.com/paritytech/polkadot-sdk/blob/master/docs/BACKPORT.md) on how to use this bot. <!-- # To be used by other automation, do not modify: original-pr-number: #${pull_number} --> Co-authored-by: Alexandru Vasile <[email protected]>
…itytech#6603) Request responses are initialized with a main protocol name, and optional protocol names as a fallback. Running litep2p in kusama as a validator has surfaced a `debug_asserts` coming from the sync component: https://github.com/paritytech/polkadot-sdk/blob/3906c578c96d97a8a099a4bdac4685acbe375a7c/substrate/client/network/sync/src/strategy/chain_sync.rs#L640-L646 The issue is that we initiate a request-response over the main protocol name `/genesis/sync/2` but receive a response over the legacy procotol `ksm/sync/2`. This behavior is correct because litep2p propagates to the higher levels the protocol that responded. In contrast, libp2p provides the main protocol name regardless of negotiating a legacy protocol. Because of this, higher level components assume that only the main protocol name will respond. To not break this assumption, this PR alings litep2p shim layer with the libp2p behavior. Closes: paritytech#6581 --------- Signed-off-by: Alexandru Vasile <[email protected]> Co-authored-by: Dmitry Markin <[email protected]>
Request responses are initialized with a main protocol name, and optional protocol names as a fallback.
Running litep2p in kusama as a validator has surfaced a
debug_asserts
coming from the sync component:polkadot-sdk/substrate/client/network/sync/src/strategy/chain_sync.rs
Lines 640 to 646 in 3906c57
The issue is that we initiate a request-response over the main protocol name
/genesis/sync/2
but receive a response over the legacy procotolksm/sync/2
. This behavior is correct because litep2p propagates to the higher levels the protocol that responded.In contrast, libp2p provides the main protocol name regardless of negotiating a legacy protocol.
Because of this, higher level components assume that only the main protocol name will respond.
To not break this assumption, this PR alings litep2p shim layer with the libp2p behavior.
Closes: #6581