From 5984bde7c459815116883bc62c68f0c398c427c4 Mon Sep 17 00:00:00 2001 From: ozpool Date: Wed, 13 May 2026 12:55:14 +0530 Subject: [PATCH] cmd/geth: report disk space cleared on prune-history completion Fixes #31916. Snapshot the on-disk size of the prunable chain-freezer tables (bodies and receipts) before and after the prune step, and include the delta as cleared= on the existing "History pruning completed" log line. Operators see the impact of the run immediately without inspecting the data directory by hand. The header and hash tables are intentionally excluded from the measurement because they are configured with prunable=false and are never truncated. If AncientSize fails for any table the helper returns 0 so the log shows "cleared=0.00 B" rather than a partial, misleading figure. --- cmd/geth/chaincmd.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 98ed348d8c..06fa3fd6e6 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -775,17 +775,41 @@ func pruneHistory(ctx *cli.Context) error { log.Info("Starting history pruning", "head", currentHeader.Number, "target", targetBlock, "targetHash", targetBlockHash.Hex()) start := time.Now() + sizeBefore := prunableFreezerSize(chaindb) rawdb.PruneTransactionIndex(chaindb, targetBlock) if _, err := chaindb.TruncateTail(targetBlock); err != nil { return fmt.Errorf("failed to truncate ancient data: %v", err) } - log.Info("History pruning completed", "tail", targetBlock, "elapsed", common.PrettyDuration(time.Since(start))) + sizeAfter := prunableFreezerSize(chaindb) + var cleared common.StorageSize + if sizeBefore > sizeAfter { + cleared = common.StorageSize(sizeBefore - sizeAfter) + } + log.Info("History pruning completed", "tail", targetBlock, "elapsed", common.PrettyDuration(time.Since(start)), "cleared", cleared) // TODO(s1na): what if there is a crash between the two prune operations? return nil } +// prunableFreezerSize returns the total on-disk size of the chain freezer +// tables that prune-history truncates (bodies and receipts). The header and +// hash tables are retained long-term and are not measured here. +func prunableFreezerSize(db ethdb.Database) uint64 { + var total uint64 + for _, table := range []string{rawdb.ChainFreezerBodiesTable, rawdb.ChainFreezerReceiptTable} { + size, err := db.AncientSize(table) + if err != nil { + // If we can't read the size of any prunable table, the delta would + // be misleading. Return 0 so the caller logs "cleared=0.00 B" rather + // than a partial figure. + return 0 + } + total += size + } + return total +} + // downloadEra is the era1 file downloader tool. func downloadEra(ctx *cli.Context) error { flags.CheckExclusive(ctx, eraBlockFlag, eraEpochFlag, eraAllFlag)