Skip to content

Commit b78468c

Browse files
committed
added params for peer exchange and back off
1 parent c486188 commit b78468c

File tree

3 files changed

+92
-34
lines changed

3 files changed

+92
-34
lines changed

libp2p/pubsub/gossipsub.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,10 @@ class GossipSub(IPubsubRouter, Service):
9292
direct_connect_initial_delay: float
9393
direct_connect_interval: int
9494

95+
do_px: bool
96+
back_off: int
97+
unsubscribe_back_off: int
98+
9599
def __init__(
96100
self,
97101
protocols: Sequence[TProtocol],
@@ -106,6 +110,9 @@ def __init__(
106110
heartbeat_interval: int = 120,
107111
direct_connect_initial_delay: float = 0.1,
108112
direct_connect_interval: int = 300,
113+
do_px: bool = False,
114+
back_off: int = 60,
115+
unsubscribe_back_off: int = 10,
109116
) -> None:
110117
self.protocols = list(protocols)
111118
self.pubsub = None
@@ -140,6 +147,10 @@ def __init__(
140147
self.direct_connect_initial_delay = direct_connect_initial_delay
141148
self.time_since_last_publish = {}
142149

150+
self.do_px = do_px
151+
self.back_off = back_off
152+
self.unsubscribe_back_off = unsubscribe_back_off
153+
143154
async def run(self) -> None:
144155
self.manager.run_daemon_task(self.heartbeat)
145156
if len(self.direct_peers) > 0:
@@ -369,7 +380,7 @@ async def leave(self, topic: str) -> None:
369380
return
370381
# Notify the peers in mesh[topic] with a PRUNE(topic) message
371382
for peer in self.mesh[topic]:
372-
await self.emit_prune(topic, peer)
383+
await self.emit_prune(topic, peer, do_px=self.do_px, is_unsubscribe=True)
373384

374385
# Forget mesh[topic]
375386
self.mesh.pop(topic, None)
@@ -751,21 +762,28 @@ async def handle_graft(
751762
) -> None:
752763
topic: str = graft_msg.topicID
753764

765+
# TODO: complete the remaining logic
766+
self.do_px
767+
754768
# Add peer to mesh for topic
755769
if topic in self.mesh:
756770
for direct_peer in self.direct_peers:
757771
if direct_peer == sender_peer_id:
758772
logger.warning(
759773
"GRAFT: ignoring request from direct peer %s", sender_peer_id
760774
)
761-
await self.emit_prune(topic, sender_peer_id)
775+
await self.emit_prune(
776+
topic, sender_peer_id, do_px=self.do_px, is_unsubscribe=False
777+
)
762778
return
763779

764780
if sender_peer_id not in self.mesh[topic]:
765781
self.mesh[topic].add(sender_peer_id)
766782
else:
767783
# Respond with PRUNE if not subscribed to the topic
768-
await self.emit_prune(topic, sender_peer_id)
784+
await self.emit_prune(
785+
topic, sender_peer_id, do_px=self.do_px, is_unsubscribe=False
786+
)
769787

770788
async def handle_prune(
771789
self, prune_msg: rpc_pb2.ControlPrune, sender_peer_id: ID
@@ -824,11 +842,23 @@ async def emit_graft(self, topic: str, id: ID) -> None:
824842

825843
await self.emit_control_message(control_msg, id)
826844

845+
async def emit_prune(
846+
self, topic: str, to_peer: ID, do_px: bool, is_unsubscribe: bool
847+
) -> None:
827848
async def emit_prune(self, topic: str, id: ID) -> None:
828849
"""Emit graft message, sent to to_peer, for topic."""
829850
prune_msg: rpc_pb2.ControlPrune = rpc_pb2.ControlPrune()
830851
prune_msg.topicID = topic
831852

853+
back_off_duration = self.back_off
854+
if is_unsubscribe:
855+
back_off_duration = self.unsubscribe_back_off
856+
857+
prune_msg.backoff = back_off_duration
858+
859+
# TODO: add peers once peerstore changes are complete
860+
# prune_msg.peers =
861+
832862
control_msg: rpc_pb2.ControlMessage = rpc_pb2.ControlMessage()
833863
control_msg.prune.extend([prune_msg])
834864

libp2p/pubsub/pb/rpc_pb2.py

Lines changed: 31 additions & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

libp2p/pubsub/pb/rpc_pb2.pyi

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,17 +179,43 @@ class ControlPrune(google.protobuf.message.Message):
179179
DESCRIPTOR: google.protobuf.descriptor.Descriptor
180180

181181
TOPICID_FIELD_NUMBER: builtins.int
182+
PEERS_FIELD_NUMBER: builtins.int
183+
BACKOFF_FIELD_NUMBER: builtins.int
182184
topicID: builtins.str
185+
backoff: builtins.int
186+
@property
187+
def peers(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___PeerInfo]: ...
183188
def __init__(
184189
self,
185190
*,
186191
topicID: builtins.str | None = ...,
192+
peers: collections.abc.Iterable[global___PeerInfo] | None = ...,
193+
backoff: builtins.int | None = ...,
187194
) -> None: ...
188-
def HasField(self, field_name: typing.Literal["topicID", b"topicID"]) -> builtins.bool: ...
189-
def ClearField(self, field_name: typing.Literal["topicID", b"topicID"]) -> None: ...
195+
def HasField(self, field_name: typing.Literal["backoff", b"backoff", "topicID", b"topicID"]) -> builtins.bool: ...
196+
def ClearField(self, field_name: typing.Literal["backoff", b"backoff", "peers", b"peers", "topicID", b"topicID"]) -> None: ...
190197

191198
global___ControlPrune = ControlPrune
192199

200+
@typing.final
201+
class PeerInfo(google.protobuf.message.Message):
202+
DESCRIPTOR: google.protobuf.descriptor.Descriptor
203+
204+
PEERID_FIELD_NUMBER: builtins.int
205+
SIGNEDPEERRECORD_FIELD_NUMBER: builtins.int
206+
peerID: builtins.bytes
207+
signedPeerRecord: builtins.bytes
208+
def __init__(
209+
self,
210+
*,
211+
peerID: builtins.bytes | None = ...,
212+
signedPeerRecord: builtins.bytes | None = ...,
213+
) -> None: ...
214+
def HasField(self, field_name: typing.Literal["peerID", b"peerID", "signedPeerRecord", b"signedPeerRecord"]) -> builtins.bool: ...
215+
def ClearField(self, field_name: typing.Literal["peerID", b"peerID", "signedPeerRecord", b"signedPeerRecord"]) -> None: ...
216+
217+
global___PeerInfo = PeerInfo
218+
193219
@typing.final
194220
class TopicDescriptor(google.protobuf.message.Message):
195221
DESCRIPTOR: google.protobuf.descriptor.Descriptor

0 commit comments

Comments
 (0)