11package main
22
33import (
4+ "bytes"
5+ "encoding/binary"
46 "encoding/json"
57 "fmt"
68 "os"
79
810 "github.com/ipfs/go-cid"
911 ipldcbor "github.com/ipfs/go-ipld-cbor"
1012 "github.com/urfave/cli/v2"
13+ cbg "github.com/whyrusleeping/cbor-gen"
1114 "golang.org/x/xerrors"
1215
1316 "github.com/filecoin-project/go-address"
1417 "github.com/filecoin-project/go-bitfield"
1518 "github.com/filecoin-project/go-state-types/abi"
19+ "github.com/filecoin-project/go-state-types/builtin"
1620 miner11 "github.com/filecoin-project/go-state-types/builtin/v11/miner"
1721 "github.com/filecoin-project/go-state-types/builtin/v11/util/adt"
22+ power "github.com/filecoin-project/go-state-types/builtin/v15/power"
1823
1924 "github.com/filecoin-project/lotus/api"
2025 "github.com/filecoin-project/lotus/build/buildconstants"
@@ -28,6 +33,7 @@ var cronWcCmd = &cli.Command{
2833 Subcommands : []* cli.Command {
2934 minerDeadlineCronCountCmd ,
3035 minerDeadlinePartitionMeasurementCmd ,
36+ cronQueueCountCmd ,
3137 },
3238}
3339
@@ -269,6 +275,64 @@ var minerDeadlinePartitionMeasurementCmd = &cli.Command{
269275 },
270276}
271277
278+ var cronQueueCountCmd = & cli.Command {
279+ Name : "queue" ,
280+ Description : "list all entries in the cron queue" ,
281+ Action : func (c * cli.Context ) error {
282+ n , acloser , err := lcli .GetFullNodeAPI (c )
283+ if err != nil {
284+ return err
285+ }
286+ defer acloser ()
287+ ctx := lcli .ReqContext (c )
288+
289+ bs := ReadOnlyAPIBlockstore {n }
290+ adtStore := adt .WrapStore (ctx , ipldcbor .NewCborStore (& bs ))
291+
292+ // Get power actor state
293+ powerActor , err := n .StateGetActor (ctx , builtin .StoragePowerActorAddr , types .EmptyTSK )
294+ if err != nil {
295+ return xerrors .Errorf ("failed to get power actor: %w" , err )
296+ }
297+
298+ var powerState power.State
299+ if err := adtStore .Get (ctx , powerActor .Head , & powerState ); err != nil {
300+ return xerrors .Errorf ("failed to load power state: %w" , err )
301+ }
302+
303+ // Load cron queue
304+ q , err := adt .AsMap (adtStore , powerState .CronEventQueue , power .CronQueueHamtBitwidth )
305+ if err != nil {
306+ return xerrors .Errorf ("failed to load cron queue hamt: %w" , err )
307+ }
308+ amtRoot := cbg.CborCid {}
309+ if err := q .ForEach (& amtRoot , func (epoch string ) error {
310+ epochInt , err := binary .ReadVarint (bytes .NewReader ([]byte (epoch )))
311+ if err != nil {
312+ return xerrors .Errorf ("failed to parse epoch: %w" , err )
313+ }
314+ events , err := adt .AsArray (adtStore , cid .Cid (amtRoot ), power .CronQueueAmtBitwidth )
315+ if err != nil {
316+ return xerrors .Errorf ("failed to load cron queue amt: %w" , err )
317+ }
318+ var event power.CronEvent
319+ if err := events .ForEach (& event , func (i int64 ) error {
320+ fmt .Printf ("Epoch: %d, Miner: %s\n " , epochInt , event .MinerAddr )
321+ return nil
322+ }); err != nil {
323+ return xerrors .Errorf ("failed to iterate cron events: %w" , err )
324+ }
325+
326+ return nil
327+
328+ }); err != nil {
329+ return xerrors .Errorf ("failed to iterate cron events: %w" , err )
330+ }
331+ return nil
332+
333+ },
334+ }
335+
272336var minerDeadlineCronCountCmd = & cli.Command {
273337 Name : "deadline" ,
274338 Description : "list all addresses of miners with active deadline crons" ,
0 commit comments