From 09ef70bbb0c64bd64cf1faacab87aae3d2622030 Mon Sep 17 00:00:00 2001 From: twoeths <10568965+twoeths@users.noreply.github.com> Date: Tue, 9 Sep 2025 19:08:38 +0700 Subject: [PATCH] fix: deduplicate slots to delete archived DatacolumnSidecars (#8357) **Motivation** - fix `archiveBlocks.ts`: duplicate slots when delete DataColumnSidecars **Description** - deduplicate them - improve logs --------- Co-authored-by: Tuyen Nguyen --- .../chain/archiveStore/utils/archiveBlocks.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/beacon-node/src/chain/archiveStore/utils/archiveBlocks.ts b/packages/beacon-node/src/chain/archiveStore/utils/archiveBlocks.ts index 2c41132e61..82dbad6a4f 100644 --- a/packages/beacon-node/src/chain/archiveStore/utils/archiveBlocks.ts +++ b/packages/beacon-node/src/chain/archiveStore/utils/archiveBlocks.ts @@ -5,7 +5,7 @@ import {IForkChoice} from "@lodestar/fork-choice"; import {ForkSeq, SLOTS_PER_EPOCH} from "@lodestar/params"; import {computeEpochAtSlot, computeStartSlotAtEpoch} from "@lodestar/state-transition"; import {Epoch, RootHex, Slot} from "@lodestar/types"; -import {Logger, fromHex, toRootHex} from "@lodestar/utils"; +import {Logger, fromHex, prettyPrintIndices, toRootHex} from "@lodestar/utils"; import {IBeaconDb} from "../../../db/index.js"; import {BlockArchiveBatchPutBinaryItem} from "../../../db/repositories/index.js"; import {ensureDir, writeIfNotExist} from "../../../util/file.js"; @@ -174,20 +174,21 @@ export async function archiveBlocks( ); const dataColumnSidecarsMinEpoch = currentEpoch - dataColumnSidecarsArchiveWindow; if (dataColumnSidecarsMinEpoch >= config.FULU_FORK_EPOCH) { - const slotsToDelete = ( - await db.dataColumnSidecarArchive.keys({ - lt: db.dataColumnSidecarArchive.getMaxKeyRaw(computeStartSlotAtEpoch(dataColumnSidecarsMinEpoch)), - }) - ).map((p) => p.prefix); - + const prefixedKeys = await db.dataColumnSidecarArchive.keys({ + lt: db.dataColumnSidecarArchive.getMaxKeyRaw(computeStartSlotAtEpoch(dataColumnSidecarsMinEpoch)), + }); + // for each slot there could be multiple dataColumnSidecar, so we need to deduplicate it + const slotsToDelete = [...new Set(prefixedKeys.map(({prefix}) => prefix))].sort((a, b) => a - b); if (slotsToDelete.length > 0) { await db.dataColumnSidecarArchive.deleteMany(slotsToDelete); - logger.verbose(`dataColumnSidecars prune: batchDelete range ${slotsToDelete[0]}..${slotsToDelete.at(-1)}`); + `dataColumnSidecars prune slotRange=${prettyPrintIndices(slotsToDelete)}, numOfSlots=${slotsToDelete.length} totalNumOfSidecars=${prefixedKeys.length}`; } else { logger.verbose(`dataColumnSidecars prune: no entries before epoch ${dataColumnSidecarsMinEpoch}`); } } else { - logger.verbose(`dataColumnSidecars pruning skipped: ${dataColumnSidecarsMinEpoch} is before fulu fork epoch`); + logger.verbose( + `dataColumnSidecars pruning skipped: ${dataColumnSidecarsMinEpoch} is before fulu fork epoch ${config.FULU_FORK_EPOCH}` + ); } } else { logger.verbose("dataColumnSidecars pruning skipped: archiveDataEpochs set to Infinity");