From d1a52cf04d31c05dc585c2aa6386248a5f9f5ff6 Mon Sep 17 00:00:00 2001 From: LexLuthr Date: Wed, 3 Apr 2024 00:34:03 +0400 Subject: [PATCH] refactor filter decision code --- storage/paths/db_index.go | 120 ++++++++--------------------- storage/paths/index.go | 154 +++++++++++++++++--------------------- storage/paths/local.go | 55 +++----------- 3 files changed, 114 insertions(+), 215 deletions(-) diff --git a/storage/paths/db_index.go b/storage/paths/db_index.go index 0ca4cca80..daebc3607 100644 --- a/storage/paths/db_index.go +++ b/storage/paths/db_index.go @@ -15,7 +15,6 @@ import ( "go.opencensus.io/tag" "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/journal/alerting" @@ -578,52 +577,23 @@ func (dbi *DBIndex) StorageFindSector(ctx context.Context, s abi.SectorID, ft st log.Debugf("not selecting on %s, not allowed by file type filters", row.StorageId) continue } - - if len(row.AllowMiners) > 0 { - found := false - allowMiners := splitString(row.AllowMiners) - for _, m := range allowMiners { - m := m - maddr, err := address.NewFromString(m) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("parsing miner ID: %w", err) - } - if abi.ActorID(mid) == s.Miner { - found = true - break - } - } - if !found { - log.Debugf("not selecting on %s, not allowed by allow miners filters", row.StorageId) - continue - } + allowMiners := splitString(row.AllowMiners) + proceed, err := MinerFilter(allowMiners, false, s.Miner) + if err != nil { + return nil, err } - if len(row.DenyMiners) > 0 { - found := false - denyMiners := splitString(row.DenyMiners) - for _, m := range denyMiners { - m := m - maddr, err := address.NewFromString(m) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("parsing miner ID: %w", err) - } - if abi.ActorID(mid) == s.Miner { - found = true - break - } - } - if found { - log.Debugf("not selecting on %s, not allowed by deny miners filters", row.StorageId) - continue - } + if !proceed { + log.Debugf("not allocating on %s, miner %s not allowed", row.StorageId, s.Miner.String()) + continue + } + denyMiners := splitString(row.DenyMiners) + proceed, err = MinerFilter(denyMiners, true, s.Miner) + if err != nil { + return nil, err + } + if !proceed { + log.Debugf("not allocating on %s, miner %s denied", row.StorageId, s.Miner.String()) + continue } if allowList != nil { @@ -776,49 +746,23 @@ func (dbi *DBIndex) StorageBestAlloc(ctx context.Context, allocate storiface.Sec // Matching with 0 as a workaround to avoid having minerID // present when calling TaskStorage.HasCapacity() if !(miner == abi.ActorID(0)) { - if len(row.AllowMiners) > 0 { - found := false - allowMiners := splitString(row.AllowMiners) - for _, m := range allowMiners { - m := m - maddr, err := address.NewFromString(m) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("parsing miner ID: %w", err) - } - if abi.ActorID(mid) == miner { - found = true - break - } - } - if !found { - continue - } + allowMiners := splitString(row.AllowMiners) + proceed, err := MinerFilter(allowMiners, false, miner) + if err != nil { + return nil, err } - if len(row.DenyMiners) > 0 { - found := false - denyMiners := splitString(row.DenyMiners) - for _, m := range denyMiners { - m := m - maddr, err := address.NewFromString(m) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("parsing miner ID: %w", err) - } - if abi.ActorID(mid) == miner { - found = true - break - } - } - if found { - continue - } + if !proceed { + log.Debugf("not allocating on %s, miner %s not allowed", row.StorageId, miner.String()) + continue + } + denyMiners := splitString(row.DenyMiners) + proceed, err = MinerFilter(denyMiners, true, miner) + if err != nil { + return nil, err + } + if !proceed { + log.Debugf("not allocating on %s, miner %s denied", row.StorageId, miner.String()) + continue } } diff --git a/storage/paths/index.go b/storage/paths/index.go index 1e90d2cb3..391e42972 100644 --- a/storage/paths/index.go +++ b/storage/paths/index.go @@ -498,50 +498,24 @@ func (i *MemIndex) StorageFindSector(ctx context.Context, s abi.SectorID, ft sto continue } - if len(st.info.AllowMiners) > 0 { - found := false - for _, m := range st.info.AllowMiners { - minerIDStr := m - maddr, err := address.NewFromString(minerIDStr) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("converting miner address to ID: %w", err) - } - if abi.ActorID(mid) == s.Miner { - found = true - break - } - } - if !found { - log.Debugf("not allocating on %s, miner %s not allowed", st.info.ID, s.Miner.String()) - continue - } + proceed, err := MinerFilter(st.info.AllowMiners, false, s.Miner) + if err != nil { + return nil, err } - if len(st.info.DenyMiners) > 0 { - found := false - for _, m := range st.info.DenyMiners { - minerIDStr := m - maddr, err := address.NewFromString(minerIDStr) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("converting miner address to ID: %w", err) - } - if abi.ActorID(mid) == s.Miner { - found = true - break - } - } - if found { - log.Debugf("not allocating on %s, miner %s denied", st.info.ID, s.Miner.String()) - continue - } + if !proceed { + log.Debugf("not allocating on %s, miner %s not allowed", st.info.ID, s.Miner.String()) + continue + } + + proceed, err = MinerFilter(st.info.DenyMiners, true, s.Miner) + if err != nil { + return nil, err + } + + if !proceed { + log.Debugf("not allocating on %s, miner %s denied", st.info.ID, s.Miner.String()) + continue } if spaceReq > uint64(st.fsi.Available) { @@ -699,50 +673,24 @@ func (i *MemIndex) StorageBestAlloc(ctx context.Context, allocate storiface.Sect continue } - if len(p.info.AllowMiners) > 0 { - found := false - for _, m := range p.info.AllowMiners { - minerIDStr := m - maddr, err := address.NewFromString(minerIDStr) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("converting miner address to ID: %w", err) - } - if abi.ActorID(mid) == miner { - found = true - break - } - } - if !found { - log.Debugf("not allocating on %s, miner %s not allowed", p.info.ID, miner.String()) - continue - } + proceed, err := MinerFilter(p.info.AllowMiners, false, miner) + if err != nil { + return nil, err } - if len(p.info.DenyMiners) > 0 { - found := false - for _, m := range p.info.DenyMiners { - minerIDStr := m - maddr, err := address.NewFromString(minerIDStr) - if err != nil { - return nil, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return nil, xerrors.Errorf("converting miner address to ID: %w", err) - } - if abi.ActorID(mid) == miner { - found = true - break - } - } - if found { - log.Debugf("not allocating on %s, miner %s denied", p.info.ID, miner.String()) - continue - } + if !proceed { + log.Debugf("not allocating on %s, miner %s not allowed", p.info.ID, miner.String()) + continue + } + + proceed, err = MinerFilter(p.info.DenyMiners, true, miner) + if err != nil { + return nil, err + } + + if !proceed { + log.Debugf("not allocating on %s, miner %s denied", p.info.ID, miner.String()) + continue } if spaceReq > uint64(p.fsi.Available) { @@ -802,3 +750,41 @@ func (i *MemIndex) FindSector(id abi.SectorID, typ storiface.SectorFileType) ([] } var _ SectorIndex = &MemIndex{} + +func MinerFilter(miners []string, deny bool, miner abi.ActorID) (bool, error) { + if len(miners) > 0 { + found := false + for _, m := range miners { + minerIDStr := m + maddr, err := address.NewFromString(minerIDStr) + if err != nil { + return false, xerrors.Errorf("parsing miner address: %w", err) + } + mid, err := address.IDFromAddress(maddr) + if err != nil { + return false, xerrors.Errorf("converting miner address to ID: %w", err) + } + if abi.ActorID(mid) == miner { + found = true + break + } + } + // If not found in list + if !found { + // If this is allowed list + if !deny { + return false, nil + } + // If this is denied list + return true, nil + } + // If found in list and + // If this is allowed list + if !deny { + return true, nil + } + // If this is denied list + return false, nil + } + return true, nil +} diff --git a/storage/paths/local.go b/storage/paths/local.go index 4d4cc1f48..018537c82 100644 --- a/storage/paths/local.go +++ b/storage/paths/local.go @@ -14,7 +14,6 @@ import ( "golang.org/x/xerrors" ffi "github.com/filecoin-project/filecoin-ffi" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/proof" @@ -512,49 +511,19 @@ func (st *Local) AcquireSector(ctx context.Context, sid storiface.SectorRef, exi if !fileType.Allowed(allowTypes, denyTypes) { return false, nil } - - if len(allowMiners) > 0 { - found := false - for _, m := range allowMiners { - minerIDStr := m - maddr, err := address.NewFromString(minerIDStr) - if err != nil { - return false, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return false, xerrors.Errorf("converting miner address to ID: %w", err) - } - if abi.ActorID(mid) == miner { - found = true - break - } - } - if !found { - return false, nil - } + proceed, err := MinerFilter(allowMiners, false, miner) + if err != nil { + return false, err } - - if len(denyMiners) > 0 { - found := false - for _, m := range denyMiners { - minerIDStr := m - maddr, err := address.NewFromString(minerIDStr) - if err != nil { - return false, xerrors.Errorf("parsing miner address: %w", err) - } - mid, err := address.IDFromAddress(maddr) - if err != nil { - return false, xerrors.Errorf("converting miner address to ID: %w", err) - } - if abi.ActorID(mid) == miner { - found = true - break - } - } - if found { - return false, nil - } + if !proceed { + return false, nil + } + proceed, err = MinerFilter(denyMiners, true, miner) + if err != nil { + return false, err + } + if !proceed { + return false, nil } return true, nil