aboutsummaryrefslogtreecommitdiff
path: root/weed/server
diff options
context:
space:
mode:
authorKonstantin Lebedev <9497591+kmlebedev@users.noreply.github.com>2024-09-09 23:42:56 +0500
committerGitHub <noreply@github.com>2024-09-09 11:42:56 -0700
commit15965f7c5421f60cc8f822ec34e1dc0da23ea1df (patch)
treeee5452e89d95e5263723ae460919c3a76e846cb3 /weed/server
parent4af21b0dfced547b540a6c20b03151cbc4faa6b5 (diff)
downloadseaweedfs-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.go47
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
+}