v1.27.0-a #10
@ -0,0 +1,2 @@
|
|||||||
|
ALTER TABLE storage_path ADD COLUMN IF NOT EXISTS allow_miners varchar DEFAULT '';
|
||||||
|
ALTER TABLE storage_path ADD COLUMN IF NOT EXISTS deny_miners varchar DEFAULT ''; -- comma separated list of miner addresses
|
@ -1 +0,0 @@
|
|||||||
ALTER TABLE storage_path ADD COLUMN IF NOT EXISTS allow_miners varchar, ADD COLUMN IF NOT EXISTS deny_miners varchar; -- comma separated list of miner addresses
|
|
@ -24,6 +24,8 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
"github.com/filecoin-project/lotus/storage/sealer/storiface"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const NoMinerFilter = abi.ActorID(0)
|
||||||
|
|
||||||
var errAlreadyLocked = errors.New("already locked")
|
var errAlreadyLocked = errors.New("already locked")
|
||||||
|
|
||||||
type DBIndex struct {
|
type DBIndex struct {
|
||||||
@ -578,21 +580,13 @@ func (dbi *DBIndex) StorageFindSector(ctx context.Context, s abi.SectorID, ft st
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
allowMiners := splitString(row.AllowMiners)
|
allowMiners := splitString(row.AllowMiners)
|
||||||
proceed, err := MinerFilter(allowMiners, false, s.Miner)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if !proceed {
|
|
||||||
log.Debugf("not allocating on %s, miner %s not allowed", row.StorageId, s.Miner.String())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
denyMiners := splitString(row.DenyMiners)
|
denyMiners := splitString(row.DenyMiners)
|
||||||
proceed, err = MinerFilter(denyMiners, true, s.Miner)
|
proceed, msg, err := MinerFilter(allowMiners, denyMiners, s.Miner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !proceed {
|
if !proceed {
|
||||||
log.Debugf("not allocating on %s, miner %s denied", row.StorageId, s.Miner.String())
|
log.Debugf("not allocating on %s, miner %s %s", row.StorageId, s.Miner.String(), msg)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -734,7 +728,6 @@ func (dbi *DBIndex) StorageBestAlloc(ctx context.Context, allocate storiface.Sec
|
|||||||
SkippedHeartbeatThresh.Seconds(),
|
SkippedHeartbeatThresh.Seconds(),
|
||||||
pathType == storiface.PathSealing,
|
pathType == storiface.PathSealing,
|
||||||
pathType == storiface.PathStorage,
|
pathType == storiface.PathStorage,
|
||||||
miner.String(),
|
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("Querying for best storage sectors fails with err %w: ", err)
|
return nil, xerrors.Errorf("Querying for best storage sectors fails with err %w: ", err)
|
||||||
@ -745,23 +738,15 @@ func (dbi *DBIndex) StorageBestAlloc(ctx context.Context, allocate storiface.Sec
|
|||||||
for _, row := range rows {
|
for _, row := range rows {
|
||||||
// Matching with 0 as a workaround to avoid having minerID
|
// Matching with 0 as a workaround to avoid having minerID
|
||||||
// present when calling TaskStorage.HasCapacity()
|
// present when calling TaskStorage.HasCapacity()
|
||||||
if !(miner == abi.ActorID(0)) {
|
if !(miner == NoMinerFilter) {
|
||||||
allowMiners := splitString(row.AllowMiners)
|
allowMiners := splitString(row.AllowMiners)
|
||||||
proceed, err := MinerFilter(allowMiners, false, miner)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if !proceed {
|
|
||||||
log.Debugf("not allocating on %s, miner %s not allowed", row.StorageId, miner.String())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
denyMiners := splitString(row.DenyMiners)
|
denyMiners := splitString(row.DenyMiners)
|
||||||
proceed, err = MinerFilter(denyMiners, true, miner)
|
proceed, msg, err := MinerFilter(allowMiners, denyMiners, miner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !proceed {
|
if !proceed {
|
||||||
log.Debugf("not allocating on %s, miner %s denied", row.StorageId, miner.String())
|
log.Debugf("not allocating on %s, miner %s %s", row.StorageId, miner.String(), msg)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -498,23 +498,13 @@ func (i *MemIndex) StorageFindSector(ctx context.Context, s abi.SectorID, ft sto
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
proceed, err := MinerFilter(st.info.AllowMiners, false, s.Miner)
|
proceed, msg, err := MinerFilter(st.info.AllowMiners, st.info.DenyMiners, s.Miner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !proceed {
|
if !proceed {
|
||||||
log.Debugf("not allocating on %s, miner %s not allowed", st.info.ID, s.Miner.String())
|
log.Debugf("not allocating on %s, miner %s %s", st.info.ID, s.Miner.String(), msg)
|
||||||
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
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -673,23 +663,13 @@ func (i *MemIndex) StorageBestAlloc(ctx context.Context, allocate storiface.Sect
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
proceed, err := MinerFilter(p.info.AllowMiners, false, miner)
|
proceed, msg, err := MinerFilter(p.info.AllowMiners, p.info.DenyMiners, miner)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if !proceed {
|
if !proceed {
|
||||||
log.Debugf("not allocating on %s, miner %s not allowed", p.info.ID, miner.String())
|
log.Debugf("not allocating on %s, miner %s %s", p.info.ID, miner.String(), msg)
|
||||||
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
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,10 +731,9 @@ func (i *MemIndex) FindSector(id abi.SectorID, typ storiface.SectorFileType) ([]
|
|||||||
|
|
||||||
var _ SectorIndex = &MemIndex{}
|
var _ SectorIndex = &MemIndex{}
|
||||||
|
|
||||||
func MinerFilter(miners []string, deny bool, miner abi.ActorID) (bool, error) {
|
func MinerFilter(allowMiners, denyMiners []string, miner abi.ActorID) (bool, string, error) {
|
||||||
if len(miners) > 0 {
|
checkMinerInList := func(minersList []string, miner abi.ActorID) (bool, error) {
|
||||||
found := false
|
for _, m := range minersList {
|
||||||
for _, m := range miners {
|
|
||||||
minerIDStr := m
|
minerIDStr := m
|
||||||
maddr, err := address.NewFromString(minerIDStr)
|
maddr, err := address.NewFromString(minerIDStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -765,26 +744,24 @@ func MinerFilter(miners []string, deny bool, miner abi.ActorID) (bool, error) {
|
|||||||
return false, xerrors.Errorf("converting miner address to ID: %w", err)
|
return false, xerrors.Errorf("converting miner address to ID: %w", err)
|
||||||
}
|
}
|
||||||
if abi.ActorID(mid) == miner {
|
if abi.ActorID(mid) == miner {
|
||||||
found = true
|
return true, nil
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If not found in list
|
|
||||||
if !found {
|
|
||||||
// If this is allowed list
|
|
||||||
if !deny {
|
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
// If this is denied list
|
|
||||||
return true, nil
|
if len(allowMiners) > 0 {
|
||||||
|
found, err := checkMinerInList(allowMiners, miner)
|
||||||
|
if err != nil || !found {
|
||||||
|
return false, "not allowed", err
|
||||||
}
|
}
|
||||||
// If found in list and
|
|
||||||
// If this is allowed list
|
|
||||||
if !deny {
|
|
||||||
return true, nil
|
|
||||||
}
|
}
|
||||||
// If this is denied list
|
|
||||||
return false, nil
|
if len(denyMiners) > 0 {
|
||||||
|
found, err := checkMinerInList(denyMiners, miner)
|
||||||
|
if err != nil || found {
|
||||||
|
return false, "denied", err
|
||||||
}
|
}
|
||||||
return true, nil
|
}
|
||||||
|
return true, "", nil
|
||||||
}
|
}
|
||||||
|
@ -511,14 +511,7 @@ func (st *Local) AcquireSector(ctx context.Context, sid storiface.SectorRef, exi
|
|||||||
if !fileType.Allowed(allowTypes, denyTypes) {
|
if !fileType.Allowed(allowTypes, denyTypes) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
proceed, err := MinerFilter(allowMiners, false, miner)
|
proceed, _, err := MinerFilter(allowMiners, denyMiners, miner)
|
||||||
if err != nil {
|
|
||||||
return false, err
|
|
||||||
}
|
|
||||||
if !proceed {
|
|
||||||
return false, nil
|
|
||||||
}
|
|
||||||
proceed, err = MinerFilter(denyMiners, true, miner)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
@ -8,28 +8,28 @@ import (
|
|||||||
"github.com/filecoin-project/go-state-types/abi"
|
"github.com/filecoin-project/go-state-types/abi"
|
||||||
)
|
)
|
||||||
|
|
||||||
// FTUnsealed represents an unsealed sector file type.
|
// FTUnsealed represents an unsealed sector file.
|
||||||
// FTSealed represents a sealed sector file type.
|
// FTSealed represents a sealed sector file.
|
||||||
// FTCache represents a cache sector file type.
|
// FTCache represents a cache sector file.
|
||||||
// FTUpdate represents an update sector file type.
|
// FTUpdate represents an update sector file.
|
||||||
// FTUpdateCache represents an update cache sector file type.
|
// FTUpdateCache represents an update cache sector file.
|
||||||
// FTPiece represents a Piece Park sector file type.
|
// FTPiece represents a Piece Park sector file.
|
||||||
// FileTypes represents the total number of file types.
|
// FileTypes represents the total number of file.
|
||||||
//
|
//
|
||||||
// The SectorFileType type is an integer type that represents different sector file types.
|
// The SectorFileType type is an integer type that represents different sector file.
|
||||||
// It has several methods to manipulate and query the file type.
|
// It has several methods to manipulate and query the file.
|
||||||
// The String method returns a string representation of the file type.
|
// The String method returns a string representation of the file.
|
||||||
// The Strings method returns a slice of string representations of all the file types that are set in the receiver object.
|
// The Strings method returns a slice of string representations of all the file that are set in the receiver object.
|
||||||
// The AllSet method returns a slice of all the file types that are set in the receiver object.
|
// The AllSet method returns a slice of all the file that are set in the receiver object.
|
||||||
// The Has method checks whether a specific file type is set in the receiver object.
|
// The Has method checks whether a specific file type is set in the receiver object.
|
||||||
// The SealSpaceUse method calculates the space used by the receiver object in sealing a sector of a given size.
|
// The SealSpaceUse method calculates the space used by the receiver object in sealing a sector of a given size.
|
||||||
// The SubAllowed method removes selected file types from the receiver object based on a list of allowed and denied file types.
|
// The SubAllowed method removes selected file from the receiver object based on a list of allowed and denied file.
|
||||||
// The Unset method removes selected file types from the receiver object.
|
// The Unset method removes selected file from the receiver object.
|
||||||
// The AnyAllowed method checks whether any file types in the receiver object are allowed based on a list of allowed and denied file types.
|
// The AnyAllowed method checks whether any file in the receiver object are allowed based on a list of allowed and denied file.
|
||||||
// The Allowed method checks whether all file types in the receiver object are allowed based on a list of allowed and denied file types.
|
// The Allowed method checks whether all file in the receiver object are allowed based on a list of allowed and denied file.
|
||||||
// The StoreSpaceUse method calculates the space used by the receiver object in storing a sector of a given size.
|
// The StoreSpaceUse method calculates the space used by the receiver object in storing a sector of a given size.
|
||||||
// The All method returns an array that represents which file types are set in the receiver object.
|
// The All method returns an array that represents which file are set in the receiver object.
|
||||||
// The IsNone method checks whether the receiver object represents no file types.
|
// The IsNone method checks whether the receiver object represents no file.
|
||||||
const (
|
const (
|
||||||
// "regular" sectors
|
// "regular" sectors
|
||||||
FTUnsealed SectorFileType = 1 << iota
|
FTUnsealed SectorFileType = 1 << iota
|
||||||
@ -56,14 +56,14 @@ const (
|
|||||||
// - FTPiece: represents Piece Park sectors
|
// - FTPiece: represents Piece Park sectors
|
||||||
var PathTypes = []SectorFileType{FTUnsealed, FTSealed, FTCache, FTUpdate, FTUpdateCache, FTPiece}
|
var PathTypes = []SectorFileType{FTUnsealed, FTSealed, FTCache, FTUpdate, FTUpdateCache, FTPiece}
|
||||||
|
|
||||||
// FTNone represents a sector file type of none. This constant is used in the StorageLock method to specify that a sector should not have any file types locked.
|
// FTNone represents a sector file type of none. This constant is used in the StorageLock method to specify that a sector should not have any file locked.
|
||||||
// Example usage:
|
// Example usage:
|
||||||
// err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache)
|
// err := m.index.StorageLock(ctx, sector.ID, storiface.FTNone, storiface.FTSealed|storiface.FTUnsealed|storiface.FTCache)
|
||||||
const (
|
const (
|
||||||
FTNone SectorFileType = 0
|
FTNone SectorFileType = 0
|
||||||
)
|
)
|
||||||
|
|
||||||
// FTAll represents the combination of all available sector file types.
|
// FTAll represents the combination of all available sector file.
|
||||||
// It is a variable of type SectorFileType.
|
// It is a variable of type SectorFileType.
|
||||||
// The value of FTAll is calculated by iterating over the PathTypes slice and using the |= operator to perform a bitwise OR operation on each path type.
|
// The value of FTAll is calculated by iterating over the PathTypes slice and using the |= operator to perform a bitwise OR operation on each path type.
|
||||||
// The result is assigned to the variable out and returned.
|
// The result is assigned to the variable out and returned.
|
||||||
@ -78,7 +78,7 @@ var FTAll = func() (out SectorFileType) {
|
|||||||
// FSOverheadDen represents the constant value 10, which is used to calculate the overhead in various storage space utilization calculations.
|
// FSOverheadDen represents the constant value 10, which is used to calculate the overhead in various storage space utilization calculations.
|
||||||
const FSOverheadDen = 10
|
const FSOverheadDen = 10
|
||||||
|
|
||||||
// FSOverheadSeal is a map that represents the overheads for different SectorFileType in sealed sectors.
|
// FSOverheadSeal is a map that represents the overheads for different SectorFileType in sectors which are being sealed.
|
||||||
var FSOverheadSeal = map[SectorFileType]int{ // 10x overheads
|
var FSOverheadSeal = map[SectorFileType]int{ // 10x overheads
|
||||||
FTUnsealed: FSOverheadDen,
|
FTUnsealed: FSOverheadDen,
|
||||||
FTSealed: FSOverheadDen,
|
FTSealed: FSOverheadDen,
|
||||||
@ -93,27 +93,9 @@ var FSOverheadSeal = map[SectorFileType]int{ // 10x overheads
|
|||||||
// FsOverheadFinalized is a map that represents the finalized overhead for different types of SectorFileType.
|
// FsOverheadFinalized is a map that represents the finalized overhead for different types of SectorFileType.
|
||||||
// The keys in the map are the SectorFileType values, and the values are integers representing the overhead.
|
// The keys in the map are the SectorFileType values, and the values are integers representing the overhead.
|
||||||
// It is used to calculate the storage space usage for different types of sectors, as shown in the example below:
|
// It is used to calculate the storage space usage for different types of sectors, as shown in the example below:
|
||||||
//
|
|
||||||
// func (t SectorFileType) StoreSpaceUse(ssize abi.SectorSize) (uint64, error) {
|
|
||||||
// var need uint64
|
|
||||||
// for _, pathType := range PathTypes {
|
|
||||||
// if !t.Has(pathType) {
|
|
||||||
// continue
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// oh, ok := FsOverheadFinalized[pathType]
|
|
||||||
// if !ok {
|
|
||||||
// return 0, xerrors.Errorf("no finalized overhead info for %s", pathType)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// need += uint64(oh) * uint64(ssize) / FSOverheadDen
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return need, nil
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// The overhead value is retrieved from FsOverheadFinalized by using the SectorFileType value as the key.
|
// The overhead value is retrieved from FsOverheadFinalized by using the SectorFileType value as the key.
|
||||||
// If the overhead value is not found in the map, an error is returned indicating that there is no finalized overhead information for the given sector type.
|
// If the overhead value is not found in the map, an error is returned indicating that there is no finalized
|
||||||
|
// overhead information for the given sector type.
|
||||||
var FsOverheadFinalized = map[SectorFileType]int{
|
var FsOverheadFinalized = map[SectorFileType]int{
|
||||||
FTUnsealed: FSOverheadDen,
|
FTUnsealed: FSOverheadDen,
|
||||||
FTSealed: FSOverheadDen,
|
FTSealed: FSOverheadDen,
|
||||||
|
Loading…
Reference in New Issue
Block a user