forked from TrueCloudLab/frostfs-node
[#1681] node: Block only Object service ops under maintenance
In previous implementation node blocked any operation of local object storage in maintenance mode. There is a need to perform some storage operations like data evacuation or restoration. Do not call block storage engine in maintenance mode. Make all Object service operations to return `apistatus.NodeUnderMaintenance` error from each local op. Signed-off-by: Leonard Lyubich <ctulhurider@gmail.com>
This commit is contained in:
parent
082602b668
commit
713aea06fa
8 changed files with 86 additions and 31 deletions
|
@ -130,3 +130,10 @@ func WithKeyStorage(store *util.KeyStorage) Option {
|
|||
c.keyStore = store
|
||||
}
|
||||
}
|
||||
|
||||
// WithNodeState provides util.NodeState to Service.
|
||||
func WithNodeState(v util.NodeState) Option {
|
||||
return func(c *cfg) {
|
||||
c.localStorage.(*storageEngineWrapper).state = v
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,8 @@ import (
|
|||
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/engine"
|
||||
internal "github.com/nspcc-dev/neofs-node/pkg/services/object/internal/client"
|
||||
internalclient "github.com/nspcc-dev/neofs-node/pkg/services/object/internal/client"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/object/util"
|
||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
||||
)
|
||||
|
||||
|
@ -26,6 +28,8 @@ type clientWrapper struct {
|
|||
}
|
||||
|
||||
type storageEngineWrapper struct {
|
||||
state util.NodeState
|
||||
|
||||
engine *engine.StorageEngine
|
||||
}
|
||||
|
||||
|
@ -170,6 +174,11 @@ func (c *clientWrapper) getObject(exec *execCtx, info coreclient.NodeInfo) (*obj
|
|||
}
|
||||
|
||||
func (e *storageEngineWrapper) get(exec *execCtx) (*object.Object, error) {
|
||||
if e.state != nil && e.state.IsMaintenance() {
|
||||
var st apistatus.NodeUnderMaintenance
|
||||
return nil, st
|
||||
}
|
||||
|
||||
if exec.headOnly() {
|
||||
var headPrm engine.HeadPrm
|
||||
headPrm.WithAddress(exec.address())
|
||||
|
|
|
@ -81,9 +81,12 @@ func WithLogger(l *logger.Logger) Option {
|
|||
|
||||
// WithLocalStorageEngine returns option to set local storage
|
||||
// instance.
|
||||
func WithLocalStorageEngine(e *engine.StorageEngine) Option {
|
||||
func WithLocalStorageEngine(e *engine.StorageEngine, state util.NodeState) Option {
|
||||
return func(c *cfg) {
|
||||
c.localStorage = (*storageEngineWrapper)(e)
|
||||
c.localStorage = &storageEngineWrapper{
|
||||
state: state,
|
||||
storage: e,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
internalclient "github.com/nspcc-dev/neofs-node/pkg/services/object/internal/client"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/object/util"
|
||||
"github.com/nspcc-dev/neofs-node/pkg/services/object_manager/placement"
|
||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
||||
)
|
||||
|
@ -29,7 +30,11 @@ type clientWrapper struct {
|
|||
client client.MultiAddressClient
|
||||
}
|
||||
|
||||
type storageEngineWrapper engine.StorageEngine
|
||||
type storageEngineWrapper struct {
|
||||
state util.NodeState
|
||||
|
||||
storage *engine.StorageEngine
|
||||
}
|
||||
|
||||
type traverseGeneratorWrapper util.TraverserGenerator
|
||||
|
||||
|
@ -120,11 +125,16 @@ func (c *clientWrapper) searchObjects(exec *execCtx, info client.NodeInfo) ([]oi
|
|||
}
|
||||
|
||||
func (e *storageEngineWrapper) search(exec *execCtx) ([]oid.ID, error) {
|
||||
if e.state != nil && e.state.IsMaintenance() {
|
||||
var st apistatus.NodeUnderMaintenance
|
||||
return nil, st
|
||||
}
|
||||
|
||||
var selectPrm engine.SelectPrm
|
||||
selectPrm.WithFilters(exec.searchFilters())
|
||||
selectPrm.WithContainerID(exec.containerID())
|
||||
|
||||
r, err := (*engine.StorageEngine)(e).Select(selectPrm)
|
||||
r, err := e.storage.Select(selectPrm)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
9
pkg/services/object/util/node_state.go
Normal file
9
pkg/services/object/util/node_state.go
Normal file
|
@ -0,0 +1,9 @@
|
|||
package util
|
||||
|
||||
// NodeState is storage node state processed by Object service.
|
||||
type NodeState interface {
|
||||
// IsMaintenance checks if node is under maintenance. Node MUST NOT serve
|
||||
// local object operations. Node MUST respond with apistatus.NodeUnderMaintenance
|
||||
// error if IsMaintenance returns true.
|
||||
IsMaintenance() bool
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue