diff --git a/storage/src/main/java/tech/pegasys/teku/storage/server/kvstore/KvStoreDatabase.java b/storage/src/main/java/tech/pegasys/teku/storage/server/kvstore/KvStoreDatabase.java index 8303b922b9f..621f4a94d4e 100644 --- a/storage/src/main/java/tech/pegasys/teku/storage/server/kvstore/KvStoreDatabase.java +++ b/storage/src/main/java/tech/pegasys/teku/storage/server/kvstore/KvStoreDatabase.java @@ -406,24 +406,34 @@ public void deleteHotBlocks(final Set blockRootsToDelete) { @Override public UInt64 pruneFinalizedBlocks( final UInt64 lastSlotToPrune, final int pruneLimit, final UInt64 checkpointInitialSlot) { - final Optional earliestBlockSlot = - dao.getEarliestFinalizedBlock().map(SignedBeaconBlock::getSlot); + final Optional earliestFinalizedBlockSlot = dao.getEarliestFinalizedBlockSlot(); LOG.debug( "Earliest block slot stored is {}", - () -> earliestBlockSlot.isEmpty() ? "EMPTY" : earliestBlockSlot.get().toString()); - if (earliestBlockSlot.isEmpty()) { + () -> earliestFinalizedBlockSlot.map(UInt64::toString).orElse("EMPTY")); + if (earliestFinalizedBlockSlot.isEmpty()) { return lastSlotToPrune; } - return pruneToBlock(lastSlotToPrune, pruneLimit, checkpointInitialSlot); + return pruneToBlock( + lastSlotToPrune, earliestFinalizedBlockSlot.get(), pruneLimit, checkpointInitialSlot); } private UInt64 pruneToBlock( - final UInt64 lastSlotToPrune, final int pruneLimit, final UInt64 checkpointInitialSlot) { + final UInt64 lastSlotToPrune, + final UInt64 earliestFinalizedBlockSlot, + final int pruneLimit, + final UInt64 checkpointInitialSlot) { final List> blocksToPrune; final Optional earliestSlotAvailableAfterPrune; LOG.debug("Pruning finalized blocks to slot {} (included)", lastSlotToPrune); + if (lastSlotToPrune.isLessThanOrEqualTo(earliestFinalizedBlockSlot)) { + LOG.debug( + "Last slot to prune {} was lower than the earliest finalized block slot in the database {}", + lastSlotToPrune, + earliestFinalizedBlockSlot); + return lastSlotToPrune; + } try (final Stream stream = - dao.streamFinalizedBlocks(UInt64.ZERO, lastSlotToPrune)) { + dao.streamFinalizedBlocks(earliestFinalizedBlockSlot, lastSlotToPrune)) { // get an extra block to set earliest finalized block slot available after pruning runs // ensuring it is an existing block in the DB blocksToPrune = @@ -436,7 +446,7 @@ private UInt64 pruneToBlock( } try (final Stream stream = - dao.streamFinalizedBlocks(UInt64.ZERO, checkpointInitialSlot)) { + dao.streamFinalizedBlocks(earliestFinalizedBlockSlot, checkpointInitialSlot)) { earliestSlotAvailableAfterPrune = stream @@ -927,8 +937,13 @@ public boolean pruneOldestBlobSidecars( final UInt64 lastSlotToPrune, final int pruneLimit, final DataArchiveWriter> archiveWriter) { + final Optional earliestBlobSidecarSlot = getEarliestBlobSidecarSlot(); + if (earliestBlobSidecarSlot.isPresent() + && earliestBlobSidecarSlot.get().isGreaterThan(lastSlotToPrune)) { + return false; + } try (final Stream prunableBlobKeys = - streamBlobSidecarKeys(UInt64.ZERO, lastSlotToPrune)) { + streamBlobSidecarKeys(earliestBlobSidecarSlot.orElse(UInt64.ZERO), lastSlotToPrune)) { return pruneBlobSidecars(pruneLimit, prunableBlobKeys, archiveWriter, false); } } @@ -938,8 +953,14 @@ public boolean pruneOldestNonCanonicalBlobSidecars( final UInt64 lastSlotToPrune, final int pruneLimit, final DataArchiveWriter> archiveWriter) { + final Optional earliestBlobSidecarSlot = getEarliestBlobSidecarSlot(); + if (earliestBlobSidecarSlot.isPresent() + && earliestBlobSidecarSlot.get().isGreaterThan(lastSlotToPrune)) { + return false; + } try (final Stream prunableNoncanonicalBlobKeys = - streamNonCanonicalBlobSidecarKeys(UInt64.ZERO, lastSlotToPrune)) { + streamNonCanonicalBlobSidecarKeys( + earliestBlobSidecarSlot.orElse(UInt64.ZERO), lastSlotToPrune)) { return pruneBlobSidecars(pruneLimit, prunableNoncanonicalBlobKeys, archiveWriter, true); } } @@ -1005,7 +1026,7 @@ private boolean pruneBlobSidecars( } updater.commit(); } - + LOG.debug("Pruned {} BlobSidecars", pruned); // `pruned` will be greater when we reach pruneLimit not on the latest BlobSidecar in a slot return pruned >= pruneLimit; } diff --git a/teku/src/main/java/tech/pegasys/teku/services/ServiceController.java b/teku/src/main/java/tech/pegasys/teku/services/ServiceController.java index 3308075c5b4..8177bde53ea 100644 --- a/teku/src/main/java/tech/pegasys/teku/services/ServiceController.java +++ b/teku/src/main/java/tech/pegasys/teku/services/ServiceController.java @@ -21,7 +21,6 @@ import tech.pegasys.teku.service.serviceutils.ServiceFacade; public abstract class ServiceController extends Service implements ServiceControllerFacade { - protected final List services = new ArrayList<>(); @Override