From 9ef446d0cf05567aa8f9f6c1bf27fb3b5cb2e051 Mon Sep 17 00:00:00 2001 From: Ping Qiu Date: Wed, 11 Mar 2026 14:48:28 -0700 Subject: [PATCH] feat: master-backed NVMe/TCP publication (nvme_addr + nqn plumbing) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add nvme_addr and nqn fields to proto messages (AllocateBlockVolume, CreateBlockVolume, LookupBlockVolume, BlockVolumeInfoMessage), wire through volume server → master registry → CSI driver. Volume servers report NVMe address in heartbeats when NVMe target is running. CSI MasterVolumeClient now populates NvmeAddr/NQN from master responses, enabling NVMe/TCP via the master-backend path. Proto files regenerated with protoc 29.5. Co-Authored-By: Claude Opus 4.6 --- weed/pb/master.proto | 6 + weed/pb/master_pb/master.pb.go | 483 +++++++++++------- weed/pb/master_pb/master_grpc.pb.go | 2 +- weed/pb/volume_server.proto | 2 + weed/pb/volume_server_pb/volume_server.pb.go | 33 +- .../volume_server_pb/volume_server_grpc.pb.go | 2 +- weed/server/master_block_registry.go | 2 + weed/server/master_grpc_server_block.go | 6 + weed/server/master_grpc_server_block_test.go | 86 ++++ weed/server/master_server.go | 4 + weed/server/volume_grpc_block.go | 9 +- weed/server/volume_server_block.go | 8 + weed/storage/blockvol/block_heartbeat.go | 2 + .../storage/blockvol/block_heartbeat_proto.go | 4 + .../blockvol/block_heartbeat_proto_test.go | 39 ++ weed/storage/blockvol/csi/volume_backend.go | 9 +- 16 files changed, 488 insertions(+), 209 deletions(-) diff --git a/weed/pb/master.proto b/weed/pb/master.proto index 7464b8417..7b32a73f1 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -506,6 +506,8 @@ message BlockVolumeInfoMessage { int64 last_scrub_time = 14; bool replica_degraded = 15; string durability_mode = 16; + string nvme_addr = 17; + string nqn = 18; } message BlockVolumeShortInfoMessage { @@ -546,6 +548,8 @@ message CreateBlockVolumeResponse { uint64 capacity_bytes = 5; string replica_server = 6; repeated string replica_servers = 7; + string nvme_addr = 8; + string nqn = 9; } message DeleteBlockVolumeRequest { @@ -566,6 +570,8 @@ message LookupBlockVolumeResponse { uint32 replica_factor = 6; repeated string replica_servers = 7; string durability_mode = 8; + string nvme_addr = 9; + string nqn = 10; } message CreateBlockSnapshotRequest { diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index a54845644..6ceaf2ebb 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v5.29.3 +// protoc v5.29.5 // source: master.proto package master_pb @@ -3900,6 +3900,8 @@ type BlockVolumeInfoMessage struct { LastScrubTime int64 `protobuf:"varint,14,opt,name=last_scrub_time,json=lastScrubTime,proto3" json:"last_scrub_time,omitempty"` ReplicaDegraded bool `protobuf:"varint,15,opt,name=replica_degraded,json=replicaDegraded,proto3" json:"replica_degraded,omitempty"` DurabilityMode string `protobuf:"bytes,16,opt,name=durability_mode,json=durabilityMode,proto3" json:"durability_mode,omitempty"` + NvmeAddr string `protobuf:"bytes,17,opt,name=nvme_addr,json=nvmeAddr,proto3" json:"nvme_addr,omitempty"` + Nqn string `protobuf:"bytes,18,opt,name=nqn,proto3" json:"nqn,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -4046,6 +4048,20 @@ func (x *BlockVolumeInfoMessage) GetDurabilityMode() string { return "" } +func (x *BlockVolumeInfoMessage) GetNvmeAddr() string { + if x != nil { + return x.NvmeAddr + } + return "" +} + +func (x *BlockVolumeInfoMessage) GetNqn() string { + if x != nil { + return x.Nqn + } + return "" +} + type BlockVolumeShortInfoMessage struct { state protoimpl.MessageState `protogen:"open.v1"` Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` @@ -4214,7 +4230,6 @@ func (x *BlockVolumeAssignment) GetReplicaAddrs() []*ReplicaAddrMessage { return nil } -// ReplicaAddrMessage holds data and control addresses for one replica. type ReplicaAddrMessage struct { state protoimpl.MessageState `protogen:"open.v1"` DataAddr string `protobuf:"bytes,1,opt,name=data_addr,json=dataAddr,proto3" json:"data_addr,omitempty"` @@ -4223,9 +4238,35 @@ type ReplicaAddrMessage struct { sizeCache protoimpl.SizeCache } -func (x *ReplicaAddrMessage) Reset() { *x = ReplicaAddrMessage{} } -func (x *ReplicaAddrMessage) String() string { return "ReplicaAddr{" + x.DataAddr + "," + x.CtrlAddr + "}" } -func (*ReplicaAddrMessage) ProtoMessage() {} +func (x *ReplicaAddrMessage) Reset() { + *x = ReplicaAddrMessage{} + mi := &file_master_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReplicaAddrMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReplicaAddrMessage) ProtoMessage() {} + +func (x *ReplicaAddrMessage) ProtoReflect() protoreflect.Message { + mi := &file_master_proto_msgTypes[64] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReplicaAddrMessage.ProtoReflect.Descriptor instead. +func (*ReplicaAddrMessage) Descriptor() ([]byte, []int) { + return file_master_proto_rawDescGZIP(), []int{64} +} func (x *ReplicaAddrMessage) GetDataAddr() string { if x != nil { @@ -4242,10 +4283,10 @@ func (x *ReplicaAddrMessage) GetCtrlAddr() string { } type CreateBlockVolumeRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - SizeBytes uint64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` - DiskType string `protobuf:"bytes,3,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + SizeBytes uint64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` + DiskType string `protobuf:"bytes,3,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` ReplicaFactor uint32 `protobuf:"varint,4,opt,name=replica_factor,json=replicaFactor,proto3" json:"replica_factor,omitempty"` DurabilityMode string `protobuf:"bytes,5,opt,name=durability_mode,json=durabilityMode,proto3" json:"durability_mode,omitempty"` unknownFields protoimpl.UnknownFields @@ -4254,7 +4295,7 @@ type CreateBlockVolumeRequest struct { func (x *CreateBlockVolumeRequest) Reset() { *x = CreateBlockVolumeRequest{} - mi := &file_master_proto_msgTypes[64] + mi := &file_master_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4266,7 +4307,7 @@ func (x *CreateBlockVolumeRequest) String() string { func (*CreateBlockVolumeRequest) ProtoMessage() {} func (x *CreateBlockVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[64] + mi := &file_master_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4279,7 +4320,7 @@ func (x *CreateBlockVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateBlockVolumeRequest.ProtoReflect.Descriptor instead. func (*CreateBlockVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{64} + return file_master_proto_rawDescGZIP(), []int{65} } func (x *CreateBlockVolumeRequest) GetName() string { @@ -4318,21 +4359,23 @@ func (x *CreateBlockVolumeRequest) GetDurabilityMode() string { } type CreateBlockVolumeResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` - VolumeServer string `protobuf:"bytes,2,opt,name=volume_server,json=volumeServer,proto3" json:"volume_server,omitempty"` - IscsiAddr string `protobuf:"bytes,3,opt,name=iscsi_addr,json=iscsiAddr,proto3" json:"iscsi_addr,omitempty"` - Iqn string `protobuf:"bytes,4,opt,name=iqn,proto3" json:"iqn,omitempty"` - CapacityBytes uint64 `protobuf:"varint,5,opt,name=capacity_bytes,json=capacityBytes,proto3" json:"capacity_bytes,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + VolumeId string `protobuf:"bytes,1,opt,name=volume_id,json=volumeId,proto3" json:"volume_id,omitempty"` + VolumeServer string `protobuf:"bytes,2,opt,name=volume_server,json=volumeServer,proto3" json:"volume_server,omitempty"` + IscsiAddr string `protobuf:"bytes,3,opt,name=iscsi_addr,json=iscsiAddr,proto3" json:"iscsi_addr,omitempty"` + Iqn string `protobuf:"bytes,4,opt,name=iqn,proto3" json:"iqn,omitempty"` + CapacityBytes uint64 `protobuf:"varint,5,opt,name=capacity_bytes,json=capacityBytes,proto3" json:"capacity_bytes,omitempty"` ReplicaServer string `protobuf:"bytes,6,opt,name=replica_server,json=replicaServer,proto3" json:"replica_server,omitempty"` ReplicaServers []string `protobuf:"bytes,7,rep,name=replica_servers,json=replicaServers,proto3" json:"replica_servers,omitempty"` + NvmeAddr string `protobuf:"bytes,8,opt,name=nvme_addr,json=nvmeAddr,proto3" json:"nvme_addr,omitempty"` + Nqn string `protobuf:"bytes,9,opt,name=nqn,proto3" json:"nqn,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *CreateBlockVolumeResponse) Reset() { *x = CreateBlockVolumeResponse{} - mi := &file_master_proto_msgTypes[65] + mi := &file_master_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4344,7 +4387,7 @@ func (x *CreateBlockVolumeResponse) String() string { func (*CreateBlockVolumeResponse) ProtoMessage() {} func (x *CreateBlockVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[65] + mi := &file_master_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4357,7 +4400,7 @@ func (x *CreateBlockVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateBlockVolumeResponse.ProtoReflect.Descriptor instead. func (*CreateBlockVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{65} + return file_master_proto_rawDescGZIP(), []int{66} } func (x *CreateBlockVolumeResponse) GetVolumeId() string { @@ -4409,6 +4452,20 @@ func (x *CreateBlockVolumeResponse) GetReplicaServers() []string { return nil } +func (x *CreateBlockVolumeResponse) GetNvmeAddr() string { + if x != nil { + return x.NvmeAddr + } + return "" +} + +func (x *CreateBlockVolumeResponse) GetNqn() string { + if x != nil { + return x.Nqn + } + return "" +} + type DeleteBlockVolumeRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -4418,7 +4475,7 @@ type DeleteBlockVolumeRequest struct { func (x *DeleteBlockVolumeRequest) Reset() { *x = DeleteBlockVolumeRequest{} - mi := &file_master_proto_msgTypes[66] + mi := &file_master_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4430,7 +4487,7 @@ func (x *DeleteBlockVolumeRequest) String() string { func (*DeleteBlockVolumeRequest) ProtoMessage() {} func (x *DeleteBlockVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[66] + mi := &file_master_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4443,7 +4500,7 @@ func (x *DeleteBlockVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteBlockVolumeRequest.ProtoReflect.Descriptor instead. func (*DeleteBlockVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{66} + return file_master_proto_rawDescGZIP(), []int{67} } func (x *DeleteBlockVolumeRequest) GetName() string { @@ -4461,7 +4518,7 @@ type DeleteBlockVolumeResponse struct { func (x *DeleteBlockVolumeResponse) Reset() { *x = DeleteBlockVolumeResponse{} - mi := &file_master_proto_msgTypes[67] + mi := &file_master_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4473,7 +4530,7 @@ func (x *DeleteBlockVolumeResponse) String() string { func (*DeleteBlockVolumeResponse) ProtoMessage() {} func (x *DeleteBlockVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[67] + mi := &file_master_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4486,7 +4543,7 @@ func (x *DeleteBlockVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteBlockVolumeResponse.ProtoReflect.Descriptor instead. func (*DeleteBlockVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{67} + return file_master_proto_rawDescGZIP(), []int{68} } type LookupBlockVolumeRequest struct { @@ -4498,7 +4555,7 @@ type LookupBlockVolumeRequest struct { func (x *LookupBlockVolumeRequest) Reset() { *x = LookupBlockVolumeRequest{} - mi := &file_master_proto_msgTypes[68] + mi := &file_master_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4510,7 +4567,7 @@ func (x *LookupBlockVolumeRequest) String() string { func (*LookupBlockVolumeRequest) ProtoMessage() {} func (x *LookupBlockVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[68] + mi := &file_master_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4523,7 +4580,7 @@ func (x *LookupBlockVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupBlockVolumeRequest.ProtoReflect.Descriptor instead. func (*LookupBlockVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{68} + return file_master_proto_rawDescGZIP(), []int{69} } func (x *LookupBlockVolumeRequest) GetName() string { @@ -4543,13 +4600,15 @@ type LookupBlockVolumeResponse struct { ReplicaFactor uint32 `protobuf:"varint,6,opt,name=replica_factor,json=replicaFactor,proto3" json:"replica_factor,omitempty"` ReplicaServers []string `protobuf:"bytes,7,rep,name=replica_servers,json=replicaServers,proto3" json:"replica_servers,omitempty"` DurabilityMode string `protobuf:"bytes,8,opt,name=durability_mode,json=durabilityMode,proto3" json:"durability_mode,omitempty"` + NvmeAddr string `protobuf:"bytes,9,opt,name=nvme_addr,json=nvmeAddr,proto3" json:"nvme_addr,omitempty"` + Nqn string `protobuf:"bytes,10,opt,name=nqn,proto3" json:"nqn,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *LookupBlockVolumeResponse) Reset() { *x = LookupBlockVolumeResponse{} - mi := &file_master_proto_msgTypes[69] + mi := &file_master_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4561,7 +4620,7 @@ func (x *LookupBlockVolumeResponse) String() string { func (*LookupBlockVolumeResponse) ProtoMessage() {} func (x *LookupBlockVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[69] + mi := &file_master_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4574,7 +4633,7 @@ func (x *LookupBlockVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupBlockVolumeResponse.ProtoReflect.Descriptor instead. func (*LookupBlockVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{69} + return file_master_proto_rawDescGZIP(), []int{70} } func (x *LookupBlockVolumeResponse) GetVolumeServer() string { @@ -4633,6 +4692,20 @@ func (x *LookupBlockVolumeResponse) GetDurabilityMode() string { return "" } +func (x *LookupBlockVolumeResponse) GetNvmeAddr() string { + if x != nil { + return x.NvmeAddr + } + return "" +} + +func (x *LookupBlockVolumeResponse) GetNqn() string { + if x != nil { + return x.Nqn + } + return "" +} + type CreateBlockSnapshotRequest struct { state protoimpl.MessageState `protogen:"open.v1"` VolumeName string `protobuf:"bytes,1,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"` @@ -4643,7 +4716,7 @@ type CreateBlockSnapshotRequest struct { func (x *CreateBlockSnapshotRequest) Reset() { *x = CreateBlockSnapshotRequest{} - mi := &file_master_proto_msgTypes[70] + mi := &file_master_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4655,7 +4728,7 @@ func (x *CreateBlockSnapshotRequest) String() string { func (*CreateBlockSnapshotRequest) ProtoMessage() {} func (x *CreateBlockSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[70] + mi := &file_master_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4668,7 +4741,7 @@ func (x *CreateBlockSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateBlockSnapshotRequest.ProtoReflect.Descriptor instead. func (*CreateBlockSnapshotRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{70} + return file_master_proto_rawDescGZIP(), []int{71} } func (x *CreateBlockSnapshotRequest) GetVolumeName() string { @@ -4696,7 +4769,7 @@ type CreateBlockSnapshotResponse struct { func (x *CreateBlockSnapshotResponse) Reset() { *x = CreateBlockSnapshotResponse{} - mi := &file_master_proto_msgTypes[71] + mi := &file_master_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4708,7 +4781,7 @@ func (x *CreateBlockSnapshotResponse) String() string { func (*CreateBlockSnapshotResponse) ProtoMessage() {} func (x *CreateBlockSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[71] + mi := &file_master_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4721,7 +4794,7 @@ func (x *CreateBlockSnapshotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateBlockSnapshotResponse.ProtoReflect.Descriptor instead. func (*CreateBlockSnapshotResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{71} + return file_master_proto_rawDescGZIP(), []int{72} } func (x *CreateBlockSnapshotResponse) GetSnapshotId() uint32 { @@ -4755,7 +4828,7 @@ type DeleteBlockSnapshotRequest struct { func (x *DeleteBlockSnapshotRequest) Reset() { *x = DeleteBlockSnapshotRequest{} - mi := &file_master_proto_msgTypes[72] + mi := &file_master_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4767,7 +4840,7 @@ func (x *DeleteBlockSnapshotRequest) String() string { func (*DeleteBlockSnapshotRequest) ProtoMessage() {} func (x *DeleteBlockSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[72] + mi := &file_master_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4780,7 +4853,7 @@ func (x *DeleteBlockSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteBlockSnapshotRequest.ProtoReflect.Descriptor instead. func (*DeleteBlockSnapshotRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{72} + return file_master_proto_rawDescGZIP(), []int{73} } func (x *DeleteBlockSnapshotRequest) GetVolumeName() string { @@ -4805,7 +4878,7 @@ type DeleteBlockSnapshotResponse struct { func (x *DeleteBlockSnapshotResponse) Reset() { *x = DeleteBlockSnapshotResponse{} - mi := &file_master_proto_msgTypes[73] + mi := &file_master_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4817,7 +4890,7 @@ func (x *DeleteBlockSnapshotResponse) String() string { func (*DeleteBlockSnapshotResponse) ProtoMessage() {} func (x *DeleteBlockSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[73] + mi := &file_master_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4830,7 +4903,7 @@ func (x *DeleteBlockSnapshotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteBlockSnapshotResponse.ProtoReflect.Descriptor instead. func (*DeleteBlockSnapshotResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{73} + return file_master_proto_rawDescGZIP(), []int{74} } type ListBlockSnapshotsRequest struct { @@ -4842,7 +4915,7 @@ type ListBlockSnapshotsRequest struct { func (x *ListBlockSnapshotsRequest) Reset() { *x = ListBlockSnapshotsRequest{} - mi := &file_master_proto_msgTypes[74] + mi := &file_master_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4854,7 +4927,7 @@ func (x *ListBlockSnapshotsRequest) String() string { func (*ListBlockSnapshotsRequest) ProtoMessage() {} func (x *ListBlockSnapshotsRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[74] + mi := &file_master_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4867,7 +4940,7 @@ func (x *ListBlockSnapshotsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBlockSnapshotsRequest.ProtoReflect.Descriptor instead. func (*ListBlockSnapshotsRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{74} + return file_master_proto_rawDescGZIP(), []int{75} } func (x *ListBlockSnapshotsRequest) GetVolumeName() string { @@ -4886,7 +4959,7 @@ type ListBlockSnapshotsResponse struct { func (x *ListBlockSnapshotsResponse) Reset() { *x = ListBlockSnapshotsResponse{} - mi := &file_master_proto_msgTypes[75] + mi := &file_master_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4898,7 +4971,7 @@ func (x *ListBlockSnapshotsResponse) String() string { func (*ListBlockSnapshotsResponse) ProtoMessage() {} func (x *ListBlockSnapshotsResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[75] + mi := &file_master_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4911,7 +4984,7 @@ func (x *ListBlockSnapshotsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBlockSnapshotsResponse.ProtoReflect.Descriptor instead. func (*ListBlockSnapshotsResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{75} + return file_master_proto_rawDescGZIP(), []int{76} } func (x *ListBlockSnapshotsResponse) GetSnapshots() []*BlockSnapshotInfo { @@ -4932,7 +5005,7 @@ type BlockSnapshotInfo struct { func (x *BlockSnapshotInfo) Reset() { *x = BlockSnapshotInfo{} - mi := &file_master_proto_msgTypes[76] + mi := &file_master_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4944,7 +5017,7 @@ func (x *BlockSnapshotInfo) String() string { func (*BlockSnapshotInfo) ProtoMessage() {} func (x *BlockSnapshotInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[76] + mi := &file_master_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4957,7 +5030,7 @@ func (x *BlockSnapshotInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BlockSnapshotInfo.ProtoReflect.Descriptor instead. func (*BlockSnapshotInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{76} + return file_master_proto_rawDescGZIP(), []int{77} } func (x *BlockSnapshotInfo) GetSnapshotId() uint32 { @@ -4991,7 +5064,7 @@ type ExpandBlockVolumeRequest struct { func (x *ExpandBlockVolumeRequest) Reset() { *x = ExpandBlockVolumeRequest{} - mi := &file_master_proto_msgTypes[77] + mi := &file_master_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5003,7 +5076,7 @@ func (x *ExpandBlockVolumeRequest) String() string { func (*ExpandBlockVolumeRequest) ProtoMessage() {} func (x *ExpandBlockVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[77] + mi := &file_master_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5016,7 +5089,7 @@ func (x *ExpandBlockVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpandBlockVolumeRequest.ProtoReflect.Descriptor instead. func (*ExpandBlockVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{77} + return file_master_proto_rawDescGZIP(), []int{78} } func (x *ExpandBlockVolumeRequest) GetName() string { @@ -5042,7 +5115,7 @@ type ExpandBlockVolumeResponse struct { func (x *ExpandBlockVolumeResponse) Reset() { *x = ExpandBlockVolumeResponse{} - mi := &file_master_proto_msgTypes[78] + mi := &file_master_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5054,7 +5127,7 @@ func (x *ExpandBlockVolumeResponse) String() string { func (*ExpandBlockVolumeResponse) ProtoMessage() {} func (x *ExpandBlockVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[78] + mi := &file_master_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5067,7 +5140,7 @@ func (x *ExpandBlockVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpandBlockVolumeResponse.ProtoReflect.Descriptor instead. func (*ExpandBlockVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{78} + return file_master_proto_rawDescGZIP(), []int{79} } func (x *ExpandBlockVolumeResponse) GetCapacityBytes() uint64 { @@ -5088,7 +5161,7 @@ type SuperBlockExtra_ErasureCoding struct { func (x *SuperBlockExtra_ErasureCoding) Reset() { *x = SuperBlockExtra_ErasureCoding{} - mi := &file_master_proto_msgTypes[81] + mi := &file_master_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5100,7 +5173,7 @@ func (x *SuperBlockExtra_ErasureCoding) String() string { func (*SuperBlockExtra_ErasureCoding) ProtoMessage() {} func (x *SuperBlockExtra_ErasureCoding) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[81] + mi := &file_master_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5149,7 +5222,7 @@ type LookupVolumeResponse_VolumeIdLocation struct { func (x *LookupVolumeResponse_VolumeIdLocation) Reset() { *x = LookupVolumeResponse_VolumeIdLocation{} - mi := &file_master_proto_msgTypes[82] + mi := &file_master_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5161,7 +5234,7 @@ func (x *LookupVolumeResponse_VolumeIdLocation) String() string { func (*LookupVolumeResponse_VolumeIdLocation) ProtoMessage() {} func (x *LookupVolumeResponse_VolumeIdLocation) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[82] + mi := &file_master_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5215,7 +5288,7 @@ type LookupEcVolumeResponse_EcShardIdLocation struct { func (x *LookupEcVolumeResponse_EcShardIdLocation) Reset() { *x = LookupEcVolumeResponse_EcShardIdLocation{} - mi := &file_master_proto_msgTypes[87] + mi := &file_master_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5227,7 +5300,7 @@ func (x *LookupEcVolumeResponse_EcShardIdLocation) String() string { func (*LookupEcVolumeResponse_EcShardIdLocation) ProtoMessage() {} func (x *LookupEcVolumeResponse_EcShardIdLocation) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[87] + mi := &file_master_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5270,7 +5343,7 @@ type ListClusterNodesResponse_ClusterNode struct { func (x *ListClusterNodesResponse_ClusterNode) Reset() { *x = ListClusterNodesResponse_ClusterNode{} - mi := &file_master_proto_msgTypes[88] + mi := &file_master_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5282,7 +5355,7 @@ func (x *ListClusterNodesResponse_ClusterNode) String() string { func (*ListClusterNodesResponse_ClusterNode) ProtoMessage() {} func (x *ListClusterNodesResponse_ClusterNode) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[88] + mi := &file_master_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5345,7 +5418,7 @@ type RaftListClusterServersResponse_ClusterServers struct { func (x *RaftListClusterServersResponse_ClusterServers) Reset() { *x = RaftListClusterServersResponse_ClusterServers{} - mi := &file_master_proto_msgTypes[89] + mi := &file_master_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5357,7 +5430,7 @@ func (x *RaftListClusterServersResponse_ClusterServers) String() string { func (*RaftListClusterServersResponse_ClusterServers) ProtoMessage() {} func (x *RaftListClusterServersResponse_ClusterServers) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[89] + mi := &file_master_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5772,7 +5845,7 @@ const file_master_proto_rawDesc = "" + "\x0fprevious_leader\x18\x01 \x01(\tR\x0epreviousLeader\x12\x1d\n" + "\n" + "new_leader\x18\x02 \x01(\tR\tnewLeader\"\x14\n" + - "\x12VolumeGrowResponse\"\xf1\x02\n" + + "\x12VolumeGrowResponse\"\xe2\x04\n" + "\x16BlockVolumeInfoMessage\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04path\x12\x1f\n" + "\vvolume_size\x18\x02 \x01(\x04R\n" + @@ -5788,14 +5861,21 @@ const file_master_proto_rawDesc = "" + "\tdisk_type\x18\t \x01(\tR\bdiskType\x12*\n" + "\x11replica_data_addr\x18\n" + " \x01(\tR\x0freplicaDataAddr\x12*\n" + - "\x11replica_ctrl_addr\x18\v \x01(\tR\x0freplicaCtrlAddr\"\x8e\x01\n" + + "\x11replica_ctrl_addr\x18\v \x01(\tR\x0freplicaCtrlAddr\x12!\n" + + "\fhealth_score\x18\f \x01(\x01R\vhealthScore\x12!\n" + + "\fscrub_errors\x18\r \x01(\x03R\vscrubErrors\x12&\n" + + "\x0flast_scrub_time\x18\x0e \x01(\x03R\rlastScrubTime\x12)\n" + + "\x10replica_degraded\x18\x0f \x01(\bR\x0freplicaDegraded\x12'\n" + + "\x0fdurability_mode\x18\x10 \x01(\tR\x0edurabilityMode\x12\x1b\n" + + "\tnvme_addr\x18\x11 \x01(\tR\bnvmeAddr\x12\x10\n" + + "\x03nqn\x18\x12 \x01(\tR\x03nqn\"\x8e\x01\n" + "\x1bBlockVolumeShortInfoMessage\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04path\x12\x1f\n" + "\vvolume_size\x18\x02 \x01(\x04R\n" + "volumeSize\x12\x1d\n" + "\n" + "block_size\x18\x03 \x01(\rR\tblockSize\x12\x1b\n" + - "\tdisk_type\x18\x04 \x01(\tR\bdiskType\"\xf2\x01\n" + + "\tdisk_type\x18\x04 \x01(\tR\bdiskType\"\xb6\x02\n" + "\x15BlockVolumeAssignment\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04path\x12\x14\n" + "\x05epoch\x18\x02 \x01(\x04R\x05epoch\x12\x12\n" + @@ -5804,12 +5884,18 @@ const file_master_proto_rawDesc = "" + "leaseTtlMs\x12*\n" + "\x11replica_data_addr\x18\x05 \x01(\tR\x0freplicaDataAddr\x12*\n" + "\x11replica_ctrl_addr\x18\x06 \x01(\tR\x0freplicaCtrlAddr\x12!\n" + - "\frebuild_addr\x18\a \x01(\tR\vrebuildAddr\"j\n" + + "\frebuild_addr\x18\a \x01(\tR\vrebuildAddr\x12B\n" + + "\rreplica_addrs\x18\b \x03(\v2\x1d.master_pb.ReplicaAddrMessageR\freplicaAddrs\"N\n" + + "\x12ReplicaAddrMessage\x12\x1b\n" + + "\tdata_addr\x18\x01 \x01(\tR\bdataAddr\x12\x1b\n" + + "\tctrl_addr\x18\x02 \x01(\tR\bctrlAddr\"\xba\x01\n" + "\x18CreateBlockVolumeRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n" + "\n" + "size_bytes\x18\x02 \x01(\x04R\tsizeBytes\x12\x1b\n" + - "\tdisk_type\x18\x03 \x01(\tR\bdiskType\"\xdc\x01\n" + + "\tdisk_type\x18\x03 \x01(\tR\bdiskType\x12%\n" + + "\x0ereplica_factor\x18\x04 \x01(\rR\rreplicaFactor\x12'\n" + + "\x0fdurability_mode\x18\x05 \x01(\tR\x0edurabilityMode\"\xb4\x02\n" + "\x19CreateBlockVolumeResponse\x12\x1b\n" + "\tvolume_id\x18\x01 \x01(\tR\bvolumeId\x12#\n" + "\rvolume_server\x18\x02 \x01(\tR\fvolumeServer\x12\x1d\n" + @@ -5817,19 +5903,28 @@ const file_master_proto_rawDesc = "" + "iscsi_addr\x18\x03 \x01(\tR\tiscsiAddr\x12\x10\n" + "\x03iqn\x18\x04 \x01(\tR\x03iqn\x12%\n" + "\x0ecapacity_bytes\x18\x05 \x01(\x04R\rcapacityBytes\x12%\n" + - "\x0ereplica_server\x18\x06 \x01(\tR\rreplicaServer\".\n" + + "\x0ereplica_server\x18\x06 \x01(\tR\rreplicaServer\x12'\n" + + "\x0freplica_servers\x18\a \x03(\tR\x0ereplicaServers\x12\x1b\n" + + "\tnvme_addr\x18\b \x01(\tR\bnvmeAddr\x12\x10\n" + + "\x03nqn\x18\t \x01(\tR\x03nqn\".\n" + "\x18DeleteBlockVolumeRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"\x1b\n" + "\x19DeleteBlockVolumeResponse\".\n" + "\x18LookupBlockVolumeRequest\x12\x12\n" + - "\x04name\x18\x01 \x01(\tR\x04name\"\xbf\x01\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"\xe7\x02\n" + "\x19LookupBlockVolumeResponse\x12#\n" + "\rvolume_server\x18\x01 \x01(\tR\fvolumeServer\x12\x1d\n" + "\n" + "iscsi_addr\x18\x02 \x01(\tR\tiscsiAddr\x12\x10\n" + "\x03iqn\x18\x03 \x01(\tR\x03iqn\x12%\n" + "\x0ecapacity_bytes\x18\x04 \x01(\x04R\rcapacityBytes\x12%\n" + - "\x0ereplica_server\x18\x05 \x01(\tR\rreplicaServer\"^\n" + + "\x0ereplica_server\x18\x05 \x01(\tR\rreplicaServer\x12%\n" + + "\x0ereplica_factor\x18\x06 \x01(\rR\rreplicaFactor\x12'\n" + + "\x0freplica_servers\x18\a \x03(\tR\x0ereplicaServers\x12'\n" + + "\x0fdurability_mode\x18\b \x01(\tR\x0edurabilityMode\x12\x1b\n" + + "\tnvme_addr\x18\t \x01(\tR\bnvmeAddr\x12\x10\n" + + "\x03nqn\x18\n" + + " \x01(\tR\x03nqn\"^\n" + "\x1aCreateBlockSnapshotRequest\x12\x1f\n" + "\vvolume_name\x18\x01 \x01(\tR\n" + "volumeName\x12\x1f\n" + @@ -5912,7 +6007,7 @@ func file_master_proto_rawDescGZIP() []byte { return file_master_proto_rawDescData } -var file_master_proto_msgTypes = make([]protoimpl.MessageInfo, 90) +var file_master_proto_msgTypes = make([]protoimpl.MessageInfo, 91) var file_master_proto_goTypes = []any{ (*Heartbeat)(nil), // 0: master_pb.Heartbeat (*HeartbeatResponse)(nil), // 1: master_pb.HeartbeatResponse @@ -5978,33 +6073,34 @@ var file_master_proto_goTypes = []any{ (*BlockVolumeInfoMessage)(nil), // 61: master_pb.BlockVolumeInfoMessage (*BlockVolumeShortInfoMessage)(nil), // 62: master_pb.BlockVolumeShortInfoMessage (*BlockVolumeAssignment)(nil), // 63: master_pb.BlockVolumeAssignment - (*CreateBlockVolumeRequest)(nil), // 64: master_pb.CreateBlockVolumeRequest - (*CreateBlockVolumeResponse)(nil), // 65: master_pb.CreateBlockVolumeResponse - (*DeleteBlockVolumeRequest)(nil), // 66: master_pb.DeleteBlockVolumeRequest - (*DeleteBlockVolumeResponse)(nil), // 67: master_pb.DeleteBlockVolumeResponse - (*LookupBlockVolumeRequest)(nil), // 68: master_pb.LookupBlockVolumeRequest - (*LookupBlockVolumeResponse)(nil), // 69: master_pb.LookupBlockVolumeResponse - (*CreateBlockSnapshotRequest)(nil), // 70: master_pb.CreateBlockSnapshotRequest - (*CreateBlockSnapshotResponse)(nil), // 71: master_pb.CreateBlockSnapshotResponse - (*DeleteBlockSnapshotRequest)(nil), // 72: master_pb.DeleteBlockSnapshotRequest - (*DeleteBlockSnapshotResponse)(nil), // 73: master_pb.DeleteBlockSnapshotResponse - (*ListBlockSnapshotsRequest)(nil), // 74: master_pb.ListBlockSnapshotsRequest - (*ListBlockSnapshotsResponse)(nil), // 75: master_pb.ListBlockSnapshotsResponse - (*BlockSnapshotInfo)(nil), // 76: master_pb.BlockSnapshotInfo - (*ExpandBlockVolumeRequest)(nil), // 77: master_pb.ExpandBlockVolumeRequest - (*ExpandBlockVolumeResponse)(nil), // 78: master_pb.ExpandBlockVolumeResponse - nil, // 79: master_pb.Heartbeat.MaxVolumeCountsEntry - nil, // 80: master_pb.StorageBackend.PropertiesEntry - (*SuperBlockExtra_ErasureCoding)(nil), // 81: master_pb.SuperBlockExtra.ErasureCoding - (*LookupVolumeResponse_VolumeIdLocation)(nil), // 82: master_pb.LookupVolumeResponse.VolumeIdLocation - nil, // 83: master_pb.DataNodeInfo.DiskInfosEntry - nil, // 84: master_pb.RackInfo.DiskInfosEntry - nil, // 85: master_pb.DataCenterInfo.DiskInfosEntry - nil, // 86: master_pb.TopologyInfo.DiskInfosEntry - (*LookupEcVolumeResponse_EcShardIdLocation)(nil), // 87: master_pb.LookupEcVolumeResponse.EcShardIdLocation - (*ListClusterNodesResponse_ClusterNode)(nil), // 88: master_pb.ListClusterNodesResponse.ClusterNode - (*RaftListClusterServersResponse_ClusterServers)(nil), // 89: master_pb.RaftListClusterServersResponse.ClusterServers - (*volume_server_pb.VolumeServerState)(nil), // 90: volume_server_pb.VolumeServerState + (*ReplicaAddrMessage)(nil), // 64: master_pb.ReplicaAddrMessage + (*CreateBlockVolumeRequest)(nil), // 65: master_pb.CreateBlockVolumeRequest + (*CreateBlockVolumeResponse)(nil), // 66: master_pb.CreateBlockVolumeResponse + (*DeleteBlockVolumeRequest)(nil), // 67: master_pb.DeleteBlockVolumeRequest + (*DeleteBlockVolumeResponse)(nil), // 68: master_pb.DeleteBlockVolumeResponse + (*LookupBlockVolumeRequest)(nil), // 69: master_pb.LookupBlockVolumeRequest + (*LookupBlockVolumeResponse)(nil), // 70: master_pb.LookupBlockVolumeResponse + (*CreateBlockSnapshotRequest)(nil), // 71: master_pb.CreateBlockSnapshotRequest + (*CreateBlockSnapshotResponse)(nil), // 72: master_pb.CreateBlockSnapshotResponse + (*DeleteBlockSnapshotRequest)(nil), // 73: master_pb.DeleteBlockSnapshotRequest + (*DeleteBlockSnapshotResponse)(nil), // 74: master_pb.DeleteBlockSnapshotResponse + (*ListBlockSnapshotsRequest)(nil), // 75: master_pb.ListBlockSnapshotsRequest + (*ListBlockSnapshotsResponse)(nil), // 76: master_pb.ListBlockSnapshotsResponse + (*BlockSnapshotInfo)(nil), // 77: master_pb.BlockSnapshotInfo + (*ExpandBlockVolumeRequest)(nil), // 78: master_pb.ExpandBlockVolumeRequest + (*ExpandBlockVolumeResponse)(nil), // 79: master_pb.ExpandBlockVolumeResponse + nil, // 80: master_pb.Heartbeat.MaxVolumeCountsEntry + nil, // 81: master_pb.StorageBackend.PropertiesEntry + (*SuperBlockExtra_ErasureCoding)(nil), // 82: master_pb.SuperBlockExtra.ErasureCoding + (*LookupVolumeResponse_VolumeIdLocation)(nil), // 83: master_pb.LookupVolumeResponse.VolumeIdLocation + nil, // 84: master_pb.DataNodeInfo.DiskInfosEntry + nil, // 85: master_pb.RackInfo.DiskInfosEntry + nil, // 86: master_pb.DataCenterInfo.DiskInfosEntry + nil, // 87: master_pb.TopologyInfo.DiskInfosEntry + (*LookupEcVolumeResponse_EcShardIdLocation)(nil), // 88: master_pb.LookupEcVolumeResponse.EcShardIdLocation + (*ListClusterNodesResponse_ClusterNode)(nil), // 89: master_pb.ListClusterNodesResponse.ClusterNode + (*RaftListClusterServersResponse_ClusterServers)(nil), // 90: master_pb.RaftListClusterServersResponse.ClusterServers + (*volume_server_pb.VolumeServerState)(nil), // 91: volume_server_pb.VolumeServerState } var file_master_proto_depIdxs = []int32{ 2, // 0: master_pb.Heartbeat.volumes:type_name -> master_pb.VolumeInformationMessage @@ -6013,109 +6109,110 @@ var file_master_proto_depIdxs = []int32{ 4, // 3: master_pb.Heartbeat.ec_shards:type_name -> master_pb.VolumeEcShardInformationMessage 4, // 4: master_pb.Heartbeat.new_ec_shards:type_name -> master_pb.VolumeEcShardInformationMessage 4, // 5: master_pb.Heartbeat.deleted_ec_shards:type_name -> master_pb.VolumeEcShardInformationMessage - 79, // 6: master_pb.Heartbeat.max_volume_counts:type_name -> master_pb.Heartbeat.MaxVolumeCountsEntry - 90, // 7: master_pb.Heartbeat.state:type_name -> volume_server_pb.VolumeServerState + 80, // 6: master_pb.Heartbeat.max_volume_counts:type_name -> master_pb.Heartbeat.MaxVolumeCountsEntry + 91, // 7: master_pb.Heartbeat.state:type_name -> volume_server_pb.VolumeServerState 61, // 8: master_pb.Heartbeat.block_volume_infos:type_name -> master_pb.BlockVolumeInfoMessage 62, // 9: master_pb.Heartbeat.new_block_volumes:type_name -> master_pb.BlockVolumeShortInfoMessage 62, // 10: master_pb.Heartbeat.deleted_block_volumes:type_name -> master_pb.BlockVolumeShortInfoMessage 5, // 11: master_pb.HeartbeatResponse.storage_backends:type_name -> master_pb.StorageBackend 63, // 12: master_pb.HeartbeatResponse.block_volume_assignments:type_name -> master_pb.BlockVolumeAssignment - 80, // 13: master_pb.StorageBackend.properties:type_name -> master_pb.StorageBackend.PropertiesEntry - 81, // 14: master_pb.SuperBlockExtra.erasure_coding:type_name -> master_pb.SuperBlockExtra.ErasureCoding + 81, // 13: master_pb.StorageBackend.properties:type_name -> master_pb.StorageBackend.PropertiesEntry + 82, // 14: master_pb.SuperBlockExtra.erasure_coding:type_name -> master_pb.SuperBlockExtra.ErasureCoding 9, // 15: master_pb.KeepConnectedResponse.volume_location:type_name -> master_pb.VolumeLocation 10, // 16: master_pb.KeepConnectedResponse.cluster_node_update:type_name -> master_pb.ClusterNodeUpdate - 82, // 17: master_pb.LookupVolumeResponse.volume_id_locations:type_name -> master_pb.LookupVolumeResponse.VolumeIdLocation + 83, // 17: master_pb.LookupVolumeResponse.volume_id_locations:type_name -> master_pb.LookupVolumeResponse.VolumeIdLocation 14, // 18: master_pb.AssignResponse.replicas:type_name -> master_pb.Location 14, // 19: master_pb.AssignResponse.location:type_name -> master_pb.Location 20, // 20: master_pb.CollectionListResponse.collections:type_name -> master_pb.Collection 2, // 21: master_pb.DiskInfo.volume_infos:type_name -> master_pb.VolumeInformationMessage 4, // 22: master_pb.DiskInfo.ec_shard_infos:type_name -> master_pb.VolumeEcShardInformationMessage - 83, // 23: master_pb.DataNodeInfo.diskInfos:type_name -> master_pb.DataNodeInfo.DiskInfosEntry + 84, // 23: master_pb.DataNodeInfo.diskInfos:type_name -> master_pb.DataNodeInfo.DiskInfosEntry 26, // 24: master_pb.RackInfo.data_node_infos:type_name -> master_pb.DataNodeInfo - 84, // 25: master_pb.RackInfo.diskInfos:type_name -> master_pb.RackInfo.DiskInfosEntry + 85, // 25: master_pb.RackInfo.diskInfos:type_name -> master_pb.RackInfo.DiskInfosEntry 27, // 26: master_pb.DataCenterInfo.rack_infos:type_name -> master_pb.RackInfo - 85, // 27: master_pb.DataCenterInfo.diskInfos:type_name -> master_pb.DataCenterInfo.DiskInfosEntry + 86, // 27: master_pb.DataCenterInfo.diskInfos:type_name -> master_pb.DataCenterInfo.DiskInfosEntry 28, // 28: master_pb.TopologyInfo.data_center_infos:type_name -> master_pb.DataCenterInfo - 86, // 29: master_pb.TopologyInfo.diskInfos:type_name -> master_pb.TopologyInfo.DiskInfosEntry + 87, // 29: master_pb.TopologyInfo.diskInfos:type_name -> master_pb.TopologyInfo.DiskInfosEntry 29, // 30: master_pb.VolumeListResponse.topology_info:type_name -> master_pb.TopologyInfo - 87, // 31: master_pb.LookupEcVolumeResponse.shard_id_locations:type_name -> master_pb.LookupEcVolumeResponse.EcShardIdLocation + 88, // 31: master_pb.LookupEcVolumeResponse.shard_id_locations:type_name -> master_pb.LookupEcVolumeResponse.EcShardIdLocation 5, // 32: master_pb.GetMasterConfigurationResponse.storage_backends:type_name -> master_pb.StorageBackend - 88, // 33: master_pb.ListClusterNodesResponse.cluster_nodes:type_name -> master_pb.ListClusterNodesResponse.ClusterNode - 89, // 34: master_pb.RaftListClusterServersResponse.cluster_servers:type_name -> master_pb.RaftListClusterServersResponse.ClusterServers - 76, // 35: master_pb.ListBlockSnapshotsResponse.snapshots:type_name -> master_pb.BlockSnapshotInfo - 14, // 36: master_pb.LookupVolumeResponse.VolumeIdLocation.locations:type_name -> master_pb.Location - 25, // 37: master_pb.DataNodeInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 25, // 38: master_pb.RackInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 25, // 39: master_pb.DataCenterInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 25, // 40: master_pb.TopologyInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 14, // 41: master_pb.LookupEcVolumeResponse.EcShardIdLocation.locations:type_name -> master_pb.Location - 0, // 42: master_pb.Seaweed.SendHeartbeat:input_type -> master_pb.Heartbeat - 8, // 43: master_pb.Seaweed.KeepConnected:input_type -> master_pb.KeepConnectedRequest - 12, // 44: master_pb.Seaweed.LookupVolume:input_type -> master_pb.LookupVolumeRequest - 15, // 45: master_pb.Seaweed.Assign:input_type -> master_pb.AssignRequest - 15, // 46: master_pb.Seaweed.StreamAssign:input_type -> master_pb.AssignRequest - 18, // 47: master_pb.Seaweed.Statistics:input_type -> master_pb.StatisticsRequest - 21, // 48: master_pb.Seaweed.CollectionList:input_type -> master_pb.CollectionListRequest - 23, // 49: master_pb.Seaweed.CollectionDelete:input_type -> master_pb.CollectionDeleteRequest - 30, // 50: master_pb.Seaweed.VolumeList:input_type -> master_pb.VolumeListRequest - 32, // 51: master_pb.Seaweed.LookupEcVolume:input_type -> master_pb.LookupEcVolumeRequest - 34, // 52: master_pb.Seaweed.VacuumVolume:input_type -> master_pb.VacuumVolumeRequest - 36, // 53: master_pb.Seaweed.DisableVacuum:input_type -> master_pb.DisableVacuumRequest - 38, // 54: master_pb.Seaweed.EnableVacuum:input_type -> master_pb.EnableVacuumRequest - 40, // 55: master_pb.Seaweed.VolumeMarkReadonly:input_type -> master_pb.VolumeMarkReadonlyRequest - 42, // 56: master_pb.Seaweed.GetMasterConfiguration:input_type -> master_pb.GetMasterConfigurationRequest - 44, // 57: master_pb.Seaweed.ListClusterNodes:input_type -> master_pb.ListClusterNodesRequest - 46, // 58: master_pb.Seaweed.LeaseAdminToken:input_type -> master_pb.LeaseAdminTokenRequest - 48, // 59: master_pb.Seaweed.ReleaseAdminToken:input_type -> master_pb.ReleaseAdminTokenRequest - 50, // 60: master_pb.Seaweed.Ping:input_type -> master_pb.PingRequest - 56, // 61: master_pb.Seaweed.RaftListClusterServers:input_type -> master_pb.RaftListClusterServersRequest - 52, // 62: master_pb.Seaweed.RaftAddServer:input_type -> master_pb.RaftAddServerRequest - 54, // 63: master_pb.Seaweed.RaftRemoveServer:input_type -> master_pb.RaftRemoveServerRequest - 58, // 64: master_pb.Seaweed.RaftLeadershipTransfer:input_type -> master_pb.RaftLeadershipTransferRequest - 16, // 65: master_pb.Seaweed.VolumeGrow:input_type -> master_pb.VolumeGrowRequest - 64, // 66: master_pb.Seaweed.CreateBlockVolume:input_type -> master_pb.CreateBlockVolumeRequest - 66, // 67: master_pb.Seaweed.DeleteBlockVolume:input_type -> master_pb.DeleteBlockVolumeRequest - 68, // 68: master_pb.Seaweed.LookupBlockVolume:input_type -> master_pb.LookupBlockVolumeRequest - 70, // 69: master_pb.Seaweed.CreateBlockSnapshot:input_type -> master_pb.CreateBlockSnapshotRequest - 72, // 70: master_pb.Seaweed.DeleteBlockSnapshot:input_type -> master_pb.DeleteBlockSnapshotRequest - 74, // 71: master_pb.Seaweed.ListBlockSnapshots:input_type -> master_pb.ListBlockSnapshotsRequest - 77, // 72: master_pb.Seaweed.ExpandBlockVolume:input_type -> master_pb.ExpandBlockVolumeRequest - 1, // 73: master_pb.Seaweed.SendHeartbeat:output_type -> master_pb.HeartbeatResponse - 11, // 74: master_pb.Seaweed.KeepConnected:output_type -> master_pb.KeepConnectedResponse - 13, // 75: master_pb.Seaweed.LookupVolume:output_type -> master_pb.LookupVolumeResponse - 17, // 76: master_pb.Seaweed.Assign:output_type -> master_pb.AssignResponse - 17, // 77: master_pb.Seaweed.StreamAssign:output_type -> master_pb.AssignResponse - 19, // 78: master_pb.Seaweed.Statistics:output_type -> master_pb.StatisticsResponse - 22, // 79: master_pb.Seaweed.CollectionList:output_type -> master_pb.CollectionListResponse - 24, // 80: master_pb.Seaweed.CollectionDelete:output_type -> master_pb.CollectionDeleteResponse - 31, // 81: master_pb.Seaweed.VolumeList:output_type -> master_pb.VolumeListResponse - 33, // 82: master_pb.Seaweed.LookupEcVolume:output_type -> master_pb.LookupEcVolumeResponse - 35, // 83: master_pb.Seaweed.VacuumVolume:output_type -> master_pb.VacuumVolumeResponse - 37, // 84: master_pb.Seaweed.DisableVacuum:output_type -> master_pb.DisableVacuumResponse - 39, // 85: master_pb.Seaweed.EnableVacuum:output_type -> master_pb.EnableVacuumResponse - 41, // 86: master_pb.Seaweed.VolumeMarkReadonly:output_type -> master_pb.VolumeMarkReadonlyResponse - 43, // 87: master_pb.Seaweed.GetMasterConfiguration:output_type -> master_pb.GetMasterConfigurationResponse - 45, // 88: master_pb.Seaweed.ListClusterNodes:output_type -> master_pb.ListClusterNodesResponse - 47, // 89: master_pb.Seaweed.LeaseAdminToken:output_type -> master_pb.LeaseAdminTokenResponse - 49, // 90: master_pb.Seaweed.ReleaseAdminToken:output_type -> master_pb.ReleaseAdminTokenResponse - 51, // 91: master_pb.Seaweed.Ping:output_type -> master_pb.PingResponse - 57, // 92: master_pb.Seaweed.RaftListClusterServers:output_type -> master_pb.RaftListClusterServersResponse - 53, // 93: master_pb.Seaweed.RaftAddServer:output_type -> master_pb.RaftAddServerResponse - 55, // 94: master_pb.Seaweed.RaftRemoveServer:output_type -> master_pb.RaftRemoveServerResponse - 59, // 95: master_pb.Seaweed.RaftLeadershipTransfer:output_type -> master_pb.RaftLeadershipTransferResponse - 60, // 96: master_pb.Seaweed.VolumeGrow:output_type -> master_pb.VolumeGrowResponse - 65, // 97: master_pb.Seaweed.CreateBlockVolume:output_type -> master_pb.CreateBlockVolumeResponse - 67, // 98: master_pb.Seaweed.DeleteBlockVolume:output_type -> master_pb.DeleteBlockVolumeResponse - 69, // 99: master_pb.Seaweed.LookupBlockVolume:output_type -> master_pb.LookupBlockVolumeResponse - 71, // 100: master_pb.Seaweed.CreateBlockSnapshot:output_type -> master_pb.CreateBlockSnapshotResponse - 73, // 101: master_pb.Seaweed.DeleteBlockSnapshot:output_type -> master_pb.DeleteBlockSnapshotResponse - 75, // 102: master_pb.Seaweed.ListBlockSnapshots:output_type -> master_pb.ListBlockSnapshotsResponse - 78, // 103: master_pb.Seaweed.ExpandBlockVolume:output_type -> master_pb.ExpandBlockVolumeResponse - 73, // [73:104] is the sub-list for method output_type - 42, // [42:73] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 89, // 33: master_pb.ListClusterNodesResponse.cluster_nodes:type_name -> master_pb.ListClusterNodesResponse.ClusterNode + 90, // 34: master_pb.RaftListClusterServersResponse.cluster_servers:type_name -> master_pb.RaftListClusterServersResponse.ClusterServers + 64, // 35: master_pb.BlockVolumeAssignment.replica_addrs:type_name -> master_pb.ReplicaAddrMessage + 77, // 36: master_pb.ListBlockSnapshotsResponse.snapshots:type_name -> master_pb.BlockSnapshotInfo + 14, // 37: master_pb.LookupVolumeResponse.VolumeIdLocation.locations:type_name -> master_pb.Location + 25, // 38: master_pb.DataNodeInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 25, // 39: master_pb.RackInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 25, // 40: master_pb.DataCenterInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 25, // 41: master_pb.TopologyInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 14, // 42: master_pb.LookupEcVolumeResponse.EcShardIdLocation.locations:type_name -> master_pb.Location + 0, // 43: master_pb.Seaweed.SendHeartbeat:input_type -> master_pb.Heartbeat + 8, // 44: master_pb.Seaweed.KeepConnected:input_type -> master_pb.KeepConnectedRequest + 12, // 45: master_pb.Seaweed.LookupVolume:input_type -> master_pb.LookupVolumeRequest + 15, // 46: master_pb.Seaweed.Assign:input_type -> master_pb.AssignRequest + 15, // 47: master_pb.Seaweed.StreamAssign:input_type -> master_pb.AssignRequest + 18, // 48: master_pb.Seaweed.Statistics:input_type -> master_pb.StatisticsRequest + 21, // 49: master_pb.Seaweed.CollectionList:input_type -> master_pb.CollectionListRequest + 23, // 50: master_pb.Seaweed.CollectionDelete:input_type -> master_pb.CollectionDeleteRequest + 30, // 51: master_pb.Seaweed.VolumeList:input_type -> master_pb.VolumeListRequest + 32, // 52: master_pb.Seaweed.LookupEcVolume:input_type -> master_pb.LookupEcVolumeRequest + 34, // 53: master_pb.Seaweed.VacuumVolume:input_type -> master_pb.VacuumVolumeRequest + 36, // 54: master_pb.Seaweed.DisableVacuum:input_type -> master_pb.DisableVacuumRequest + 38, // 55: master_pb.Seaweed.EnableVacuum:input_type -> master_pb.EnableVacuumRequest + 40, // 56: master_pb.Seaweed.VolumeMarkReadonly:input_type -> master_pb.VolumeMarkReadonlyRequest + 42, // 57: master_pb.Seaweed.GetMasterConfiguration:input_type -> master_pb.GetMasterConfigurationRequest + 44, // 58: master_pb.Seaweed.ListClusterNodes:input_type -> master_pb.ListClusterNodesRequest + 46, // 59: master_pb.Seaweed.LeaseAdminToken:input_type -> master_pb.LeaseAdminTokenRequest + 48, // 60: master_pb.Seaweed.ReleaseAdminToken:input_type -> master_pb.ReleaseAdminTokenRequest + 50, // 61: master_pb.Seaweed.Ping:input_type -> master_pb.PingRequest + 56, // 62: master_pb.Seaweed.RaftListClusterServers:input_type -> master_pb.RaftListClusterServersRequest + 52, // 63: master_pb.Seaweed.RaftAddServer:input_type -> master_pb.RaftAddServerRequest + 54, // 64: master_pb.Seaweed.RaftRemoveServer:input_type -> master_pb.RaftRemoveServerRequest + 58, // 65: master_pb.Seaweed.RaftLeadershipTransfer:input_type -> master_pb.RaftLeadershipTransferRequest + 16, // 66: master_pb.Seaweed.VolumeGrow:input_type -> master_pb.VolumeGrowRequest + 65, // 67: master_pb.Seaweed.CreateBlockVolume:input_type -> master_pb.CreateBlockVolumeRequest + 67, // 68: master_pb.Seaweed.DeleteBlockVolume:input_type -> master_pb.DeleteBlockVolumeRequest + 69, // 69: master_pb.Seaweed.LookupBlockVolume:input_type -> master_pb.LookupBlockVolumeRequest + 71, // 70: master_pb.Seaweed.CreateBlockSnapshot:input_type -> master_pb.CreateBlockSnapshotRequest + 73, // 71: master_pb.Seaweed.DeleteBlockSnapshot:input_type -> master_pb.DeleteBlockSnapshotRequest + 75, // 72: master_pb.Seaweed.ListBlockSnapshots:input_type -> master_pb.ListBlockSnapshotsRequest + 78, // 73: master_pb.Seaweed.ExpandBlockVolume:input_type -> master_pb.ExpandBlockVolumeRequest + 1, // 74: master_pb.Seaweed.SendHeartbeat:output_type -> master_pb.HeartbeatResponse + 11, // 75: master_pb.Seaweed.KeepConnected:output_type -> master_pb.KeepConnectedResponse + 13, // 76: master_pb.Seaweed.LookupVolume:output_type -> master_pb.LookupVolumeResponse + 17, // 77: master_pb.Seaweed.Assign:output_type -> master_pb.AssignResponse + 17, // 78: master_pb.Seaweed.StreamAssign:output_type -> master_pb.AssignResponse + 19, // 79: master_pb.Seaweed.Statistics:output_type -> master_pb.StatisticsResponse + 22, // 80: master_pb.Seaweed.CollectionList:output_type -> master_pb.CollectionListResponse + 24, // 81: master_pb.Seaweed.CollectionDelete:output_type -> master_pb.CollectionDeleteResponse + 31, // 82: master_pb.Seaweed.VolumeList:output_type -> master_pb.VolumeListResponse + 33, // 83: master_pb.Seaweed.LookupEcVolume:output_type -> master_pb.LookupEcVolumeResponse + 35, // 84: master_pb.Seaweed.VacuumVolume:output_type -> master_pb.VacuumVolumeResponse + 37, // 85: master_pb.Seaweed.DisableVacuum:output_type -> master_pb.DisableVacuumResponse + 39, // 86: master_pb.Seaweed.EnableVacuum:output_type -> master_pb.EnableVacuumResponse + 41, // 87: master_pb.Seaweed.VolumeMarkReadonly:output_type -> master_pb.VolumeMarkReadonlyResponse + 43, // 88: master_pb.Seaweed.GetMasterConfiguration:output_type -> master_pb.GetMasterConfigurationResponse + 45, // 89: master_pb.Seaweed.ListClusterNodes:output_type -> master_pb.ListClusterNodesResponse + 47, // 90: master_pb.Seaweed.LeaseAdminToken:output_type -> master_pb.LeaseAdminTokenResponse + 49, // 91: master_pb.Seaweed.ReleaseAdminToken:output_type -> master_pb.ReleaseAdminTokenResponse + 51, // 92: master_pb.Seaweed.Ping:output_type -> master_pb.PingResponse + 57, // 93: master_pb.Seaweed.RaftListClusterServers:output_type -> master_pb.RaftListClusterServersResponse + 53, // 94: master_pb.Seaweed.RaftAddServer:output_type -> master_pb.RaftAddServerResponse + 55, // 95: master_pb.Seaweed.RaftRemoveServer:output_type -> master_pb.RaftRemoveServerResponse + 59, // 96: master_pb.Seaweed.RaftLeadershipTransfer:output_type -> master_pb.RaftLeadershipTransferResponse + 60, // 97: master_pb.Seaweed.VolumeGrow:output_type -> master_pb.VolumeGrowResponse + 66, // 98: master_pb.Seaweed.CreateBlockVolume:output_type -> master_pb.CreateBlockVolumeResponse + 68, // 99: master_pb.Seaweed.DeleteBlockVolume:output_type -> master_pb.DeleteBlockVolumeResponse + 70, // 100: master_pb.Seaweed.LookupBlockVolume:output_type -> master_pb.LookupBlockVolumeResponse + 72, // 101: master_pb.Seaweed.CreateBlockSnapshot:output_type -> master_pb.CreateBlockSnapshotResponse + 74, // 102: master_pb.Seaweed.DeleteBlockSnapshot:output_type -> master_pb.DeleteBlockSnapshotResponse + 76, // 103: master_pb.Seaweed.ListBlockSnapshots:output_type -> master_pb.ListBlockSnapshotsResponse + 79, // 104: master_pb.Seaweed.ExpandBlockVolume:output_type -> master_pb.ExpandBlockVolumeResponse + 74, // [74:105] is the sub-list for method output_type + 43, // [43:74] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { file_master_proto_init() } @@ -6129,7 +6226,7 @@ func file_master_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_master_proto_rawDesc), len(file_master_proto_rawDesc)), NumEnums: 0, - NumMessages: 90, + NumMessages: 91, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/pb/master_pb/master_grpc.pb.go b/weed/pb/master_pb/master_grpc.pb.go index cd8a3ad45..3d4ebe328 100644 --- a/weed/pb/master_pb/master_grpc.pb.go +++ b/weed/pb/master_pb/master_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.6.1 -// - protoc v5.29.3 +// - protoc v5.29.5 // source: master.proto package master_pb diff --git a/weed/pb/volume_server.proto b/weed/pb/volume_server.proto index 5d3b348eb..b1bec99f4 100644 --- a/weed/pb/volume_server.proto +++ b/weed/pb/volume_server.proto @@ -788,6 +788,8 @@ message AllocateBlockVolumeResponse { string replica_data_addr = 4; string replica_ctrl_addr = 5; string rebuild_listen_addr = 6; + string nvme_addr = 7; + string nqn = 8; } message VolumeServerDeleteBlockVolumeRequest { diff --git a/weed/pb/volume_server_pb/volume_server.pb.go b/weed/pb/volume_server_pb/volume_server.pb.go index 8efe1cf70..e61a83483 100644 --- a/weed/pb/volume_server_pb/volume_server.pb.go +++ b/weed/pb/volume_server_pb/volume_server.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.36.11 -// protoc v5.29.3 +// protoc v5.29.5 // source: volume_server.proto package volume_server_pb @@ -6186,9 +6186,9 @@ func (x *PingResponse) GetStopTimeNs() int64 { } type AllocateBlockVolumeRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - SizeBytes uint64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + SizeBytes uint64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` DiskType string `protobuf:"bytes,3,opt,name=disk_type,json=diskType,proto3" json:"disk_type,omitempty"` DurabilityMode string `protobuf:"bytes,4,opt,name=durability_mode,json=durabilityMode,proto3" json:"durability_mode,omitempty"` unknownFields protoimpl.UnknownFields @@ -6261,6 +6261,8 @@ type AllocateBlockVolumeResponse struct { ReplicaDataAddr string `protobuf:"bytes,4,opt,name=replica_data_addr,json=replicaDataAddr,proto3" json:"replica_data_addr,omitempty"` ReplicaCtrlAddr string `protobuf:"bytes,5,opt,name=replica_ctrl_addr,json=replicaCtrlAddr,proto3" json:"replica_ctrl_addr,omitempty"` RebuildListenAddr string `protobuf:"bytes,6,opt,name=rebuild_listen_addr,json=rebuildListenAddr,proto3" json:"rebuild_listen_addr,omitempty"` + NvmeAddr string `protobuf:"bytes,7,opt,name=nvme_addr,json=nvmeAddr,proto3" json:"nvme_addr,omitempty"` + Nqn string `protobuf:"bytes,8,opt,name=nqn,proto3" json:"nqn,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -6337,6 +6339,20 @@ func (x *AllocateBlockVolumeResponse) GetRebuildListenAddr() string { return "" } +func (x *AllocateBlockVolumeResponse) GetNvmeAddr() string { + if x != nil { + return x.NvmeAddr + } + return "" +} + +func (x *AllocateBlockVolumeResponse) GetNqn() string { + if x != nil { + return x.Nqn + } + return "" +} + type VolumeServerDeleteBlockVolumeRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -7898,12 +7914,13 @@ const file_volume_server_proto_rawDesc = "" + "\rstart_time_ns\x18\x01 \x01(\x03R\vstartTimeNs\x12$\n" + "\x0eremote_time_ns\x18\x02 \x01(\x03R\fremoteTimeNs\x12 \n" + "\fstop_time_ns\x18\x03 \x01(\x03R\n" + - "stopTimeNs\"l\n" + + "stopTimeNs\"\x95\x01\n" + "\x1aAllocateBlockVolumeRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n" + "\n" + "size_bytes\x18\x02 \x01(\x04R\tsizeBytes\x12\x1b\n" + - "\tdisk_type\x18\x03 \x01(\tR\bdiskType\"\xea\x01\n" + + "\tdisk_type\x18\x03 \x01(\tR\bdiskType\x12'\n" + + "\x0fdurability_mode\x18\x04 \x01(\tR\x0edurabilityMode\"\x99\x02\n" + "\x1bAllocateBlockVolumeResponse\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04path\x12\x10\n" + "\x03iqn\x18\x02 \x01(\tR\x03iqn\x12\x1d\n" + @@ -7911,7 +7928,9 @@ const file_volume_server_proto_rawDesc = "" + "iscsi_addr\x18\x03 \x01(\tR\tiscsiAddr\x12*\n" + "\x11replica_data_addr\x18\x04 \x01(\tR\x0freplicaDataAddr\x12*\n" + "\x11replica_ctrl_addr\x18\x05 \x01(\tR\x0freplicaCtrlAddr\x12.\n" + - "\x13rebuild_listen_addr\x18\x06 \x01(\tR\x11rebuildListenAddr\":\n" + + "\x13rebuild_listen_addr\x18\x06 \x01(\tR\x11rebuildListenAddr\x12\x1b\n" + + "\tnvme_addr\x18\a \x01(\tR\bnvmeAddr\x12\x10\n" + + "\x03nqn\x18\b \x01(\tR\x03nqn\":\n" + "$VolumeServerDeleteBlockVolumeRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"'\n" + "%VolumeServerDeleteBlockVolumeResponse\"Q\n" + diff --git a/weed/pb/volume_server_pb/volume_server_grpc.pb.go b/weed/pb/volume_server_pb/volume_server_grpc.pb.go index 1f76c2b28..733ea4d2c 100644 --- a/weed/pb/volume_server_pb/volume_server_grpc.pb.go +++ b/weed/pb/volume_server_pb/volume_server_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.6.1 -// - protoc v5.29.3 +// - protoc v5.29.5 // source: volume_server.proto package volume_server_pb diff --git a/weed/server/master_block_registry.go b/weed/server/master_block_registry.go index 099a01dd0..33ce17645 100644 --- a/weed/server/master_block_registry.go +++ b/weed/server/master_block_registry.go @@ -50,6 +50,8 @@ type BlockVolumeEntry struct { Path string // file path on volume server IQN string ISCSIAddr string + NvmeAddr string // NVMe/TCP target address (ip:port), empty if NVMe disabled + NQN string // NVMe subsystem NQN, empty if NVMe disabled SizeBytes uint64 ReplicaPlacement string // SeaweedFS placement string: "000", "001", "010", "100" Epoch uint64 diff --git a/weed/server/master_grpc_server_block.go b/weed/server/master_grpc_server_block.go index 0a5913d9d..4c4a3f5f2 100644 --- a/weed/server/master_grpc_server_block.go +++ b/weed/server/master_grpc_server_block.go @@ -107,6 +107,8 @@ func (ms *MasterServer) CreateBlockVolume(ctx context.Context, req *master_pb.Cr Path: result.Path, IQN: result.IQN, ISCSIAddr: result.ISCSIAddr, + NvmeAddr: result.NvmeAddr, + NQN: result.NQN, SizeBytes: req.SizeBytes, Epoch: 1, Role: blockvol.RoleToWire(blockvol.RolePrimary), @@ -264,6 +266,8 @@ func (ms *MasterServer) LookupBlockVolume(ctx context.Context, req *master_pb.Lo ReplicaFactor: uint32(rf), ReplicaServers: replicaServers, DurabilityMode: durModeStr, + NvmeAddr: entry.NvmeAddr, + Nqn: entry.NQN, }, nil } @@ -409,6 +413,8 @@ func (ms *MasterServer) createBlockVolumeResponseFromEntry(entry *BlockVolumeEnt CapacityBytes: entry.SizeBytes, ReplicaServer: entry.ReplicaServer, // backward compat ReplicaServers: replicaServerList(entry), + NvmeAddr: entry.NvmeAddr, + Nqn: entry.NQN, } } diff --git a/weed/server/master_grpc_server_block_test.go b/weed/server/master_grpc_server_block_test.go index 52c9fd259..3d10607bb 100644 --- a/weed/server/master_grpc_server_block_test.go +++ b/weed/server/master_grpc_server_block_test.go @@ -1013,3 +1013,89 @@ func TestMaster_ResponseConsistency_ReplicaServerVsReplicaServers(t *testing.T) lresp.ReplicaServer, lresp.ReplicaServers[0]) } } + +func TestMaster_NvmeFieldsFlowThroughCreateAndLookup(t *testing.T) { + ms := testMasterServer(t) + ms.blockRegistry.MarkBlockCapable("vs1:9333") + + // Mock: VS returns NVMe fields. + ms.blockVSAllocate = func(ctx context.Context, server, name string, sizeBytes uint64, diskType, durabilityMode string) (*blockAllocResult, error) { + return &blockAllocResult{ + Path: fmt.Sprintf("/data/%s.blk", name), + IQN: fmt.Sprintf("iqn.2024.test:%s", name), + ISCSIAddr: server, + NvmeAddr: "10.0.0.1:4420", + NQN: fmt.Sprintf("nqn.2024-01.com.seaweedfs:vol.%s", name), + }, nil + } + + resp, err := ms.CreateBlockVolume(context.Background(), &master_pb.CreateBlockVolumeRequest{ + Name: "nvme-vol", + SizeBytes: 1 << 30, + }) + if err != nil { + t.Fatalf("CreateBlockVolume: %v", err) + } + if resp.NvmeAddr != "10.0.0.1:4420" { + t.Fatalf("CreateResponse.NvmeAddr: got %q, want 10.0.0.1:4420", resp.NvmeAddr) + } + if resp.Nqn != "nqn.2024-01.com.seaweedfs:vol.nvme-vol" { + t.Fatalf("CreateResponse.Nqn: got %q", resp.Nqn) + } + + // Verify registry entry. + entry, ok := ms.blockRegistry.Lookup("nvme-vol") + if !ok { + t.Fatal("volume not found in registry") + } + if entry.NvmeAddr != "10.0.0.1:4420" { + t.Fatalf("entry.NvmeAddr: got %q", entry.NvmeAddr) + } + if entry.NQN != "nqn.2024-01.com.seaweedfs:vol.nvme-vol" { + t.Fatalf("entry.NQN: got %q", entry.NQN) + } + + // Lookup should also return NVMe fields. + lresp, err := ms.LookupBlockVolume(context.Background(), &master_pb.LookupBlockVolumeRequest{ + Name: "nvme-vol", + }) + if err != nil { + t.Fatalf("LookupBlockVolume: %v", err) + } + if lresp.NvmeAddr != "10.0.0.1:4420" { + t.Fatalf("LookupResponse.NvmeAddr: got %q", lresp.NvmeAddr) + } + if lresp.Nqn != "nqn.2024-01.com.seaweedfs:vol.nvme-vol" { + t.Fatalf("LookupResponse.Nqn: got %q", lresp.Nqn) + } +} + +func TestMaster_NoNvmeFieldsWhenDisabled(t *testing.T) { + ms := testMasterServer(t) + ms.blockRegistry.MarkBlockCapable("vs1:9333") + + // Default mock returns no NVMe fields (NVMe disabled). + resp, err := ms.CreateBlockVolume(context.Background(), &master_pb.CreateBlockVolumeRequest{ + Name: "iscsi-only-vol", + SizeBytes: 1 << 30, + }) + if err != nil { + t.Fatalf("CreateBlockVolume: %v", err) + } + if resp.NvmeAddr != "" { + t.Fatalf("NvmeAddr should be empty when NVMe disabled, got %q", resp.NvmeAddr) + } + if resp.Nqn != "" { + t.Fatalf("Nqn should be empty when NVMe disabled, got %q", resp.Nqn) + } + + lresp, err := ms.LookupBlockVolume(context.Background(), &master_pb.LookupBlockVolumeRequest{ + Name: "iscsi-only-vol", + }) + if err != nil { + t.Fatalf("LookupBlockVolume: %v", err) + } + if lresp.NvmeAddr != "" || lresp.Nqn != "" { + t.Fatalf("Lookup NVMe fields should be empty, got addr=%q nqn=%q", lresp.NvmeAddr, lresp.Nqn) + } +} diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 197a7f292..51bea569d 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -550,6 +550,8 @@ type blockAllocResult struct { ReplicaDataAddr string ReplicaCtrlAddr string RebuildListenAddr string + NvmeAddr string + NQN string } // defaultBlockVSAllocate calls a volume server's AllocateBlockVolume RPC. @@ -571,6 +573,8 @@ func (ms *MasterServer) defaultBlockVSAllocate(ctx context.Context, server strin result.ReplicaDataAddr = resp.ReplicaDataAddr result.ReplicaCtrlAddr = resp.ReplicaCtrlAddr result.RebuildListenAddr = resp.RebuildListenAddr + result.NvmeAddr = resp.NvmeAddr + result.NQN = resp.Nqn return nil }) return &result, err diff --git a/weed/server/volume_grpc_block.go b/weed/server/volume_grpc_block.go index 7fa6542d5..585f285e6 100644 --- a/weed/server/volume_grpc_block.go +++ b/weed/server/volume_grpc_block.go @@ -32,14 +32,19 @@ func (vs *VolumeServer) AllocateBlockVolume(_ context.Context, req *volume_serve host = host[:idx] } - return &volume_server_pb.AllocateBlockVolumeResponse{ + resp := &volume_server_pb.AllocateBlockVolumeResponse{ Path: path, Iqn: iqn, IscsiAddr: iscsiAddr, ReplicaDataAddr: fmt.Sprintf("%s:%d", host, dataPort), ReplicaCtrlAddr: fmt.Sprintf("%s:%d", host, ctrlPort), RebuildListenAddr: fmt.Sprintf("%s:%d", host, rebuildPort), - }, nil + } + if nvmeAddr := vs.blockService.NvmeListenAddr(); nvmeAddr != "" { + resp.NvmeAddr = nvmeAddr + resp.Nqn = vs.blockService.NQN(req.Name) + } + return resp, nil } // VolumeServerDeleteBlockVolume deletes a block volume on this volume server. diff --git a/weed/server/volume_server_block.go b/weed/server/volume_server_block.go index d893c4e90..b973e246a 100644 --- a/weed/server/volume_server_block.go +++ b/weed/server/volume_server_block.go @@ -545,6 +545,14 @@ func (bs *BlockService) CollectBlockVolumeHeartbeat() []blockvol.BlockVolumeInfo msgs[i].ReplicaDataAddr = s.replicaDataAddr msgs[i].ReplicaCtrlAddr = s.replicaCtrlAddr } + // NVMe publication: report nvme_addr and nqn if NVMe target is running. + if bs.nvmeListenAddr != "" { + msgs[i].NvmeAddr = bs.nvmeListenAddr + // Derive volume name from path for NQN construction. + name := filepath.Base(msgs[i].Path) + name = strings.TrimSuffix(name, ".blk") + msgs[i].NQN = bs.NQN(name) + } } return msgs } diff --git a/weed/storage/blockvol/block_heartbeat.go b/weed/storage/blockvol/block_heartbeat.go index e828b7180..7bf21a781 100644 --- a/weed/storage/blockvol/block_heartbeat.go +++ b/weed/storage/blockvol/block_heartbeat.go @@ -24,6 +24,8 @@ type BlockVolumeInfoMessage struct { LastScrubTime int64 // CP8-2: unix seconds ReplicaDegraded bool // CP8-2: true if any replica shipper degraded DurabilityMode string // CP8-3-1: "best_effort", "sync_all", "sync_quorum" + NvmeAddr string // NVMe/TCP target address (ip:port), empty if NVMe disabled + NQN string // NVMe subsystem NQN, empty if NVMe disabled } // BlockVolumeShortInfoMessage is used for delta heartbeats diff --git a/weed/storage/blockvol/block_heartbeat_proto.go b/weed/storage/blockvol/block_heartbeat_proto.go index 49b628439..a978f8857 100644 --- a/weed/storage/blockvol/block_heartbeat_proto.go +++ b/weed/storage/blockvol/block_heartbeat_proto.go @@ -23,6 +23,8 @@ func InfoMessageToProto(m BlockVolumeInfoMessage) *master_pb.BlockVolumeInfoMess LastScrubTime: m.LastScrubTime, ReplicaDegraded: m.ReplicaDegraded, DurabilityMode: m.DurabilityMode, + NvmeAddr: m.NvmeAddr, + Nqn: m.NQN, } } @@ -48,6 +50,8 @@ func InfoMessageFromProto(p *master_pb.BlockVolumeInfoMessage) BlockVolumeInfoMe LastScrubTime: p.LastScrubTime, ReplicaDegraded: p.ReplicaDegraded, DurabilityMode: p.DurabilityMode, + NvmeAddr: p.NvmeAddr, + NQN: p.Nqn, } } diff --git a/weed/storage/blockvol/block_heartbeat_proto_test.go b/weed/storage/blockvol/block_heartbeat_proto_test.go index 3b405c256..5e6cd842b 100644 --- a/weed/storage/blockvol/block_heartbeat_proto_test.go +++ b/weed/storage/blockvol/block_heartbeat_proto_test.go @@ -403,6 +403,45 @@ func TestInfoMessage_DurabilityModeEmpty_BackwardCompat(t *testing.T) { } } +func TestInfoMessage_NvmeFieldsRoundTrip(t *testing.T) { + orig := BlockVolumeInfoMessage{ + Path: "/data/nvme.blk", + Epoch: 1, + NvmeAddr: "10.0.0.1:4420", + NQN: "nqn.2024-01.com.seaweedfs:vol.test-vol", + } + pb := InfoMessageToProto(orig) + if pb.NvmeAddr != "10.0.0.1:4420" { + t.Fatalf("ToProto NvmeAddr: got %q", pb.NvmeAddr) + } + if pb.Nqn != "nqn.2024-01.com.seaweedfs:vol.test-vol" { + t.Fatalf("ToProto Nqn: got %q", pb.Nqn) + } + back := InfoMessageFromProto(pb) + if back.NvmeAddr != orig.NvmeAddr { + t.Fatalf("FromProto NvmeAddr: got %q, want %q", back.NvmeAddr, orig.NvmeAddr) + } + if back.NQN != orig.NQN { + t.Fatalf("FromProto NQN: got %q, want %q", back.NQN, orig.NQN) + } +} + +func TestInfoMessage_NvmeFieldsEmpty_BackwardCompat(t *testing.T) { + // Empty NVMe fields (NVMe disabled) should round-trip as empty. + orig := BlockVolumeInfoMessage{ + Path: "/data/iscsi-only.blk", + Epoch: 1, + } + pb := InfoMessageToProto(orig) + back := InfoMessageFromProto(pb) + if back.NvmeAddr != "" { + t.Fatalf("NvmeAddr should be empty, got %q", back.NvmeAddr) + } + if back.NQN != "" { + t.Fatalf("NQN should be empty, got %q", back.NQN) + } +} + func TestInfoMessage_HealthFieldsZeroDefault(t *testing.T) { // Verify zero-valued health fields round-trip correctly (backward compat). orig := BlockVolumeInfoMessage{ diff --git a/weed/storage/blockvol/csi/volume_backend.go b/weed/storage/blockvol/csi/volume_backend.go index 2a827be85..c236c1a85 100644 --- a/weed/storage/blockvol/csi/volume_backend.go +++ b/weed/storage/blockvol/csi/volume_backend.go @@ -106,11 +106,6 @@ func (b *LocalVolumeBackend) ExpandVolume(ctx context.Context, volumeID string, } // MasterVolumeClient calls master gRPC for volume operations. -// NOTE: NvmeAddr/NQN fields in VolumeInfo are NOT populated by MasterVolumeClient -// because the master proto (CreateBlockVolumeResponse, LookupBlockVolumeResponse) -// does not yet have nvme_addr/nqn fields. This is deferred until proto is updated -// in a future CP. NVMe support via master-backend path is therefore iSCSI-only -// until that proto change lands. type MasterVolumeClient struct { masterAddr string dialOpt grpc.DialOption @@ -139,6 +134,8 @@ func (c *MasterVolumeClient) CreateVolume(ctx context.Context, name string, size ISCSIAddr: resp.IscsiAddr, IQN: resp.Iqn, CapacityBytes: resp.CapacityBytes, + NvmeAddr: resp.NvmeAddr, + NQN: resp.Nqn, } return nil }) @@ -168,6 +165,8 @@ func (c *MasterVolumeClient) LookupVolume(ctx context.Context, name string) (*Vo ISCSIAddr: resp.IscsiAddr, IQN: resp.Iqn, CapacityBytes: resp.CapacityBytes, + NvmeAddr: resp.NvmeAddr, + NQN: resp.Nqn, } return nil })