aboutsummaryrefslogtreecommitdiff
path: root/weed/server/master_grpc_server_volume.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/master_grpc_server_volume.go')
-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
+}