frostfs-node/pkg/services/control/server/set_shard_mode.go
Evgenii Stratonikov 4944490ffb [#1559] local_object_storage: Move shard to the DegradedReadOnly mode
`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>
2022-07-21 17:56:06 +03:00

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
}