From 335f5df3ec3f4cfbfe70ebd67fb796b9a3eeac6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 24 Aug 2022 11:25:37 -0400 Subject: [PATCH] numassigner: SectorNumReserveCount --- api/api_storage.go | 20 +++- api/proxy_gen.go | 13 +++ build/openrpc/full.json.gz | Bin 28351 -> 28350 bytes build/openrpc/gateway.json.gz | Bin 4942 -> 4943 bytes build/openrpc/miner.json.gz | Bin 14932 -> 15221 bytes build/openrpc/worker.json.gz | Bin 5032 -> 5036 bytes cmd/lotus-miner/sectors.go | 97 +---------------- documentation/en/api-v0-methods-miner.md | 34 ++++++ itests/sector_numassign_test.go | 47 ++++++++ lib/strle/human.go | 100 ++++++++++++++++++ .../strle/human_test.go | 8 +- node/impl/storminer.go | 4 + storage/pipeline/numassign.go | 49 +++++++++ 13 files changed, 272 insertions(+), 100 deletions(-) create mode 100644 lib/strle/human.go rename cmd/lotus-miner/sectors_test.go => lib/strle/human_test.go (90%) diff --git a/api/api_storage.go b/api/api_storage.go index 8ecf752e2..c183d2189 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -125,10 +125,19 @@ type StorageMiner interface { SectorAbortUpgrade(context.Context, abi.SectorNumber) error //perm:admin // SectorNumAssignerMeta returns sector number assigner metadata - reserved/allocated - SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) //perm:read - SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) //perm:read - SectorNumReserve(ctx context.Context, name string, field bitfield.BitField, force bool) error //perm:admin - SectorNumFree(ctx context.Context, name string) error //perm:admin + SectorNumAssignerMeta(ctx context.Context) (NumAssignerMeta, error) //perm:read + // SectorNumReservations returns a list of sector number reservations + SectorNumReservations(ctx context.Context) (map[string]bitfield.BitField, error) //perm:read + // SectorNumReserve creates a new sector number reservation. Will fail if any other reservation has colliding + // numbers or name. Set force to true to override safety checks. + // Valid characters for name: a-z, A-Z, 0-9, _, - + SectorNumReserve(ctx context.Context, name string, sectors bitfield.BitField, force bool) error //perm:admin + // SectorNumReserveCount creates a new sector number reservation for `count` sector numbers. + // by default lotus will allocate lowest-available sector numbers to the reservation. + // For restrictions on `name` see SectorNumReserve + SectorNumReserveCount(ctx context.Context, name string, count uint64) (bitfield.BitField, error) //perm:admin + // SectorNumFree drops a sector reservation + SectorNumFree(ctx context.Context, name string) error //perm:admin // WorkerConnect tells the node to connect to workers RPC WorkerConnect(context.Context, string) error //perm:admin retry:true @@ -480,5 +489,8 @@ type NumAssignerMeta struct { Reserved bitfield.BitField Allocated bitfield.BitField + // ChainAllocated+Reserved+Allocated + InUse bitfield.BitField + Next abi.SectorNumber } diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 6a55dfd32..769344ce2 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -836,6 +836,8 @@ type StorageMinerStruct struct { SectorNumReserve func(p0 context.Context, p1 string, p2 bitfield.BitField, p3 bool) error `perm:"admin"` + SectorNumReserveCount func(p0 context.Context, p1 string, p2 uint64) (bitfield.BitField, error) `perm:"admin"` + SectorPreCommitFlush func(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) `perm:"admin"` SectorPreCommitPending func(p0 context.Context) ([]abi.SectorID, error) `perm:"admin"` @@ -4978,6 +4980,17 @@ func (s *StorageMinerStub) SectorNumReserve(p0 context.Context, p1 string, p2 bi return ErrNotSupported } +func (s *StorageMinerStruct) SectorNumReserveCount(p0 context.Context, p1 string, p2 uint64) (bitfield.BitField, error) { + if s.Internal.SectorNumReserveCount == nil { + return *new(bitfield.BitField), ErrNotSupported + } + return s.Internal.SectorNumReserveCount(p0, p1, p2) +} + +func (s *StorageMinerStub) SectorNumReserveCount(p0 context.Context, p1 string, p2 uint64) (bitfield.BitField, error) { + return *new(bitfield.BitField), ErrNotSupported +} + func (s *StorageMinerStruct) SectorPreCommitFlush(p0 context.Context) ([]sealiface.PreCommitBatchRes, error) { if s.Internal.SectorPreCommitFlush == nil { return *new([]sealiface.PreCommitBatchRes), ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 24e6dc3544a499d008f25bee31c662cbc2b7961e..6beb0d65af84db6fa5835a7d37a4677615412cb0 100644 GIT binary patch delta 16909 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 P00960%dsUnkc9;R00ZK= diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index e01a54b8e46cd858bf0b93686368e5adfa75ca23..583f188390e8d332771655a1083519bf234fe090 100644 GIT binary patch delta 3816 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 delta 3815 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0b753c4361704cf393c1cbd2c82bdef30fc22768..963c86454542e43c1d5091da7c4ff8be747c277e 100644 GIT binary patch literal 15221 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 literal 14932 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index ed6e2ec1403839b0f3b6077bc5f1b3870916250e..c15d91e4418ea352f2d3a843d9500d791a971d7e 100644 GIT binary patch delta 3679 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 diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 84f48b3cc..84c2d8e95 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -18,7 +18,6 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-bitfield" - rlepluslazy "github.com/filecoin-project/go-bitfield/rle" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" @@ -33,6 +32,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" + "github.com/filecoin-project/lotus/lib/strle" "github.com/filecoin-project/lotus/lib/tablewriter" sealing "github.com/filecoin-project/lotus/storage/pipeline" ) @@ -2231,12 +2231,12 @@ var sectorsNumbersInfoCmd = &cli.Command{ return err } - alloc, err := bitfieldToHumanRanges(am.Allocated) + alloc, err := strle.BitfieldToHumanRanges(am.Allocated) if err != nil { return err } - reserved, err := bitfieldToHumanRanges(am.Reserved) + reserved, err := strle.BitfieldToHumanRanges(am.Reserved) if err != nil { return err } @@ -2268,7 +2268,7 @@ var sectorsNumbersReservationsCmd = &cli.Command{ var out []string for name, field := range rs { - hr, err := bitfieldToHumanRanges(field) + hr, err := strle.BitfieldToHumanRanges(field) if err != nil { return err } @@ -2314,7 +2314,7 @@ var sectorsNumbersReserveCmd = &cli.Command{ return xerrors.Errorf("expected 2 arguments: [reservation name] [reserved ranges]") } - bf, err := humanRangesToBitField(cctx.Args().Get(1)) + bf, err := strle.HumanRangesToBitField(cctx.Args().Get(1)) if err != nil { return xerrors.Errorf("parsing ranges: %w", err) } @@ -2342,90 +2342,3 @@ var sectorsNumbersFreeCmd = &cli.Command{ return api.SectorNumFree(ctx, cctx.Args().First()) }, } - -func humanRangesToBitField(h string) (bitfield.BitField, error) { - var runs []rlepluslazy.Run - var last uint64 - - strRanges := strings.Split(h, ",") - for i, strRange := range strRanges { - lr := strings.Split(strRange, "-") - - var start, end uint64 - var err error - - switch len(lr) { - case 1: // one number - start, err = strconv.ParseUint(lr[0], 10, 64) - if err != nil { - return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) - } - - end = start - case 2: // x-y - start, err = strconv.ParseUint(lr[0], 10, 64) - if err != nil { - return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) - } - end, err = strconv.ParseUint(lr[1], 10, 64) - if err != nil { - return bitfield.BitField{}, xerrors.Errorf("parsing right side of run %d: %w", i, err) - } - } - - if start < last { - return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was less than last run end(%d)", i, start, last) - } - - if start == last && last > 0 { - return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was equal to last run end(%d)", i, start, last) - } - - if start > end { - return bitfield.BitField{}, xerrors.Errorf("run start(%d) can't be greater than run end(%d) (run %d)", start, end, i) - } - - if start > last { - runs = append(runs, rlepluslazy.Run{Val: false, Len: start - last}) - } - - runs = append(runs, rlepluslazy.Run{Val: true, Len: end - start + 1}) - last = end + 1 - } - - return bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: runs}) -} - -func bitfieldToHumanRanges(bf bitfield.BitField) (string, error) { - bj, err := bf.MarshalJSON() - if err != nil { - return "", err - } - - var bints []int64 - if err := json.Unmarshal(bj, &bints); err != nil { - return "", err - } - - var at int64 - var out string - - for i, bi := range bints { - at += bi - - if i%2 == 0 { - if i > 0 { - out += "," - } - out += fmt.Sprint(at) - continue - } - - if bi > 1 { - out += "-" - out += fmt.Sprint(at - 1) - } - } - - return out, err -} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 9515771a9..379fa22dd 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -143,6 +143,7 @@ * [SectorNumFree](#SectorNumFree) * [SectorNumReservations](#SectorNumReservations) * [SectorNumReserve](#SectorNumReserve) + * [SectorNumReserveCount](#SectorNumReserveCount) * [SectorPreCommitFlush](#SectorPreCommitFlush) * [SectorPreCommitPending](#SectorPreCommitPending) * [SectorRemove](#SectorRemove) @@ -2961,11 +2962,16 @@ Response: 5, 1 ], + "InUse": [ + 5, + 1 + ], "Next": 9 } ``` ### SectorNumFree +SectorNumFree drops a sector reservation Perms: admin @@ -2980,6 +2986,7 @@ Inputs: Response: `{}` ### SectorNumReservations +SectorNumReservations returns a list of sector number reservations Perms: read @@ -2999,6 +3006,9 @@ Response: ``` ### SectorNumReserve +SectorNumReserve creates a new sector number reservation. Will fail if any other reservation has colliding +numbers or name. Set force to true to override safety checks. +Valid characters for name: a-z, A-Z, 0-9, _, - Perms: admin @@ -3017,6 +3027,30 @@ Inputs: Response: `{}` +### SectorNumReserveCount +SectorNumReserveCount creates a new sector number reservation for `count` sector numbers. +by default lotus will allocate lowest-available sector numbers to the reservation. +For restrictions on `name` see SectorNumReserve + + +Perms: admin + +Inputs: +```json +[ + "string value", + 42 +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + ### SectorPreCommitFlush SectorPreCommitFlush immediately sends a PreCommit message with sectors batched for PreCommit. Returns null if message wasn't sent diff --git a/itests/sector_numassign_test.go b/itests/sector_numassign_test.go index 85f8c657e..af667aa92 100644 --- a/itests/sector_numassign_test.go +++ b/itests/sector_numassign_test.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/itests/kit" + "github.com/filecoin-project/lotus/lib/strle" ) func TestAssignBasic(t *testing.T) { @@ -128,3 +129,49 @@ func TestAssignReservation(t *testing.T) { require.Equal(t, abi.SectorNumber(11), sl[1]) require.Equal(t, abi.SectorNumber(12), sl[2]) } + +func TestReserveCount(t *testing.T) { + kit.QuietMiningLogs() + + ctx := context.Background() + + _, miner, _ := kit.EnsembleMinimal(t, kit.ThroughRPC(), kit.MockProofs()) + + // with no reservations higher + r1, err := miner.SectorNumReserveCount(ctx, "r1", 2) + require.NoError(t, err) + requireBitField(t, "3-4", r1) + + // reserve some higher numbers + err = miner.SectorNumReserve(ctx, "test-reservation", rangeBitField(10, 15), false) + require.NoError(t, err) + + // reserve a few below an existing reservation + r2, err := miner.SectorNumReserveCount(ctx, "r2", 2) + require.NoError(t, err) + requireBitField(t, "5-6", r2) + + // reserve a few through an existing reservation + r3, err := miner.SectorNumReserveCount(ctx, "r3", 6) + require.NoError(t, err) + requireBitField(t, "7-9,16-18", r3) + + // do one more + r4, err := miner.SectorNumReserveCount(ctx, "r4", 4) + require.NoError(t, err) + requireBitField(t, "19-22", r4) + + resvs, err := miner.SectorNumReservations(ctx) + require.NoError(t, err) + + requireBitField(t, "3-4", resvs["r1"]) + requireBitField(t, "5-6", resvs["r2"]) + requireBitField(t, "7-9,16-18", resvs["r3"]) + requireBitField(t, "19-22", resvs["r4"]) +} + +func requireBitField(t *testing.T, expect string, bf bitfield.BitField) { + s, err := strle.BitfieldToHumanRanges(bf) + require.NoError(t, err) + require.Equal(t, expect, s) +} diff --git a/lib/strle/human.go b/lib/strle/human.go new file mode 100644 index 000000000..f381f83fc --- /dev/null +++ b/lib/strle/human.go @@ -0,0 +1,100 @@ +package strle + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-bitfield" + rlepluslazy "github.com/filecoin-project/go-bitfield/rle" +) + +func HumanRangesToBitField(h string) (bitfield.BitField, error) { + var runs []rlepluslazy.Run + var last uint64 + + strRanges := strings.Split(h, ",") + for i, strRange := range strRanges { + lr := strings.Split(strRange, "-") + + var start, end uint64 + var err error + + switch len(lr) { + case 1: // one number + start, err = strconv.ParseUint(lr[0], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) + } + + end = start + case 2: // x-y + start, err = strconv.ParseUint(lr[0], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing left side of run %d: %w", i, err) + } + end, err = strconv.ParseUint(lr[1], 10, 64) + if err != nil { + return bitfield.BitField{}, xerrors.Errorf("parsing right side of run %d: %w", i, err) + } + } + + if start < last { + return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was less than last run end(%d)", i, start, last) + } + + if start == last && last > 0 { + return bitfield.BitField{}, xerrors.Errorf("run %d start(%d) was equal to last run end(%d)", i, start, last) + } + + if start > end { + return bitfield.BitField{}, xerrors.Errorf("run start(%d) can't be greater than run end(%d) (run %d)", start, end, i) + } + + if start > last { + runs = append(runs, rlepluslazy.Run{Val: false, Len: start - last}) + } + + runs = append(runs, rlepluslazy.Run{Val: true, Len: end - start + 1}) + last = end + 1 + } + + return bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: runs}) +} + +func BitfieldToHumanRanges(bf bitfield.BitField) (string, error) { + bj, err := bf.MarshalJSON() + if err != nil { + return "", err + } + + var bints []int64 + if err := json.Unmarshal(bj, &bints); err != nil { + return "", err + } + + var at int64 + var out string + + for i, bi := range bints { + at += bi + + if i%2 == 0 { + if i > 0 { + out += "," + } + out += fmt.Sprint(at) + continue + } + + if bi > 1 { + out += "-" + out += fmt.Sprint(at - 1) + } + } + + return out, err +} diff --git a/cmd/lotus-miner/sectors_test.go b/lib/strle/human_test.go similarity index 90% rename from cmd/lotus-miner/sectors_test.go rename to lib/strle/human_test.go index 60ffce873..744024b29 100644 --- a/cmd/lotus-miner/sectors_test.go +++ b/lib/strle/human_test.go @@ -1,4 +1,4 @@ -package main +package strle import ( "testing" @@ -11,7 +11,7 @@ import ( func TestHumanBitfield(t *testing.T) { check := func(ints []uint64, out string) { bf := bitfield.NewFromSet(ints) - h, err := bitfieldToHumanRanges(bf) + h, err := BitfieldToHumanRanges(bf) require.NoError(t, err) require.Equal(t, out, h) } @@ -26,10 +26,10 @@ func TestHumanBitfield(t *testing.T) { func TestHumanBitfieldRoundtrip(t *testing.T) { check := func(ints []uint64, out string) { - parsed, err := humanRangesToBitField(out) + parsed, err := HumanRangesToBitField(out) require.NoError(t, err) - h, err := bitfieldToHumanRanges(parsed) + h, err := BitfieldToHumanRanges(parsed) require.NoError(t, err) require.Equal(t, out, h) diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 25c1d99b7..2039429c2 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -440,6 +440,10 @@ func (sm *StorageMinerAPI) SectorNumReserve(ctx context.Context, name string, fi return sm.Miner.NumReserve(ctx, name, field, force) } +func (sm *StorageMinerAPI) SectorNumReserveCount(ctx context.Context, name string, count uint64) (bitfield.BitField, error) { + return sm.Miner.NumReserveCount(ctx, name, count) +} + func (sm *StorageMinerAPI) SectorNumFree(ctx context.Context, name string) error { return sm.Miner.NumFree(ctx, name) } diff --git a/storage/pipeline/numassign.go b/storage/pipeline/numassign.go index 551d7a85e..18c154b6a 100644 --- a/storage/pipeline/numassign.go +++ b/storage/pipeline/numassign.go @@ -168,6 +168,7 @@ func (m *Sealing) numAssignerMetaLocked(ctx context.Context) (api.NumAssignerMet return api.NumAssignerMeta{ Reserved: *reserved, Allocated: *allocated, + InUse: inuse, Next: firstFree, }, nil } @@ -208,6 +209,11 @@ func (m *Sealing) NumReserve(ctx context.Context, name string, reserving bitfiel m.sclk.Lock() defer m.sclk.Unlock() + return m.numReserveLocked(ctx, name, reserving, force) +} + +// NumReserve creates a new sector reservation +func (m *Sealing) numReserveLocked(ctx context.Context, name string, reserving bitfield.BitField, force bool) error { rk, err := reservationKey(name) if err != nil { return err @@ -294,6 +300,49 @@ func (m *Sealing) NumReserve(ctx context.Context, name string, reserving bitfiel return nil } +func (m *Sealing) NumReserveCount(ctx context.Context, name string, count uint64) (bitfield.BitField, error) { + m.sclk.Lock() + defer m.sclk.Unlock() + + nm, err := m.numAssignerMetaLocked(ctx) + if err != nil { + return bitfield.BitField{}, err + } + + // figure out `count` unused sectors at lowest possible numbers + + usedCount, err := nm.InUse.Count() + if err != nil { + return bitfield.BitField{}, err + } + + // get a bitfield mask which has at least `count` bits more set than the nm.InUse field + mask, err := bitfield.NewFromIter(&rlepluslazy.RunSliceIterator{Runs: []rlepluslazy.Run{ + { + Val: true, + Len: count + usedCount, + }, + }}) + + free, err := bitfield.SubtractBitField(mask, nm.InUse) + if err != nil { + return bitfield.BitField{}, err + } + + // free now has at least 'count' bits set - it's possible that InUse had some bits set outside the count+usedCount range + + free, err = free.Slice(0, count) + if err != nil { + return bitfield.BitField{}, err + } + + if err := m.numReserveLocked(ctx, name, free, false); err != nil { + return bitfield.BitField{}, err + } + + return free, nil +} + // NumFree removes a named sector reservation func (m *Sealing) NumFree(ctx context.Context, name string) error { rk, err := reservationKey(name)