123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- package shell
- import (
- "context"
- "flag"
- "fmt"
- "github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
- "github.com/seaweedfs/seaweedfs/weed/storage/needle"
- "github.com/seaweedfs/seaweedfs/weed/storage/super_block"
- "github.com/seaweedfs/seaweedfs/weed/storage/types"
- "io"
- )
- func init() {
- Commands = append(Commands, &commandGrow{})
- }
- type commandGrow struct {
- }
- func (c *commandGrow) Name() string {
- return "volume.grow"
- }
- func (c *commandGrow) Help() string {
- return `grow volumes
- volume.grow [-collection=<collection name>] [-dataCenter=<data center name>]
- `
- }
- func (c *commandGrow) HasTag(CommandTag) bool {
- return false
- }
- func (c *commandGrow) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) {
- volumeVacuumCommand := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
- growCount := volumeVacuumCommand.Uint("count", 2, "")
- collection := volumeVacuumCommand.String("collection", "", "grow this collection")
- dataCenter := volumeVacuumCommand.String("dataCenter", "", "grow volumes only from the specified data center")
- rack := volumeVacuumCommand.String("rack", "", "grow volumes only from the specified rack")
- dataNode := volumeVacuumCommand.String("dataNode", "", "grow volumes only from the specified data node")
- diskType := volumeVacuumCommand.String("diskType", "", "grow volumes only from the specified disk type")
- if err = volumeVacuumCommand.Parse(args); err != nil {
- return nil
- }
- if *collection == "" {
- return fmt.Errorf("collection option is required")
- }
- t, _, err := collectTopologyInfo(commandEnv, 0)
- if err != nil {
- return err
- }
- volumeGrowRequest := &master_pb.VolumeGrowRequest{
- Collection: *collection,
- DataCenter: *dataCenter,
- Rack: *rack,
- DataNode: *dataNode,
- WritableVolumeCount: uint32(*growCount),
- }
- collectionFound := false
- dataCenterFound := *dataCenter == ""
- rackFound := *rack == ""
- dataNodeFound := *dataNode == ""
- diskTypeFound := *diskType == ""
- for _, dc := range t.DataCenterInfos {
- if dc.Id == *dataCenter {
- dataCenterFound = true
- }
- for _, r := range dc.RackInfos {
- if r.Id == *rack {
- rackFound = true
- }
- for _, dn := range r.DataNodeInfos {
- if dn.Id == *dataNode {
- dataNodeFound = true
- }
- for _, di := range dn.DiskInfos {
- if !diskTypeFound && di.Type == types.ToDiskType(*diskType).String() {
- diskTypeFound = true
- }
- for _, vi := range di.VolumeInfos {
- if !collectionFound && vi.Collection == *collection {
- replicaPlacement, _ := super_block.NewReplicaPlacementFromByte(byte(vi.ReplicaPlacement))
- volumeGrowRequest.Ttl = needle.LoadTTLFromUint32(vi.Ttl).String()
- volumeGrowRequest.DiskType = vi.DiskType
- volumeGrowRequest.Replication = replicaPlacement.String()
- collectionFound = true
- }
- if collectionFound && dataCenterFound && rackFound && dataNodeFound && diskTypeFound {
- break
- }
- }
- }
- }
- }
- }
- if !dataCenterFound {
- return fmt.Errorf("data center not found")
- }
- if !rackFound {
- return fmt.Errorf("rack not found")
- }
- if !dataNodeFound {
- return fmt.Errorf("data node not found")
- }
- if !diskTypeFound {
- return fmt.Errorf("disk type not found")
- }
- if !collectionFound {
- return fmt.Errorf("collection not found")
- }
- if err = commandEnv.MasterClient.WithClient(false, func(client master_pb.SeaweedClient) error {
- if _, err := client.VolumeGrow(context.Background(), volumeGrowRequest); err != nil {
- return err
- }
- return nil
- }); err != nil {
- return
- }
- return nil
- }
|