Skip to content

Commit 628cb79

Browse files
authored
Make DataUnavailablePool always accept new blocks (Consensys#8129)
1 parent 26657d2 commit 628cb79

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

Diff for: ethereum/statetransition/src/main/java/tech/pegasys/teku/statetransition/blobs/DataUnavailableBlockPool.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,14 @@
3838
* with UNKNOWN_BLOCK and will be tracked in the block pendingPool.
3939
*/
4040
public class DataUnavailableBlockPool implements FinalizedCheckpointChannel {
41+
public static final int MAX_CAPACITY = 10;
4142
private static final Logger LOG = LogManager.getLogger();
4243

4344
private static final Duration WAIT_BEFORE_RETRY = Duration.ofSeconds(1);
4445

4546
// this is a queue of chain tips
4647
private final Queue<SignedBeaconBlock> awaitingDataAvailabilityQueue =
47-
new ArrayBlockingQueue<>(10);
48+
new ArrayBlockingQueue<>(MAX_CAPACITY);
4849
private final Spec spec;
4950
private final BlockManager blockManager;
5051
private final BlockBlobSidecarsTrackersPool blockBlobSidecarsTrackersPool;
@@ -72,9 +73,11 @@ public synchronized void addDataUnavailableBlock(final SignedBeaconBlock block)
7273

7374
boolean wasEmpty = awaitingDataAvailabilityQueue.isEmpty();
7475
if (!awaitingDataAvailabilityQueue.offer(block)) {
76+
final SignedBeaconBlock oldestBlock = awaitingDataAvailabilityQueue.poll();
77+
awaitingDataAvailabilityQueue.add(block);
7578
LOG.info(
7679
"Discarding block {} as data unavailable retry pool capacity exceeded",
77-
block::toLogString);
80+
oldestBlock::toLogString);
7881
return;
7982
}
8083
if (wasEmpty) {

Diff for: ethereum/statetransition/src/test/java/tech/pegasys/teku/statetransition/blobs/DataUnavailableBlockPoolTest.java

+21
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@
2121
import static org.mockito.Mockito.verifyNoMoreInteractions;
2222
import static org.mockito.Mockito.when;
2323
import static tech.pegasys.teku.spec.datastructures.validator.BroadcastValidationLevel.NOT_REQUIRED;
24+
import static tech.pegasys.teku.statetransition.blobs.DataUnavailableBlockPool.MAX_CAPACITY;
2425

26+
import java.util.List;
2527
import java.util.Optional;
28+
import java.util.stream.IntStream;
2629
import org.junit.jupiter.api.BeforeEach;
2730
import org.junit.jupiter.api.Test;
2831
import tech.pegasys.teku.infrastructure.async.SafeFuture;
@@ -197,4 +200,22 @@ void shouldPruneBlocksOlderThanFinalizedSlot() {
197200
assertThat(dataUnavailableBlockPool.containsBlock(blockAtSlot10)).isFalse();
198201
assertThat(dataUnavailableBlockPool.containsBlock(blockAtSlot11)).isFalse();
199202
}
203+
204+
@Test
205+
void shouldDiscardOldestWhenFull() {
206+
final List<SignedBeaconBlock> blocks =
207+
IntStream.range(0, MAX_CAPACITY)
208+
.mapToObj(dataStructureUtil::randomSignedBeaconBlock)
209+
.toList();
210+
blocks.forEach(dataUnavailableBlockPool::addDataUnavailableBlock);
211+
212+
assertThat(dataUnavailableBlockPool.containsBlock(blocks.get(0))).isTrue();
213+
214+
final SignedBeaconBlock newBlock = dataStructureUtil.randomSignedBeaconBlock();
215+
216+
dataUnavailableBlockPool.addDataUnavailableBlock(newBlock);
217+
218+
assertThat(dataUnavailableBlockPool.containsBlock(blocks.get(0))).isFalse();
219+
assertThat(dataUnavailableBlockPool.containsBlock(newBlock)).isTrue();
220+
}
200221
}

0 commit comments

Comments
 (0)