From 89db7431efafbf01b849d6420db2fc9b88b00fc6 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 13 Jan 2025 15:44:35 +0530 Subject: [PATCH 1/4] cron queue inspector --- cmd/lotus-shed/cron-count.go | 58 ++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/cmd/lotus-shed/cron-count.go b/cmd/lotus-shed/cron-count.go index fd843fb5ea0..7928a4dd3a0 100644 --- a/cmd/lotus-shed/cron-count.go +++ b/cmd/lotus-shed/cron-count.go @@ -8,13 +8,16 @@ import ( "github.com/ipfs/go-cid" ipldcbor "github.com/ipfs/go-ipld-cbor" "github.com/urfave/cli/v2" + cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/builtin" miner11 "github.com/filecoin-project/go-state-types/builtin/v11/miner" "github.com/filecoin-project/go-state-types/builtin/v11/util/adt" + power "github.com/filecoin-project/go-state-types/builtin/v15/power" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build/buildconstants" @@ -28,6 +31,7 @@ var cronWcCmd = &cli.Command{ Subcommands: []*cli.Command{ minerDeadlineCronCountCmd, minerDeadlinePartitionMeasurementCmd, + cronQueueCountCmd, }, } @@ -269,6 +273,60 @@ var minerDeadlinePartitionMeasurementCmd = &cli.Command{ }, } +var cronQueueCountCmd = &cli.Command{ + Name: "queue", + Description: "list all entries in the cron queue", + Action: func(c *cli.Context) error { + n, acloser, err := lcli.GetFullNodeAPI(c) + if err != nil { + return err + } + defer acloser() + ctx := lcli.ReqContext(c) + + bs := ReadOnlyAPIBlockstore{n} + adtStore := adt.WrapStore(ctx, ipldcbor.NewCborStore(&bs)) + + // Get power actor state + powerActor, err := n.StateGetActor(ctx, builtin.StoragePowerActorAddr, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("failed to get power actor: %w", err) + } + + var powerState power.State + if err := adtStore.Get(ctx, powerActor.Head, &powerState); err != nil { + return xerrors.Errorf("failed to load power state: %w", err) + } + + // Load cron queue + q, err := adt.AsMap(adtStore, powerState.CronEventQueue, power.CronQueueHamtBitwidth) + if err != nil { + return xerrors.Errorf("failed to load cron queue hamt: %w", err) + } + amtRoot := cbg.CborCid{} + if err := q.ForEach(&amtRoot, func(epochStr string) error { + events, err := adt.AsArray(adtStore, cid.Cid(amtRoot), power.CronQueueAmtBitwidth) + if err != nil { + return xerrors.Errorf("failed to load cron queue amt: %w", err) + } + var event power.CronEvent + if err := events.ForEach(&event, func(epoch int64) error { + fmt.Printf("Epoch: %s, Miner: %s, Method: %s\n", epoch, event.MinerAddr) + return nil + }); err != nil { + return xerrors.Errorf("failed to iterate cron events: %w", err) + } + + return nil + + }); err != nil { + return xerrors.Errorf("failed to iterate cron events: %w", err) + } + return nil + + }, +} + var minerDeadlineCronCountCmd = &cli.Command{ Name: "deadline", Description: "list all addresses of miners with active deadline crons", From 1e822252897b0a0cdb85fba519a1d716d742e544 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 13 Jan 2025 15:46:31 +0530 Subject: [PATCH 2/4] Print correct --- cmd/lotus-shed/cron-count.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/cron-count.go b/cmd/lotus-shed/cron-count.go index 7928a4dd3a0..4ae33b95463 100644 --- a/cmd/lotus-shed/cron-count.go +++ b/cmd/lotus-shed/cron-count.go @@ -311,7 +311,7 @@ var cronQueueCountCmd = &cli.Command{ } var event power.CronEvent if err := events.ForEach(&event, func(epoch int64) error { - fmt.Printf("Epoch: %s, Miner: %s, Method: %s\n", epoch, event.MinerAddr) + fmt.Printf("Epoch: %s, Miner: %s\n", epochStr, event.MinerAddr) return nil }); err != nil { return xerrors.Errorf("failed to iterate cron events: %w", err) From eb1f261c621c731969a2ed6ec8559d6cf552320e Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 13 Jan 2025 15:49:23 +0530 Subject: [PATCH 3/4] Print moar correct --- cmd/lotus-shed/cron-count.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cmd/lotus-shed/cron-count.go b/cmd/lotus-shed/cron-count.go index 4ae33b95463..fcd3fffd0da 100644 --- a/cmd/lotus-shed/cron-count.go +++ b/cmd/lotus-shed/cron-count.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "encoding/binary" "encoding/json" "fmt" "os" @@ -304,14 +306,18 @@ var cronQueueCountCmd = &cli.Command{ return xerrors.Errorf("failed to load cron queue hamt: %w", err) } amtRoot := cbg.CborCid{} - if err := q.ForEach(&amtRoot, func(epochStr string) error { + if err := q.ForEach(&amtRoot, func(epoch string) error { + epochInt, err := binary.ReadUvarint(bytes.NewReader([]byte(epoch))) + if err != nil { + return xerrors.Errorf("failed to parse epoch: %w", err) + } events, err := adt.AsArray(adtStore, cid.Cid(amtRoot), power.CronQueueAmtBitwidth) if err != nil { return xerrors.Errorf("failed to load cron queue amt: %w", err) } var event power.CronEvent - if err := events.ForEach(&event, func(epoch int64) error { - fmt.Printf("Epoch: %s, Miner: %s\n", epochStr, event.MinerAddr) + if err := events.ForEach(&event, func(i int64) error { + fmt.Printf("Epoch: %d, Miner: %s\n", epochInt, event.MinerAddr) return nil }); err != nil { return xerrors.Errorf("failed to iterate cron events: %w", err) From 655e63c78a01004c5076b82517523def2f0cfefb Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 13 Jan 2025 15:54:02 +0530 Subject: [PATCH 4/4] Epochs are signed --- cmd/lotus-shed/cron-count.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-shed/cron-count.go b/cmd/lotus-shed/cron-count.go index fcd3fffd0da..ecdd216f67b 100644 --- a/cmd/lotus-shed/cron-count.go +++ b/cmd/lotus-shed/cron-count.go @@ -307,7 +307,7 @@ var cronQueueCountCmd = &cli.Command{ } amtRoot := cbg.CborCid{} if err := q.ForEach(&amtRoot, func(epoch string) error { - epochInt, err := binary.ReadUvarint(bytes.NewReader([]byte(epoch))) + epochInt, err := binary.ReadVarint(bytes.NewReader([]byte(epoch))) if err != nil { return xerrors.Errorf("failed to parse epoch: %w", err) }