forked from TrueCloudLab/frostfs-node
4944490ffb
`Degraded` mode can be set by the administrator if needed. Modifying operations in this mode can lead node into an inconsistent state because metabase checks such as lock checking are not performed. Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
59 lines
1.4 KiB
Go
59 lines
1.4 KiB
Go
package control
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/shard"
|
|
"github.com/nspcc-dev/neofs-node/pkg/local_object_storage/shard/mode"
|
|
"github.com/nspcc-dev/neofs-node/pkg/services/control"
|
|
"google.golang.org/grpc/codes"
|
|
"google.golang.org/grpc/status"
|
|
)
|
|
|
|
func (s *Server) SetShardMode(_ context.Context, req *control.SetShardModeRequest) (*control.SetShardModeResponse, error) {
|
|
// verify request
|
|
err := s.isValidRequest(req)
|
|
if err != nil {
|
|
return nil, status.Error(codes.PermissionDenied, err.Error())
|
|
}
|
|
|
|
var (
|
|
m mode.Mode
|
|
|
|
requestedMode = req.GetBody().GetMode()
|
|
requestedShard = shard.NewIDFromBytes(req.Body.GetShard_ID())
|
|
)
|
|
|
|
switch requestedMode {
|
|
case control.ShardMode_READ_WRITE:
|
|
m = mode.ReadWrite
|
|
case control.ShardMode_READ_ONLY:
|
|
m = mode.ReadOnly
|
|
case control.ShardMode_DEGRADED:
|
|
m = mode.Degraded
|
|
case control.ShardMode_DEGRADED_READ_ONLY:
|
|
m = mode.ReadOnly
|
|
default:
|
|
return nil, status.Error(codes.Internal, fmt.Sprintf("unknown shard mode: %s", requestedMode))
|
|
}
|
|
|
|
err = s.s.SetShardMode(requestedShard, m, false)
|
|
if err != nil {
|
|
return nil, status.Error(codes.Internal, err.Error())
|
|
}
|
|
|
|
// create and fill response
|
|
resp := new(control.SetShardModeResponse)
|
|
|
|
body := new(control.SetShardModeResponse_Body)
|
|
resp.SetBody(body)
|
|
|
|
// sign the response
|
|
err = SignMessage(s.key, resp)
|
|
if err != nil {
|
|
return nil, status.Error(codes.Internal, err.Error())
|
|
}
|
|
|
|
return resp, nil
|
|
}
|