We're running a 4-node QBFT chain at version v24.9.1 which has been mining blocks successfully.
Randomly the QBFT importBlockToChain(...) path hit the following exception:
2024-11-25 01:14:51.009+00:00 | BftProcessorExecutor-QBFT-0 | INFO | QbftBesuControllerBuilder | Imported #4,409,754 / 0 tx / 0 pending / 0 (0.0%) gas / (0xa441dc13de7058d008db01fa8cc809fe4bd9d90940628dda9c681a3450948cf0)
2024-11-25 01:14:56.020+00:00 | BftProcessorExecutor-QBFT-0 | ERROR | EventMultiplexer | State machine threw exception while processing event \{org.hyperledger.besu.consensus.common.bft.events.BftReceivedMessageEvent@ccf16401\}
java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1687)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:540)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:526)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:512)
at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:239)
at java.base/java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:632)
at org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController.isPermitted(NodeLocalConfigPermissioningController.java:243)
at org.hyperledger.besu.ethereum.permissioning.NodeLocalConfigPermissioningController.isConnectionPermitted(NodeLocalConfigPermissioningController.java:334)
at org.hyperledger.besu.ethereum.permissioning.node.NodePermissioningController.isPermitted(NodePermissioningController.java:87)
at org.hyperledger.besu.ethereum.permissioning.node.PeerPermissionsAdapter.inboundIsPermitted(PeerPermissionsAdapter.java:122)
at org.hyperledger.besu.ethereum.permissioning.node.PeerPermissionsAdapter.isPermitted(PeerPermissionsAdapter.java:78)
at org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions$CombinedPeerPermissions.isPermitted(PeerPermissions.java:129)
at org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerRlpxPermissions.allowOngoingConnection(PeerRlpxPermissions.java:61)
at org.hyperledger.besu.ethereum.p2p.rlpx.RlpxAgent.lambda$handlePermissionsUpdate$10(RlpxAgent.java:280)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
at java.base/java.util.stream.DistinctOps$1$2.accept(DistinctOps.java:174)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.concurrent.ConcurrentHashMap$ValueSpliterator.forEachRemaining(ConcurrentHashMap.java:3620)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:522)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:512)
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:739)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:522)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:512)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:239)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
at org.hyperledger.besu.ethereum.p2p.rlpx.RlpxAgent.handlePermissionsUpdate(RlpxAgent.java:278)
at org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions.lambda$dispatchUpdate$0(PeerPermissions.java:79)
at org.hyperledger.besu.util.Subscribers.lambda$forEach$0(Subscribers.java:131)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.hyperledger.besu.util.Subscribers.forEach(Subscribers.java:128)
at org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions.dispatchUpdate(PeerPermissions.java:79)
at org.hyperledger.besu.ethereum.permissioning.node.PeerPermissionsAdapter.lambda$new$0(PeerPermissionsAdapter.java:54)
at org.hyperledger.besu.ethereum.chain.DefaultBlockchain.lambda$appendBlockHelper$30(DefaultBlockchain.java:473)
at org.hyperledger.besu.util.Subscribers.lambda$forEach$0(Subscribers.java:131)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.hyperledger.besu.util.Subscribers.forEach(Subscribers.java:128)
at org.hyperledger.besu.ethereum.chain.DefaultBlockchain.appendBlockHelper(DefaultBlockchain.java:473)
at org.hyperledger.besu.ethereum.chain.DefaultBlockchain.appendBlock(DefaultBlockchain.java:414)
at org.hyperledger.besu.ethereum.mainnet.MainnetBlockImporter.lambda$importBlock$0(MainnetBlockImporter.java:53)
at java.base/java.util.Optional.ifPresent(Optional.java:178)
at org.hyperledger.besu.ethereum.mainnet.MainnetBlockImporter.importBlock(MainnetBlockImporter.java:51)
at org.hyperledger.besu.ethereum.core.BlockImporter.importBlock(BlockImporter.java:45)
at org.hyperledger.besu.consensus.qbft.statemachine.QbftRound.importBlockToChain(QbftRound.java:361)
at org.hyperledger.besu.consensus.qbft.statemachine.QbftRound.peerIsCommitted(QbftRound.java:330)
at org.hyperledger.besu.consensus.qbft.statemachine.QbftRound.handleCommitMessage(QbftRound.java:255)
at org.hyperledger.besu.consensus.qbft.statemachine.QbftBlockHeightManager.actionOrBufferMessage(QbftBlockHeightManager.java:264)
at org.hyperledger.besu.consensus.qbft.statemachine.QbftBlockHeightManager.handleCommitPayload(QbftBlockHeightManager.java:251)
at org.hyperledger.besu.consensus.common.bft.statemachine.BaseBftController.consumeMessage(BaseBftController.java:126)
at org.hyperledger.besu.consensus.qbft.statemachine.QbftController.handleMessage(QbftController.java:95)
at org.hyperledger.besu.consensus.common.bft.statemachine.BaseBftController.handleMessageEvent(BaseBftController.java:88)
at org.hyperledger.besu.consensus.common.bft.EventMultiplexer.handleBftEvent(EventMultiplexer.java:53)
at java.base/java.util.Optional.ifPresent(Optional.java:178)
at org.hyperledger.besu.consensus.common.bft.BftProcessor.run(BftProcessor.java:68)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1595)
Steps to Reproduce
We're running a 4-node QBFT chain at version
v24.9.1
which has been mining blocks successfully.Randomly the QBFT
importBlockToChain(...)
path hit the following exception:Versions (Add all that apply)
v24.9.1