Fix case where syncCompactFilters is called but filters but no sync peer is set (#4965)

This commit is contained in:
Chris Stewart 2023-01-31 06:42:55 -06:00 committed by GitHub
parent 7043c95800
commit 3bc89c680f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -183,15 +183,21 @@ case class NeutrinoNode(
bestFilterHeader: CompactFilterHeaderDb, bestFilterHeader: CompactFilterHeaderDb,
chainApi: ChainApi, chainApi: ChainApi,
bestFilterOpt: Option[CompactFilterDb]): Future[Unit] = { bestFilterOpt: Option[CompactFilterDb]): Future[Unit] = {
val syncPeer = dataMessageHandler.syncPeer.getOrElse( val syncPeerMsgSenderOptF = {
throw new RuntimeException("Sync peer not set")) dataMessageHandler.syncPeer.map { peer =>
val syncPeerMsgSenderF = peerManager.peerData(syncPeer).peerMessageSender peerManager.peerData(peer).peerMessageSender
val sendCompactFilterHeaderMsgF = syncPeerMsgSenderF.flatMap( }
_.sendNextGetCompactFilterHeadersCommand( }
chainApi = chainApi, val sendCompactFilterHeaderMsgF = syncPeerMsgSenderOptF match {
filterHeaderBatchSize = chainConfig.filterHeaderBatchSize, case Some(syncPeerMsgSenderF) =>
prevStopHash = bestFilterHeader.blockHashBE) syncPeerMsgSenderF.flatMap(
) _.sendNextGetCompactFilterHeadersCommand(
chainApi = chainApi,
filterHeaderBatchSize = chainConfig.filterHeaderBatchSize,
prevStopHash = bestFilterHeader.blockHashBE)
)
case None => Future.successful(false)
}
sendCompactFilterHeaderMsgF.flatMap { isSyncFilterHeaders => sendCompactFilterHeaderMsgF.flatMap { isSyncFilterHeaders =>
// If we have started syncing filters // If we have started syncing filters
if ( if (
@ -199,16 +205,23 @@ case class NeutrinoNode(
bestFilterOpt.isDefined && bestFilterOpt.isDefined &&
bestFilterOpt.get.hashBE != bestFilterHeader.filterHashBE bestFilterOpt.get.hashBE != bestFilterHeader.filterHashBE
) { ) {
//means we are not syncing filter headers, and our filters are NOT syncPeerMsgSenderOptF match {
//in sync with our compact filter headers case Some(syncPeerMsgSenderF) =>
syncPeerMsgSenderF.flatMap { sender => //means we are not syncing filter headers, and our filters are NOT
sender //in sync with our compact filter headers
.sendNextGetCompactFilterCommand(chainApi = chainApi, syncPeerMsgSenderF.flatMap { sender =>
filterBatchSize = sender
chainConfig.filterBatchSize, .sendNextGetCompactFilterCommand(chainApi = chainApi,
startHeight = filterBatchSize =
bestFilterOpt.get.height) chainConfig.filterBatchSize,
.map(_ => ()) startHeight =
bestFilterOpt.get.height)
.map(_ => ())
}
case None =>
logger.warn(
s"Not syncing compact filters since we do not have a syncPeer set, bestFilterOpt=$bestFilterOpt")
Future.unit
} }
} else { } else {
Future.unit Future.unit