@@ -21,6 +21,7 @@ import (
2121 "github.com/ledgerwatch/erigon-lib/metrics"
2222 "github.com/ledgerwatch/log/v3"
2323 "github.com/urfave/cli/v2"
24+ "golang.org/x/sync/semaphore"
2425
2526 "github.com/ledgerwatch/erigon-lib/common"
2627 "github.com/ledgerwatch/erigon-lib/common/datadir"
@@ -144,6 +145,20 @@ var snapshotCommand = cli.Command{
144145 },
145146 }),
146147 },
148+ {
149+ Name : "integrity" ,
150+ Action : doIntegrity ,
151+ Flags : joinFlags ([]cli.Flag {
152+ & utils .DataDirFlag ,
153+ }),
154+ },
155+ //{
156+ // Name: "bodies_decrement_datafix",
157+ // Action: doBodiesDecrement,
158+ // Flags: joinFlags([]cli.Flag{
159+ // &utils.DataDirFlag,
160+ // }),
161+ //},
147162 },
148163}
149164
@@ -174,6 +189,39 @@ var (
174189 }
175190)
176191
192+ func doIntegrity (cliCtx * cli.Context ) error {
193+ logger , _ , err := debug .Setup (cliCtx , true /* root logger */ )
194+ if err != nil {
195+ return err
196+ }
197+
198+ ctx := cliCtx .Context
199+ dirs := datadir .New (cliCtx .String (utils .DataDirFlag .Name ))
200+ chainDB := dbCfg (kv .ChainDB , dirs .Chaindata ).MustOpen ()
201+ defer chainDB .Close ()
202+
203+ cfg := ethconfig .NewSnapCfg (true , false , true )
204+ chainConfig := fromdb .ChainConfig (chainDB )
205+ blockSnaps , borSnaps , blockRetire , agg , err := openSnaps (ctx , cfg , dirs , snapcfg .KnownCfg (chainConfig .ChainName , 0 ).Version , chainDB , logger )
206+ if err != nil {
207+ return err
208+ }
209+ defer blockSnaps .Close ()
210+ defer borSnaps .Close ()
211+ defer agg .Close ()
212+
213+ blockReader , _ := blockRetire .IO ()
214+ if err := blockReader .(* freezeblocks.BlockReader ).IntegrityTxnID (false ); err != nil {
215+ return err
216+ }
217+
218+ //if err := integrity.E3HistoryNoSystemTxs(ctx, chainDB, agg); err != nil {
219+ // return err
220+ //}
221+
222+ return nil
223+ }
224+
177225func doDiff (cliCtx * cli.Context ) error {
178226 defer log .Info ("Done" )
179227 srcF , dstF := cliCtx .String ("src" ), cliCtx .String ("dst" )
@@ -243,6 +291,7 @@ func doDecompressSpeed(cliCtx *cli.Context) error {
243291 }()
244292 return nil
245293}
294+
246295func doRam (cliCtx * cli.Context ) error {
247296 var logger log.Logger
248297 var err error
@@ -279,19 +328,17 @@ func doIndicesCommand(cliCtx *cli.Context) error {
279328
280329 dirs := datadir .New (cliCtx .String (utils .DataDirFlag .Name ))
281330 rebuild := cliCtx .Bool (SnapshotRebuildFlag .Name )
282- //from := cliCtx.Uint64(SnapshotFromFlag.Name)
283-
284- chainDB := mdbx .NewMDBX (logger ).Path (dirs .Chaindata ).MustOpen ()
331+ chainDB := dbCfg (kv .ChainDB , dirs .Chaindata ).MustOpen ()
285332 defer chainDB .Close ()
286333
287334 dir .MustExist (dirs .SnapHistory )
288- chainConfig := fromdb .ChainConfig (chainDB )
289335
290336 if rebuild {
291337 panic ("not implemented" )
292338 }
293339
294340 cfg := ethconfig .NewSnapCfg (true , false , true )
341+ chainConfig := fromdb .ChainConfig (chainDB )
295342 blockSnaps , borSnaps , br , agg , err := openSnaps (ctx , cfg , dirs , snapcfg .KnownCfg (chainConfig .ChainName , 0 ).Version , chainDB , logger )
296343
297344 if err != nil {
@@ -325,13 +372,16 @@ func openSnaps(ctx context.Context, cfg ethconfig.BlocksFreezing, dirs datadir.D
325372 return
326373 }
327374 borSnaps .LogStat ("open" )
328-
329- agg , err = libstate .NewAggregatorV3 (ctx , dirs .SnapHistory , dirs .Tmp , ethconfig .HistoryV3AggregationStep , chainDB , logger )
330- if err != nil {
331- return
332- }
333- agg .SetWorkers (estimate .CompressSnapshot .Workers ())
334- err = agg .OpenFolder ()
375+ agg = openAgg (ctx , dirs , chainDB , logger )
376+ err = chainDB .View (ctx , func (tx kv.Tx ) error {
377+ ac := agg .MakeContext ()
378+ defer ac .Close ()
379+ //ac.LogStats(tx, func(endTxNumMinimax uint64) uint64 {
380+ // _, histBlockNumProgress, _ := rawdbv3.TxNums.FindBlockNum(tx, endTxNumMinimax)
381+ // return histBlockNumProgress
382+ //})
383+ return nil
384+ })
335385 if err != nil {
336386 return
337387 }
@@ -461,7 +511,7 @@ func doRetireCommand(cliCtx *cli.Context) error {
461511 every := cliCtx .Uint64 (SnapshotEveryFlag .Name )
462512 version := uint8 (cliCtx .Int (SnapshotVersionFlag .Name ))
463513
464- db := mdbx . NewMDBX ( logger ). Label ( kv .ChainDB ). Path ( dirs .Chaindata ).MustOpen ()
514+ db := dbCfg ( kv .ChainDB , dirs .Chaindata ).MustOpen ()
465515 defer db .Close ()
466516
467517 cfg := ethconfig .NewSnapCfg (true , false , true )
@@ -641,3 +691,113 @@ func doUploaderCommand(cliCtx *cli.Context) error {
641691 }
642692 return err
643693}
694+
695+ /*
696+ func doBodiesDecrement(cliCtx *cli.Context) error {
697+ logger, _, err := debug.Setup(cliCtx, true)
698+ if err != nil {
699+ return err
700+ }
701+ dirs := datadir.New(cliCtx.String(utils.DataDirFlag.Name))
702+ ctx := cliCtx.Context
703+ logEvery := time.NewTicker(30 * time.Second)
704+ defer logEvery.Stop()
705+
706+ list, err := snaptype.Segments(dirs.Snap, 1)
707+ if err != nil {
708+ return err
709+ }
710+ var l []snaptype.FileInfo
711+ for _, f := range list {
712+ if f.T != snaptype.Bodies {
713+ continue
714+ }
715+ if f.From < 14_500_000 {
716+ continue
717+ }
718+ l = append(l, f)
719+ }
720+ migrateSingleBody := func(srcF, dstF string) error {
721+ src, err := compress.NewDecompressor(srcF)
722+ if err != nil {
723+ return err
724+ }
725+ defer src.Close()
726+ dst, err := compress.NewCompressor(ctx, "compress", dstF, dirs.Tmp, compress.MinPatternScore, estimate.CompressSnapshot.Workers(), log.LvlInfo, logger)
727+ if err != nil {
728+ return err
729+ }
730+ defer dst.Close()
731+
732+ i := 0
733+ srcG := src.MakeGetter()
734+ var buf []byte
735+ dstBuf := bytes.NewBuffer(nil)
736+ for srcG.HasNext() {
737+ i++
738+ buf, _ = srcG.Next(buf[:0])
739+ body := &types.BodyForStorage{}
740+ if err := rlp.Decode(bytes.NewReader(buf), body); err != nil {
741+ return err
742+ }
743+ body.BaseTxId -= 1
744+ dstBuf.Reset()
745+ if err := rlp.Encode(dstBuf, body); err != nil {
746+ return err
747+ }
748+
749+ if err := dst.AddWord(dstBuf.Bytes()); err != nil {
750+ return err
751+ }
752+
753+ select {
754+ case <-logEvery.C:
755+ logger.Info("[bodies] progress", "f", src.FileName(), "progress", fmt.Sprintf("%dK/%dK", i/1_000, src.Count()/1_000))
756+ default:
757+ }
758+ }
759+ if err := dst.Compress(); err != nil {
760+ return err
761+ }
762+ src.Close()
763+ dst.Close()
764+ os.Rename(srcF, srcF+".back")
765+ os.Rename(dstF, srcF)
766+ os.Remove(srcF + ".torrent")
767+ os.Remove(srcF + ".idx")
768+ ext := filepath.Ext(srcF)
769+ withoutExt := srcF[:len(srcF)-len(ext)]
770+ _ = os.Remove(withoutExt + ".idx")
771+ return nil
772+ }
773+ for _, f := range l {
774+ srcF, dstF := f.Path, f.Path+"2"
775+ if err := migrateSingleBody(srcF, dstF); err != nil {
776+ return err
777+ }
778+ }
779+
780+ return nil
781+ }
782+ */
783+
784+ func dbCfg (label kv.Label , path string ) mdbx.MdbxOpts {
785+ const ThreadsLimit = 9_000
786+ limiterB := semaphore .NewWeighted (ThreadsLimit )
787+ opts := mdbx .NewMDBX (log .New ()).Path (path ).Label (label ).RoTxsLimiter (limiterB )
788+ // integration tool don't intent to create db, then easiest way to open db - it's pass mdbx.Accede flag, which allow
789+ // to read all options from DB, instead of overriding them
790+ opts = opts .Accede ()
791+ return opts
792+ }
793+ func openAgg (ctx context.Context , dirs datadir.Dirs , chainDB kv.RwDB , logger log.Logger ) * libstate.AggregatorV3 {
794+ agg , err := libstate .NewAggregatorV3 (ctx , dirs .Snap , dirs .Tmp , ethconfig .HistoryV3AggregationStep , chainDB , logger )
795+ if err != nil {
796+ panic (err )
797+ }
798+ if err = agg .OpenFolder (); err != nil {
799+ panic (err )
800+ }
801+ agg .SetWorkers (estimate .CompressSnapshot .Workers ())
802+ return agg
803+ }
0 commit comments