Skip to content

Commit 8a9a84a

Browse files
pingesmacfarla
andauthored
Check for snap server (#6609)
* EthPeer add isServingSnap to be able to make sure that we have enough snap servers connected when we are snap syncing Signed-off-by: stefan.pingel@consensys.net <stefan.pingel@consensys.net> Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com> Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com>
1 parent 8d8dbf0 commit 8a9a84a

File tree

42 files changed

+942
-318
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+942
-318
lines changed

besu/src/main/java/org/hyperledger/besu/RunnerBuilder.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -688,13 +688,14 @@ public Runner build() {
688688
.map(nodePerms -> PeerPermissions.combine(nodePerms, defaultPeerPermissions))
689689
.orElse(defaultPeerPermissions);
690690

691+
final EthPeers ethPeers = besuController.getEthPeers();
692+
691693
LOG.info("Detecting NAT service.");
692694
final boolean fallbackEnabled = natMethod == NatMethod.AUTO || natMethodFallbackEnabled;
693695
final NatService natService = new NatService(buildNatManager(natMethod), fallbackEnabled);
694696
final NetworkBuilder inactiveNetwork = caps -> new NoopP2PNetwork();
695697
final NetworkBuilder activeNetwork =
696698
caps -> {
697-
final EthPeers ethPeers = besuController.getEthPeers();
698699
return DefaultP2PNetwork.builder()
699700
.vertx(vertx)
700701
.nodeKey(nodeKey)
@@ -709,8 +710,8 @@ public Runner build() {
709710
.blockchain(context.getBlockchain())
710711
.blockNumberForks(besuController.getGenesisConfigOptions().getForkBlockNumbers())
711712
.timestampForks(besuController.getGenesisConfigOptions().getForkBlockTimestamps())
712-
.allConnectionsSupplier(ethPeers::getAllConnections)
713-
.allActiveConnectionsSupplier(ethPeers::getAllActiveConnections)
713+
.allConnectionsSupplier(ethPeers::streamAllConnections)
714+
.allActiveConnectionsSupplier(ethPeers::streamAllActiveConnections)
714715
.maxPeers(ethPeers.getMaxPeers())
715716
.build();
716717
};
@@ -721,9 +722,10 @@ public Runner build() {
721722
.subProtocols(subProtocols)
722723
.network(p2pEnabled ? activeNetwork : inactiveNetwork)
723724
.metricsSystem(metricsSystem)
725+
.ethPeersShouldConnect(ethPeers::shouldTryToConnect)
724726
.build();
725727

726-
besuController.getEthPeers().setRlpxAgent(networkRunner.getRlpxAgent());
728+
ethPeers.setRlpxAgent(networkRunner.getRlpxAgent());
727729

728730
final P2PNetwork network = networkRunner.getNetwork();
729731
// ForkId in Ethereum Node Record needs updating when we transition to a new protocol spec

besu/src/main/java/org/hyperledger/besu/controller/BesuControllerBuilder.java

+28-8
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import org.hyperledger.besu.ethereum.core.Difficulty;
4747
import org.hyperledger.besu.ethereum.core.MiningParameters;
4848
import org.hyperledger.besu.ethereum.core.PrivacyParameters;
49-
import org.hyperledger.besu.ethereum.core.Synchronizer;
5049
import org.hyperledger.besu.ethereum.eth.EthProtocol;
5150
import org.hyperledger.besu.ethereum.eth.EthProtocolConfiguration;
5251
import org.hyperledger.besu.ethereum.eth.SnapProtocol;
@@ -77,6 +76,7 @@
7776
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
7877
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
7978
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolFactory;
79+
import org.hyperledger.besu.ethereum.forkid.ForkIdManager;
8080
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
8181
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpec;
8282
import org.hyperledger.besu.ethereum.p2p.config.NetworkingConfiguration;
@@ -604,6 +604,12 @@ public BesuController build() {
604604
final int maxMessageSize = ethereumWireProtocolConfiguration.getMaxMessageSize();
605605
final Supplier<ProtocolSpec> currentProtocolSpecSupplier =
606606
() -> protocolSchedule.getByBlockHeader(blockchain.getChainHeadHeader());
607+
final ForkIdManager forkIdManager =
608+
new ForkIdManager(
609+
blockchain,
610+
genesisConfigOptions.getForkBlockNumbers(),
611+
genesisConfigOptions.getForkBlockTimestamps(),
612+
ethereumWireProtocolConfiguration.isLegacyEth64ForkIdEnabled());
607613
final EthPeers ethPeers =
608614
new EthPeers(
609615
getSupportedProtocol(),
@@ -615,7 +621,9 @@ public BesuController build() {
615621
nodeKey.getPublicKey().getEncodedBytes(),
616622
maxPeers,
617623
maxRemotelyInitiatedPeers,
618-
randomPeerPriority);
624+
randomPeerPriority,
625+
syncConfig.getSyncMode(),
626+
forkIdManager);
619627

620628
final EthMessages ethMessages = new EthMessages();
621629
final EthMessages snapMessages = new EthMessages();
@@ -681,13 +689,14 @@ public BesuController build() {
681689
ethMessages,
682690
scheduler,
683691
peerValidators,
684-
Optional.empty());
692+
Optional.empty(),
693+
forkIdManager);
685694

686695
final PivotBlockSelector pivotBlockSelector =
687696
createPivotSelector(
688697
protocolSchedule, protocolContext, ethContext, syncState, metricsSystem, blockchain);
689698

690-
final Synchronizer synchronizer =
699+
final DefaultSynchronizer synchronizer =
691700
createSynchronizer(
692701
protocolSchedule,
693702
worldStateStorageCoordinator,
@@ -697,6 +706,16 @@ public BesuController build() {
697706
ethProtocolManager,
698707
pivotBlockSelector);
699708

709+
ethPeers.setTrailingPeerRequirementsSupplier(synchronizer::calculateTrailingPeerRequirements);
710+
711+
if (SyncMode.isSnapSync(syncConfig.getSyncMode())
712+
|| SyncMode.isCheckpointSync(syncConfig.getSyncMode())) {
713+
synchronizer.subscribeInSync((b) -> ethPeers.snapServerPeersNeeded(!b));
714+
ethPeers.snapServerPeersNeeded(true);
715+
} else {
716+
ethPeers.snapServerPeersNeeded(false);
717+
}
718+
700719
protocolContext.setSynchronizer(Optional.of(synchronizer));
701720

702721
final Optional<SnapProtocolManager> maybeSnapProtocolManager =
@@ -809,7 +828,7 @@ private TrieLogPruner createTrieLogPruner(
809828
* @param pivotBlockSelector the pivot block selector
810829
* @return the synchronizer
811830
*/
812-
protected Synchronizer createSynchronizer(
831+
protected DefaultSynchronizer createSynchronizer(
813832
final ProtocolSchedule protocolSchedule,
814833
final WorldStateStorageCoordinator worldStateStorageCoordinator,
815834
final ProtocolContext protocolContext,
@@ -1000,6 +1019,7 @@ protected String getSupportedProtocol() {
10001019
* @param scheduler the scheduler
10011020
* @param peerValidators the peer validators
10021021
* @param mergePeerFilter the merge peer filter
1022+
* @param forkIdManager the fork id manager
10031023
* @return the eth protocol manager
10041024
*/
10051025
protected EthProtocolManager createEthProtocolManager(
@@ -1012,7 +1032,8 @@ protected EthProtocolManager createEthProtocolManager(
10121032
final EthMessages ethMessages,
10131033
final EthScheduler scheduler,
10141034
final List<PeerValidator> peerValidators,
1015-
final Optional<MergePeerFilter> mergePeerFilter) {
1035+
final Optional<MergePeerFilter> mergePeerFilter,
1036+
final ForkIdManager forkIdManager) {
10161037
return new EthProtocolManager(
10171038
protocolContext.getBlockchain(),
10181039
networkId,
@@ -1026,8 +1047,7 @@ protected EthProtocolManager createEthProtocolManager(
10261047
mergePeerFilter,
10271048
synchronizerConfiguration,
10281049
scheduler,
1029-
genesisConfigOptions.getForkBlockNumbers(),
1030-
genesisConfigOptions.getForkBlockTimestamps());
1050+
forkIdManager);
10311051
}
10321052

10331053
/**

besu/src/main/java/org/hyperledger/besu/controller/ConsensusScheduleBesuControllerBuilder.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.hyperledger.besu.ethereum.eth.sync.state.SyncState;
5050
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
5151
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
52+
import org.hyperledger.besu.ethereum.forkid.ForkIdManager;
5253
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
5354
import org.hyperledger.besu.ethereum.p2p.config.SubProtocolConfiguration;
5455
import org.hyperledger.besu.ethereum.storage.StorageProvider;
@@ -242,7 +243,8 @@ protected EthProtocolManager createEthProtocolManager(
242243
final EthMessages ethMessages,
243244
final EthScheduler scheduler,
244245
final List<PeerValidator> peerValidators,
245-
final Optional<MergePeerFilter> mergePeerFilter) {
246+
final Optional<MergePeerFilter> mergePeerFilter,
247+
final ForkIdManager forkIdManager) {
246248
return besuControllerBuilderSchedule
247249
.get(0L)
248250
.createEthProtocolManager(
@@ -255,7 +257,8 @@ protected EthProtocolManager createEthProtocolManager(
255257
ethMessages,
256258
scheduler,
257259
peerValidators,
258-
mergePeerFilter);
260+
mergePeerFilter,
261+
forkIdManager);
259262
}
260263

261264
@Override

besu/src/main/java/org/hyperledger/besu/controller/MergeBesuControllerBuilder.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.hyperledger.besu.ethereum.eth.sync.backwardsync.BackwardSyncContext;
4242
import org.hyperledger.besu.ethereum.eth.sync.state.SyncState;
4343
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
44+
import org.hyperledger.besu.ethereum.forkid.ForkIdManager;
4445
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
4546
import org.hyperledger.besu.ethereum.mainnet.ScheduleBasedBlockHeaderFunctions;
4647
import org.hyperledger.besu.ethereum.worldstate.WorldStateArchive;
@@ -97,7 +98,8 @@ protected EthProtocolManager createEthProtocolManager(
9798
final EthMessages ethMessages,
9899
final EthScheduler scheduler,
99100
final List<PeerValidator> peerValidators,
100-
final Optional<MergePeerFilter> mergePeerFilter) {
101+
final Optional<MergePeerFilter> mergePeerFilter,
102+
final ForkIdManager forkIdManager) {
101103

102104
var mergeContext = protocolContext.getConsensusContext(MergeContext.class);
103105

@@ -126,7 +128,8 @@ protected EthProtocolManager createEthProtocolManager(
126128
ethMessages,
127129
scheduler,
128130
peerValidators,
129-
filterToUse);
131+
filterToUse,
132+
forkIdManager);
130133

131134
return ethProtocolManager;
132135
}

besu/src/main/java/org/hyperledger/besu/controller/TransitionBesuControllerBuilder.java

+14-13
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.hyperledger.besu.ethereum.chain.MutableBlockchain;
3434
import org.hyperledger.besu.ethereum.core.MiningParameters;
3535
import org.hyperledger.besu.ethereum.core.PrivacyParameters;
36-
import org.hyperledger.besu.ethereum.core.Synchronizer;
3736
import org.hyperledger.besu.ethereum.eth.EthProtocolConfiguration;
3837
import org.hyperledger.besu.ethereum.eth.manager.EthContext;
3938
import org.hyperledger.besu.ethereum.eth.manager.EthMessages;
@@ -49,6 +48,7 @@
4948
import org.hyperledger.besu.ethereum.eth.sync.state.SyncState;
5049
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPool;
5150
import org.hyperledger.besu.ethereum.eth.transactions.TransactionPoolConfiguration;
51+
import org.hyperledger.besu.ethereum.forkid.ForkIdManager;
5252
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
5353
import org.hyperledger.besu.ethereum.storage.StorageProvider;
5454
import org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration;
@@ -156,7 +156,8 @@ protected EthProtocolManager createEthProtocolManager(
156156
final EthMessages ethMessages,
157157
final EthScheduler scheduler,
158158
final List<PeerValidator> peerValidators,
159-
final Optional<MergePeerFilter> mergePeerFilter) {
159+
final Optional<MergePeerFilter> mergePeerFilter,
160+
final ForkIdManager forkIdManager) {
160161
return mergeBesuControllerBuilder.createEthProtocolManager(
161162
protocolContext,
162163
synchronizerConfiguration,
@@ -167,7 +168,8 @@ protected EthProtocolManager createEthProtocolManager(
167168
ethMessages,
168169
scheduler,
169170
peerValidators,
170-
mergePeerFilter);
171+
mergePeerFilter,
172+
forkIdManager);
171173
}
172174

173175
@Override
@@ -212,7 +214,7 @@ protected PluginServiceFactory createAdditionalPluginServices(
212214
}
213215

214216
@Override
215-
protected Synchronizer createSynchronizer(
217+
protected DefaultSynchronizer createSynchronizer(
216218
final ProtocolSchedule protocolSchedule,
217219
final WorldStateStorageCoordinator worldStateStorageCoordinator,
218220
final ProtocolContext protocolContext,
@@ -222,15 +224,14 @@ protected Synchronizer createSynchronizer(
222224
final PivotBlockSelector pivotBlockSelector) {
223225

224226
DefaultSynchronizer sync =
225-
(DefaultSynchronizer)
226-
super.createSynchronizer(
227-
protocolSchedule,
228-
worldStateStorageCoordinator,
229-
protocolContext,
230-
ethContext,
231-
syncState,
232-
ethProtocolManager,
233-
pivotBlockSelector);
227+
super.createSynchronizer(
228+
protocolSchedule,
229+
worldStateStorageCoordinator,
230+
protocolContext,
231+
ethContext,
232+
syncState,
233+
ethProtocolManager,
234+
pivotBlockSelector);
234235

235236
if (genesisConfigOptions.getTerminalTotalDifficulty().isPresent()) {
236237
LOG.info(

consensus/common/src/main/java/org/hyperledger/besu/consensus/common/bft/protocol/BftProtocolManager.java

-6
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.hyperledger.besu.consensus.common.bft.network.PeerConnectionTracker;
2121
import org.hyperledger.besu.datatypes.Address;
2222
import org.hyperledger.besu.ethereum.p2p.network.ProtocolManager;
23-
import org.hyperledger.besu.ethereum.p2p.peers.Peer;
2423
import org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection;
2524
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Capability;
2625
import org.hyperledger.besu.ethereum.p2p.rlpx.wire.Message;
@@ -108,11 +107,6 @@ public void handleNewConnection(final PeerConnection peerConnection) {
108107
peers.add(peerConnection);
109108
}
110109

111-
@Override
112-
public boolean shouldConnect(final Peer peer, final boolean incoming) {
113-
return false; // for now the EthProtocolManager takes care of this
114-
}
115-
116110
@Override
117111
public void handleDisconnect(
118112
final PeerConnection peerConnection,

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/forkid/ForkIdManager.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ public ForkIdManager(
5858
checkNotNull(blockchain);
5959
checkNotNull(blockNumberForks);
6060
this.chainHeadSupplier = blockchain::getChainHeadHeader;
61-
this.genesisHash = blockchain.getGenesisBlock().getHash();
61+
try {
62+
this.genesisHash = blockchain.getGenesisBlock().getHash();
63+
} catch (Exception e) {
64+
throw new RuntimeException(e);
65+
}
6266
this.blockNumbersForkIds = new ArrayList<>();
6367
this.timestampsForkIds = new ArrayList<>();
6468
this.legacyEth64 = legacyEth64;

ethereum/eth/src/main/java/org/hyperledger/besu/ethereum/eth/manager/EthPeer.java

+16-4
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ protected boolean removeEldestEntry(final Map.Entry<Hash, Boolean> eldest) {
103103
private final PeerReputation reputation = new PeerReputation();
104104
private final Map<PeerValidator, Boolean> validationStatus = new ConcurrentHashMap<>();
105105
private final Bytes id;
106+
private boolean isServingSnap = false;
106107

107108
private static final Map<Integer, Integer> roundMessages;
108109

@@ -393,6 +394,14 @@ public RequestManager.ResponseStream getSnapTrieNode(
393394
requestManagers.get(SnapProtocol.NAME).get(SnapV1.GET_TRIE_NODES), getTrieNodes);
394395
}
395396

397+
public void setIsServingSnap(final boolean isServingSnap) {
398+
this.isServingSnap = isServingSnap;
399+
}
400+
401+
public boolean isServingSnap() {
402+
return isServingSnap;
403+
}
404+
396405
private RequestManager.ResponseStream sendRequest(
397406
final RequestManager requestManager, final MessageData messageData) throws PeerNotConnected {
398407
lastRequestTimestamp = clock.millis();
@@ -582,9 +591,9 @@ public String getProtocolName() {
582591
}
583592

584593
/**
585-
* Return A read-only snapshot of this peer's current {@code chainState} }
594+
* Return A read-only snapshot of this peer's current {@code chainState}
586595
*
587-
* @return A read-only snapshot of this peer's current {@code chainState} }
596+
* @return A read-only snapshot of this peer's current {@code chainState}
588597
*/
589598
public ChainHeadEstimate chainStateSnapshot() {
590599
return chainHeadState.getSnapshot();
@@ -629,14 +638,17 @@ public boolean hasSupportForMessage(final int messageCode) {
629638
@Override
630639
public String toString() {
631640
return String.format(
632-
"PeerId: %s %s, validated? %s, disconnected? %s, client: %s, %s, %s",
641+
"PeerId: %s %s, validated? %s, disconnected? %s, client: %s, %s, %s, isServingSnap %s, has height %s, connected for %s ms",
633642
getLoggableId(),
634643
reputation,
635644
isFullyValidated(),
636645
isDisconnected(),
637646
connection.getPeerInfo().getClientId(),
638647
connection,
639-
connection.getPeer().getEnodeURLString());
648+
connection.getPeer().getEnodeURLString(),
649+
isServingSnap,
650+
chainHeadState.getEstimatedHeight(),
651+
System.currentTimeMillis() - connection.getInitiatedAt());
640652
}
641653

642654
@Nonnull

0 commit comments

Comments
 (0)