diff options
Diffstat (limited to 'weed/server/master_grpc_server_volume.go')
| -rw-r--r-- | weed/server/master_grpc_server_volume.go | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/weed/server/master_grpc_server_volume.go b/weed/server/master_grpc_server_volume.go index d11a98f93..1848097ec 100644 --- a/weed/server/master_grpc_server_volume.go +++ b/weed/server/master_grpc_server_volume.go @@ -282,3 +282,27 @@ func (ms *MasterServer) VacuumVolume(ctx context.Context, req *master_pb.VacuumV return resp, nil } + +func (ms *MasterServer) VolumeMarkReadonly(ctx context.Context, req *master_pb.VolumeMarkReadonlyRequest) (*master_pb.VolumeMarkReadonlyResponse, error) { + + if !ms.Topo.IsLeader() { + return nil, raft.NotLeaderError + } + + resp := &master_pb.VolumeMarkReadonlyResponse{} + + replicaPlacement, _ := super_block.NewReplicaPlacementFromByte(byte(req.ReplicaPlacement)) + vl := ms.Topo.GetVolumeLayout(req.Collection, replicaPlacement, needle.LoadTTLFromUint32(req.Ttl), types.ToDiskType(req.DiskType)) + dataNodes := ms.Topo.Lookup(req.Collection, needle.VolumeId(req.VolumeId)) + for _, dn := range dataNodes { + if dn.Ip == req.Ip && dn.Port == int(req.Port) { + if req.IsReadonly { + vl.SetVolumeUnavailable(dn, needle.VolumeId(req.VolumeId)) + } else { + vl.SetVolumeAvailable(dn, needle.VolumeId(req.VolumeId), false) + } + } + } + + return resp, nil +} |
