diff options
| author | Konstantin Lebedev <9497591+kmlebedev@users.noreply.github.com> | 2024-09-09 23:42:56 +0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-09 11:42:56 -0700 |
| commit | 15965f7c5421f60cc8f822ec34e1dc0da23ea1df (patch) | |
| tree | ee5452e89d95e5263723ae460919c3a76e846cb3 /weed/server | |
| parent | 4af21b0dfced547b540a6c20b03151cbc4faa6b5 (diff) | |
| download | seaweedfs-15965f7c5421f60cc8f822ec34e1dc0da23ea1df.tar.xz seaweedfs-15965f7c5421f60cc8f822ec34e1dc0da23ea1df.zip | |
[shell] fix volume grow in shell (#5992)
* fix volume grow in shell
* revert add Async
* check available volume space
* create a VolumeGrowRequest and remove unnecessary fields
Diffstat (limited to 'weed/server')
| -rw-r--r-- | weed/server/master_grpc_server_volume.go | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/weed/server/master_grpc_server_volume.go b/weed/server/master_grpc_server_volume.go index db0976fb7..e40f054e0 100644 --- a/weed/server/master_grpc_server_volume.go +++ b/weed/server/master_grpc_server_volume.go @@ -286,3 +286,50 @@ func (ms *MasterServer) VolumeMarkReadonly(ctx context.Context, req *master_pb.V return resp, nil } + +func (ms *MasterServer) VolumeGrow(ctx context.Context, req *master_pb.VolumeGrowRequest) (*master_pb.VolumeGrowResponse, error) { + if !ms.Topo.IsLeader() { + return nil, raft.NotLeaderError + } + if req.Replication == "" { + req.Replication = ms.option.DefaultReplicaPlacement + } + replicaPlacement, err := super_block.NewReplicaPlacementFromString(req.Replication) + if err != nil { + return nil, err + } + ttl, err := needle.ReadTTL(req.Ttl) + if err != nil { + return nil, err + } + volumeGrowOption := topology.VolumeGrowOption{ + Collection: req.Collection, + ReplicaPlacement: replicaPlacement, + Ttl: ttl, + DiskType: types.ToDiskType(req.DiskType), + Preallocate: ms.preallocateSize, + DataCenter: req.DataCenter, + Rack: req.Rack, + DataNode: req.DataNode, + MemoryMapMaxSizeMb: req.MemoryMapMaxSizeMb, + } + volumeGrowRequest := topology.VolumeGrowRequest{ + Option: &volumeGrowOption, + Count: req.WritableVolumeCount, + Force: true, + Reason: "grpc volume grow", + } + replicaCount := int64(req.WritableVolumeCount * uint32(replicaPlacement.GetCopyCount())) + + if ms.Topo.AvailableSpaceFor(&volumeGrowOption) < replicaCount { + return nil, fmt.Errorf("only %d volumes left, not enough for %d", ms.Topo.AvailableSpaceFor(&volumeGrowOption), replicaCount) + } + + if !ms.Topo.DataCenterExists(volumeGrowOption.DataCenter) { + err = fmt.Errorf("data center %v not found in topology", volumeGrowOption.DataCenter) + } + + ms.DoAutomaticVolumeGrow(&volumeGrowRequest) + + return &master_pb.VolumeGrowResponse{}, nil +} |
