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>
101 lines
2.7 KiB
Go
101 lines
2.7 KiB
Go
package control
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/mr-tron/base58"
|
|
rawclient "github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/common"
|
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags"
|
|
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key"
|
|
"github.com/nspcc-dev/neofs-node/pkg/services/control"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
const (
|
|
shardModeFlag = "mode"
|
|
shardIDFlag = "id"
|
|
shardClearErrorsFlag = "clear-errors"
|
|
|
|
shardModeReadOnly = "read-only"
|
|
shardModeReadWrite = "read-write"
|
|
shardModeDegraded = "degraded"
|
|
shardModeDegradedReadOnly = "degraded-read-only"
|
|
)
|
|
|
|
var setShardModeCmd = &cobra.Command{
|
|
Use: "set-mode",
|
|
Short: "Set work mode of the shard",
|
|
Long: "Set work mode of the shard",
|
|
Run: setShardMode,
|
|
}
|
|
|
|
func initControlSetShardModeCmd() {
|
|
commonflags.InitWithoutRPC(setShardModeCmd)
|
|
|
|
flags := setShardModeCmd.Flags()
|
|
|
|
flags.String(controlRPC, controlRPCDefault, controlRPCUsage)
|
|
flags.String(shardIDFlag, "", "ID of the shard in base58 encoding")
|
|
flags.String(shardModeFlag, "",
|
|
fmt.Sprintf("new shard mode keyword ('%s', '%s', '%s')",
|
|
shardModeReadWrite,
|
|
shardModeReadOnly,
|
|
shardModeDegraded,
|
|
),
|
|
)
|
|
flags.Bool(shardClearErrorsFlag, false, "Set shard error count to 0")
|
|
}
|
|
|
|
func setShardMode(cmd *cobra.Command, _ []string) {
|
|
pk := key.Get(cmd)
|
|
|
|
var mode control.ShardMode
|
|
|
|
switch shardMode, _ := cmd.Flags().GetString(shardModeFlag); shardMode {
|
|
default:
|
|
common.ExitOnErr(cmd, "", fmt.Errorf("unsupported mode %s", shardMode))
|
|
case shardModeReadWrite:
|
|
mode = control.ShardMode_READ_WRITE
|
|
case shardModeReadOnly:
|
|
mode = control.ShardMode_READ_ONLY
|
|
case shardModeDegraded:
|
|
mode = control.ShardMode_DEGRADED
|
|
case shardModeDegradedReadOnly:
|
|
mode = control.ShardMode_DEGRADED_READ_ONLY
|
|
}
|
|
|
|
req := new(control.SetShardModeRequest)
|
|
|
|
body := new(control.SetShardModeRequest_Body)
|
|
req.SetBody(body)
|
|
|
|
body.SetMode(mode)
|
|
body.SetShardID(getShardID(cmd))
|
|
|
|
reset, _ := cmd.Flags().GetBool(shardClearErrorsFlag)
|
|
body.ClearErrorCounter(reset)
|
|
|
|
signRequest(cmd, pk, req)
|
|
|
|
cli := getClient(cmd, pk)
|
|
|
|
var resp *control.SetShardModeResponse
|
|
var err error
|
|
err = cli.ExecRaw(func(client *rawclient.Client) error {
|
|
resp, err = control.SetShardMode(client, req)
|
|
return err
|
|
})
|
|
common.ExitOnErr(cmd, "rpc error: %w", err)
|
|
|
|
verifyResponse(cmd, resp.GetSignature(), resp.GetBody())
|
|
|
|
cmd.Println("Shard mode update request successfully sent.")
|
|
}
|
|
|
|
func getShardID(cmd *cobra.Command) []byte {
|
|
sid, _ := cmd.Flags().GetString(shardIDFlag)
|
|
raw, err := base58.Decode(sid)
|
|
common.ExitOnErr(cmd, "incorrect shard ID encoding: %w", err)
|
|
return raw
|
|
}
|