Skip to content

Commit

Permalink
Fluffy State Bridge: Support skipping gossip when content is found in…
Browse files Browse the repository at this point in the history
… the network (#2867)
  • Loading branch information
bhartnett authored Nov 25, 2024
1 parent e64e5c7 commit 78c5770
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 11 deletions.
7 changes: 7 additions & 0 deletions fluffy/tools/portal_bridge/portal_bridge_conf.nim
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,13 @@ type
name: "verify-gossip"
.}: bool

skipGossipForExisting* {.
desc:
"Enable skipping gossip of each content value which is successfully fetched from the network",
defaultValue: true,
name: "skip-gossip-for-existing"
.}: bool

gossipWorkersCount* {.
desc:
"The number of workers to use for gossiping the state into the portal network",
Expand Down
35 changes: 24 additions & 11 deletions fluffy/tools/portal_bridge/portal_bridge_state.nim
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ proc runBackfillGossipBlockOffersLoop(
portalRpcUrl: JsonRpcUrl,
portalNodeId: NodeId,
verifyGossip: bool,
skipGossipForExisting: bool,
workerId: int,
) {.async: (raises: [CancelledError]).} =
info "Starting state backfill gossip block offers loop", workerId
Expand Down Expand Up @@ -304,18 +305,29 @@ proc runBackfillGossipBlockOffersLoop(

var retryGossip = false
for k, v in offersMap:
try:
let numPeers = await portalClient.portal_stateGossip(k.to0xHex(), v.to0xHex())
if numPeers > 0:
debug "Offer successfully gossipped to peers: ", numPeers, workerId
elif numPeers == 0:
warn "Offer gossipped to no peers", workerId
var gossipContent = true
if skipGossipForExisting:
try:
let contentInfo = await portalClient.portal_stateGetContent(k.to0xHex())
if contentInfo.content.len() > 0:
gossipContent = false
except CatchableError as e:
warn "Failed to find content with key: ",
contentKey = k.to0xHex(), error = e.msg, workerId

if gossipContent:
try:
let numPeers = await portalClient.portal_stateGossip(k.to0xHex(), v.to0xHex())
if numPeers > 0:
debug "Offer successfully gossipped to peers: ", numPeers, workerId
elif numPeers == 0:
warn "Offer gossipped to no peers", workerId
retryGossip = true
break
except CatchableError as e:
error "Failed to gossip offer to peers", error = e.msg, workerId
retryGossip = true
break
except CatchableError as e:
error "Failed to gossip offer to peers", error = e.msg, workerId
retryGossip = true
break

if retryGossip:
await sleepAsync(3.seconds)
Expand Down Expand Up @@ -425,7 +437,8 @@ proc runState*(config: PortalBridgeConf) =

for workerId in 1 .. config.gossipWorkersCount.int:
asyncSpawn runBackfillGossipBlockOffersLoop(
blockOffersQueue, config.portalRpcUrl, portalNodeId, config.verifyGossip, workerId
blockOffersQueue, config.portalRpcUrl, portalNodeId, config.verifyGossip,
config.skipGossipForExisting, workerId,
)

asyncSpawn runBackfillMetricsLoop(blockDataQueue, blockOffersQueue)
Expand Down

0 comments on commit 78c5770

Please sign in to comment.