diff --git a/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/ActiveEth2P2PNetwork.java b/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/ActiveEth2P2PNetwork.java index 4851bf01133..6dd13b98f27 100644 --- a/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/ActiveEth2P2PNetwork.java +++ b/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/ActiveEth2P2PNetwork.java @@ -168,6 +168,8 @@ private synchronized void stopGossip() { @Override public void onSyncStateChanged(final boolean isInSync, final boolean isOptimistic) { + gossipForkManager.onOptimisticHeadChanged(isOptimistic); + if (state.get() != State.RUNNING) { return; } @@ -176,7 +178,6 @@ public void onSyncStateChanged(final boolean isInSync, final boolean isOptimisti } else { stopGossip(); } - gossipForkManager.onOptimisticHeadChanged(isOptimistic); } @VisibleForTesting diff --git a/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManager.java b/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManager.java index 52462fa0390..3220469395c 100644 --- a/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManager.java +++ b/networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManager.java @@ -63,6 +63,7 @@ public class GossipForkManager { private final IntSet currentSyncCommitteeSubnets = new IntOpenHashSet(); private Optional currentEpoch = Optional.empty(); + private boolean isHeadOptimistic; private GossipForkManager( final Spec spec, @@ -71,6 +72,7 @@ private GossipForkManager( this.spec = spec; this.recentChainData = recentChainData; this.forksByActivationEpoch = forksByActivationEpoch; + this.isHeadOptimistic = recentChainData.isChainHeadOptimistic(); } public static GossipForkManager.Builder builder() { @@ -141,6 +143,7 @@ public synchronized void stopGossip() { } public synchronized void onOptimisticHeadChanged(final boolean isHeadOptimistic) { + this.isHeadOptimistic = isHeadOptimistic; if (isHeadOptimistic) { activeSubscriptions.forEach(GossipForkSubscriptions::stopGossipForOptimisticSync); } else { @@ -279,7 +282,7 @@ private void startSubscriptions(final GossipForkSubscriptions subscription) { if (activeSubscriptions.add(subscription)) { subscription.startGossip( recentChainData.getGenesisData().orElseThrow().getGenesisValidatorsRoot(), - recentChainData.isChainHeadOptimistic()); + isHeadOptimistic); currentAttestationSubnets.forEach(subscription::subscribeToAttestationSubnetId); currentSyncCommitteeSubnets.forEach(subscription::subscribeToSyncCommitteeSubnet); } diff --git a/networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManagerTest.java b/networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManagerTest.java index f4460d3fe01..06a7cd3c39b 100644 --- a/networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManagerTest.java +++ b/networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/gossip/forks/GossipForkManagerTest.java @@ -568,6 +568,19 @@ void shouldStartSubscriptionsInOptimisticSyncMode() { verify(subscriptions).startGossip(GENESIS_VALIDATORS_ROOT, true); } + @Test + void shouldStartSubscriptionsInNonOptimisticSyncModeWhenSyncStateChangedBeforeStart() { + when(recentChainData.isChainHeadOptimistic()).thenReturn(true); + + final GossipForkSubscriptions subscriptions = forkAtEpoch(0); + final GossipForkManager manager = managerForForks(subscriptions); + + manager.onOptimisticHeadChanged(false); + manager.configureGossipForEpoch(UInt64.ZERO); + + verify(subscriptions).startGossip(GENESIS_VALIDATORS_ROOT, false); + } + private GossipForkSubscriptions forkAtEpoch(final long epoch) { final GossipForkSubscriptions subscriptions = mock(GossipForkSubscriptions.class, "subscriptionsForEpoch" + epoch);