From 5120d8481a3b53fd9ac8f5c2e0210101600926ee Mon Sep 17 00:00:00 2001 From: Clint Armstrong Date: Wed, 12 Jan 2022 12:20:52 -0500 Subject: [PATCH 01/31] allow overriding worker hostname with environment variable Signed-off-by: Clint Armstrong --- extern/sector-storage/worker_local.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/extern/sector-storage/worker_local.go b/extern/sector-storage/worker_local.go index a5f5a0b9d..213748db7 100644 --- a/extern/sector-storage/worker_local.go +++ b/extern/sector-storage/worker_local.go @@ -582,9 +582,13 @@ func (l *LocalWorker) memInfo() (memPhysical, memUsed, memSwap, memSwapUsed uint } func (l *LocalWorker) Info(context.Context) (storiface.WorkerInfo, error) { - hostname, err := os.Hostname() // TODO: allow overriding from config - if err != nil { - panic(err) + hostname, ok := os.LookupEnv("LOTUS_WORKER_HOSTNAME") + if !ok { + var err error + hostname, err = os.Hostname() + if err != nil { + panic(err) + } } gpus, err := ffi.GetGPUDevices() From 2375df2b62d710dd427d89b5658c0cf185cc6be8 Mon Sep 17 00:00:00 2001 From: beck Date: Wed, 25 May 2022 11:11:23 +0800 Subject: [PATCH 02/31] Feat/add provingDeadlinesCmd live option --- cmd/lotus-miner/proving.go | 57 ++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index faae5e955..8b3bde610 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -197,6 +197,14 @@ var provingInfoCmd = &cli.Command{ var provingDeadlinesCmd = &cli.Command{ Name: "deadlines", Usage: "View the current proving period deadlines information", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "live", + Usage: "View live deadlines information", + Value: false, + Aliases: []string{"l"}, + }, + }, Action: func(cctx *cli.Context) error { api, acloser, err := lcli.GetFullNodeAPI(cctx) if err != nil { @@ -239,28 +247,53 @@ var provingDeadlinesCmd = &cli.Command{ sectors := uint64(0) faults := uint64(0) + var PartitionSum int + + if cctx.Bool("live") { + for _, partition := range partitions { + sc, err := partition.LiveSectors.Count() + if err != nil { + return err + } + + if sc > 0 { + PartitionSum++ + } + + sectors += sc + + fc, err := partition.FaultySectors.Count() + if err != nil { + return err + } + + faults += fc - for _, partition := range partitions { - sc, err := partition.AllSectors.Count() - if err != nil { - return err } + } else { + for _, partition := range partitions { + PartitionSum++ - sectors += sc + sc, err := partition.AllSectors.Count() + if err != nil { + return err + } - fc, err := partition.FaultySectors.Count() - if err != nil { - return err + sectors += sc + + fc, err := partition.FaultySectors.Count() + if err != nil { + return err + } + + faults += fc } - - faults += fc } - var cur string if di.Index == uint64(dlIdx) { cur += "\t(current)" } - _, _ = fmt.Fprintf(tw, "%d\t%d\t%d (%d)\t%d%s\n", dlIdx, len(partitions), sectors, faults, provenPartitions, cur) + _, _ = fmt.Fprintf(tw, "%d\t%d\t%d (%d)\t%d%s\n", dlIdx, PartitionSum, sectors, faults, provenPartitions, cur) } return tw.Flush() From 43ec14fa9c40d8b220e2272663572a86d7583286 Mon Sep 17 00:00:00 2001 From: beck Date: Wed, 25 May 2022 11:12:32 +0800 Subject: [PATCH 03/31] Feat/add provingDeadlineInfoCmd live option --- cmd/lotus-miner/proving.go | 83 ++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 8b3bde610..51149baf6 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -304,6 +304,14 @@ var provingDeadlineInfoCmd = &cli.Command{ Name: "deadline", Usage: "View the current proving period deadline information by its index ", ArgsUsage: "", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "live", + Usage: "View deadline live sectors", + Value: false, + Aliases: []string{"l"}, + }, + }, Action: func(cctx *cli.Context) error { if cctx.Args().Len() != 1 { @@ -353,33 +361,64 @@ var provingDeadlineInfoCmd = &cli.Command{ fmt.Printf("Proven Partitions: %d\n", provenPartitions) fmt.Printf("Current: %t\n\n", di.Index == dlIdx) - for pIdx, partition := range partitions { - sectorCount, err := partition.AllSectors.Count() - if err != nil { - return err - } + if !cctx.Bool("live") { + for pIdx, partition := range partitions { + sectorCount, err := partition.AllSectors.Count() + if err != nil { + return err + } - sectorNumbers, err := partition.AllSectors.All(sectorCount) - if err != nil { - return err - } + sectorNumbers, err := partition.AllSectors.All(sectorCount) + if err != nil { + return err + } - faultsCount, err := partition.FaultySectors.Count() - if err != nil { - return err - } + faultsCount, err := partition.FaultySectors.Count() + if err != nil { + return err + } - fn, err := partition.FaultySectors.All(faultsCount) - if err != nil { - return err - } + fn, err := partition.FaultySectors.All(faultsCount) + if err != nil { + return err + } - fmt.Printf("Partition Index: %d\n", pIdx) - fmt.Printf("Sectors: %d\n", sectorCount) - fmt.Printf("Sector Numbers: %v\n", sectorNumbers) - fmt.Printf("Faults: %d\n", faultsCount) - fmt.Printf("Faulty Sectors: %d\n", fn) + fmt.Printf("Partition Index: %d\n", pIdx) + fmt.Printf("Sectors: %d\n", sectorCount) + fmt.Printf("Sector Numbers: %v\n", sectorNumbers) + fmt.Printf("Faults: %d\n", faultsCount) + fmt.Printf("Faulty Sectors: %d\n", fn) + } + } else { + for pIdx, partition := range partitions { + sectorCount, err := partition.LiveSectors.Count() + if err != nil { + return err + } + + sectorNumbers, err := partition.LiveSectors.All(sectorCount) + if err != nil { + return err + } + + faultsCount, err := partition.FaultySectors.Count() + if err != nil { + return err + } + + fn, err := partition.FaultySectors.All(faultsCount) + if err != nil { + return err + } + + fmt.Printf("Partition Index: %d\n", pIdx) + fmt.Printf("Sectors: %d\n", sectorCount) + fmt.Printf("Sector Numbers: %v\n", sectorNumbers) + fmt.Printf("Faults: %d\n", faultsCount) + fmt.Printf("Faulty Sectors: %d\n", fn) + } } + return nil }, } From c079a12c9ca154abb2d2bd27788a8bcd148c1799 Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Tue, 5 Jul 2022 11:18:51 -0700 Subject: [PATCH 04/31] push lotus-gateway to docker hub --- .circleci/config.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 914fa2ffd..4d237d938 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -730,26 +730,32 @@ jobs: name: docker build command: | docker build --target lotus -t filecoin/lotus:<< parameters.tag >> -f Dockerfile.lotus . + docker build --target lotus-gateway -t filecoin/lotus-gateway:<< parameters.tag >> -f Dockerfile.lotus . docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:<< parameters.tag >> -f Dockerfile.lotus . if [[ ! -z $CIRCLE_SHA1 ]]; then docker build --target lotus -t filecoin/lotus:$CIRCLE_SHA1 -f Dockerfile.lotus . + docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_SHA1 -f Dockerfile.lotus . docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_SHA1 -f Dockerfile.lotus . fi if [[ ! -z $CIRCLE_TAG ]]; then docker build --target lotus -t filecoin/lotus:$CIRCLE_TAG -f Dockerfile.lotus . + docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_TAG -f Dockerfile.lotus . docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_TAG -f Dockerfile.lotus . fi - run: name: docker push command: | docker push filecoin/lotus:<< parameters.tag >> + docker push filecoin/lotus-gateway:<< parameters.tag >> docker push filecoin/lotus-all-in-one:<< parameters.tag >> if [[ ! -z $CIRCLE_SHA1 ]]; then docker push filecoin/lotus:$CIRCLE_SHA1 + docker push filecoin/lotus-gateway:$CIRCLE_SHA1 docker push filecoin/lotus-all-in-one:$CIRCLE_SHA1 fi if [[ ! -z $CIRCLE_TAG ]]; then docker push filecoin/lotus:$CIRCLE_TAG + docker push filecoin/lotus-gateway:$CIRCLE_TAG docker push filecoin/lotus-all-in-one:$CIRCLE_TAG fi From 91e678bdcb2227d8fe6f3a07732560fbdcabfe8b Mon Sep 17 00:00:00 2001 From: Cory Schwartz Date: Tue, 5 Jul 2022 11:42:24 -0700 Subject: [PATCH 05/31] fix circleci template --- .circleci/template.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/template.yml b/.circleci/template.yml index 482eb72bf..d43cfe374 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -730,13 +730,16 @@ jobs: name: docker build command: | docker build --target lotus -t filecoin/lotus:<< parameters.tag >> -f Dockerfile.lotus . + docker build --target lotus-gateway -t filecoin/lotus-gateway:<< parameters.tag >> -f Dockerfile.lotus . docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:<< parameters.tag >> -f Dockerfile.lotus . if [["[[ ! -z $CIRCLE_SHA1 ]]"]]; then docker build --target lotus -t filecoin/lotus:$CIRCLE_SHA1 -f Dockerfile.lotus . + docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_SHA1 -f Dockerfile.lotus . docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_SHA1 -f Dockerfile.lotus . fi if [["[[ ! -z $CIRCLE_TAG ]]"]]; then docker build --target lotus -t filecoin/lotus:$CIRCLE_TAG -f Dockerfile.lotus . + docker build --target lotus-gateway -t filecoin/lotus-gateway:$CIRCLE_TAG -f Dockerfile.lotus . docker build --target lotus-all-in-one -t filecoin/lotus-all-in-one:$CIRCLE_TAG -f Dockerfile.lotus . fi - run: From 6583a44a928d42003d4ca2961aa7faf6edb4a03d Mon Sep 17 00:00:00 2001 From: beck Date: Wed, 20 Jul 2022 10:21:52 +0800 Subject: [PATCH 06/31] reduce redundant code --- cmd/lotus-miner/proving.go | 102 +++++++++++++++---------------------- 1 file changed, 40 insertions(+), 62 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 51149baf6..9655e1fd0 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -249,8 +249,8 @@ var provingDeadlinesCmd = &cli.Command{ faults := uint64(0) var PartitionSum int - if cctx.Bool("live") { - for _, partition := range partitions { + for _, partition := range partitions { + if cctx.Bool("live") { sc, err := partition.LiveSectors.Count() if err != nil { return err @@ -261,34 +261,24 @@ var provingDeadlinesCmd = &cli.Command{ } sectors += sc - - fc, err := partition.FaultySectors.Count() - if err != nil { - return err - } - - faults += fc - - } - } else { - for _, partition := range partitions { - PartitionSum++ - + } else { sc, err := partition.AllSectors.Count() if err != nil { return err } + PartitionSum++ sectors += sc - - fc, err := partition.FaultySectors.Count() - if err != nil { - return err - } - - faults += fc } + + fc, err := partition.FaultySectors.Count() + if err != nil { + return err + } + + faults += fc } + var cur string if di.Index == uint64(dlIdx) { cur += "\t(current)" @@ -361,64 +351,52 @@ var provingDeadlineInfoCmd = &cli.Command{ fmt.Printf("Proven Partitions: %d\n", provenPartitions) fmt.Printf("Current: %t\n\n", di.Index == dlIdx) - if !cctx.Bool("live") { - for pIdx, partition := range partitions { - sectorCount, err := partition.AllSectors.Count() + var sectorCount uint64 + var sectorNumbers []uint64 + + for pIdx, partition := range partitions { + if !cctx.Bool("live") { + sectorCount, err = partition.AllSectors.Count() if err != nil { return err } - sectorNumbers, err := partition.AllSectors.All(sectorCount) + sectorNumbers, err = partition.AllSectors.All(sectorCount) if err != nil { return err } - faultsCount, err := partition.FaultySectors.Count() + } else { + sectorCount, err = partition.LiveSectors.Count() if err != nil { return err } - fn, err := partition.FaultySectors.All(faultsCount) - if err != nil { - return err + if sectorCount != 0 { + sectorNumbers, err = partition.LiveSectors.All(sectorCount) + if err != nil { + return err + } } - fmt.Printf("Partition Index: %d\n", pIdx) - fmt.Printf("Sectors: %d\n", sectorCount) - fmt.Printf("Sector Numbers: %v\n", sectorNumbers) - fmt.Printf("Faults: %d\n", faultsCount) - fmt.Printf("Faulty Sectors: %d\n", fn) } - } else { - for pIdx, partition := range partitions { - sectorCount, err := partition.LiveSectors.Count() - if err != nil { - return err - } - sectorNumbers, err := partition.LiveSectors.All(sectorCount) - if err != nil { - return err - } - - faultsCount, err := partition.FaultySectors.Count() - if err != nil { - return err - } - - fn, err := partition.FaultySectors.All(faultsCount) - if err != nil { - return err - } - - fmt.Printf("Partition Index: %d\n", pIdx) - fmt.Printf("Sectors: %d\n", sectorCount) - fmt.Printf("Sector Numbers: %v\n", sectorNumbers) - fmt.Printf("Faults: %d\n", faultsCount) - fmt.Printf("Faulty Sectors: %d\n", fn) + faultsCount, err := partition.FaultySectors.Count() + if err != nil { + return err } + + fn, err := partition.FaultySectors.All(faultsCount) + if err != nil { + return err + } + + fmt.Printf("Partition Index: %d\n", pIdx) + fmt.Printf("Sectors: %d\n", sectorCount) + fmt.Printf("Sector Numbers: %v\n", sectorNumbers) + fmt.Printf("Faults: %d\n", faultsCount) + fmt.Printf("Faulty Sectors: %d\n", fn) } - return nil }, } From 4f03486011cdb26f7b892765680965e986f8e2da Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Fri, 29 Jul 2022 20:09:49 +0530 Subject: [PATCH 07/31] miner withdrawbalance API --- api/api_storage.go | 7 +++ api/proxy_gen.go | 13 ++++ build/openrpc/full.json.gz | Bin 28036 -> 28040 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4894 bytes build/openrpc/miner.json.gz | Bin 14241 -> 14527 bytes build/openrpc/worker.json.gz | Bin 4764 -> 4762 bytes cmd/lotus-miner/actor.go | 72 +++++------------------ documentation/en/api-v0-methods-miner.md | 30 ++++++++++ node/impl/storminer.go | 53 +++++++++++++++++ 9 files changed, 118 insertions(+), 57 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index e9135e30d..242685109 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -48,6 +48,13 @@ type StorageMiner interface { ActorSectorSize(context.Context, address.Address) (abi.SectorSize, error) //perm:read ActorAddressConfig(ctx context.Context) (AddressConfig, error) //perm:read + // WithdrawBalance allows to withdraw balance from miner actor to owner address + // Specify amount as "0" to withdraw full balance. This method returns a message CID + // even when StateWaitMessage() fails and reciept exit code is non-zero + // User should check for message execution manually if this method returns a + // "Timeout waiting for withdrawl message" error. + WithdrawBalance(ctx context.Context, amount abi.TokenAmount, confidence uint64) (cid.Cid, error) //perm:admin + MiningBase(context.Context) (*types.TipSet, error) //perm:read ComputeWindowPoSt(ctx context.Context, dlIdx uint64, tsk types.TipSetKey) ([]miner.SubmitWindowedPoStParams, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 401a37ec2..37e123105 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -880,6 +880,8 @@ type StorageMinerStruct struct { StorageTryLock func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) (bool, error) `perm:"admin"` + WithdrawBalance func(p0 context.Context, p1 abi.TokenAmount, p2 uint64) (cid.Cid, error) `perm:"admin"` + WorkerConnect func(p0 context.Context, p1 string) error `perm:"admin"` WorkerJobs func(p0 context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) `perm:"admin"` @@ -5186,6 +5188,17 @@ func (s *StorageMinerStub) StorageTryLock(p0 context.Context, p1 abi.SectorID, p return false, ErrNotSupported } +func (s *StorageMinerStruct) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount, p2 uint64) (cid.Cid, error) { + if s.Internal.WithdrawBalance == nil { + return *new(cid.Cid), ErrNotSupported + } + return s.Internal.WithdrawBalance(p0, p1, p2) +} + +func (s *StorageMinerStub) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount, p2 uint64) (cid.Cid, error) { + return *new(cid.Cid), ErrNotSupported +} + func (s *StorageMinerStruct) WorkerConnect(p0 context.Context, p1 string) error { if s.Internal.WorkerConnect == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8ff1c06f49e820c252d2fdfa2b178936125e60b0..397c8a4dde825decb89389047e04c2eec3e327ee 100644 GIT binary patch delta 27239 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%0AJ#}`9lB9mVJ16Hth8)qu! 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 delta 27185 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 W|B_zGe*Yf;0RR6Pr#2sYbp-%-=D3Xj diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index e91b9161da5aaeccd7ee95dbdb60ff35af281b73..3e1b629d93560aef26c9cbdac0ed021156ab2c6e 100644 GIT binary patch delta 2886 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0eca81421af2b1f2f98bba3d75c83fc6edbe9a23..fa7047adff16583f293d944e6819a0fb0d024d45 100644 GIT binary patch delta 13824 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 CGUes~ delta 13535 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 Z*grHLA8#K2UjP6A|NnB^Q1oHL0su+cbSeM< diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 4a724cbe9ccc7a271d529efa3654984da858be2a..1ec87a2c833940c29211ea578b58bd855ae3d93d 100644 GIT binary patch delta 3798 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 M|M~BnPb(S$0LtWwTL1t6 delta 3799 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 N|NrJnl`$(C0RZ(as^I_t diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index 945f6e185..ca8e3e703 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -218,6 +218,17 @@ var actorWithdrawCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { + amount := abi.NewTokenAmount(0) + + if cctx.Args().Present() { + f, err := types.ParseFIL(cctx.Args().First()) + if err != nil { + return xerrors.Errorf("parsing 'amount' argument: %w", err) + } + + amount = abi.TokenAmount(f) + } + nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err @@ -232,77 +243,24 @@ var actorWithdrawCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - maddr, err := nodeApi.ActorAddress(ctx) + res, err := nodeApi.WithdrawBalance(ctx, amount, uint64(cctx.Int("confidence"))) if err != nil { return err } - mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + msg, err := api.StateSearchMsg(ctx, res) if err != nil { return err } - available, err := api.StateMinerAvailableBalance(ctx, maddr, types.EmptyTSK) - if err != nil { - return err - } - - amount := available - if cctx.Args().Present() { - f, err := types.ParseFIL(cctx.Args().First()) - if err != nil { - return xerrors.Errorf("parsing 'amount' argument: %w", err) - } - - amount = abi.TokenAmount(f) - - if amount.GreaterThan(available) { - return xerrors.Errorf("can't withdraw more funds than available; requested: %s; available: %s", types.FIL(amount), types.FIL(available)) - } - } - - params, err := actors.SerializeParams(&miner.WithdrawBalanceParams{ - AmountRequested: amount, // Default to attempting to withdraw all the extra funds in the miner actor - }) - if err != nil { - return err - } - - smsg, err := api.MpoolPushMessage(ctx, &types.Message{ - To: maddr, - From: mi.Owner, - Value: types.NewInt(0), - Method: builtin.MethodsMiner.WithdrawBalance, - Params: params, - }, nil) - if err != nil { - return err - } - - fmt.Printf("Requested rewards withdrawal in message %s\n", smsg.Cid()) - - // wait for it to get mined into a block - fmt.Printf("waiting for %d epochs for confirmation..\n", uint64(cctx.Int("confidence"))) - - wait, err := api.StateWaitMsg(ctx, smsg.Cid(), uint64(cctx.Int("confidence"))) - if err != nil { - return err - } - - // check it executed successfully - if wait.Receipt.ExitCode != 0 { - fmt.Println(cctx.App.Writer, "withdrawal failed!") - return err - } - - nv, err := api.StateNetworkVersion(ctx, wait.TipSet) + nv, err := api.StateNetworkVersion(ctx, msg.TipSet) if err != nil { return err } if nv >= network.Version14 { var withdrawn abi.TokenAmount - if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { + if err := withdrawn.UnmarshalCBOR(bytes.NewReader(msg.Receipt.Return)); err != nil { return err } diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 2c781f5b0..5e4060296 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -170,6 +170,8 @@ * [StorageReportHealth](#StorageReportHealth) * [StorageStat](#StorageStat) * [StorageTryLock](#StorageTryLock) +* [Withdraw](#Withdraw) + * [WithdrawBalance](#WithdrawBalance) * [Worker](#Worker) * [WorkerConnect](#WorkerConnect) * [WorkerJobs](#WorkerJobs) @@ -3662,6 +3664,34 @@ Inputs: Response: `true` +## Withdraw + + +### WithdrawBalance +WithdrawBalance allows to withdraw balance from miner actor to owner address +Specify amount as "0" to withdraw full balance. This method returns a message CID +even when StateWaitMessage() fails and reciept exit code is non-zero +User should check for message execution manually if this method returns a +"Timeout waiting for withdrawl message" error. + + +Perms: admin + +Inputs: +```json +[ + "0", + 42 +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + ## Worker diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 3b4e1e23e..9a9228331 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -32,12 +32,15 @@ import ( filmktsstore "github.com/filecoin-project/go-fil-markets/stores" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/big" + builtintypes "github.com/filecoin-project/go-state-types/builtin" minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/types" @@ -1279,3 +1282,53 @@ func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.Exten func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubsystems, err error) { return sm.EnabledSubsystems, nil } + +func (sm *StorageMinerAPI) WithdrawBalance(ctx context.Context, amount abi.TokenAmount, confidence uint64) (cid.Cid, error) { + available, err := sm.Full.StateMinerAvailableBalance(ctx, sm.Miner.Address(), types.EmptyTSK) + if err != nil { + return cid.Undef, xerrors.Errorf("Error getting miner balance: %w", err) + } + + if amount.GreaterThan(available) { + return cid.Undef, xerrors.Errorf("can't withdraw more funds than available; requested: %s; available: %s", types.FIL(amount), types.FIL(available)) + } + + if amount.Equals(big.Zero()) { + amount = available + } + + params, err := actors.SerializeParams(&minertypes.WithdrawBalanceParams{ + AmountRequested: amount, // Default to attempting to withdraw all the extra funds in the miner actor + }) + if err != nil { + return cid.Undef, err + } + + mi, err := sm.Full.StateMinerInfo(ctx, sm.Miner.Address(), types.EmptyTSK) + if err != nil { + return cid.Undef, xerrors.Errorf("Error getting miner's owner address: %w", err) + } + + smsg, err := sm.Full.MpoolPushMessage(ctx, &types.Message{ + To: sm.Miner.Address(), + From: mi.Owner, + Value: types.NewInt(0), + Method: builtintypes.MethodsMiner.WithdrawBalance, + Params: params, + }, nil) + if err != nil { + return cid.Undef, err + } + + // wait for it to get mined into a block + wait, err := sm.Full.StateWaitMsg(ctx, smsg.Cid(), confidence, abi.ChainEpoch(2), true) + if err != nil { + return smsg.Cid(), xerrors.Errorf("Timeout waiting for withdrawl message") + } + + if wait.Receipt.ExitCode != 0 { + return wait.Message, xerrors.Errorf("Failed to execute withdrawl message: %w", err) + } + + return wait.Message, nil +} From 498334e86001487849c5e17ca8bed9120a8d2525 Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Fri, 29 Jul 2022 20:18:10 +0530 Subject: [PATCH 08/31] fix spelling mistakes --- api/api_storage.go | 4 ++-- node/impl/storminer.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 242685109..f42ab6327 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -50,9 +50,9 @@ type StorageMiner interface { // WithdrawBalance allows to withdraw balance from miner actor to owner address // Specify amount as "0" to withdraw full balance. This method returns a message CID - // even when StateWaitMessage() fails and reciept exit code is non-zero + // even when StateWaitMessage() fails and receipt exit code is non-zero // User should check for message execution manually if this method returns a - // "Timeout waiting for withdrawl message" error. + // "Timeout waiting for withdrawal message" error. WithdrawBalance(ctx context.Context, amount abi.TokenAmount, confidence uint64) (cid.Cid, error) //perm:admin MiningBase(context.Context) (*types.TipSet, error) //perm:read diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 9a9228331..1be2e9cca 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -1323,11 +1323,11 @@ func (sm *StorageMinerAPI) WithdrawBalance(ctx context.Context, amount abi.Token // wait for it to get mined into a block wait, err := sm.Full.StateWaitMsg(ctx, smsg.Cid(), confidence, abi.ChainEpoch(2), true) if err != nil { - return smsg.Cid(), xerrors.Errorf("Timeout waiting for withdrawl message") + return smsg.Cid(), xerrors.Errorf("Timeout waiting for withdrawal message") } if wait.Receipt.ExitCode != 0 { - return wait.Message, xerrors.Errorf("Failed to execute withdrawl message: %w", err) + return wait.Message, xerrors.Errorf("Failed to execute withdrawal message: %w", err) } return wait.Message, nil From 9e9a3825aa06196f05ed3cdcf74c6a27c17bfeae Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Fri, 29 Jul 2022 20:32:05 +0530 Subject: [PATCH 09/31] rerun make gen --- build/openrpc/miner.json.gz | Bin 14527 -> 14527 bytes documentation/en/api-v0-methods-miner.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index fa7047adff16583f293d944e6819a0fb0d024d45..a05e0ac52038e289837dbb82edc0f61e383183db 100644 GIT binary patch delta 1649 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 diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 5e4060296..581f8fb0d 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3670,9 +3670,9 @@ Response: `true` ### WithdrawBalance WithdrawBalance allows to withdraw balance from miner actor to owner address Specify amount as "0" to withdraw full balance. This method returns a message CID -even when StateWaitMessage() fails and reciept exit code is non-zero +even when StateWaitMessage() fails and receipt exit code is non-zero User should check for message execution manually if this method returns a -"Timeout waiting for withdrawl message" error. +"Timeout waiting for withdrawal message" error. Perms: admin From dfea74cca853483634d17493ef1460afbfb81d52 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Fri, 29 Jul 2022 18:33:30 -0400 Subject: [PATCH 10/31] Add stop cmd for lotus worker --- api/api_worker.go | 4 +++ api/proxy_gen.go | 13 ++++++++++ cmd/lotus-worker/main.go | 31 +++++++++++++++++++++++ cmd/lotus-worker/sealworker/rpc.go | 4 +++ documentation/en/api-v0-methods-worker.md | 11 ++++++++ storage/sealer/worker_local.go | 4 +++ 6 files changed, 67 insertions(+) diff --git a/api/api_worker.go b/api/api_worker.go index 17dac8e3d..18c06ecb9 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -76,6 +76,10 @@ type Worker interface { // Like ProcessSession, but returns an error when worker is disabled Session(context.Context) (uuid.UUID, error) //perm:admin + + // Trigger shutdown + Shutdown(context.Context) error //perm:admin + } var _ storiface.WorkerCalls = *new(Worker) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 401a37ec2..2c80a6315 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -965,6 +965,8 @@ type WorkerStruct struct { SetEnabled func(p0 context.Context, p1 bool) error `perm:"admin"` + Shutdown func(p0 context.Context) error `perm:"admin"` + StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` TaskDisable func(p0 context.Context, p1 sealtasks.TaskType) error `perm:"admin"` @@ -5560,6 +5562,17 @@ func (s *WorkerStub) SetEnabled(p0 context.Context, p1 bool) error { return ErrNotSupported } +func (s *WorkerStruct) Shutdown(p0 context.Context) error { + if s.Internal.Shutdown == nil { + return ErrNotSupported + } + return s.Internal.Shutdown(p0) +} + +func (s *WorkerStub) Shutdown(p0 context.Context) error { + return ErrNotSupported +} + func (s *WorkerStruct) StorageAddLocal(p0 context.Context, p1 string) error { if s.Internal.StorageAddLocal == nil { return ErrNotSupported diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index 41a59f6b4..56555c152 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -55,6 +55,7 @@ func main() { local := []*cli.Command{ runCmd, + stopCmd, infoCmd, storageCmd, setCmd, @@ -115,6 +116,27 @@ func main() { } } +var stopCmd = &cli.Command{ + Name: "stop", + Usage: "Stop a running lotus worker", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetWorkerAPI(cctx) + if err != nil { + return err + } + defer closer() + + ctx := lcli.ReqContext(cctx) + err = api.Shutdown(ctx) + if err != nil { + return err + } + + return nil + }, +} + var runCmd = &cli.Command{ Name: "run", Usage: "Start lotus worker", @@ -623,6 +645,15 @@ var runCmd = &cli.Command{ } }() + go func() { + <-workerApi.Done() + log.Warn("Shutting down...") + if err := srv.Shutdown(context.TODO()); err != nil { + log.Errorf("shutting down RPC server failed: %s", err) + } + log.Warn("Graceful shutdown successful") + }() + return srv.Serve(nl) }, } diff --git a/cmd/lotus-worker/sealworker/rpc.go b/cmd/lotus-worker/sealworker/rpc.go index 120d6c04e..605f8a532 100644 --- a/cmd/lotus-worker/sealworker/rpc.go +++ b/cmd/lotus-worker/sealworker/rpc.go @@ -118,4 +118,8 @@ func (w *Worker) Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) return build.OpenRPCDiscoverJSON_Worker(), nil } +func (w *Worker) Shutdown(ctx context.Context) error { + return w.LocalWorker.Close() +} + var _ storiface.WorkerCalls = &Worker{} diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index f13562099..07f182a95 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -6,6 +6,7 @@ * [Paths](#Paths) * [Remove](#Remove) * [Session](#Session) + * [Shutdown](#Shutdown) * [Version](#Version) * [Add](#Add) * [AddPiece](#AddPiece) @@ -1453,6 +1454,16 @@ Inputs: `null` Response: `"07070707-0707-0707-0707-070707070707"` +### Shutdown +Trigger shutdown + + +Perms: admin + +Inputs: `null` + +Response: `{}` + ### Version diff --git a/storage/sealer/worker_local.go b/storage/sealer/worker_local.go index 78d4c3e5a..fdedbe131 100644 --- a/storage/sealer/worker_local.go +++ b/storage/sealer/worker_local.go @@ -829,6 +829,10 @@ func (l *LocalWorker) Close() error { return nil } +func (l *LocalWorker) Done() <-chan struct{} { + return l.closing +} + // WaitQuiet blocks as long as there are tasks running func (l *LocalWorker) WaitQuiet() { l.running.Wait() From e9705c4e26c0d4c345c748dba9bf634ad7b98294 Mon Sep 17 00:00:00 2001 From: LexLuthr <88259624+LexLuthr@users.noreply.github.com> Date: Sat, 30 Jul 2022 17:16:50 +0530 Subject: [PATCH 11/31] remove comment pointed out in review --- node/impl/storminer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 1be2e9cca..e4a908fa9 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -1298,7 +1298,7 @@ func (sm *StorageMinerAPI) WithdrawBalance(ctx context.Context, amount abi.Token } params, err := actors.SerializeParams(&minertypes.WithdrawBalanceParams{ - AmountRequested: amount, // Default to attempting to withdraw all the extra funds in the miner actor + AmountRequested: amount, }) if err != nil { return cid.Undef, err From e7bace9341913f92d1df49f111292bc9dfeef5ee Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Mon, 1 Aug 2022 11:36:34 -0400 Subject: [PATCH 12/31] Update API docs --- build/openrpc/full.json.gz | Bin 28036 -> 28040 bytes build/openrpc/gateway.json.gz | Bin 4893 -> 4894 bytes build/openrpc/miner.json.gz | Bin 14241 -> 14241 bytes build/openrpc/worker.json.gz | Bin 4764 -> 4802 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8ff1c06f49e820c252d2fdfa2b178936125e60b0..397c8a4dde825decb89389047e04c2eec3e327ee 100644 GIT binary patch delta 27239 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%0AJ#}`9lB9mVJ16Hth8)qu! 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 delta 27185 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 W|B_zGe*Yf;0RR6Pr#2sYbp-%-=D3Xj diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index e91b9161da5aaeccd7ee95dbdb60ff35af281b73..3e1b629d93560aef26c9cbdac0ed021156ab2c6e 100644 GIT binary patch delta 2886 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0eca81421af2b1f2f98bba3d75c83fc6edbe9a23..ecdae43d9efbdb31fd9dbc6c22bf70216a33c263 100644 GIT binary patch delta 8634 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

kId(MGQS@EjV{@46cW z8jYh|e@4juN!?rIN(i0hJ88YD^{UpZTCZxoy2E;Pl9Q(+b-@S3M6yCttt!5+rBfSe zP|-~{`ZK`zNiH?k8d7V>G7YI^f3=p?zO0_+B*gfV3lnJLztIJ9Y-~b#uT~q`t%COi zvRu_|N3uOko1=k&=?E#gVHD(9=oxq66BdVm%y#mgicYYk98a z`7X)xSx%Oo6k#6`K`vyz2>TU1d~oSn)J|^3SvL|riM^KLT83*Gu4VWR$?$1ECkai;uXC5) zCEdzdfm2CrZr35x=oBm3`#>S)-oI; zhCtT}Oov}+1-7FKOh;U3-Swh%*Q~IX!KJwA7Im`;ivTs&V5qCDSOls&WtJG9)@NFu z?W8_KdQYbH+RN8#hlMpA65_h;wk!hFP_IdObd0SQ`Cmyyf3~31^d?O!wH;Mz5&u-A zldjM5`0PL9*oLRK&`zkdTK4HQ+ zO`6ZaUtDHJHMc%N_ZBfPU5(*6Jy1K!al@R70sh>+ol}=JVzxMdsOfC<>YGnJb7uZkadFLvW?6Me}Ux5ojIlUYw!wlfx!9l+hdWE zPeWCUAA;>V8eM^Ez8uP6U~Se8SJV<1@Z@{IDaP8^$ORsQ40U$z-_xY%s`w+eL>a7- z?td>JTFYPPl6QAQi*B(h4$Ds}CWUmzv1)09}AN;@r5A5G=qbfWmIUtTUEO&uTsg zG_iVPTyuD%FoLzZtH_1ZoYX^~(EPj6ujpIy(1s1;aEkcwGjX70A=&y8|BX^-iYJgk zahfO^oFHhQk_CMYUdeubUo1StigjfMpMouMe;jJ9{jhr2-GVYWgp=NNSFe*x~XZ3{`^B2I-pKwY_? z=Ay%YYg6+U@Ey7h*3?DUB(PTUt%3mB)>OtE`-A3EZkz+&z{(ZZDAQvw% zvUu0QOdQ)75oR12i~e9Z8XG<1+@*Ke;yb43*%_Q8TMqYU|FLKMijWf>UJ4?p zw%j4y^?jj(EjX~e3aUiswS&0glNvH4AEczx}7w?VL3*-Rq%^wwl<0idaMg0 zPLfryRkKIkUX$D$9!>-sF@-lH%S<&$wI0FLn-UeONfyoyua}UpPZOV@vUB5xAx%bc zq+Zr>1s?Vc|2rYQYs#<6>NAxZ--L194mW#{K8IS}(WKIyV8 zWA_~3-SB@t=4ApQ4=ry?=O#sL`Q12mHFutkXS1_BC71+FSz#KLcj-G*+Bg#>i2T!n z*pb!^CKYbA2tbyc7Np=dav_Ge=lc%*UjUN@1$5Eb`MF{U%5#Kln@SfT_|C4Q!LVO) zEYJb#zBH~mEVCghE(L$XyliL5svi+MqvmbH+KEXR>U`(4j1WyL7{dY70#jHCx`_!K z8^Km;q$&|D)xtrmDh7*e8x{J?&B7cEN1R1O0Lsyqey`sf^!mO2P0zSM&@zs`40|K~ zpx3{7tQ%13Bhjp+k?g+f`Uz|J^;80!^o%to(T}v$h~{l)OuP?Rj;X(3&owT!r29v!m7g?kB4>;c_4Ur(yFjf24%DYvh?! zWohG$1sQzfK(;bU*fpg^Um8n{inFQDsCnCxBW}An(QO_C!*S>+{KX&6lLfx$Q?Vc9 zRP6g1hK`9jn+(RqX{i^83zT0Fv{|c46md9}!v}w(2l7J+q+CqKJL^bXrtp7~dPzIx zfvPCH;!9QavLFTp4|bK}-!l~Vs?^jQdG|>Kxat}Ls9g<#)&-xn_&%EqCdFyaetnI` zVw-kT)yX3nohtHP`|AsOxirY`GO(jO8T>(igIQpBASfUbzo#ckn)l zZEt_#U(G44;{5i}QOiKNF7>5eG)BF%*E@T?vyYUZALjZTv9G%-au0IS2LGh)Epm@3 zA)Eo4NZbU3#&uN_P}*+f({(I&T)U8hxIBn6}wqYyW@q=hWeE_+^nP5rHo`Rx9bF)&?svrmY>Y zm0+wqY%Bk!igkh(GwbjW4)>11y_m>urT77Ms{xIl~kV%DD`gkrakltsYy`+j7M zaWL)A26Ncon-1pI-gp8hdvmit+k=b#WHB&@Q#7%Xv7rSJub_9!r3Hfao4fuS&QpKl zwz@am{wAjbRfR%?)KL9mzug>MNX*}i1$EbuleGmI+GBW) zR5u_>CTVcH?hD&p5BoWJ8B#W0GRS}0=r{3w6$O_T%HqRv1t*$S)^N&B8fds+R8OGd zlqi>|xV&$=Q*qyn;L_)`lIR(yOF~_Afjqi#&6r$>J^5yQLhJL@gNIFM8%M)~@$BH> zus=NRG#$^x!^?Z<7)OKQY&JgZ4`#DjKYW~Re|-MgGmd|zaXyvM|%_fBxrY2O!LpU|4}NgMVBBJgYS!N>E@pBc9C z-@(23qRlyUp=~1@duzp`kLRC-0)7WQr0U_A5_99a;_hm$(FZA1W~13`+D~E=KI;&n zct2^JhAEr|{e#iLcrY7|6KH=8ri1=;FgzGdJH;&Ot*^vxl)`Q_91e!V$@pN{Pomc! z^$!k*gUO&ju7u#88pCM@!&q{z62ox{!|8ZD98da(<8cbZ1i^QS;dFK|I2<2L#o8z^ zoa_z*Om~n04tAOWW;@RShda&ykG;5NAebz*YG|e!wm&^})j=Mw#vXq^r!IJ6^t2-A zR1rKsxu=Eyj*)v>^6wP6KlVb;8MG`%TqNCGFPE`c{&EOH^NV3-BydpH>1p zMfGVFutQWIQvm+C$)JB*1(134+zOy7LQk&%s$y1C0qhiV9T@-HL#{go(3UM{C!?E?|4eb+8B67IIkyFw{<;ALTqCM6chmv$3o5fMI{!AM_8$)5%ny2ka69 zypZ#NXJde>=K;^f05P>-K?Y51X}^&63u(WQ_6uph&=2Mp5*L3SsHFd(Kb}nvrm0o- zpLMu@QS11$0(f3*vZDVvvB|oCo)ep_&*wR@NlWwR#U?G#pBI~~D1T0DvM!zH#3t** zc|L4n(m6_a=-6@pLs;mu{$$jj2Aj04n<^2-lu7Jqe=t0pjE949(uzv#+PcTBq5vQE zhm*tpY&@K$CT@RpFdoegC!_H}*S1OldfGm(WuNa1&8Ox2PSJcu-0u?2E9HM1zr6y@ z97obKDuBuuZP|0*2DQ3pw~>P~2fdEHf;Ig#d5+b@^C!fwJ5|u0{JYi#osfSAe)}zw zf5zh9G4f9txG_(&Duq9r2o3jJI3pbrwBX{Vq=eRQbL_jHu7Q&g`*eOm7n z5}O3A1+*5>T0m<7tp$ECEwCY;f5);G|2mpTM-yq`ucL`xbTrZ9qhBM~Gmgl{wtL2V z0_S#A;MaezQu+z|IQT!|SMl?svynAP`#s}W{4M_E0FUX0Fdyn;NkQ!zb(Vu(suWrd zhZ2@Q4sNY@jG_K5`(aS@wX^!(=~A&Ogc7go%!nxbT4g>y`Ypq{;Tc5Jb-okjYb#v| z71Xb-(YWe;PqC7@6)&BN)xOOqzHaC;#d8&xBf(PQ3PMaVY{g5t>L8I8D)qk+Qm4{q zb*86EUH4{Bl0vKo*$Ej~rF~rd71CD+b^BH0^W}MUM(^%Q%3ZDgJ{TB}k2jD1F8~1l M|3z7LyV%?a;NeVdw-hc#N%PdM5#* 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 O0RR7T+fejj!vX-&-1D{o diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 4a724cbe9ccc7a271d529efa3654984da858be2a..87f6da985401a9120b4dcc0214f2783d306e7dbc 100644 GIT binary patch literal 4802 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 Date: Mon, 1 Aug 2022 23:41:24 +0530 Subject: [PATCH 13/31] don't wait for msg to land on chain --- api/api_storage.go | 6 ++---- api/proxy_gen.go | 8 ++++---- build/openrpc/miner.json.gz | Bin 14527 -> 14424 bytes cmd/lotus-miner/actor.go | 15 ++++++++++----- documentation/en/api-v0-methods-miner.md | 7 ++----- node/impl/storminer.go | 14 ++------------ 6 files changed, 20 insertions(+), 30 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index f42ab6327..7bfb6eccd 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -50,10 +50,8 @@ type StorageMiner interface { // WithdrawBalance allows to withdraw balance from miner actor to owner address // Specify amount as "0" to withdraw full balance. This method returns a message CID - // even when StateWaitMessage() fails and receipt exit code is non-zero - // User should check for message execution manually if this method returns a - // "Timeout waiting for withdrawal message" error. - WithdrawBalance(ctx context.Context, amount abi.TokenAmount, confidence uint64) (cid.Cid, error) //perm:admin + // and does not wait for message execution + WithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) //perm:admin MiningBase(context.Context) (*types.TipSet, error) //perm:read diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 37e123105..52c01693d 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -880,7 +880,7 @@ type StorageMinerStruct struct { StorageTryLock func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) (bool, error) `perm:"admin"` - WithdrawBalance func(p0 context.Context, p1 abi.TokenAmount, p2 uint64) (cid.Cid, error) `perm:"admin"` + WithdrawBalance func(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) `perm:"admin"` WorkerConnect func(p0 context.Context, p1 string) error `perm:"admin"` @@ -5188,14 +5188,14 @@ func (s *StorageMinerStub) StorageTryLock(p0 context.Context, p1 abi.SectorID, p return false, ErrNotSupported } -func (s *StorageMinerStruct) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount, p2 uint64) (cid.Cid, error) { +func (s *StorageMinerStruct) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { if s.Internal.WithdrawBalance == nil { return *new(cid.Cid), ErrNotSupported } - return s.Internal.WithdrawBalance(p0, p1, p2) + return s.Internal.WithdrawBalance(p0, p1) } -func (s *StorageMinerStub) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount, p2 uint64) (cid.Cid, error) { +func (s *StorageMinerStub) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { return *new(cid.Cid), ErrNotSupported } diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index a05e0ac52038e289837dbb82edc0f61e383183db..3c54c65d1505f2507147231f88ecc73f796349ec 100644 GIT binary patch delta 14202 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 Q0ssL2|L9ec2!qH105a^b(EtDd delta 14321 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 fw|6P>u2z5V_l?KLo5%kP009607MDd*= network.Version14 { var withdrawn abi.TokenAmount - if err := withdrawn.UnmarshalCBOR(bytes.NewReader(msg.Receipt.Return)); err != nil { + if err := withdrawn.UnmarshalCBOR(bytes.NewReader(wait.Receipt.Return)); err != nil { return err } diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 581f8fb0d..73aab2168 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3670,9 +3670,7 @@ Response: `true` ### WithdrawBalance WithdrawBalance allows to withdraw balance from miner actor to owner address Specify amount as "0" to withdraw full balance. This method returns a message CID -even when StateWaitMessage() fails and receipt exit code is non-zero -User should check for message execution manually if this method returns a -"Timeout waiting for withdrawal message" error. +and does not wait for message execution Perms: admin @@ -3680,8 +3678,7 @@ Perms: admin Inputs: ```json [ - "0", - 42 + "0" ] ``` diff --git a/node/impl/storminer.go b/node/impl/storminer.go index e4a908fa9..f1cd3a62c 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -1283,7 +1283,7 @@ func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubs return sm.EnabledSubsystems, nil } -func (sm *StorageMinerAPI) WithdrawBalance(ctx context.Context, amount abi.TokenAmount, confidence uint64) (cid.Cid, error) { +func (sm *StorageMinerAPI) WithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) { available, err := sm.Full.StateMinerAvailableBalance(ctx, sm.Miner.Address(), types.EmptyTSK) if err != nil { return cid.Undef, xerrors.Errorf("Error getting miner balance: %w", err) @@ -1320,15 +1320,5 @@ func (sm *StorageMinerAPI) WithdrawBalance(ctx context.Context, amount abi.Token return cid.Undef, err } - // wait for it to get mined into a block - wait, err := sm.Full.StateWaitMsg(ctx, smsg.Cid(), confidence, abi.ChainEpoch(2), true) - if err != nil { - return smsg.Cid(), xerrors.Errorf("Timeout waiting for withdrawal message") - } - - if wait.Receipt.ExitCode != 0 { - return wait.Message, xerrors.Errorf("Failed to execute withdrawal message: %w", err) - } - - return wait.Message, nil + return smsg.Cid(), nil } From 9d65b56d2edf45946d9aea611028eea2313b3d81 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Mon, 1 Aug 2022 14:20:01 -0400 Subject: [PATCH 14/31] Add cli docs for lotus worker stop cmd --- documentation/en/cli-lotus-worker.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 6fa6fd25f..bb36b1460 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -11,6 +11,7 @@ VERSION: COMMANDS: run Start lotus worker + stop Stop a running lotus worker info Print worker info storage manage sector storage set Manage worker settings @@ -58,6 +59,19 @@ OPTIONS: ``` +## lotus-worker stop +``` +NAME: + lotus-worker stop - Stop a running lotus worker + +USAGE: + lotus-worker stop [command options] [arguments...] + +OPTIONS: + --help, -h show help (default: false) + +``` + ## lotus-worker info ``` NAME: From f5a7a650e7b10851887d8972820044d92c1a98ed Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Tue, 2 Aug 2022 13:04:54 +0530 Subject: [PATCH 15/31] rename to ActorWithdrawBalance --- api/api_storage.go | 2 +- api/proxy_gen.go | 26 ++++++------ build/openrpc/miner.json.gz | Bin 14424 -> 14411 bytes cmd/lotus-miner/actor.go | 2 +- documentation/en/api-v0-methods-miner.md | 50 +++++++++++------------ node/impl/storminer.go | 2 +- 6 files changed, 39 insertions(+), 43 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 7bfb6eccd..4379031b0 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -51,7 +51,7 @@ type StorageMiner interface { // WithdrawBalance allows to withdraw balance from miner actor to owner address // Specify amount as "0" to withdraw full balance. This method returns a message CID // and does not wait for message execution - WithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) //perm:admin + ActorWithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) //perm:admin MiningBase(context.Context) (*types.TipSet, error) //perm:read diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 52c01693d..ec532866f 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -656,6 +656,8 @@ type StorageMinerStruct struct { ActorSectorSize func(p0 context.Context, p1 address.Address) (abi.SectorSize, error) `perm:"read"` + ActorWithdrawBalance func(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) `perm:"admin"` + CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` ComputeDataCid func(p0 context.Context, p1 abi.UnpaddedPieceSize, p2 storiface.Data) (abi.PieceInfo, error) `perm:"admin"` @@ -880,8 +882,6 @@ type StorageMinerStruct struct { StorageTryLock func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) (bool, error) `perm:"admin"` - WithdrawBalance func(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) `perm:"admin"` - WorkerConnect func(p0 context.Context, p1 string) error `perm:"admin"` WorkerJobs func(p0 context.Context) (map[uuid.UUID][]storiface.WorkerJob, error) `perm:"admin"` @@ -3956,6 +3956,17 @@ func (s *StorageMinerStub) ActorSectorSize(p0 context.Context, p1 address.Addres return *new(abi.SectorSize), ErrNotSupported } +func (s *StorageMinerStruct) ActorWithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { + if s.Internal.ActorWithdrawBalance == nil { + return *new(cid.Cid), ErrNotSupported + } + return s.Internal.ActorWithdrawBalance(p0, p1) +} + +func (s *StorageMinerStub) ActorWithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { + return *new(cid.Cid), ErrNotSupported +} + func (s *StorageMinerStruct) CheckProvable(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storiface.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) { if s.Internal.CheckProvable == nil { return *new(map[abi.SectorNumber]string), ErrNotSupported @@ -5188,17 +5199,6 @@ func (s *StorageMinerStub) StorageTryLock(p0 context.Context, p1 abi.SectorID, p return false, ErrNotSupported } -func (s *StorageMinerStruct) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { - if s.Internal.WithdrawBalance == nil { - return *new(cid.Cid), ErrNotSupported - } - return s.Internal.WithdrawBalance(p0, p1) -} - -func (s *StorageMinerStub) WithdrawBalance(p0 context.Context, p1 abi.TokenAmount) (cid.Cid, error) { - return *new(cid.Cid), ErrNotSupported -} - func (s *StorageMinerStruct) WorkerConnect(p0 context.Context, p1 string) error { if s.Internal.WorkerConnect == nil { return ErrNotSupported diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 3c54c65d1505f2507147231f88ecc73f796349ec..da5cc51f89b305ab437c9b2da6f36831a70ef487 100644 GIT binary patch delta 14081 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 delta 14085 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 D>3eQR diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index 32fb066b9..3707f3f5b 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -243,7 +243,7 @@ var actorWithdrawCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - res, err := nodeApi.WithdrawBalance(ctx, amount) + res, err := nodeApi.ActorWithdrawBalance(ctx, amount) if err != nil { return err } diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 73aab2168..e24520b20 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -9,6 +9,7 @@ * [ActorAddress](#ActorAddress) * [ActorAddressConfig](#ActorAddressConfig) * [ActorSectorSize](#ActorSectorSize) + * [ActorWithdrawBalance](#ActorWithdrawBalance) * [Auth](#Auth) * [AuthNew](#AuthNew) * [AuthVerify](#AuthVerify) @@ -170,8 +171,6 @@ * [StorageReportHealth](#StorageReportHealth) * [StorageStat](#StorageStat) * [StorageTryLock](#StorageTryLock) -* [Withdraw](#Withdraw) - * [WithdrawBalance](#WithdrawBalance) * [Worker](#Worker) * [WorkerConnect](#WorkerConnect) * [WorkerJobs](#WorkerJobs) @@ -294,6 +293,28 @@ Inputs: Response: `34359738368` +### ActorWithdrawBalance +WithdrawBalance allows to withdraw balance from miner actor to owner address +Specify amount as "0" to withdraw full balance. This method returns a message CID +and does not wait for message execution + + +Perms: admin + +Inputs: +```json +[ + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + ## Auth @@ -3664,31 +3685,6 @@ Inputs: Response: `true` -## Withdraw - - -### WithdrawBalance -WithdrawBalance allows to withdraw balance from miner actor to owner address -Specify amount as "0" to withdraw full balance. This method returns a message CID -and does not wait for message execution - - -Perms: admin - -Inputs: -```json -[ - "0" -] -``` - -Response: -```json -{ - "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" -} -``` - ## Worker diff --git a/node/impl/storminer.go b/node/impl/storminer.go index f1cd3a62c..74b1dc776 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -1283,7 +1283,7 @@ func (sm *StorageMinerAPI) RuntimeSubsystems(context.Context) (res api.MinerSubs return sm.EnabledSubsystems, nil } -func (sm *StorageMinerAPI) WithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) { +func (sm *StorageMinerAPI) ActorWithdrawBalance(ctx context.Context, amount abi.TokenAmount) (cid.Cid, error) { available, err := sm.Full.StateMinerAvailableBalance(ctx, sm.Miner.Address(), types.EmptyTSK) if err != nil { return cid.Undef, xerrors.Errorf("Error getting miner balance: %w", err) From 65ba7bd37d6ac10618c5eaa01b2daf0091d2abd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Aug 2022 10:12:24 +0200 Subject: [PATCH 16/31] cli: clueanup deadlines command --- cmd/lotus-miner/proving.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index bec2c07ce..57d063282 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -247,7 +247,7 @@ var provingDeadlinesCmd = &cli.Command{ sectors := uint64(0) faults := uint64(0) - var PartitionSum int + var partitionCount int for _, partition := range partitions { if cctx.Bool("live") { @@ -257,7 +257,7 @@ var provingDeadlinesCmd = &cli.Command{ } if sc > 0 { - PartitionSum++ + partitionCount++ } sectors += sc @@ -267,7 +267,7 @@ var provingDeadlinesCmd = &cli.Command{ return err } - PartitionSum++ + partitionCount++ sectors += sc } @@ -283,7 +283,7 @@ var provingDeadlinesCmd = &cli.Command{ if di.Index == uint64(dlIdx) { cur += "\t(current)" } - _, _ = fmt.Fprintf(tw, "%d\t%d\t%d (%d)\t%d%s\n", dlIdx, PartitionSum, sectors, faults, provenPartitions, cur) + _, _ = fmt.Fprintf(tw, "%d\t%d\t%d (%d)\t%d%s\n", dlIdx, partitionCount, sectors, faults, provenPartitions, cur) } return tw.Flush() @@ -299,9 +299,6 @@ var provingDeadlineInfoCmd = &cli.Command{ Aliases: []string{"n"}, Usage: "Print sector/fault numbers belonging to this deadline", }, - }, - ArgsUsage: "", - Flags: []cli.Flag{ &cli.BoolFlag{ Name: "live", Usage: "View deadline live sectors", @@ -309,6 +306,7 @@ var provingDeadlineInfoCmd = &cli.Command{ Aliases: []string{"l"}, }, }, + ArgsUsage: "", Action: func(cctx *cli.Context) error { if cctx.Args().Len() != 1 { From 8c1d1bfd4af2499c0e39890307378b0a0abc6581 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Aug 2022 10:15:12 +0200 Subject: [PATCH 17/31] cli: show live sectors in the deadlines command by default --- cmd/lotus-miner/proving.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 57d063282..708dd4083 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -199,10 +199,9 @@ var provingDeadlinesCmd = &cli.Command{ Usage: "View the current proving period deadlines information", Flags: []cli.Flag{ &cli.BoolFlag{ - Name: "live", - Usage: "View live deadlines information", - Value: false, - Aliases: []string{"l"}, + Name: "all", + Usage: "Count all sectors (only live sectors are counted by default)", + Aliases: []string{"a"}, }, }, Action: func(cctx *cli.Context) error { @@ -250,7 +249,7 @@ var provingDeadlinesCmd = &cli.Command{ var partitionCount int for _, partition := range partitions { - if cctx.Bool("live") { + if !cctx.Bool("all") { sc, err := partition.LiveSectors.Count() if err != nil { return err From 4548cea0004a8f3f621895e699a091e0983696f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Aug 2022 10:40:34 +0200 Subject: [PATCH 18/31] cli: More verbose deadline command --- cmd/lotus-miner/proving.go | 83 ++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 34 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index 708dd4083..e2b89483a 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -1,10 +1,13 @@ package main import ( + "bytes" "encoding/json" "fmt" + "github.com/filecoin-project/go-bitfield" "os" "strconv" + "strings" "text/tabwriter" "time" @@ -298,12 +301,6 @@ var provingDeadlineInfoCmd = &cli.Command{ Aliases: []string{"n"}, Usage: "Print sector/fault numbers belonging to this deadline", }, - &cli.BoolFlag{ - Name: "live", - Usage: "View deadline live sectors", - Value: false, - Aliases: []string{"l"}, - }, }, ArgsUsage: "", Action: func(cctx *cli.Context) error { @@ -355,54 +352,72 @@ var provingDeadlineInfoCmd = &cli.Command{ fmt.Printf("Proven Partitions: %d\n", provenPartitions) fmt.Printf("Current: %t\n\n", di.Index == dlIdx) - var sectorCount uint64 - var sectorNumbers []uint64 - for pIdx, partition := range partitions { - if !cctx.Bool("live") { - sectorCount, err = partition.AllSectors.Count() + fmt.Printf("Partition Index: %d\n", pIdx) + + printStats := func(bf bitfield.BitField, name string) error { + count, err := bf.Count() if err != nil { return err } - sectorNumbers, err = partition.AllSectors.All(sectorCount) + rit, err := bf.RunIterator() if err != nil { return err } - } else { - sectorCount, err = partition.LiveSectors.Count() - if err != nil { - return err - } - - if sectorCount != 0 { - sectorNumbers, err = partition.LiveSectors.All(sectorCount) + var ones, zeros, oneRuns, zeroRuns, invalid uint64 + for rit.HasNext() { + r, err := rit.NextRun() if err != nil { - return err + return xerrors.Errorf("next run: %w", err) + } + if !r.Valid() { + invalid++ + } + if r.Val { + ones += r.Len + oneRuns++ + } else { + zeros += r.Len + zeroRuns++ } } + var buf bytes.Buffer + if err := bf.MarshalCBOR(&buf); err != nil { + return err + } + sz := len(buf.Bytes()) + szstr := types.SizeStr(types.NewInt(uint64(sz))) + + fmt.Printf("\t%s Sectors:%s%d (bitfield - runs %d+%d=%d - %d 0s %d 1s - %d inv - %s %dB)\n", name, strings.Repeat(" ", 18-len(name)), count, zeroRuns, oneRuns, zeroRuns+oneRuns, zeros, ones, invalid, szstr, sz) + + if cctx.Bool("sector-nums") { + nums, err := bf.All(count) + if err != nil { + return err + } + fmt.Printf("\t%s Sector Numbers:%s%v\n", name, strings.Repeat(" ", 12-len(name)), nums) + } + + return nil } - faultsCount, err := partition.FaultySectors.Count() - if err != nil { + if err := printStats(partition.AllSectors, "All"); err != nil { return err } - - fn, err := partition.FaultySectors.All(faultsCount) - if err != nil { + if err := printStats(partition.LiveSectors, "Live"); err != nil { return err } - - fmt.Printf("Partition Index: %d\n", pIdx) - fmt.Printf("\tSectors: %d\n", sectorCount) - if cctx.Bool("sector-nums") { - fmt.Printf("\tSector Numbers: %v\n", sectorNumbers) + if err := printStats(partition.ActiveSectors, "Active"); err != nil { + return err } - fmt.Printf("\tFaults: %d\n", faultsCount) - if cctx.Bool("sector-nums") { - fmt.Printf("\tFaulty Sectors: %d\n", fn) + if err := printStats(partition.FaultySectors, "Faulty"); err != nil { + return err + } + if err := printStats(partition.RecoveringSectors, "Recovering"); err != nil { + return err } } return nil From 9a5ca5017b0f1c9aac2e1f4cd0143b3d47f6a6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 2 Aug 2022 10:45:20 +0200 Subject: [PATCH 19/31] gen --- cmd/lotus-miner/proving.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index e2b89483a..c758176b0 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/filecoin-project/go-bitfield" "os" "strconv" "strings" @@ -16,6 +15,7 @@ import ( "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/lotus/blockstore" diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 2af074d0b..7b852a83b 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -2055,7 +2055,7 @@ USAGE: lotus-miner proving deadlines [command options] [arguments...] OPTIONS: - --help, -h show help (default: false) + --all, -a Count all sectors (only live sectors are counted by default) (default: false) ``` From 5f0ac7defb9f53d056ac0d0a895b58b9d7bf6508 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 2 Aug 2022 10:59:32 -0400 Subject: [PATCH 20/31] Wait 20s for worker shutdown so the miner can unregister the worker --- cmd/lotus-worker/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index 56555c152..f254943e3 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -647,6 +647,8 @@ var runCmd = &cli.Command{ go func() { <-workerApi.Done() + // Wait 20s to allow the miner to unregister the worker on next heartbeat + time.Sleep(20 * time.Second) log.Warn("Shutting down...") if err := srv.Shutdown(context.TODO()); err != nil { log.Errorf("shutting down RPC server failed: %s", err) From 31a09b73ccec773d2bdfc5cfbad6acd394ee518d Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 2 Aug 2022 16:40:39 -0400 Subject: [PATCH 21/31] Add lotus-shed cmd to get total active deal storage --- chain/actors/builtin/market/market.go | 4 +++ cmd/lotus-shed/market.go | 43 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/chain/actors/builtin/market/market.go b/chain/actors/builtin/market/market.go index 2540d71ca..8c0e4e91a 100644 --- a/chain/actors/builtin/market/market.go +++ b/chain/actors/builtin/market/market.go @@ -240,6 +240,10 @@ func GetDealFees(deal market8.DealProposal, height abi.ChainEpoch) (abi.TokenAmo return ef, big.Sub(tf, ef) } +func IsDealActive(state market8.DealState) bool { + return state.SectorStartEpoch > -1 && state.SlashEpoch == -1 +} + func labelFromGoString(s string) (market8.DealLabel, error) { if utf8.ValidString(s) { return market8.NewLabelFromString(s) diff --git a/cmd/lotus-shed/market.go b/cmd/lotus-shed/market.go index 29b2fb112..e12752552 100644 --- a/cmd/lotus-shed/market.go +++ b/cmd/lotus-shed/market.go @@ -32,6 +32,7 @@ var marketCmd = &cli.Command{ marketDealFeesCmd, marketExportDatastoreCmd, marketImportDatastoreCmd, + marketDealsTotalStorageCmd, }, } @@ -283,6 +284,48 @@ var marketImportDatastoreCmd = &cli.Command{ }, } +var marketDealsTotalStorageCmd = &cli.Command{ + Name: "get-deals-total-storage", + Usage: "View the total storage available in all active market deals", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + + ctx := lcli.ReqContext(cctx) + + ts, err := lcli.LoadTipSet(ctx, cctx, api) + if err != nil { + return err + } + + deals, err := api.StateMarketDeals(ctx, ts.Key()) + if err != nil { + return err + } + + total := big.Zero() + count := 0 + + for _, deal := range deals { + if market.IsDealActive(deal.State) { + dealStorage := big.NewIntUnsigned(uint64(deal.Proposal.PieceSize)) + total = big.Add(total, dealStorage) + count++ + } + + } + + fmt.Println("Total deals: ", count) + fmt.Println("Total storage: ", total) + + return nil + }, +} + func openLockedRepo(path string) (repo.LockedRepo, error) { // Open the repo at the repo path rpo, err := repo.NewFS(path) From 2f65a20d1608613aeb2c445e55acd41204e3b415 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Tue, 2 Aug 2022 18:54:42 -0400 Subject: [PATCH 22/31] Add IsDealActive func to template wq --- chain/actors/builtin/market/actor.go.template | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chain/actors/builtin/market/actor.go.template b/chain/actors/builtin/market/actor.go.template index a96c62e43..66298a18a 100644 --- a/chain/actors/builtin/market/actor.go.template +++ b/chain/actors/builtin/market/actor.go.template @@ -185,6 +185,10 @@ func GetDealFees(deal market{{.latestVersion}}.DealProposal, height abi.ChainEpo return ef, big.Sub(tf, ef) } +func IsDealActive(state market{{.latestVersion}}.DealState) bool { + return state.SectorStartEpoch > -1 && state.SlashEpoch == -1 +} + func labelFromGoString(s string) (market{{.latestVersion}}.DealLabel, error) { if utf8.ValidString(s) { return market{{.latestVersion}}.NewLabelFromString(s) From 4818d784325ee97bbd744ef281558540695f5328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Aug 2022 11:06:05 +0200 Subject: [PATCH 23/31] cli: Put bitfield stats in 'proving deadline' behind a flag --- cmd/lotus-miner/proving.go | 55 +++++++++++++++++------------ documentation/en/cli-lotus-miner.md | 1 + 2 files changed, 33 insertions(+), 23 deletions(-) diff --git a/cmd/lotus-miner/proving.go b/cmd/lotus-miner/proving.go index c758176b0..5ff49c25f 100644 --- a/cmd/lotus-miner/proving.go +++ b/cmd/lotus-miner/proving.go @@ -301,6 +301,11 @@ var provingDeadlineInfoCmd = &cli.Command{ Aliases: []string{"n"}, Usage: "Print sector/fault numbers belonging to this deadline", }, + &cli.BoolFlag{ + Name: "bitfield", + Aliases: []string{"b"}, + Usage: "Print partition bitfield stats", + }, }, ArgsUsage: "", Action: func(cctx *cli.Context) error { @@ -366,32 +371,36 @@ var provingDeadlineInfoCmd = &cli.Command{ return err } - var ones, zeros, oneRuns, zeroRuns, invalid uint64 - for rit.HasNext() { - r, err := rit.NextRun() - if err != nil { - return xerrors.Errorf("next run: %w", err) + if cctx.Bool("bitfield") { + var ones, zeros, oneRuns, zeroRuns, invalid uint64 + for rit.HasNext() { + r, err := rit.NextRun() + if err != nil { + return xerrors.Errorf("next run: %w", err) + } + if !r.Valid() { + invalid++ + } + if r.Val { + ones += r.Len + oneRuns++ + } else { + zeros += r.Len + zeroRuns++ + } } - if !r.Valid() { - invalid++ - } - if r.Val { - ones += r.Len - oneRuns++ - } else { - zeros += r.Len - zeroRuns++ - } - } - var buf bytes.Buffer - if err := bf.MarshalCBOR(&buf); err != nil { - return err - } - sz := len(buf.Bytes()) - szstr := types.SizeStr(types.NewInt(uint64(sz))) + var buf bytes.Buffer + if err := bf.MarshalCBOR(&buf); err != nil { + return err + } + sz := len(buf.Bytes()) + szstr := types.SizeStr(types.NewInt(uint64(sz))) - fmt.Printf("\t%s Sectors:%s%d (bitfield - runs %d+%d=%d - %d 0s %d 1s - %d inv - %s %dB)\n", name, strings.Repeat(" ", 18-len(name)), count, zeroRuns, oneRuns, zeroRuns+oneRuns, zeros, ones, invalid, szstr, sz) + fmt.Printf("\t%s Sectors:%s%d (bitfield - runs %d+%d=%d - %d 0s %d 1s - %d inv - %s %dB)\n", name, strings.Repeat(" ", 18-len(name)), count, zeroRuns, oneRuns, zeroRuns+oneRuns, zeros, ones, invalid, szstr, sz) + } else { + fmt.Printf("\t%s Sectors:%s%d\n", name, strings.Repeat(" ", 18-len(name)), count) + } if cctx.Bool("sector-nums") { nums, err := bf.All(count) diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 7b852a83b..883c66ae8 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -2068,6 +2068,7 @@ USAGE: lotus-miner proving deadline [command options] OPTIONS: + --bitfield, -b Print partition bitfield stats (default: false) --sector-nums, -n Print sector/fault numbers belonging to this deadline (default: false) ``` From 384b6433c029d09372abcbdd3ac000e4d93cb53b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Aug 2022 11:14:53 +0200 Subject: [PATCH 24/31] circle: Fix template --- .circleci/template.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/template.yml b/.circleci/template.yml index 150a360f2..a9f7fc54c 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -762,13 +762,16 @@ jobs: name: docker push command: | docker push filecoin/lotus:<< parameters.tag >> + docker push filecoin/lotus-gateway:<< parameters.tag >> docker push filecoin/lotus-all-in-one:<< parameters.tag >> if [["[[ ! -z $CIRCLE_SHA1 ]]"]]; then docker push filecoin/lotus:$CIRCLE_SHA1 + docker push filecoin/lotus-gateway:$CIRCLE_SHA1 docker push filecoin/lotus-all-in-one:$CIRCLE_SHA1 fi if [["[[ ! -z $CIRCLE_TAG ]]"]]; then docker push filecoin/lotus:$CIRCLE_TAG + docker push filecoin/lotus-gateway:$CIRCLE_TAG docker push filecoin/lotus-all-in-one:$CIRCLE_TAG fi From da33d82e1b53b63c5be4e1fa41b6a6ead5dc2704 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Aug 2022 12:54:32 +0200 Subject: [PATCH 25/31] feat: sealer: Custom worker name config --- cmd/lotus-worker/main.go | 7 ++++ documentation/en/cli-lotus-worker.md | 1 + .../en/default-lotus-miner-config.toml | 7 ++++ node/config/doc_gen.go | 7 ++++ node/config/storage.go | 2 + node/config/types.go | 4 ++ storage/sealer/manager.go | 3 ++ storage/sealer/worker_local.go | 40 ++++++++----------- 8 files changed, 48 insertions(+), 23 deletions(-) diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index f254943e3..73771ff6b 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -159,6 +159,12 @@ var runCmd = &cli.Command{ Usage: "don't use swap", Value: false, }, + &cli.StringFlag{ + Name: "name", + Usage: "custom worker name", + EnvVars: []string{"LOTUS_WORKER_NAME"}, + DefaultText: "hostname", + }, &cli.BoolFlag{ Name: "addpiece", Usage: "enable addpiece", @@ -513,6 +519,7 @@ var runCmd = &cli.Command{ NoSwap: cctx.Bool("no-swap"), MaxParallelChallengeReads: cctx.Int("post-parallel-reads"), ChallengeReadTimeout: cctx.Duration("post-read-timeout"), + Name: cctx.String("name"), }, remote, localStore, nodeApi, nodeApi, wsts), LocalStore: localStore, Storage: lr, diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index bb36b1460..2ef2da226 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -41,6 +41,7 @@ OPTIONS: --addpiece enable addpiece (default: true) --commit enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap) (default: true) --listen value host address and port the worker api will listen on (default: "0.0.0.0:3456") + --name value custom worker name (default: hostname) [$LOTUS_WORKER_NAME] --no-default disable all default compute tasks, use the worker for storage/fetching only (default: false) --no-local-storage don't use storageminer repo for sector storage (default: false) --no-swap don't use swap (default: false) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index f44e71ad8..786924904 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -622,6 +622,13 @@ # env var: LOTUS_STORAGE_ALLOWREGENSECTORKEY #AllowRegenSectorKey = true + # LocalWorkerName specifies a custom name for the builtin worker. + # If set to an empty string (default) os hostname will be used + # + # type: string + # env var: LOTUS_STORAGE_LOCALWORKERNAME + #LocalWorkerName = "" + # Assigner specifies the worker assigner to use when scheduling tasks. # "utilization" (default) - assign tasks to workers with lowest utilization. # "spread" - assign tasks to as many distinct workers as possible. diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 41aca47b9..65b0ee50c 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -844,6 +844,13 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b Comment: ``, }, + { + Name: "LocalWorkerName", + Type: "string", + + Comment: `LocalWorkerName specifies a custom name for the builtin worker. +If set to an empty string (default) os hostname will be used`, + }, { Name: "Assigner", Type: "string", diff --git a/node/config/storage.go b/node/config/storage.go index 99ca0df87..20f1791e6 100644 --- a/node/config/storage.go +++ b/node/config/storage.go @@ -65,6 +65,8 @@ func (c *StorageMiner) StorageManager() sealer.Config { ResourceFiltering: c.Storage.ResourceFiltering, DisallowRemoteFinalize: c.Storage.DisallowRemoteFinalize, + LocalWorkerName: c.Storage.LocalWorkerName, + Assigner: c.Storage.Assigner, ParallelCheckLimit: c.Proving.ParallelCheckLimit, diff --git a/node/config/types.go b/node/config/types.go index 320026063..725872186 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -401,6 +401,10 @@ type SealerConfig struct { AllowProveReplicaUpdate2 bool AllowRegenSectorKey bool + // LocalWorkerName specifies a custom name for the builtin worker. + // If set to an empty string (default) os hostname will be used + LocalWorkerName string + // Assigner specifies the worker assigner to use when scheduling tasks. // "utilization" (default) - assign tasks to workers with lowest utilization. // "spread" - assign tasks to as many distinct workers as possible. diff --git a/storage/sealer/manager.go b/storage/sealer/manager.go index 3e5e6032b..4335fe6e4 100644 --- a/storage/sealer/manager.go +++ b/storage/sealer/manager.go @@ -116,6 +116,8 @@ type Config struct { AllowProveReplicaUpdate2 bool AllowRegenSectorKey bool + LocalWorkerName string + // ResourceFiltering instructs the system which resource filtering strategy // to use when evaluating tasks against this worker. An empty value defaults // to "hardware". @@ -207,6 +209,7 @@ func New(ctx context.Context, lstor *paths.Local, stor paths.Store, ls paths.Loc wcfg := WorkerConfig{ IgnoreResourceFiltering: sc.ResourceFiltering == ResourceFilteringDisabled, TaskTypes: localTasks, + Name: sc.LocalWorkerName, } worker := NewLocalWorker(wcfg, stor, lstor, si, m, wss) err = m.AddWorker(ctx, worker) diff --git a/storage/sealer/worker_local.go b/storage/sealer/worker_local.go index fd13f4520..1311f2f2c 100644 --- a/storage/sealer/worker_local.go +++ b/storage/sealer/worker_local.go @@ -34,6 +34,9 @@ type WorkerConfig struct { TaskTypes []sealtasks.TaskType NoSwap bool + // os.Hostname if not set + Name string + // IgnoreResourceFiltering enables task distribution to happen on this // worker regardless of its currently available resources. Used in testing // with the local worker. @@ -56,6 +59,8 @@ type LocalWorker struct { noSwap bool envLookup EnvFunc + name string + // see equivalent field on WorkerConfig. ignoreResources bool @@ -83,6 +88,7 @@ func newLocalWorker(executor ExecutorFunc, wcfg WorkerConfig, envLookup EnvFunc, localStore: local, sindex: sindex, ret: ret, + name: wcfg.Name, ct: &workerCallTracker{ st: cst, @@ -97,6 +103,14 @@ func newLocalWorker(executor ExecutorFunc, wcfg WorkerConfig, envLookup EnvFunc, closing: make(chan struct{}), } + if w.name == "" { + var err error + w.name, err = os.Hostname() + if err != nil { + panic(err) + } + } + if wcfg.MaxParallelChallengeReads > 0 { w.challengeThrottle = make(chan struct{}, wcfg.MaxParallelChallengeReads) } @@ -113,13 +127,7 @@ func newLocalWorker(executor ExecutorFunc, wcfg WorkerConfig, envLookup EnvFunc, go func() { for _, call := range unfinished { - hostname, osErr := os.Hostname() - if osErr != nil { - log.Errorf("get hostname err: %+v", err) - hostname = "" - } - - err := storiface.Err(storiface.ErrTempWorkerRestart, xerrors.Errorf("worker [Hostname: %s] restarted", hostname)) + err := storiface.Err(storiface.ErrTempWorkerRestart, xerrors.Errorf("worker [name: %s] restarted", w.name)) // TODO: Handle restarting PC1 once support is merged @@ -283,12 +291,7 @@ func (l *LocalWorker) asyncCall(ctx context.Context, sector storiface.SectorRef, } if err != nil { - hostname, osErr := os.Hostname() - if osErr != nil { - log.Errorf("get hostname err: %+v", err) - } - - err = xerrors.Errorf("%w [Hostname: %s]", err, hostname) + err = xerrors.Errorf("%w [name: %s]", err, l.name) } if doReturn(ctx, rt, ci, l.ret, res, toCallError(err)) { @@ -774,15 +777,6 @@ func (l *LocalWorker) memInfo() (memPhysical, memUsed, memSwap, memSwapUsed uint } func (l *LocalWorker) Info(context.Context) (storiface.WorkerInfo, error) { - hostname, ok := os.LookupEnv("LOTUS_WORKER_HOSTNAME") - if !ok { - var err error - hostname, err = os.Hostname() - if err != nil { - panic(err) - } - } - gpus, err := ffi.GetGPUDevices() if err != nil { log.Errorf("getting gpu devices failed: %+v", err) @@ -801,7 +795,7 @@ func (l *LocalWorker) Info(context.Context) (storiface.WorkerInfo, error) { } return storiface.WorkerInfo{ - Hostname: hostname, + Hostname: l.name, IgnoreResources: l.ignoreResources, Resources: storiface.WorkerResources{ MemPhysical: memPhysical, From ecddd080484cf6582283179e62ca00f6a8953968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 3 Aug 2022 13:05:30 +0200 Subject: [PATCH 26/31] itests: Test custom worker names --- itests/kit/ensemble.go | 1 + itests/kit/node_opts.go | 8 ++++++++ itests/worker_test.go | 25 +++++++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 124e8ddb2..434917c54 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -727,6 +727,7 @@ func (n *Ensemble) Start() *Ensemble { LocalWorker: sectorstorage.NewLocalWorker(sectorstorage.WorkerConfig{ TaskTypes: m.options.workerTasks, NoSwap: false, + Name: m.options.workerName, }, store, localStore, m.MinerNode, m.MinerNode, wsts), LocalStore: localStore, Storage: lr, diff --git a/itests/kit/node_opts.go b/itests/kit/node_opts.go index 0fe66eaea..8a08d8879 100644 --- a/itests/kit/node_opts.go +++ b/itests/kit/node_opts.go @@ -47,6 +47,7 @@ type nodeOpts struct { workerTasks []sealtasks.TaskType workerStorageOpt func(paths.Store) paths.Store + workerName string } // DefaultNodeOpts are the default options that will be applied to test nodes. @@ -219,6 +220,13 @@ func WithTaskTypes(tt []sealtasks.TaskType) NodeOpt { } } +func WithWorkerName(n string) NodeOpt { + return func(opts *nodeOpts) error { + opts.workerName = n + return nil + } +} + var WithSealWorkerTasks = WithTaskTypes([]sealtasks.TaskType{sealtasks.TTFetch, sealtasks.TTCommit1, sealtasks.TTFinalize, sealtasks.TTAddPiece, sealtasks.TTPreCommit1, sealtasks.TTPreCommit2, sealtasks.TTCommit2, sealtasks.TTUnseal}) func WithWorkerStorage(transform func(paths.Store) paths.Store) NodeOpt { diff --git a/itests/worker_test.go b/itests/worker_test.go index 7328bd50f..19bb763fc 100644 --- a/itests/worker_test.go +++ b/itests/worker_test.go @@ -401,3 +401,28 @@ func TestWindowPostWorkerManualPoSt(t *testing.T) { require.NoError(t, err) require.Len(t, lastPending, 0) } + +func TestWorkerName(t *testing.T) { + name := "thisstringisprobablynotahostnameihope" + + ctx := context.Background() + _, miner, worker, ens := kit.EnsembleWorker(t, kit.WithAllSubsystems(), kit.ThroughRPC(), kit.WithWorkerName(name)) + + ens.InterconnectAll().BeginMining(50 * time.Millisecond) + + e, err := worker.Info(ctx) + require.NoError(t, err) + require.Equal(t, name, e.Hostname) + + ws, err := miner.WorkerStats(ctx) + require.NoError(t, err) + + var found bool + for _, stats := range ws { + if stats.Info.Hostname == name { + found = true + } + } + + require.True(t, found) +} From 654a3c976e92fd295986a17dfe4685d949ba3205 Mon Sep 17 00:00:00 2001 From: Shrenuj Bansal Date: Wed, 3 Aug 2022 10:08:59 -0400 Subject: [PATCH 27/31] remove tipset retrieval to use default --- cmd/lotus-shed/market.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/cmd/lotus-shed/market.go b/cmd/lotus-shed/market.go index e12752552..0c5e7c81d 100644 --- a/cmd/lotus-shed/market.go +++ b/cmd/lotus-shed/market.go @@ -19,6 +19,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/chain/actors/builtin/market" + "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/lib/backupds" "github.com/filecoin-project/lotus/node/repo" @@ -287,7 +288,6 @@ var marketImportDatastoreCmd = &cli.Command{ var marketDealsTotalStorageCmd = &cli.Command{ Name: "get-deals-total-storage", Usage: "View the total storage available in all active market deals", - Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { api, closer, err := lcli.GetFullNodeAPI(cctx) if err != nil { @@ -297,12 +297,7 @@ var marketDealsTotalStorageCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) - ts, err := lcli.LoadTipSet(ctx, cctx, api) - if err != nil { - return err - } - - deals, err := api.StateMarketDeals(ctx, ts.Key()) + deals, err := api.StateMarketDeals(ctx, types.EmptyTSK) if err != nil { return err } From 9a9428789dac90691d3b793eaa14226613e3abb8 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 3 Aug 2022 12:15:53 -0700 Subject: [PATCH 28/31] Build / Publish snap twice (lotus-filecoin + lotus) --- .circleci/config.yml | 18 ++++++++++++++---- .circleci/template.yml | 18 ++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e121f9b10..e4e676ca3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -587,14 +587,24 @@ jobs: name: install snapcraft command: sudo snap install snapcraft --classic - run: - name: build snap + name: build `lotus-filecoin` snap command: snapcraft --use-lxd --debug - run: - name: publish snap + name: publish `lotus-filecoin` snap command: | - pwd - ls *.snap snapcraft upload lotus-filecoin_latest_amd64.snap --release << parameters.channel >> + - run: + name: Rewrite snapcraft.yaml to use `lotus` name + command: + cat snap/snapcraft.yaml | sed 's/lotus-filecoin/lotus/' > lotus-snapcraft.yaml + mv lotus-snapcrat.yaml snap/snapcraft.yaml + - run: + name: build `lotus` snap + command: snapcraft --use-lxd --debug + - run: + name: publish `lotus` snap + command: | + snapcraft upload lotus_latest_amd64.snap --release << parameters.channel >> build-and-push-image: description: build and push docker images to public AWS ECR registry diff --git a/.circleci/template.yml b/.circleci/template.yml index a9f7fc54c..5eefc59bf 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -587,14 +587,24 @@ jobs: name: install snapcraft command: sudo snap install snapcraft --classic - run: - name: build snap + name: build `lotus-filecoin` snap command: snapcraft --use-lxd --debug - run: - name: publish snap + name: publish `lotus-filecoin` snap command: | - pwd - ls *.snap snapcraft upload lotus-filecoin_latest_amd64.snap --release << parameters.channel >> + - run: + name: Rewrite snapcraft.yaml to use `lotus` name + command: + cat snap/snapcraft.yaml | sed 's/lotus-filecoin/lotus/' > lotus-snapcraft.yaml + mv lotus-snapcrat.yaml snap/snapcraft.yaml + - run: + name: build `lotus` snap + command: snapcraft --use-lxd --debug + - run: + name: publish `lotus` snap + command: | + snapcraft upload lotus_latest_amd64.snap --release << parameters.channel >> build-and-push-image: description: build and push docker images to public AWS ECR registry From 37177956523a8c3efcfe7c4e7f7daa2bd9b01167 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 3 Aug 2022 13:45:29 -0700 Subject: [PATCH 29/31] Switches goreleaser notes back to default (keep-existing) --- .goreleaser.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index e027d57b0..f8839cc13 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -129,7 +129,6 @@ release: owner: filecoin-project name: lotus prerelease: auto - mode: append name_template: "Release v{{.Version}}" From 5a8bc204b725ca933ba58d28853278df94ba92d4 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Wed, 3 Aug 2022 21:29:35 -0700 Subject: [PATCH 30/31] Change default shell options for snapcraft publish The builds were erroring only in CircleCI, when run manually the same command worked fine. I reached out to CircleCI support, and got the following message: >>> The reason you are seeing this error when running in CircleCI and not while debugging with SSH is due to the -e set in #!/bin/bash -eo pipefail at the beginning of the shell while the debugging shell would just be #!/bin/bash. The -e sets to exit to the shell when any non zero [0] exit code status. Since you say the command works when debugging with SSH you can set the shell to use /bin/bash -o pipefail using a default shell options. Here is an example: - run: name: <> shell: /bin/bash -o pipefail command: | << some commands>> Notice that I still added -o pipefail as that prevents errors in a pipeline from being masked. --- .circleci/config.yml | 2 ++ .circleci/template.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index e4e676ca3..593da9cef 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -591,6 +591,7 @@ jobs: command: snapcraft --use-lxd --debug - run: name: publish `lotus-filecoin` snap + shell: /bin/bash -o pipefail command: | snapcraft upload lotus-filecoin_latest_amd64.snap --release << parameters.channel >> - run: @@ -603,6 +604,7 @@ jobs: command: snapcraft --use-lxd --debug - run: name: publish `lotus` snap + shell: /bin/bash -o pipefail command: | snapcraft upload lotus_latest_amd64.snap --release << parameters.channel >> diff --git a/.circleci/template.yml b/.circleci/template.yml index 5eefc59bf..94bf929d1 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -591,6 +591,7 @@ jobs: command: snapcraft --use-lxd --debug - run: name: publish `lotus-filecoin` snap + shell: /bin/bash -o pipefail command: | snapcraft upload lotus-filecoin_latest_amd64.snap --release << parameters.channel >> - run: @@ -603,6 +604,7 @@ jobs: command: snapcraft --use-lxd --debug - run: name: publish `lotus` snap + shell: /bin/bash -o pipefail command: | snapcraft upload lotus_latest_amd64.snap --release << parameters.channel >> From 298fbd8d88ba96416183a2e832e9f88f2dea3d17 Mon Sep 17 00:00:00 2001 From: Aloxaf Date: Fri, 5 Aug 2022 10:47:06 +0800 Subject: [PATCH 31/31] fix: build: use GOCC when building lotus-fountain --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c3788d5a9..16f78342e 100644 --- a/Makefile +++ b/Makefile @@ -174,8 +174,8 @@ lotus-pond-app: lotus-pond-front lotus-pond lotus-fountain: rm -f lotus-fountain - go build $(GOFLAGS) -o lotus-fountain ./cmd/lotus-fountain - go run github.com/GeertJohan/go.rice/rice append --exec lotus-fountain -i ./cmd/lotus-fountain -i ./build + $(GOCC) build $(GOFLAGS) -o lotus-fountain ./cmd/lotus-fountain + $(GOCC) run github.com/GeertJohan/go.rice/rice append --exec lotus-fountain -i ./cmd/lotus-fountain -i ./build .PHONY: lotus-fountain BINS+=lotus-fountain