diff --git a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustody.java b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustody.java index 563d2fa903e..b28d05b4b0b 100644 --- a/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustody.java +++ b/ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustody.java @@ -34,19 +34,26 @@ public class DasLongPollCustody implements UpdatableDataColumnSidecarCustody, SlotEventsChannel { + public interface GossipWaitTimeoutCalculator { + /** + * Returns the duration to wait for a column to be gossiped + */ + Duration getGossipWaitTimeout(UInt64 slot); + } + private final UpdatableDataColumnSidecarCustody delegate; private final AsyncRunner asyncRunner; - private final Duration waitPeriodForCurrentSlot; + private final GossipWaitTimeoutCalculator gossipWaitTimeoutCalculator; @VisibleForTesting final PendingRequests pendingRequests = new PendingRequests(); public DasLongPollCustody( final UpdatableDataColumnSidecarCustody delegate, final AsyncRunner asyncRunner, - final Duration waitPeriodForCurrentSlot) { + GossipWaitTimeoutCalculator gossipWaitTimeoutCalculator) { this.delegate = delegate; this.asyncRunner = asyncRunner; - this.waitPeriodForCurrentSlot = waitPeriodForCurrentSlot; + this.gossipWaitTimeoutCalculator = gossipWaitTimeoutCalculator; } @Override @@ -101,6 +108,7 @@ private SafeFuture> addPendingRequest( @Override public void onSlot(final UInt64 slot) { + Duration waitPeriodForCurrentSlot = gossipWaitTimeoutCalculator.getGossipWaitTimeout(slot); asyncRunner .runAfterDelay( () -> pendingRequests.setNoWaitSlot(slot.increment()), waitPeriodForCurrentSlot) diff --git a/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustodyTest.java b/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustodyTest.java index 3de998426aa..b282cfee487 100644 --- a/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustodyTest.java +++ b/ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/datacolumns/DasLongPollCustodyTest.java @@ -68,7 +68,7 @@ public class DasLongPollCustodyTest { private final DataStructureUtil dataStructureUtil = new DataStructureUtil(0, spec); private final Duration currentSlotTimeout = ofSeconds(3); private final DasLongPollCustody custody = - new DasLongPollCustody(custodyImpl, stubAsyncRunner, currentSlotTimeout); + new DasLongPollCustody(custodyImpl, stubAsyncRunner, __ -> currentSlotTimeout); private final BeaconBlock block10 = blockResolver.addBlock(10, true); private final DataColumnSidecar sidecar10_0 = createSidecar(block10, 0); diff --git a/services/beaconchain/src/main/java/tech/pegasys/teku/services/beaconchain/BeaconChainController.java b/services/beaconchain/src/main/java/tech/pegasys/teku/services/beaconchain/BeaconChainController.java index e0daf26580a..81d065b4986 100644 --- a/services/beaconchain/src/main/java/tech/pegasys/teku/services/beaconchain/BeaconChainController.java +++ b/services/beaconchain/src/main/java/tech/pegasys/teku/services/beaconchain/BeaconChainController.java @@ -745,9 +745,16 @@ protected void initDasCustody() { eventChannels.subscribe(SlotEventsChannel.class, dataColumnSidecarCustodyImpl); eventChannels.subscribe(FinalizedCheckpointChannel.class, dataColumnSidecarCustodyImpl); + DasLongPollCustody.GossipWaitTimeoutCalculator gossipWaitTimeoutCalculator = + slot -> { + Duration slotDuration = + Duration.ofSeconds(spec.atSlot(slot).getConfig().getSecondsPerSlot()); + return slotDuration.dividedBy(3); + }; + DasLongPollCustody dasLongPollCustody = new DasLongPollCustody( - dataColumnSidecarCustodyImpl, operationPoolAsyncRunner, Duration.ofSeconds(5)); + dataColumnSidecarCustodyImpl, operationPoolAsyncRunner, gossipWaitTimeoutCalculator); eventChannels.subscribe(SlotEventsChannel.class, dasLongPollCustody); DataColumnSidecarByRootCustodyImpl dataColumnSidecarByRootCustody =