hyperledger / besu

An enterprise-grade Java-based, Apache 2.0 licensed Ethereum client https://wiki.hyperledger.org/display/besu
https://www.hyperledger.org/projects/besu
Apache License 2.0
1.52k stars 846 forks source link

Seeing `ConcurrentModificationException` in `NodeLocalConfigPermissioningController.isPermitted(...)` #7916

Open matthew1001 opened 4 days ago

matthew1001 commented 4 days ago

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:

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)

Versions (Add all that apply)

pullurib commented 3 days ago

I can look into it, please assign it to me