config: Storage.DisallowRemoteFinalize
This commit is contained in:
parent
8c6cba7a03
commit
7612860d15
@ -542,6 +542,13 @@
|
|||||||
# env var: LOTUS_STORAGE_ASSIGNER
|
# env var: LOTUS_STORAGE_ASSIGNER
|
||||||
#Assigner = "utilization"
|
#Assigner = "utilization"
|
||||||
|
|
||||||
|
# If you see stuck Finalize tasks after enabling this setting, check
|
||||||
|
# 'lotus-miner sealing sched-diag' and 'lotus-miner storage find [sector num]'
|
||||||
|
#
|
||||||
|
# type: bool
|
||||||
|
# env var: LOTUS_STORAGE_DISALLOWREMOTEFINALIZE
|
||||||
|
#DisallowRemoteFinalize = false
|
||||||
|
|
||||||
# ResourceFiltering instructs the system which resource filtering strategy
|
# ResourceFiltering instructs the system which resource filtering strategy
|
||||||
# to use when evaluating tasks against this worker. An empty value defaults
|
# to use when evaluating tasks against this worker. An empty value defaults
|
||||||
# to "hardware".
|
# to "hardware".
|
||||||
|
12
extern/sector-storage/manager.go
vendored
12
extern/sector-storage/manager.go
vendored
@ -71,7 +71,8 @@ type Manager struct {
|
|||||||
workLk sync.Mutex
|
workLk sync.Mutex
|
||||||
work *statestore.StateStore
|
work *statestore.StateStore
|
||||||
|
|
||||||
parallelCheckLimit int
|
parallelCheckLimit int
|
||||||
|
disallowRemoteFinalize bool
|
||||||
|
|
||||||
callToWork map[storiface.CallID]WorkID
|
callToWork map[storiface.CallID]WorkID
|
||||||
// used when we get an early return and there's no callToWork mapping
|
// used when we get an early return and there's no callToWork mapping
|
||||||
@ -123,6 +124,8 @@ type Config struct {
|
|||||||
// PoSt config
|
// PoSt config
|
||||||
ParallelCheckLimit int
|
ParallelCheckLimit int
|
||||||
|
|
||||||
|
DisallowRemoteFinalize bool
|
||||||
|
|
||||||
Assigner string
|
Assigner string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,7 +158,8 @@ func New(ctx context.Context, lstor *stores.Local, stor stores.Store, ls stores.
|
|||||||
|
|
||||||
localProver: prover,
|
localProver: prover,
|
||||||
|
|
||||||
parallelCheckLimit: sc.ParallelCheckLimit,
|
parallelCheckLimit: sc.ParallelCheckLimit,
|
||||||
|
disallowRemoteFinalize: sc.DisallowRemoteFinalize,
|
||||||
|
|
||||||
work: mss,
|
work: mss,
|
||||||
callToWork: map[storiface.CallID]WorkID{},
|
callToWork: map[storiface.CallID]WorkID{},
|
||||||
@ -634,7 +638,7 @@ func (m *Manager) FinalizeSector(ctx context.Context, sector storage.SectorRef,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// get a selector for moving stuff into long-term storage
|
// get a selector for moving stuff into long-term storage
|
||||||
fetchSel := newMoveSelector(m.index, sector.ID, storiface.FTCache|storiface.FTSealed, storiface.PathStorage)
|
fetchSel := newMoveSelector(m.index, sector.ID, storiface.FTCache|storiface.FTSealed, storiface.PathStorage, !m.disallowRemoteFinalize)
|
||||||
|
|
||||||
// only move the unsealed file if it still exists and needs moving
|
// only move the unsealed file if it still exists and needs moving
|
||||||
moveUnsealed := unsealed
|
moveUnsealed := unsealed
|
||||||
@ -712,7 +716,7 @@ func (m *Manager) FinalizeReplicaUpdate(ctx context.Context, sector storage.Sect
|
|||||||
|
|
||||||
move := func(types storiface.SectorFileType) error {
|
move := func(types storiface.SectorFileType) error {
|
||||||
// get a selector for moving stuff into long-term storage
|
// get a selector for moving stuff into long-term storage
|
||||||
fetchSel := newMoveSelector(m.index, sector.ID, types, storiface.PathStorage)
|
fetchSel := newMoveSelector(m.index, sector.ID, types, storiface.PathStorage, !m.disallowRemoteFinalize)
|
||||||
{
|
{
|
||||||
if len(keepUnsealed) == 0 {
|
if len(keepUnsealed) == 0 {
|
||||||
moveUnsealed = storiface.FTNone
|
moveUnsealed = storiface.FTNone
|
||||||
|
22
extern/sector-storage/selector_move.go
vendored
22
extern/sector-storage/selector_move.go
vendored
@ -13,18 +13,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type moveSelector struct {
|
type moveSelector struct {
|
||||||
index stores.SectorIndex
|
index stores.SectorIndex
|
||||||
sector abi.SectorID
|
sector abi.SectorID
|
||||||
alloc storiface.SectorFileType
|
alloc storiface.SectorFileType
|
||||||
destPtype storiface.PathType
|
destPtype storiface.PathType
|
||||||
|
allowRemote bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMoveSelector(index stores.SectorIndex, sector abi.SectorID, alloc storiface.SectorFileType, destPtype storiface.PathType) *moveSelector {
|
func newMoveSelector(index stores.SectorIndex, sector abi.SectorID, alloc storiface.SectorFileType, destPtype storiface.PathType, allowRemote bool) *moveSelector {
|
||||||
return &moveSelector{
|
return &moveSelector{
|
||||||
index: index,
|
index: index,
|
||||||
sector: sector,
|
sector: sector,
|
||||||
alloc: alloc,
|
alloc: alloc,
|
||||||
destPtype: destPtype,
|
destPtype: destPtype,
|
||||||
|
allowRemote: allowRemote,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,7 +88,7 @@ func (s *moveSelector) Ok(ctx context.Context, task sealtasks.TaskType, spt abi.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ok, false, nil
|
return ok && s.allowRemote, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *moveSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b *WorkerHandle) (bool, error) {
|
func (s *moveSelector) Cmp(ctx context.Context, task sealtasks.TaskType, a, b *WorkerHandle) (bool, error) {
|
||||||
|
@ -763,6 +763,13 @@ This parameter is ONLY applicable if the retrieval pricing policy strategy has b
|
|||||||
Comment: `Assigner specifies the worker assigner to use when scheduling tasks.
|
Comment: `Assigner specifies the worker assigner to use when scheduling tasks.
|
||||||
"utilization" (default) - assign tasks to workers with lowest utilization.
|
"utilization" (default) - assign tasks to workers with lowest utilization.
|
||||||
"spread" - assign tasks to as many distinct workers as possible.`,
|
"spread" - assign tasks to as many distinct workers as possible.`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "DisallowRemoteFinalize",
|
||||||
|
Type: "bool",
|
||||||
|
|
||||||
|
Comment: `If you see stuck Finalize tasks after enabling this setting, check
|
||||||
|
'lotus-miner sealing sched-diag' and 'lotus-miner storage find [sector num]'`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Name: "ResourceFiltering",
|
Name: "ResourceFiltering",
|
||||||
|
@ -63,6 +63,7 @@ func (c *StorageMiner) StorageManager() sectorstorage.Config {
|
|||||||
AllowProveReplicaUpdate2: c.Storage.AllowProveReplicaUpdate2,
|
AllowProveReplicaUpdate2: c.Storage.AllowProveReplicaUpdate2,
|
||||||
AllowRegenSectorKey: c.Storage.AllowRegenSectorKey,
|
AllowRegenSectorKey: c.Storage.AllowRegenSectorKey,
|
||||||
ResourceFiltering: c.Storage.ResourceFiltering,
|
ResourceFiltering: c.Storage.ResourceFiltering,
|
||||||
|
DisallowRemoteFinalize: c.Storage.DisallowRemoteFinalize,
|
||||||
|
|
||||||
Assigner: c.Storage.Assigner,
|
Assigner: c.Storage.Assigner,
|
||||||
|
|
||||||
|
@ -335,6 +335,19 @@ type SealerConfig struct {
|
|||||||
// "spread" - assign tasks to as many distinct workers as possible.
|
// "spread" - assign tasks to as many distinct workers as possible.
|
||||||
Assigner string
|
Assigner string
|
||||||
|
|
||||||
|
// DisallowRemoteFinalize when set to true will force all Finalize tasks to
|
||||||
|
// run on workers with local access to both long-term storage and the sealing
|
||||||
|
// path containing the sector.
|
||||||
|
//
|
||||||
|
// WARNING: Only set this if all workers have access to long-term storage
|
||||||
|
// paths. If this flag is enabled, and there are workers without long-term
|
||||||
|
// storage access, sectors will not be moved from them, and Finalize tasks
|
||||||
|
// will appear to be stuck.
|
||||||
|
//
|
||||||
|
// If you see stuck Finalize tasks after enabling this setting, check
|
||||||
|
// 'lotus-miner sealing sched-diag' and 'lotus-miner storage find [sector num]'
|
||||||
|
DisallowRemoteFinalize bool
|
||||||
|
|
||||||
// ResourceFiltering instructs the system which resource filtering strategy
|
// ResourceFiltering instructs the system which resource filtering strategy
|
||||||
// to use when evaluating tasks against this worker. An empty value defaults
|
// to use when evaluating tasks against this worker. An empty value defaults
|
||||||
// to "hardware".
|
// to "hardware".
|
||||||
|
Loading…
Reference in New Issue
Block a user