Use chunks for GetBlocksAcceptanceData calls in order to avoid blocking consensus for too long (#2075)

This commit is contained in:
Michael Sutton 2022-06-03 18:25:02 +03:00 committed by GitHub
parent d50ad0667c
commit b200b77541
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -40,26 +40,39 @@ func (ctx *Context) getAndConvertAcceptedTransactionIDs(selectedParentChainChang
acceptedTransactionIDs := make([]*appmessage.AcceptedTransactionIDs, len(selectedParentChainChanges.Added)) acceptedTransactionIDs := make([]*appmessage.AcceptedTransactionIDs, len(selectedParentChainChanges.Added))
chainBlocksAcceptanceData, err := ctx.Domain.Consensus().GetBlocksAcceptanceData(selectedParentChainChanges.Added) const chunk = 1000
if err != nil { position := 0
return nil, err
}
for i, addedChainBlock := range selectedParentChainChanges.Added { for position < len(selectedParentChainChanges.Added) {
chainBlockAcceptanceData := chainBlocksAcceptanceData[i] var chainBlocksChunk []*externalapi.DomainHash
acceptedTransactionIDs[i] = &appmessage.AcceptedTransactionIDs{ if position+chunk > len(selectedParentChainChanges.Added) {
AcceptingBlockHash: addedChainBlock.String(), chainBlocksChunk = selectedParentChainChanges.Added[position:]
AcceptedTransactionIDs: nil, } else {
chainBlocksChunk = selectedParentChainChanges.Added[position : position+chunk]
} }
for _, blockAcceptanceData := range chainBlockAcceptanceData { // We use chunks in order to avoid blocking consensus for too long
for _, transactionAcceptanceData := range blockAcceptanceData.TransactionAcceptanceData { chainBlocksAcceptanceData, err := ctx.Domain.Consensus().GetBlocksAcceptanceData(chainBlocksChunk)
if transactionAcceptanceData.IsAccepted { if err != nil {
acceptedTransactionIDs[i].AcceptedTransactionIDs = return nil, err
append(acceptedTransactionIDs[i].AcceptedTransactionIDs, }
consensushashing.TransactionID(transactionAcceptanceData.Transaction).String())
for i, addedChainBlock := range chainBlocksChunk {
chainBlockAcceptanceData := chainBlocksAcceptanceData[i]
acceptedTransactionIDs[position+i] = &appmessage.AcceptedTransactionIDs{
AcceptingBlockHash: addedChainBlock.String(),
AcceptedTransactionIDs: nil,
}
for _, blockAcceptanceData := range chainBlockAcceptanceData {
for _, transactionAcceptanceData := range blockAcceptanceData.TransactionAcceptanceData {
if transactionAcceptanceData.IsAccepted {
acceptedTransactionIDs[position+i].AcceptedTransactionIDs =
append(acceptedTransactionIDs[position+i].AcceptedTransactionIDs,
consensushashing.TransactionID(transactionAcceptanceData.Transaction).String())
}
} }
} }
} }
position += chunk
} }
return acceptedTransactionIDs, nil return acceptedTransactionIDs, nil