Browse Source

feat: master-backed NVMe/TCP publication (nvme_addr + nqn plumbing)

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 <noreply@anthropic.com>
feature/sw-block
Ping Qiu 2 weeks ago
parent
commit
9ef446d0cf
  1. 6
      weed/pb/master.proto
  2. 483
      weed/pb/master_pb/master.pb.go
  3. 2
      weed/pb/master_pb/master_grpc.pb.go
  4. 2
      weed/pb/volume_server.proto
  5. 33
      weed/pb/volume_server_pb/volume_server.pb.go
  6. 2
      weed/pb/volume_server_pb/volume_server_grpc.pb.go
  7. 2
      weed/server/master_block_registry.go
  8. 6
      weed/server/master_grpc_server_block.go
  9. 86
      weed/server/master_grpc_server_block_test.go
  10. 4
      weed/server/master_server.go
  11. 9
      weed/server/volume_grpc_block.go
  12. 8
      weed/server/volume_server_block.go
  13. 2
      weed/storage/blockvol/block_heartbeat.go
  14. 4
      weed/storage/blockvol/block_heartbeat_proto.go
  15. 39
      weed/storage/blockvol/block_heartbeat_proto_test.go
  16. 9
      weed/storage/blockvol/csi/volume_backend.go

6
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 {

483
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,
},

2
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

2
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 {

33
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" +

2
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

2
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

6
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,
}
}

86
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)
}
}

4
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

9
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.

8
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
}

2
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

4
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,
}
}

39
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{

9
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
})

Loading…
Cancel
Save