From f5c35240be853a1098d362f7ca6a6fdf5001fef8 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Sun, 1 Mar 2026 10:22:00 -0800 Subject: [PATCH] Add volume dir tags and EC placement priority (#8472) * Add volume dir tags to topology Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add preferred tag config for EC Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Prioritize EC destinations by tags Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add EC placement planner tag tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Refactor EC placement tests to reuse buildActiveTopology Remove buildActiveTopologyWithDiskTags helper function and consolidate tag setup inline in test cases. Tests now use UpdateTopology to apply tags after topology creation, reusing the existing buildActiveTopology function rather than duplicating its logic. All tag scenario tests pass: - TestECPlacementPlannerPrefersTaggedDisks - TestECPlacementPlannerFallsBackWhenTagsInsufficient Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Consolidate normalizeTagList into shared util package Extract normalizeTagList from three locations (volume.go, detection.go, erasure_coding_handler.go) into new weed/util/tag.go as exported NormalizeTagList function. Replace all duplicate implementations with imports and calls to util.NormalizeTagList. This improves code reuse and maintainability by centralizing tag normalization logic. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add PreferredTags to EC config persistence Add preferred_tags field to ErasureCodingTaskConfig protobuf with field number 5. Update GetConfigSpec to include preferred_tags field in the UI configuration schema. Add PreferredTags to ToTaskPolicy to serialize config to protobuf. Add PreferredTags to FromTaskPolicy to deserialize from protobuf with defensive copy to prevent external mutation. This allows EC preferred tags to be persisted and restored across worker restarts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add defensive copy for Tags slice in DiskLocation Copy the incoming tags slice in NewDiskLocation instead of storing by reference. This prevents external callers from mutating the DiskLocation.Tags slice after construction, improving encapsulation and preventing unexpected changes to disk metadata. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add doc comment to buildCandidateSets method Document the tiered candidate selection and fallback behavior. Explain that for a planner with preferredTags, it accumulates disks matching each tag in order into progressively larger tiers, emits a candidate set once a tier reaches shardsNeeded, and finally falls back to the full candidates set if preferred-tag tiers are insufficient. This clarifies the intended semantics for future maintainers. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Apply final PR review fixes 1. Update parseVolumeTags to replicate single tag entry to all folders instead of leaving some folders with nil tags. This prevents nil pointer dereferences when processing folders without explicit tags. 2. Add defensive copy in ToTaskPolicy for PreferredTags slice to match the pattern used in FromTaskPolicy, preventing external mutation of the returned TaskPolicy. 3. Add clarifying comment in buildCandidateSets explaining that the shardsNeeded <= 0 branch is a defensive check for direct callers, since selectDestinations guarantees shardsNeeded > 0. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix nil pointer dereference in parseVolumeTags Ensure all folder tags are initialized to either normalized tags or empty slices, not nil. When multiple tag entries are provided and there are more folders than entries, remaining folders now get empty slices instead of nil, preventing nil pointer dereference in downstream code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix NormalizeTagList to return empty slice instead of nil Change NormalizeTagList to always return a non-nil slice. When all tags are empty or whitespace after normalization, return an empty slice instead of nil. This prevents nil pointer dereferences in downstream code that expects a valid (possibly empty) slice. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add nil safety check for v.tags pointer Add a safety check to handle the case where v.tags might be nil, preventing a nil pointer dereference. If v.tags is nil, use an empty string instead. This is defensive programming to prevent panics in edge cases. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add volume.tags flag to weed server and weed mini commands Add the volume.tags CLI option to both the 'weed server' and 'weed mini' commands. This allows users to specify disk tags when running the combined server modes, just like they can with 'weed volume'. The flag uses the same format and description as the volume command: comma-separated tag groups per data dir with ':' separators (e.g. fast:ssd,archive). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- weed/admin/topology/capacity.go | 2 + weed/command/mini.go | 1 + weed/command/server.go | 1 + weed/command/volume.go | 40 +- weed/pb/master.proto | 10 +- weed/pb/master_pb/master.pb.go | 810 ++++++++++-------- weed/pb/worker.proto | 1 + weed/pb/worker_pb/worker.pb.go | 13 +- weed/plugin/worker/erasure_coding_handler.go | 16 + weed/server/master_grpc_server.go | 1 + weed/server/volume_server.go | 4 +- weed/storage/disk_location.go | 10 +- weed/storage/store.go | 15 +- weed/storage/store_load_balancing_test.go | 2 +- weed/topology/data_node.go | 33 + weed/util/tag.go | 25 + weed/worker/tasks/erasure_coding/config.go | 27 +- weed/worker/tasks/erasure_coding/detection.go | 108 ++- .../tasks/erasure_coding/detection_test.go | 70 +- 19 files changed, 797 insertions(+), 392 deletions(-) create mode 100644 weed/util/tag.go diff --git a/weed/admin/topology/capacity.go b/weed/admin/topology/capacity.go index 6da8c228b..504990d58 100644 --- a/weed/admin/topology/capacity.go +++ b/weed/admin/topology/capacity.go @@ -115,6 +115,7 @@ func (at *ActiveTopology) GetDisksWithEffectiveCapacity(taskType TaskType, exclu RemoteVolumeCount: disk.DiskInfo.DiskInfo.RemoteVolumeCount, ActiveVolumeCount: disk.DiskInfo.DiskInfo.ActiveVolumeCount, FreeVolumeCount: disk.DiskInfo.DiskInfo.FreeVolumeCount, + Tags: append([]string(nil), disk.DiskInfo.DiskInfo.Tags...), } diskCopy.DiskInfo = diskInfoCopy diskCopy.DiskInfo.MaxVolumeCount = disk.DiskInfo.DiskInfo.MaxVolumeCount // Ensure Max is set @@ -178,6 +179,7 @@ func (at *ActiveTopology) GetDisksForPlanning(taskType TaskType, excludeNodeID s RemoteVolumeCount: disk.DiskInfo.DiskInfo.RemoteVolumeCount, ActiveVolumeCount: disk.DiskInfo.DiskInfo.ActiveVolumeCount, FreeVolumeCount: disk.DiskInfo.DiskInfo.FreeVolumeCount, + Tags: append([]string(nil), disk.DiskInfo.DiskInfo.Tags...), } diskCopy.DiskInfo = diskInfoCopy diff --git a/weed/command/mini.go b/weed/command/mini.go index 2ba00d26e..0ff0b9b51 100644 --- a/weed/command/mini.go +++ b/weed/command/mini.go @@ -204,6 +204,7 @@ func initMiniVolumeFlags() { miniOptions.v.publicUrl = cmdMini.Flag.String("volume.publicUrl", "", "publicly accessible address") miniOptions.v.indexType = cmdMini.Flag.String("volume.index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") miniOptions.v.diskType = cmdMini.Flag.String("volume.disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") + miniOptions.v.tags = cmdMini.Flag.String("volume.tags", "", "comma-separated tag groups per data dir; each group uses ':' (e.g. fast:ssd,archive)") miniOptions.v.fixJpgOrientation = cmdMini.Flag.Bool("volume.images.fix.orientation", false, "Adjust jpg orientation when uploading.") miniOptions.v.readMode = cmdMini.Flag.String("volume.readMode", "proxy", "[local|proxy|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") miniOptions.v.compactionMBPerSecond = cmdMini.Flag.Int("volume.compactionMBps", 0, "limit compaction speed in mega bytes per second") diff --git a/weed/command/server.go b/weed/command/server.go index e5b2d3280..b9392186e 100644 --- a/weed/command/server.go +++ b/weed/command/server.go @@ -137,6 +137,7 @@ func init() { serverOptions.v.id = cmdServer.Flag.String("volume.id", "", "volume server id. If empty, default to ip:port") serverOptions.v.indexType = cmdServer.Flag.String("volume.index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") serverOptions.v.diskType = cmdServer.Flag.String("volume.disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") + serverOptions.v.tags = cmdServer.Flag.String("volume.tags", "", "comma-separated tag groups per data dir; each group uses ':' (e.g. fast:ssd,archive)") serverOptions.v.fixJpgOrientation = cmdServer.Flag.Bool("volume.images.fix.orientation", false, "Adjust jpg orientation when uploading.") serverOptions.v.readMode = cmdServer.Flag.String("volume.readMode", "proxy", "[local|proxy|redirect] how to deal with non-local volume: 'not found|read in remote node|redirect volume location'.") serverOptions.v.compactionMBPerSecond = cmdServer.Flag.Int("volume.compactionMBps", 0, "limit compaction speed in mega bytes per second") diff --git a/weed/command/volume.go b/weed/command/volume.go index 601849f28..34deaee42 100644 --- a/weed/command/volume.go +++ b/weed/command/volume.go @@ -53,6 +53,7 @@ type VolumeServerOptions struct { whiteList []string indexType *string diskType *string + tags *string fixJpgOrientation *bool readMode *string cpuProfile *string @@ -94,6 +95,7 @@ func init() { v.rack = cmdVolume.Flag.String("rack", "", "current volume server's rack name") v.indexType = cmdVolume.Flag.String("index", "memory", "Choose [memory|leveldb|leveldbMedium|leveldbLarge] mode for memory~performance balance.") v.diskType = cmdVolume.Flag.String("disk", "", "[hdd|ssd|] hard drive or solid state drive or any tag") + v.tags = cmdVolume.Flag.String("tags", "", "comma-separated tag groups per data dir; each group uses ':' (e.g. fast:ssd,archive)") v.fixJpgOrientation = cmdVolume.Flag.Bool("images.fix.orientation", false, "Adjust jpg orientation when uploading.") v.readMode = cmdVolume.Flag.String("readMode", "proxy", "[local|proxy|redirect] how to deal with non-local volume: 'not found|proxy to remote node|redirect volume location'.") v.cpuProfile = cmdVolume.Flag.String("cpuprofile", "", "cpu profile output file") @@ -219,6 +221,12 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v glog.Fatalf("%d directories by -dir, but only %d disk types is set by -disk", len(v.folders), len(diskTypes)) } + var tagsArg string + if v.tags != nil { + tagsArg = *v.tags + } + folderTags := parseVolumeTags(tagsArg, len(v.folders)) + // security related white list configuration v.whiteList = util.StringSplit(volumeWhiteListOption, ",") @@ -269,7 +277,7 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v volumeServer := weed_server.NewVolumeServer(volumeMux, publicVolumeMux, *v.ip, *v.port, *v.portGrpc, *v.publicUrl, volumeServerId, - v.folders, v.folderMaxLimits, minFreeSpaces, diskTypes, + v.folders, v.folderMaxLimits, minFreeSpaces, diskTypes, folderTags, *v.idxFolder, volumeNeedleMapKind, v.masters, constants.VolumePulsePeriod, *v.dataCenter, *v.rack, @@ -334,6 +342,36 @@ func (v VolumeServerOptions) startVolumeServer(volumeFolders, maxVolumeCounts, v } +func parseVolumeTags(tagsArg string, folderCount int) [][]string { + if folderCount <= 0 { + return nil + } + tagEntries := []string{} + if strings.TrimSpace(tagsArg) != "" { + tagEntries = strings.Split(tagsArg, ",") + } + folderTags := make([][]string, folderCount) + + // If exactly one tag entry provided, replicate it to all folders + if len(tagEntries) == 1 { + normalized := util.NormalizeTagList(strings.Split(tagEntries[0], ":")) + for i := 0; i < folderCount; i++ { + folderTags[i] = append([]string(nil), normalized...) + } + } else { + // Otherwise, assign tags to folders that have explicit entries + for i := 0; i < folderCount; i++ { + if i < len(tagEntries) { + folderTags[i] = util.NormalizeTagList(strings.Split(tagEntries[i], ":")) + } else { + // Initialize remaining folders with empty tag slice + folderTags[i] = []string{} + } + } + } + return folderTags +} + func shutdown(publicHttpDown httpdown.Server, clusterHttpServer httpdown.Server, grpcS *grpc.Server, volumeServer *weed_server.VolumeServer) { // firstly, stop the public http service to prevent from receiving new user request diff --git a/weed/pb/master.proto b/weed/pb/master.proto index a6a7b15e2..337ed88b9 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -61,6 +61,11 @@ service Seaweed { ////////////////////////////////////////////////// +message DiskTag { + uint32 disk_id = 1; + repeated string tags = 2; +} + message Heartbeat { string ip = 1; uint32 port = 2; @@ -89,6 +94,8 @@ message Heartbeat { // state flags volume_server_pb.VolumeServerState state = 23; + + repeated DiskTag disk_tags = 24; } message HeartbeatResponse { @@ -292,6 +299,7 @@ message DiskInfo { repeated VolumeEcShardInformationMessage ec_shard_infos = 7; int64 remote_volume_count = 8; uint32 disk_id = 9; + repeated string tags = 10; } message DataNodeInfo { string id = 1; @@ -460,4 +468,4 @@ message RaftLeadershipTransferResponse { } message VolumeGrowResponse { -} \ No newline at end of file +} diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index 27501ee8b..faa03df2d 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -22,6 +22,58 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type DiskTag struct { + state protoimpl.MessageState `protogen:"open.v1"` + DiskId uint32 `protobuf:"varint,1,opt,name=disk_id,json=diskId,proto3" json:"disk_id,omitempty"` + Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DiskTag) Reset() { + *x = DiskTag{} + mi := &file_master_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DiskTag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DiskTag) ProtoMessage() {} + +func (x *DiskTag) ProtoReflect() protoreflect.Message { + mi := &file_master_proto_msgTypes[0] + 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 DiskTag.ProtoReflect.Descriptor instead. +func (*DiskTag) Descriptor() ([]byte, []int) { + return file_master_proto_rawDescGZIP(), []int{0} +} + +func (x *DiskTag) GetDiskId() uint32 { + if x != nil { + return x.DiskId + } + return 0 +} + +func (x *DiskTag) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + type Heartbeat struct { state protoimpl.MessageState `protogen:"open.v1"` Ip string `protobuf:"bytes,1,opt,name=ip,proto3" json:"ip,omitempty"` @@ -48,13 +100,14 @@ type Heartbeat struct { Id string `protobuf:"bytes,22,opt,name=id,proto3" json:"id,omitempty"` // volume server id, independent of ip:port for stable identification // state flags State *volume_server_pb.VolumeServerState `protobuf:"bytes,23,opt,name=state,proto3" json:"state,omitempty"` + DiskTags []*DiskTag `protobuf:"bytes,24,rep,name=disk_tags,json=diskTags,proto3" json:"disk_tags,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Heartbeat) Reset() { *x = Heartbeat{} - mi := &file_master_proto_msgTypes[0] + mi := &file_master_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -66,7 +119,7 @@ func (x *Heartbeat) String() string { func (*Heartbeat) ProtoMessage() {} func (x *Heartbeat) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[0] + mi := &file_master_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -79,7 +132,7 @@ func (x *Heartbeat) ProtoReflect() protoreflect.Message { // Deprecated: Use Heartbeat.ProtoReflect.Descriptor instead. func (*Heartbeat) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{0} + return file_master_proto_rawDescGZIP(), []int{1} } func (x *Heartbeat) GetIp() string { @@ -222,6 +275,13 @@ func (x *Heartbeat) GetState() *volume_server_pb.VolumeServerState { return nil } +func (x *Heartbeat) GetDiskTags() []*DiskTag { + if x != nil { + return x.DiskTags + } + return nil +} + type HeartbeatResponse struct { state protoimpl.MessageState `protogen:"open.v1"` VolumeSizeLimit uint64 `protobuf:"varint,1,opt,name=volume_size_limit,json=volumeSizeLimit,proto3" json:"volume_size_limit,omitempty"` @@ -237,7 +297,7 @@ type HeartbeatResponse struct { func (x *HeartbeatResponse) Reset() { *x = HeartbeatResponse{} - mi := &file_master_proto_msgTypes[1] + mi := &file_master_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -249,7 +309,7 @@ func (x *HeartbeatResponse) String() string { func (*HeartbeatResponse) ProtoMessage() {} func (x *HeartbeatResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[1] + mi := &file_master_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -262,7 +322,7 @@ func (x *HeartbeatResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HeartbeatResponse.ProtoReflect.Descriptor instead. func (*HeartbeatResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{1} + return file_master_proto_rawDescGZIP(), []int{2} } func (x *HeartbeatResponse) GetVolumeSizeLimit() uint64 { @@ -338,7 +398,7 @@ type VolumeInformationMessage struct { func (x *VolumeInformationMessage) Reset() { *x = VolumeInformationMessage{} - mi := &file_master_proto_msgTypes[2] + mi := &file_master_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -350,7 +410,7 @@ func (x *VolumeInformationMessage) String() string { func (*VolumeInformationMessage) ProtoMessage() {} func (x *VolumeInformationMessage) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[2] + mi := &file_master_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -363,7 +423,7 @@ func (x *VolumeInformationMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeInformationMessage.ProtoReflect.Descriptor instead. func (*VolumeInformationMessage) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{2} + return file_master_proto_rawDescGZIP(), []int{3} } func (x *VolumeInformationMessage) GetId() uint32 { @@ -493,7 +553,7 @@ type VolumeShortInformationMessage struct { func (x *VolumeShortInformationMessage) Reset() { *x = VolumeShortInformationMessage{} - mi := &file_master_proto_msgTypes[3] + mi := &file_master_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -505,7 +565,7 @@ func (x *VolumeShortInformationMessage) String() string { func (*VolumeShortInformationMessage) ProtoMessage() {} func (x *VolumeShortInformationMessage) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[3] + mi := &file_master_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -518,7 +578,7 @@ func (x *VolumeShortInformationMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeShortInformationMessage.ProtoReflect.Descriptor instead. func (*VolumeShortInformationMessage) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{3} + return file_master_proto_rawDescGZIP(), []int{4} } func (x *VolumeShortInformationMessage) GetId() uint32 { @@ -585,7 +645,7 @@ type VolumeEcShardInformationMessage struct { func (x *VolumeEcShardInformationMessage) Reset() { *x = VolumeEcShardInformationMessage{} - mi := &file_master_proto_msgTypes[4] + mi := &file_master_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -597,7 +657,7 @@ func (x *VolumeEcShardInformationMessage) String() string { func (*VolumeEcShardInformationMessage) ProtoMessage() {} func (x *VolumeEcShardInformationMessage) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[4] + mi := &file_master_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -610,7 +670,7 @@ func (x *VolumeEcShardInformationMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeEcShardInformationMessage.ProtoReflect.Descriptor instead. func (*VolumeEcShardInformationMessage) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{4} + return file_master_proto_rawDescGZIP(), []int{5} } func (x *VolumeEcShardInformationMessage) GetId() uint32 { @@ -673,7 +733,7 @@ type StorageBackend struct { func (x *StorageBackend) Reset() { *x = StorageBackend{} - mi := &file_master_proto_msgTypes[5] + mi := &file_master_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +745,7 @@ func (x *StorageBackend) String() string { func (*StorageBackend) ProtoMessage() {} func (x *StorageBackend) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[5] + mi := &file_master_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -698,7 +758,7 @@ func (x *StorageBackend) ProtoReflect() protoreflect.Message { // Deprecated: Use StorageBackend.ProtoReflect.Descriptor instead. func (*StorageBackend) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{5} + return file_master_proto_rawDescGZIP(), []int{6} } func (x *StorageBackend) GetType() string { @@ -730,7 +790,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} - mi := &file_master_proto_msgTypes[6] + mi := &file_master_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -742,7 +802,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[6] + mi := &file_master_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -755,7 +815,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{6} + return file_master_proto_rawDescGZIP(), []int{7} } type SuperBlockExtra struct { @@ -767,7 +827,7 @@ type SuperBlockExtra struct { func (x *SuperBlockExtra) Reset() { *x = SuperBlockExtra{} - mi := &file_master_proto_msgTypes[7] + mi := &file_master_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -779,7 +839,7 @@ func (x *SuperBlockExtra) String() string { func (*SuperBlockExtra) ProtoMessage() {} func (x *SuperBlockExtra) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[7] + mi := &file_master_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -792,7 +852,7 @@ func (x *SuperBlockExtra) ProtoReflect() protoreflect.Message { // Deprecated: Use SuperBlockExtra.ProtoReflect.Descriptor instead. func (*SuperBlockExtra) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{7} + return file_master_proto_rawDescGZIP(), []int{8} } func (x *SuperBlockExtra) GetErasureCoding() *SuperBlockExtra_ErasureCoding { @@ -816,7 +876,7 @@ type KeepConnectedRequest struct { func (x *KeepConnectedRequest) Reset() { *x = KeepConnectedRequest{} - mi := &file_master_proto_msgTypes[8] + mi := &file_master_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -828,7 +888,7 @@ func (x *KeepConnectedRequest) String() string { func (*KeepConnectedRequest) ProtoMessage() {} func (x *KeepConnectedRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[8] + mi := &file_master_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -841,7 +901,7 @@ func (x *KeepConnectedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use KeepConnectedRequest.ProtoReflect.Descriptor instead. func (*KeepConnectedRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{8} + return file_master_proto_rawDescGZIP(), []int{9} } func (x *KeepConnectedRequest) GetClientType() string { @@ -903,7 +963,7 @@ type VolumeLocation struct { func (x *VolumeLocation) Reset() { *x = VolumeLocation{} - mi := &file_master_proto_msgTypes[9] + mi := &file_master_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -915,7 +975,7 @@ func (x *VolumeLocation) String() string { func (*VolumeLocation) ProtoMessage() {} func (x *VolumeLocation) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[9] + mi := &file_master_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -928,7 +988,7 @@ func (x *VolumeLocation) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeLocation.ProtoReflect.Descriptor instead. func (*VolumeLocation) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{9} + return file_master_proto_rawDescGZIP(), []int{10} } func (x *VolumeLocation) GetUrl() string { @@ -1007,7 +1067,7 @@ type ClusterNodeUpdate struct { func (x *ClusterNodeUpdate) Reset() { *x = ClusterNodeUpdate{} - mi := &file_master_proto_msgTypes[10] + mi := &file_master_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1019,7 +1079,7 @@ func (x *ClusterNodeUpdate) String() string { func (*ClusterNodeUpdate) ProtoMessage() {} func (x *ClusterNodeUpdate) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[10] + mi := &file_master_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1032,7 +1092,7 @@ func (x *ClusterNodeUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use ClusterNodeUpdate.ProtoReflect.Descriptor instead. func (*ClusterNodeUpdate) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{10} + return file_master_proto_rawDescGZIP(), []int{11} } func (x *ClusterNodeUpdate) GetNodeType() string { @@ -1080,7 +1140,7 @@ type KeepConnectedResponse struct { func (x *KeepConnectedResponse) Reset() { *x = KeepConnectedResponse{} - mi := &file_master_proto_msgTypes[11] + mi := &file_master_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1092,7 +1152,7 @@ func (x *KeepConnectedResponse) String() string { func (*KeepConnectedResponse) ProtoMessage() {} func (x *KeepConnectedResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[11] + mi := &file_master_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1105,7 +1165,7 @@ func (x *KeepConnectedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use KeepConnectedResponse.ProtoReflect.Descriptor instead. func (*KeepConnectedResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{11} + return file_master_proto_rawDescGZIP(), []int{12} } func (x *KeepConnectedResponse) GetVolumeLocation() *VolumeLocation { @@ -1132,7 +1192,7 @@ type LookupVolumeRequest struct { func (x *LookupVolumeRequest) Reset() { *x = LookupVolumeRequest{} - mi := &file_master_proto_msgTypes[12] + mi := &file_master_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1144,7 +1204,7 @@ func (x *LookupVolumeRequest) String() string { func (*LookupVolumeRequest) ProtoMessage() {} func (x *LookupVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[12] + mi := &file_master_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1157,7 +1217,7 @@ func (x *LookupVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVolumeRequest.ProtoReflect.Descriptor instead. func (*LookupVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{12} + return file_master_proto_rawDescGZIP(), []int{13} } func (x *LookupVolumeRequest) GetVolumeOrFileIds() []string { @@ -1183,7 +1243,7 @@ type LookupVolumeResponse struct { func (x *LookupVolumeResponse) Reset() { *x = LookupVolumeResponse{} - mi := &file_master_proto_msgTypes[13] + mi := &file_master_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1195,7 +1255,7 @@ func (x *LookupVolumeResponse) String() string { func (*LookupVolumeResponse) ProtoMessage() {} func (x *LookupVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[13] + mi := &file_master_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1208,7 +1268,7 @@ func (x *LookupVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupVolumeResponse.ProtoReflect.Descriptor instead. func (*LookupVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{13} + return file_master_proto_rawDescGZIP(), []int{14} } func (x *LookupVolumeResponse) GetVolumeIdLocations() []*LookupVolumeResponse_VolumeIdLocation { @@ -1230,7 +1290,7 @@ type Location struct { func (x *Location) Reset() { *x = Location{} - mi := &file_master_proto_msgTypes[14] + mi := &file_master_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1242,7 +1302,7 @@ func (x *Location) String() string { func (*Location) ProtoMessage() {} func (x *Location) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[14] + mi := &file_master_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1255,7 +1315,7 @@ func (x *Location) ProtoReflect() protoreflect.Message { // Deprecated: Use Location.ProtoReflect.Descriptor instead. func (*Location) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{14} + return file_master_proto_rawDescGZIP(), []int{15} } func (x *Location) GetUrl() string { @@ -1304,7 +1364,7 @@ type AssignRequest struct { func (x *AssignRequest) Reset() { *x = AssignRequest{} - mi := &file_master_proto_msgTypes[15] + mi := &file_master_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1316,7 +1376,7 @@ func (x *AssignRequest) String() string { func (*AssignRequest) ProtoMessage() {} func (x *AssignRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[15] + mi := &file_master_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1329,7 +1389,7 @@ func (x *AssignRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AssignRequest.ProtoReflect.Descriptor instead. func (*AssignRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{15} + return file_master_proto_rawDescGZIP(), []int{16} } func (x *AssignRequest) GetCount() uint64 { @@ -1419,7 +1479,7 @@ type VolumeGrowRequest struct { func (x *VolumeGrowRequest) Reset() { *x = VolumeGrowRequest{} - mi := &file_master_proto_msgTypes[16] + mi := &file_master_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1431,7 +1491,7 @@ func (x *VolumeGrowRequest) String() string { func (*VolumeGrowRequest) ProtoMessage() {} func (x *VolumeGrowRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[16] + mi := &file_master_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1444,7 +1504,7 @@ func (x *VolumeGrowRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeGrowRequest.ProtoReflect.Descriptor instead. func (*VolumeGrowRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{16} + return file_master_proto_rawDescGZIP(), []int{17} } func (x *VolumeGrowRequest) GetWritableVolumeCount() uint32 { @@ -1524,7 +1584,7 @@ type AssignResponse struct { func (x *AssignResponse) Reset() { *x = AssignResponse{} - mi := &file_master_proto_msgTypes[17] + mi := &file_master_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1536,7 +1596,7 @@ func (x *AssignResponse) String() string { func (*AssignResponse) ProtoMessage() {} func (x *AssignResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[17] + mi := &file_master_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1549,7 +1609,7 @@ func (x *AssignResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssignResponse.ProtoReflect.Descriptor instead. func (*AssignResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{17} + return file_master_proto_rawDescGZIP(), []int{18} } func (x *AssignResponse) GetFid() string { @@ -1606,7 +1666,7 @@ type StatisticsRequest struct { func (x *StatisticsRequest) Reset() { *x = StatisticsRequest{} - mi := &file_master_proto_msgTypes[18] + mi := &file_master_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1618,7 +1678,7 @@ func (x *StatisticsRequest) String() string { func (*StatisticsRequest) ProtoMessage() {} func (x *StatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[18] + mi := &file_master_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1631,7 +1691,7 @@ func (x *StatisticsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatisticsRequest.ProtoReflect.Descriptor instead. func (*StatisticsRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{18} + return file_master_proto_rawDescGZIP(), []int{19} } func (x *StatisticsRequest) GetReplication() string { @@ -1673,7 +1733,7 @@ type StatisticsResponse struct { func (x *StatisticsResponse) Reset() { *x = StatisticsResponse{} - mi := &file_master_proto_msgTypes[19] + mi := &file_master_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1685,7 +1745,7 @@ func (x *StatisticsResponse) String() string { func (*StatisticsResponse) ProtoMessage() {} func (x *StatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[19] + mi := &file_master_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1698,7 +1758,7 @@ func (x *StatisticsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatisticsResponse.ProtoReflect.Descriptor instead. func (*StatisticsResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{19} + return file_master_proto_rawDescGZIP(), []int{20} } func (x *StatisticsResponse) GetTotalSize() uint64 { @@ -1732,7 +1792,7 @@ type Collection struct { func (x *Collection) Reset() { *x = Collection{} - mi := &file_master_proto_msgTypes[20] + mi := &file_master_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1744,7 +1804,7 @@ func (x *Collection) String() string { func (*Collection) ProtoMessage() {} func (x *Collection) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[20] + mi := &file_master_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1757,7 +1817,7 @@ func (x *Collection) ProtoReflect() protoreflect.Message { // Deprecated: Use Collection.ProtoReflect.Descriptor instead. func (*Collection) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{20} + return file_master_proto_rawDescGZIP(), []int{21} } func (x *Collection) GetName() string { @@ -1777,7 +1837,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} - mi := &file_master_proto_msgTypes[21] + mi := &file_master_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1789,7 +1849,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[21] + mi := &file_master_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1802,7 +1862,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{21} + return file_master_proto_rawDescGZIP(), []int{22} } func (x *CollectionListRequest) GetIncludeNormalVolumes() bool { @@ -1828,7 +1888,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} - mi := &file_master_proto_msgTypes[22] + mi := &file_master_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1840,7 +1900,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[22] + mi := &file_master_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1853,7 +1913,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{22} + return file_master_proto_rawDescGZIP(), []int{23} } func (x *CollectionListResponse) GetCollections() []*Collection { @@ -1872,7 +1932,7 @@ type CollectionDeleteRequest struct { func (x *CollectionDeleteRequest) Reset() { *x = CollectionDeleteRequest{} - mi := &file_master_proto_msgTypes[23] + mi := &file_master_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1884,7 +1944,7 @@ func (x *CollectionDeleteRequest) String() string { func (*CollectionDeleteRequest) ProtoMessage() {} func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[23] + mi := &file_master_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1897,7 +1957,7 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{23} + return file_master_proto_rawDescGZIP(), []int{24} } func (x *CollectionDeleteRequest) GetName() string { @@ -1915,7 +1975,7 @@ type CollectionDeleteResponse struct { func (x *CollectionDeleteResponse) Reset() { *x = CollectionDeleteResponse{} - mi := &file_master_proto_msgTypes[24] + mi := &file_master_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1927,7 +1987,7 @@ func (x *CollectionDeleteResponse) String() string { func (*CollectionDeleteResponse) ProtoMessage() {} func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[24] + mi := &file_master_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1940,7 +2000,7 @@ func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteResponse.ProtoReflect.Descriptor instead. func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{24} + return file_master_proto_rawDescGZIP(), []int{25} } // volume related @@ -1955,13 +2015,14 @@ type DiskInfo struct { EcShardInfos []*VolumeEcShardInformationMessage `protobuf:"bytes,7,rep,name=ec_shard_infos,json=ecShardInfos,proto3" json:"ec_shard_infos,omitempty"` RemoteVolumeCount int64 `protobuf:"varint,8,opt,name=remote_volume_count,json=remoteVolumeCount,proto3" json:"remote_volume_count,omitempty"` DiskId uint32 `protobuf:"varint,9,opt,name=disk_id,json=diskId,proto3" json:"disk_id,omitempty"` + Tags []string `protobuf:"bytes,10,rep,name=tags,proto3" json:"tags,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *DiskInfo) Reset() { *x = DiskInfo{} - mi := &file_master_proto_msgTypes[25] + mi := &file_master_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1973,7 +2034,7 @@ func (x *DiskInfo) String() string { func (*DiskInfo) ProtoMessage() {} func (x *DiskInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[25] + mi := &file_master_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1986,7 +2047,7 @@ func (x *DiskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DiskInfo.ProtoReflect.Descriptor instead. func (*DiskInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{25} + return file_master_proto_rawDescGZIP(), []int{26} } func (x *DiskInfo) GetType() string { @@ -2052,6 +2113,13 @@ func (x *DiskInfo) GetDiskId() uint32 { return 0 } +func (x *DiskInfo) GetTags() []string { + if x != nil { + return x.Tags + } + return nil +} + type DataNodeInfo struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -2064,7 +2132,7 @@ type DataNodeInfo struct { func (x *DataNodeInfo) Reset() { *x = DataNodeInfo{} - mi := &file_master_proto_msgTypes[26] + mi := &file_master_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2076,7 +2144,7 @@ func (x *DataNodeInfo) String() string { func (*DataNodeInfo) ProtoMessage() {} func (x *DataNodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[26] + mi := &file_master_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2089,7 +2157,7 @@ func (x *DataNodeInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DataNodeInfo.ProtoReflect.Descriptor instead. func (*DataNodeInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{26} + return file_master_proto_rawDescGZIP(), []int{27} } func (x *DataNodeInfo) GetId() string { @@ -2131,7 +2199,7 @@ type RackInfo struct { func (x *RackInfo) Reset() { *x = RackInfo{} - mi := &file_master_proto_msgTypes[27] + mi := &file_master_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2143,7 +2211,7 @@ func (x *RackInfo) String() string { func (*RackInfo) ProtoMessage() {} func (x *RackInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[27] + mi := &file_master_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2156,7 +2224,7 @@ func (x *RackInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RackInfo.ProtoReflect.Descriptor instead. func (*RackInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{27} + return file_master_proto_rawDescGZIP(), []int{28} } func (x *RackInfo) GetId() string { @@ -2191,7 +2259,7 @@ type DataCenterInfo struct { func (x *DataCenterInfo) Reset() { *x = DataCenterInfo{} - mi := &file_master_proto_msgTypes[28] + mi := &file_master_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2203,7 +2271,7 @@ func (x *DataCenterInfo) String() string { func (*DataCenterInfo) ProtoMessage() {} func (x *DataCenterInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[28] + mi := &file_master_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2216,7 +2284,7 @@ func (x *DataCenterInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DataCenterInfo.ProtoReflect.Descriptor instead. func (*DataCenterInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{28} + return file_master_proto_rawDescGZIP(), []int{29} } func (x *DataCenterInfo) GetId() string { @@ -2251,7 +2319,7 @@ type TopologyInfo struct { func (x *TopologyInfo) Reset() { *x = TopologyInfo{} - mi := &file_master_proto_msgTypes[29] + mi := &file_master_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2263,7 +2331,7 @@ func (x *TopologyInfo) String() string { func (*TopologyInfo) ProtoMessage() {} func (x *TopologyInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[29] + mi := &file_master_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2276,7 +2344,7 @@ func (x *TopologyInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TopologyInfo.ProtoReflect.Descriptor instead. func (*TopologyInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{29} + return file_master_proto_rawDescGZIP(), []int{30} } func (x *TopologyInfo) GetId() string { @@ -2308,7 +2376,7 @@ type VolumeListRequest struct { func (x *VolumeListRequest) Reset() { *x = VolumeListRequest{} - mi := &file_master_proto_msgTypes[30] + mi := &file_master_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2320,7 +2388,7 @@ func (x *VolumeListRequest) String() string { func (*VolumeListRequest) ProtoMessage() {} func (x *VolumeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[30] + mi := &file_master_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2333,7 +2401,7 @@ func (x *VolumeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeListRequest.ProtoReflect.Descriptor instead. func (*VolumeListRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{30} + return file_master_proto_rawDescGZIP(), []int{31} } type VolumeListResponse struct { @@ -2346,7 +2414,7 @@ type VolumeListResponse struct { func (x *VolumeListResponse) Reset() { *x = VolumeListResponse{} - mi := &file_master_proto_msgTypes[31] + mi := &file_master_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2358,7 +2426,7 @@ func (x *VolumeListResponse) String() string { func (*VolumeListResponse) ProtoMessage() {} func (x *VolumeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[31] + mi := &file_master_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2371,7 +2439,7 @@ func (x *VolumeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeListResponse.ProtoReflect.Descriptor instead. func (*VolumeListResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{31} + return file_master_proto_rawDescGZIP(), []int{32} } func (x *VolumeListResponse) GetTopologyInfo() *TopologyInfo { @@ -2397,7 +2465,7 @@ type LookupEcVolumeRequest struct { func (x *LookupEcVolumeRequest) Reset() { *x = LookupEcVolumeRequest{} - mi := &file_master_proto_msgTypes[32] + mi := &file_master_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2409,7 +2477,7 @@ func (x *LookupEcVolumeRequest) String() string { func (*LookupEcVolumeRequest) ProtoMessage() {} func (x *LookupEcVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[32] + mi := &file_master_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2422,7 +2490,7 @@ func (x *LookupEcVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupEcVolumeRequest.ProtoReflect.Descriptor instead. func (*LookupEcVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{32} + return file_master_proto_rawDescGZIP(), []int{33} } func (x *LookupEcVolumeRequest) GetVolumeId() uint32 { @@ -2442,7 +2510,7 @@ type LookupEcVolumeResponse struct { func (x *LookupEcVolumeResponse) Reset() { *x = LookupEcVolumeResponse{} - mi := &file_master_proto_msgTypes[33] + mi := &file_master_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2454,7 +2522,7 @@ func (x *LookupEcVolumeResponse) String() string { func (*LookupEcVolumeResponse) ProtoMessage() {} func (x *LookupEcVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[33] + mi := &file_master_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2467,7 +2535,7 @@ func (x *LookupEcVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupEcVolumeResponse.ProtoReflect.Descriptor instead. func (*LookupEcVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{33} + return file_master_proto_rawDescGZIP(), []int{34} } func (x *LookupEcVolumeResponse) GetVolumeId() uint32 { @@ -2495,7 +2563,7 @@ type VacuumVolumeRequest struct { func (x *VacuumVolumeRequest) Reset() { *x = VacuumVolumeRequest{} - mi := &file_master_proto_msgTypes[34] + mi := &file_master_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2507,7 +2575,7 @@ func (x *VacuumVolumeRequest) String() string { func (*VacuumVolumeRequest) ProtoMessage() {} func (x *VacuumVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[34] + mi := &file_master_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2520,7 +2588,7 @@ func (x *VacuumVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VacuumVolumeRequest.ProtoReflect.Descriptor instead. func (*VacuumVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{34} + return file_master_proto_rawDescGZIP(), []int{35} } func (x *VacuumVolumeRequest) GetGarbageThreshold() float32 { @@ -2552,7 +2620,7 @@ type VacuumVolumeResponse struct { func (x *VacuumVolumeResponse) Reset() { *x = VacuumVolumeResponse{} - mi := &file_master_proto_msgTypes[35] + mi := &file_master_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2564,7 +2632,7 @@ func (x *VacuumVolumeResponse) String() string { func (*VacuumVolumeResponse) ProtoMessage() {} func (x *VacuumVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[35] + mi := &file_master_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2577,7 +2645,7 @@ func (x *VacuumVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VacuumVolumeResponse.ProtoReflect.Descriptor instead. func (*VacuumVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{35} + return file_master_proto_rawDescGZIP(), []int{36} } type DisableVacuumRequest struct { @@ -2588,7 +2656,7 @@ type DisableVacuumRequest struct { func (x *DisableVacuumRequest) Reset() { *x = DisableVacuumRequest{} - mi := &file_master_proto_msgTypes[36] + mi := &file_master_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2600,7 +2668,7 @@ func (x *DisableVacuumRequest) String() string { func (*DisableVacuumRequest) ProtoMessage() {} func (x *DisableVacuumRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[36] + mi := &file_master_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2613,7 +2681,7 @@ func (x *DisableVacuumRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DisableVacuumRequest.ProtoReflect.Descriptor instead. func (*DisableVacuumRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{36} + return file_master_proto_rawDescGZIP(), []int{37} } type DisableVacuumResponse struct { @@ -2624,7 +2692,7 @@ type DisableVacuumResponse struct { func (x *DisableVacuumResponse) Reset() { *x = DisableVacuumResponse{} - mi := &file_master_proto_msgTypes[37] + mi := &file_master_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2636,7 +2704,7 @@ func (x *DisableVacuumResponse) String() string { func (*DisableVacuumResponse) ProtoMessage() {} func (x *DisableVacuumResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[37] + mi := &file_master_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2649,7 +2717,7 @@ func (x *DisableVacuumResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DisableVacuumResponse.ProtoReflect.Descriptor instead. func (*DisableVacuumResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{37} + return file_master_proto_rawDescGZIP(), []int{38} } type EnableVacuumRequest struct { @@ -2660,7 +2728,7 @@ type EnableVacuumRequest struct { func (x *EnableVacuumRequest) Reset() { *x = EnableVacuumRequest{} - mi := &file_master_proto_msgTypes[38] + mi := &file_master_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2672,7 +2740,7 @@ func (x *EnableVacuumRequest) String() string { func (*EnableVacuumRequest) ProtoMessage() {} func (x *EnableVacuumRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[38] + mi := &file_master_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2685,7 +2753,7 @@ func (x *EnableVacuumRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableVacuumRequest.ProtoReflect.Descriptor instead. func (*EnableVacuumRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{38} + return file_master_proto_rawDescGZIP(), []int{39} } type EnableVacuumResponse struct { @@ -2696,7 +2764,7 @@ type EnableVacuumResponse struct { func (x *EnableVacuumResponse) Reset() { *x = EnableVacuumResponse{} - mi := &file_master_proto_msgTypes[39] + mi := &file_master_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2708,7 +2776,7 @@ func (x *EnableVacuumResponse) String() string { func (*EnableVacuumResponse) ProtoMessage() {} func (x *EnableVacuumResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[39] + mi := &file_master_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2721,7 +2789,7 @@ func (x *EnableVacuumResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableVacuumResponse.ProtoReflect.Descriptor instead. func (*EnableVacuumResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{39} + return file_master_proto_rawDescGZIP(), []int{40} } type VolumeMarkReadonlyRequest struct { @@ -2741,7 +2809,7 @@ type VolumeMarkReadonlyRequest struct { func (x *VolumeMarkReadonlyRequest) Reset() { *x = VolumeMarkReadonlyRequest{} - mi := &file_master_proto_msgTypes[40] + mi := &file_master_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2753,7 +2821,7 @@ func (x *VolumeMarkReadonlyRequest) String() string { func (*VolumeMarkReadonlyRequest) ProtoMessage() {} func (x *VolumeMarkReadonlyRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[40] + mi := &file_master_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2766,7 +2834,7 @@ func (x *VolumeMarkReadonlyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeMarkReadonlyRequest.ProtoReflect.Descriptor instead. func (*VolumeMarkReadonlyRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{40} + return file_master_proto_rawDescGZIP(), []int{41} } func (x *VolumeMarkReadonlyRequest) GetIp() string { @@ -2840,7 +2908,7 @@ type VolumeMarkReadonlyResponse struct { func (x *VolumeMarkReadonlyResponse) Reset() { *x = VolumeMarkReadonlyResponse{} - mi := &file_master_proto_msgTypes[41] + mi := &file_master_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2852,7 +2920,7 @@ func (x *VolumeMarkReadonlyResponse) String() string { func (*VolumeMarkReadonlyResponse) ProtoMessage() {} func (x *VolumeMarkReadonlyResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[41] + mi := &file_master_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2865,7 +2933,7 @@ func (x *VolumeMarkReadonlyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeMarkReadonlyResponse.ProtoReflect.Descriptor instead. func (*VolumeMarkReadonlyResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{41} + return file_master_proto_rawDescGZIP(), []int{42} } type GetMasterConfigurationRequest struct { @@ -2876,7 +2944,7 @@ type GetMasterConfigurationRequest struct { func (x *GetMasterConfigurationRequest) Reset() { *x = GetMasterConfigurationRequest{} - mi := &file_master_proto_msgTypes[42] + mi := &file_master_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2888,7 +2956,7 @@ func (x *GetMasterConfigurationRequest) String() string { func (*GetMasterConfigurationRequest) ProtoMessage() {} func (x *GetMasterConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[42] + mi := &file_master_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2901,7 +2969,7 @@ func (x *GetMasterConfigurationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMasterConfigurationRequest.ProtoReflect.Descriptor instead. func (*GetMasterConfigurationRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{42} + return file_master_proto_rawDescGZIP(), []int{43} } type GetMasterConfigurationResponse struct { @@ -2919,7 +2987,7 @@ type GetMasterConfigurationResponse struct { func (x *GetMasterConfigurationResponse) Reset() { *x = GetMasterConfigurationResponse{} - mi := &file_master_proto_msgTypes[43] + mi := &file_master_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2931,7 +2999,7 @@ func (x *GetMasterConfigurationResponse) String() string { func (*GetMasterConfigurationResponse) ProtoMessage() {} func (x *GetMasterConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[43] + mi := &file_master_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2944,7 +3012,7 @@ func (x *GetMasterConfigurationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMasterConfigurationResponse.ProtoReflect.Descriptor instead. func (*GetMasterConfigurationResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{43} + return file_master_proto_rawDescGZIP(), []int{44} } func (x *GetMasterConfigurationResponse) GetMetricsAddress() string { @@ -3007,7 +3075,7 @@ type ListClusterNodesRequest struct { func (x *ListClusterNodesRequest) Reset() { *x = ListClusterNodesRequest{} - mi := &file_master_proto_msgTypes[44] + mi := &file_master_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3019,7 +3087,7 @@ func (x *ListClusterNodesRequest) String() string { func (*ListClusterNodesRequest) ProtoMessage() {} func (x *ListClusterNodesRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[44] + mi := &file_master_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3032,7 +3100,7 @@ func (x *ListClusterNodesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListClusterNodesRequest.ProtoReflect.Descriptor instead. func (*ListClusterNodesRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{44} + return file_master_proto_rawDescGZIP(), []int{45} } func (x *ListClusterNodesRequest) GetClientType() string { @@ -3065,7 +3133,7 @@ type ListClusterNodesResponse struct { func (x *ListClusterNodesResponse) Reset() { *x = ListClusterNodesResponse{} - mi := &file_master_proto_msgTypes[45] + mi := &file_master_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3077,7 +3145,7 @@ func (x *ListClusterNodesResponse) String() string { func (*ListClusterNodesResponse) ProtoMessage() {} func (x *ListClusterNodesResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[45] + mi := &file_master_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3090,7 +3158,7 @@ func (x *ListClusterNodesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListClusterNodesResponse.ProtoReflect.Descriptor instead. func (*ListClusterNodesResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{45} + return file_master_proto_rawDescGZIP(), []int{46} } func (x *ListClusterNodesResponse) GetClusterNodes() []*ListClusterNodesResponse_ClusterNode { @@ -3113,7 +3181,7 @@ type LeaseAdminTokenRequest struct { func (x *LeaseAdminTokenRequest) Reset() { *x = LeaseAdminTokenRequest{} - mi := &file_master_proto_msgTypes[46] + mi := &file_master_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3125,7 +3193,7 @@ func (x *LeaseAdminTokenRequest) String() string { func (*LeaseAdminTokenRequest) ProtoMessage() {} func (x *LeaseAdminTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[46] + mi := &file_master_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3138,7 +3206,7 @@ func (x *LeaseAdminTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LeaseAdminTokenRequest.ProtoReflect.Descriptor instead. func (*LeaseAdminTokenRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{46} + return file_master_proto_rawDescGZIP(), []int{47} } func (x *LeaseAdminTokenRequest) GetPreviousToken() int64 { @@ -3186,7 +3254,7 @@ type LeaseAdminTokenResponse struct { func (x *LeaseAdminTokenResponse) Reset() { *x = LeaseAdminTokenResponse{} - mi := &file_master_proto_msgTypes[47] + mi := &file_master_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3198,7 +3266,7 @@ func (x *LeaseAdminTokenResponse) String() string { func (*LeaseAdminTokenResponse) ProtoMessage() {} func (x *LeaseAdminTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[47] + mi := &file_master_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3211,7 +3279,7 @@ func (x *LeaseAdminTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LeaseAdminTokenResponse.ProtoReflect.Descriptor instead. func (*LeaseAdminTokenResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{47} + return file_master_proto_rawDescGZIP(), []int{48} } func (x *LeaseAdminTokenResponse) GetToken() int64 { @@ -3239,7 +3307,7 @@ type ReleaseAdminTokenRequest struct { func (x *ReleaseAdminTokenRequest) Reset() { *x = ReleaseAdminTokenRequest{} - mi := &file_master_proto_msgTypes[48] + mi := &file_master_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3251,7 +3319,7 @@ func (x *ReleaseAdminTokenRequest) String() string { func (*ReleaseAdminTokenRequest) ProtoMessage() {} func (x *ReleaseAdminTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[48] + mi := &file_master_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3264,7 +3332,7 @@ func (x *ReleaseAdminTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseAdminTokenRequest.ProtoReflect.Descriptor instead. func (*ReleaseAdminTokenRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{48} + return file_master_proto_rawDescGZIP(), []int{49} } func (x *ReleaseAdminTokenRequest) GetPreviousToken() int64 { @@ -3296,7 +3364,7 @@ type ReleaseAdminTokenResponse struct { func (x *ReleaseAdminTokenResponse) Reset() { *x = ReleaseAdminTokenResponse{} - mi := &file_master_proto_msgTypes[49] + mi := &file_master_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3308,7 +3376,7 @@ func (x *ReleaseAdminTokenResponse) String() string { func (*ReleaseAdminTokenResponse) ProtoMessage() {} func (x *ReleaseAdminTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[49] + mi := &file_master_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3321,7 +3389,7 @@ func (x *ReleaseAdminTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseAdminTokenResponse.ProtoReflect.Descriptor instead. func (*ReleaseAdminTokenResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{49} + return file_master_proto_rawDescGZIP(), []int{50} } type PingRequest struct { @@ -3334,7 +3402,7 @@ type PingRequest struct { func (x *PingRequest) Reset() { *x = PingRequest{} - mi := &file_master_proto_msgTypes[50] + mi := &file_master_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3346,7 +3414,7 @@ func (x *PingRequest) String() string { func (*PingRequest) ProtoMessage() {} func (x *PingRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[50] + mi := &file_master_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3359,7 +3427,7 @@ func (x *PingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingRequest.ProtoReflect.Descriptor instead. func (*PingRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{50} + return file_master_proto_rawDescGZIP(), []int{51} } func (x *PingRequest) GetTarget() string { @@ -3387,7 +3455,7 @@ type PingResponse struct { func (x *PingResponse) Reset() { *x = PingResponse{} - mi := &file_master_proto_msgTypes[51] + mi := &file_master_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3399,7 +3467,7 @@ func (x *PingResponse) String() string { func (*PingResponse) ProtoMessage() {} func (x *PingResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[51] + mi := &file_master_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3412,7 +3480,7 @@ func (x *PingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingResponse.ProtoReflect.Descriptor instead. func (*PingResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{51} + return file_master_proto_rawDescGZIP(), []int{52} } func (x *PingResponse) GetStartTimeNs() int64 { @@ -3447,7 +3515,7 @@ type RaftAddServerRequest struct { func (x *RaftAddServerRequest) Reset() { *x = RaftAddServerRequest{} - mi := &file_master_proto_msgTypes[52] + mi := &file_master_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3459,7 +3527,7 @@ func (x *RaftAddServerRequest) String() string { func (*RaftAddServerRequest) ProtoMessage() {} func (x *RaftAddServerRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[52] + mi := &file_master_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3472,7 +3540,7 @@ func (x *RaftAddServerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftAddServerRequest.ProtoReflect.Descriptor instead. func (*RaftAddServerRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{52} + return file_master_proto_rawDescGZIP(), []int{53} } func (x *RaftAddServerRequest) GetId() string { @@ -3504,7 +3572,7 @@ type RaftAddServerResponse struct { func (x *RaftAddServerResponse) Reset() { *x = RaftAddServerResponse{} - mi := &file_master_proto_msgTypes[53] + mi := &file_master_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3516,7 +3584,7 @@ func (x *RaftAddServerResponse) String() string { func (*RaftAddServerResponse) ProtoMessage() {} func (x *RaftAddServerResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[53] + mi := &file_master_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3529,7 +3597,7 @@ func (x *RaftAddServerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftAddServerResponse.ProtoReflect.Descriptor instead. func (*RaftAddServerResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{53} + return file_master_proto_rawDescGZIP(), []int{54} } type RaftRemoveServerRequest struct { @@ -3542,7 +3610,7 @@ type RaftRemoveServerRequest struct { func (x *RaftRemoveServerRequest) Reset() { *x = RaftRemoveServerRequest{} - mi := &file_master_proto_msgTypes[54] + mi := &file_master_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3554,7 +3622,7 @@ func (x *RaftRemoveServerRequest) String() string { func (*RaftRemoveServerRequest) ProtoMessage() {} func (x *RaftRemoveServerRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[54] + mi := &file_master_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3567,7 +3635,7 @@ func (x *RaftRemoveServerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftRemoveServerRequest.ProtoReflect.Descriptor instead. func (*RaftRemoveServerRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{54} + return file_master_proto_rawDescGZIP(), []int{55} } func (x *RaftRemoveServerRequest) GetId() string { @@ -3592,7 +3660,7 @@ type RaftRemoveServerResponse struct { func (x *RaftRemoveServerResponse) Reset() { *x = RaftRemoveServerResponse{} - mi := &file_master_proto_msgTypes[55] + mi := &file_master_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3604,7 +3672,7 @@ func (x *RaftRemoveServerResponse) String() string { func (*RaftRemoveServerResponse) ProtoMessage() {} func (x *RaftRemoveServerResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[55] + mi := &file_master_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3617,7 +3685,7 @@ func (x *RaftRemoveServerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftRemoveServerResponse.ProtoReflect.Descriptor instead. func (*RaftRemoveServerResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{55} + return file_master_proto_rawDescGZIP(), []int{56} } type RaftListClusterServersRequest struct { @@ -3628,7 +3696,7 @@ type RaftListClusterServersRequest struct { func (x *RaftListClusterServersRequest) Reset() { *x = RaftListClusterServersRequest{} - mi := &file_master_proto_msgTypes[56] + mi := &file_master_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3640,7 +3708,7 @@ func (x *RaftListClusterServersRequest) String() string { func (*RaftListClusterServersRequest) ProtoMessage() {} func (x *RaftListClusterServersRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[56] + mi := &file_master_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3653,7 +3721,7 @@ func (x *RaftListClusterServersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftListClusterServersRequest.ProtoReflect.Descriptor instead. func (*RaftListClusterServersRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{56} + return file_master_proto_rawDescGZIP(), []int{57} } type RaftListClusterServersResponse struct { @@ -3665,7 +3733,7 @@ type RaftListClusterServersResponse struct { func (x *RaftListClusterServersResponse) Reset() { *x = RaftListClusterServersResponse{} - mi := &file_master_proto_msgTypes[57] + mi := &file_master_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3677,7 +3745,7 @@ func (x *RaftListClusterServersResponse) String() string { func (*RaftListClusterServersResponse) ProtoMessage() {} func (x *RaftListClusterServersResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[57] + mi := &file_master_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3690,7 +3758,7 @@ func (x *RaftListClusterServersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftListClusterServersResponse.ProtoReflect.Descriptor instead. func (*RaftListClusterServersResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{57} + return file_master_proto_rawDescGZIP(), []int{58} } func (x *RaftListClusterServersResponse) GetClusterServers() []*RaftListClusterServersResponse_ClusterServers { @@ -3710,7 +3778,7 @@ type RaftLeadershipTransferRequest struct { func (x *RaftLeadershipTransferRequest) Reset() { *x = RaftLeadershipTransferRequest{} - mi := &file_master_proto_msgTypes[58] + mi := &file_master_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3722,7 +3790,7 @@ func (x *RaftLeadershipTransferRequest) String() string { func (*RaftLeadershipTransferRequest) ProtoMessage() {} func (x *RaftLeadershipTransferRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[58] + mi := &file_master_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3735,7 +3803,7 @@ func (x *RaftLeadershipTransferRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftLeadershipTransferRequest.ProtoReflect.Descriptor instead. func (*RaftLeadershipTransferRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{58} + return file_master_proto_rawDescGZIP(), []int{59} } func (x *RaftLeadershipTransferRequest) GetTargetId() string { @@ -3762,7 +3830,7 @@ type RaftLeadershipTransferResponse struct { func (x *RaftLeadershipTransferResponse) Reset() { *x = RaftLeadershipTransferResponse{} - mi := &file_master_proto_msgTypes[59] + mi := &file_master_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3774,7 +3842,7 @@ func (x *RaftLeadershipTransferResponse) String() string { func (*RaftLeadershipTransferResponse) ProtoMessage() {} func (x *RaftLeadershipTransferResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[59] + mi := &file_master_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3855,7 @@ func (x *RaftLeadershipTransferResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftLeadershipTransferResponse.ProtoReflect.Descriptor instead. func (*RaftLeadershipTransferResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{59} + return file_master_proto_rawDescGZIP(), []int{60} } func (x *RaftLeadershipTransferResponse) GetPreviousLeader() string { @@ -3812,7 +3880,7 @@ type VolumeGrowResponse struct { func (x *VolumeGrowResponse) Reset() { *x = VolumeGrowResponse{} - mi := &file_master_proto_msgTypes[60] + mi := &file_master_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3824,7 +3892,7 @@ func (x *VolumeGrowResponse) String() string { func (*VolumeGrowResponse) ProtoMessage() {} func (x *VolumeGrowResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[60] + mi := &file_master_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3837,7 +3905,7 @@ func (x *VolumeGrowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeGrowResponse.ProtoReflect.Descriptor instead. func (*VolumeGrowResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{60} + return file_master_proto_rawDescGZIP(), []int{61} } type SuperBlockExtra_ErasureCoding struct { @@ -3851,7 +3919,7 @@ type SuperBlockExtra_ErasureCoding struct { func (x *SuperBlockExtra_ErasureCoding) Reset() { *x = SuperBlockExtra_ErasureCoding{} - mi := &file_master_proto_msgTypes[63] + mi := &file_master_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3863,7 +3931,7 @@ func (x *SuperBlockExtra_ErasureCoding) String() string { func (*SuperBlockExtra_ErasureCoding) ProtoMessage() {} func (x *SuperBlockExtra_ErasureCoding) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[63] + mi := &file_master_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3876,7 +3944,7 @@ func (x *SuperBlockExtra_ErasureCoding) ProtoReflect() protoreflect.Message { // Deprecated: Use SuperBlockExtra_ErasureCoding.ProtoReflect.Descriptor instead. func (*SuperBlockExtra_ErasureCoding) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{7, 0} + return file_master_proto_rawDescGZIP(), []int{8, 0} } func (x *SuperBlockExtra_ErasureCoding) GetData() uint32 { @@ -3912,7 +3980,7 @@ type LookupVolumeResponse_VolumeIdLocation struct { func (x *LookupVolumeResponse_VolumeIdLocation) Reset() { *x = LookupVolumeResponse_VolumeIdLocation{} - mi := &file_master_proto_msgTypes[64] + mi := &file_master_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3924,7 +3992,7 @@ func (x *LookupVolumeResponse_VolumeIdLocation) String() string { func (*LookupVolumeResponse_VolumeIdLocation) ProtoMessage() {} func (x *LookupVolumeResponse_VolumeIdLocation) 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 { @@ -3937,7 +4005,7 @@ func (x *LookupVolumeResponse_VolumeIdLocation) ProtoReflect() protoreflect.Mess // Deprecated: Use LookupVolumeResponse_VolumeIdLocation.ProtoReflect.Descriptor instead. func (*LookupVolumeResponse_VolumeIdLocation) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{13, 0} + return file_master_proto_rawDescGZIP(), []int{14, 0} } func (x *LookupVolumeResponse_VolumeIdLocation) GetVolumeOrFileId() string { @@ -3978,7 +4046,7 @@ type LookupEcVolumeResponse_EcShardIdLocation struct { func (x *LookupEcVolumeResponse_EcShardIdLocation) Reset() { *x = LookupEcVolumeResponse_EcShardIdLocation{} - mi := &file_master_proto_msgTypes[69] + mi := &file_master_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3990,7 +4058,7 @@ func (x *LookupEcVolumeResponse_EcShardIdLocation) String() string { func (*LookupEcVolumeResponse_EcShardIdLocation) ProtoMessage() {} func (x *LookupEcVolumeResponse_EcShardIdLocation) 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 { @@ -4003,7 +4071,7 @@ func (x *LookupEcVolumeResponse_EcShardIdLocation) ProtoReflect() protoreflect.M // Deprecated: Use LookupEcVolumeResponse_EcShardIdLocation.ProtoReflect.Descriptor instead. func (*LookupEcVolumeResponse_EcShardIdLocation) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{33, 0} + return file_master_proto_rawDescGZIP(), []int{34, 0} } func (x *LookupEcVolumeResponse_EcShardIdLocation) GetShardId() uint32 { @@ -4033,7 +4101,7 @@ type ListClusterNodesResponse_ClusterNode struct { func (x *ListClusterNodesResponse_ClusterNode) Reset() { *x = ListClusterNodesResponse_ClusterNode{} - mi := &file_master_proto_msgTypes[70] + mi := &file_master_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4045,7 +4113,7 @@ func (x *ListClusterNodesResponse_ClusterNode) String() string { func (*ListClusterNodesResponse_ClusterNode) ProtoMessage() {} func (x *ListClusterNodesResponse_ClusterNode) 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 { @@ -4058,7 +4126,7 @@ func (x *ListClusterNodesResponse_ClusterNode) ProtoReflect() protoreflect.Messa // Deprecated: Use ListClusterNodesResponse_ClusterNode.ProtoReflect.Descriptor instead. func (*ListClusterNodesResponse_ClusterNode) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{45, 0} + return file_master_proto_rawDescGZIP(), []int{46, 0} } func (x *ListClusterNodesResponse_ClusterNode) GetAddress() string { @@ -4108,7 +4176,7 @@ type RaftListClusterServersResponse_ClusterServers struct { func (x *RaftListClusterServersResponse_ClusterServers) Reset() { *x = RaftListClusterServersResponse_ClusterServers{} - mi := &file_master_proto_msgTypes[71] + mi := &file_master_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4120,7 +4188,7 @@ func (x *RaftListClusterServersResponse_ClusterServers) String() string { func (*RaftListClusterServersResponse_ClusterServers) ProtoMessage() {} func (x *RaftListClusterServersResponse_ClusterServers) 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 { @@ -4133,7 +4201,7 @@ func (x *RaftListClusterServersResponse_ClusterServers) ProtoReflect() protorefl // Deprecated: Use RaftListClusterServersResponse_ClusterServers.ProtoReflect.Descriptor instead. func (*RaftListClusterServersResponse_ClusterServers) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{57, 0} + return file_master_proto_rawDescGZIP(), []int{58, 0} } func (x *RaftListClusterServersResponse_ClusterServers) GetId() string { @@ -4168,7 +4236,10 @@ var File_master_proto protoreflect.FileDescriptor const file_master_proto_rawDesc = "" + "\n" + - "\fmaster.proto\x12\tmaster_pb\x1a\x13volume_server.proto\"\x8b\b\n" + + "\fmaster.proto\x12\tmaster_pb\x1a\x13volume_server.proto\"6\n" + + "\aDiskTag\x12\x17\n" + + "\adisk_id\x18\x01 \x01(\rR\x06diskId\x12\x12\n" + + "\x04tags\x18\x02 \x03(\tR\x04tags\"\xbc\b\n" + "\tHeartbeat\x12\x0e\n" + "\x02ip\x18\x01 \x01(\tR\x02ip\x12\x12\n" + "\x04port\x18\x02 \x01(\rR\x04port\x12\x1d\n" + @@ -4195,7 +4266,8 @@ const file_master_proto_rawDesc = "" + "\tgrpc_port\x18\x14 \x01(\rR\bgrpcPort\x12%\n" + "\x0elocation_uuids\x18\x15 \x03(\tR\rlocationUuids\x12\x0e\n" + "\x02id\x18\x16 \x01(\tR\x02id\x129\n" + - "\x05state\x18\x17 \x01(\v2#.volume_server_pb.VolumeServerStateR\x05state\x1aB\n" + + "\x05state\x18\x17 \x01(\v2#.volume_server_pb.VolumeServerStateR\x05state\x12/\n" + + "\tdisk_tags\x18\x18 \x03(\v2\x12.master_pb.DiskTagR\bdiskTags\x1aB\n" + "\x14MaxVolumeCountsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\rR\x05value:\x028\x01\"\xcd\x02\n" + @@ -4376,7 +4448,7 @@ const file_master_proto_rawDesc = "" + "\vcollections\x18\x01 \x03(\v2\x15.master_pb.CollectionR\vcollections\"-\n" + "\x17CollectionDeleteRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"\x1a\n" + - "\x18CollectionDeleteResponse\"\xaa\x03\n" + + "\x18CollectionDeleteResponse\"\xbe\x03\n" + "\bDiskInfo\x12\x12\n" + "\x04type\x18\x01 \x01(\tR\x04type\x12!\n" + "\fvolume_count\x18\x02 \x01(\x03R\vvolumeCount\x12(\n" + @@ -4386,7 +4458,9 @@ const file_master_proto_rawDesc = "" + "\fvolume_infos\x18\x06 \x03(\v2#.master_pb.VolumeInformationMessageR\vvolumeInfos\x12P\n" + "\x0eec_shard_infos\x18\a \x03(\v2*.master_pb.VolumeEcShardInformationMessageR\fecShardInfos\x12.\n" + "\x13remote_volume_count\x18\b \x01(\x03R\x11remoteVolumeCount\x12\x17\n" + - "\adisk_id\x18\t \x01(\rR\x06diskId\"\xee\x01\n" + + "\adisk_id\x18\t \x01(\rR\x06diskId\x12\x12\n" + + "\x04tags\x18\n" + + " \x03(\tR\x04tags\"\xee\x01\n" + "\fDataNodeInfo\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12D\n" + "\tdiskInfos\x18\x02 \x03(\v2&.master_pb.DataNodeInfo.DiskInfosEntryR\tdiskInfos\x12\x1b\n" + @@ -4570,173 +4644,175 @@ func file_master_proto_rawDescGZIP() []byte { return file_master_proto_rawDescData } -var file_master_proto_msgTypes = make([]protoimpl.MessageInfo, 72) +var file_master_proto_msgTypes = make([]protoimpl.MessageInfo, 73) var file_master_proto_goTypes = []any{ - (*Heartbeat)(nil), // 0: master_pb.Heartbeat - (*HeartbeatResponse)(nil), // 1: master_pb.HeartbeatResponse - (*VolumeInformationMessage)(nil), // 2: master_pb.VolumeInformationMessage - (*VolumeShortInformationMessage)(nil), // 3: master_pb.VolumeShortInformationMessage - (*VolumeEcShardInformationMessage)(nil), // 4: master_pb.VolumeEcShardInformationMessage - (*StorageBackend)(nil), // 5: master_pb.StorageBackend - (*Empty)(nil), // 6: master_pb.Empty - (*SuperBlockExtra)(nil), // 7: master_pb.SuperBlockExtra - (*KeepConnectedRequest)(nil), // 8: master_pb.KeepConnectedRequest - (*VolumeLocation)(nil), // 9: master_pb.VolumeLocation - (*ClusterNodeUpdate)(nil), // 10: master_pb.ClusterNodeUpdate - (*KeepConnectedResponse)(nil), // 11: master_pb.KeepConnectedResponse - (*LookupVolumeRequest)(nil), // 12: master_pb.LookupVolumeRequest - (*LookupVolumeResponse)(nil), // 13: master_pb.LookupVolumeResponse - (*Location)(nil), // 14: master_pb.Location - (*AssignRequest)(nil), // 15: master_pb.AssignRequest - (*VolumeGrowRequest)(nil), // 16: master_pb.VolumeGrowRequest - (*AssignResponse)(nil), // 17: master_pb.AssignResponse - (*StatisticsRequest)(nil), // 18: master_pb.StatisticsRequest - (*StatisticsResponse)(nil), // 19: master_pb.StatisticsResponse - (*Collection)(nil), // 20: master_pb.Collection - (*CollectionListRequest)(nil), // 21: master_pb.CollectionListRequest - (*CollectionListResponse)(nil), // 22: master_pb.CollectionListResponse - (*CollectionDeleteRequest)(nil), // 23: master_pb.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 24: master_pb.CollectionDeleteResponse - (*DiskInfo)(nil), // 25: master_pb.DiskInfo - (*DataNodeInfo)(nil), // 26: master_pb.DataNodeInfo - (*RackInfo)(nil), // 27: master_pb.RackInfo - (*DataCenterInfo)(nil), // 28: master_pb.DataCenterInfo - (*TopologyInfo)(nil), // 29: master_pb.TopologyInfo - (*VolumeListRequest)(nil), // 30: master_pb.VolumeListRequest - (*VolumeListResponse)(nil), // 31: master_pb.VolumeListResponse - (*LookupEcVolumeRequest)(nil), // 32: master_pb.LookupEcVolumeRequest - (*LookupEcVolumeResponse)(nil), // 33: master_pb.LookupEcVolumeResponse - (*VacuumVolumeRequest)(nil), // 34: master_pb.VacuumVolumeRequest - (*VacuumVolumeResponse)(nil), // 35: master_pb.VacuumVolumeResponse - (*DisableVacuumRequest)(nil), // 36: master_pb.DisableVacuumRequest - (*DisableVacuumResponse)(nil), // 37: master_pb.DisableVacuumResponse - (*EnableVacuumRequest)(nil), // 38: master_pb.EnableVacuumRequest - (*EnableVacuumResponse)(nil), // 39: master_pb.EnableVacuumResponse - (*VolumeMarkReadonlyRequest)(nil), // 40: master_pb.VolumeMarkReadonlyRequest - (*VolumeMarkReadonlyResponse)(nil), // 41: master_pb.VolumeMarkReadonlyResponse - (*GetMasterConfigurationRequest)(nil), // 42: master_pb.GetMasterConfigurationRequest - (*GetMasterConfigurationResponse)(nil), // 43: master_pb.GetMasterConfigurationResponse - (*ListClusterNodesRequest)(nil), // 44: master_pb.ListClusterNodesRequest - (*ListClusterNodesResponse)(nil), // 45: master_pb.ListClusterNodesResponse - (*LeaseAdminTokenRequest)(nil), // 46: master_pb.LeaseAdminTokenRequest - (*LeaseAdminTokenResponse)(nil), // 47: master_pb.LeaseAdminTokenResponse - (*ReleaseAdminTokenRequest)(nil), // 48: master_pb.ReleaseAdminTokenRequest - (*ReleaseAdminTokenResponse)(nil), // 49: master_pb.ReleaseAdminTokenResponse - (*PingRequest)(nil), // 50: master_pb.PingRequest - (*PingResponse)(nil), // 51: master_pb.PingResponse - (*RaftAddServerRequest)(nil), // 52: master_pb.RaftAddServerRequest - (*RaftAddServerResponse)(nil), // 53: master_pb.RaftAddServerResponse - (*RaftRemoveServerRequest)(nil), // 54: master_pb.RaftRemoveServerRequest - (*RaftRemoveServerResponse)(nil), // 55: master_pb.RaftRemoveServerResponse - (*RaftListClusterServersRequest)(nil), // 56: master_pb.RaftListClusterServersRequest - (*RaftListClusterServersResponse)(nil), // 57: master_pb.RaftListClusterServersResponse - (*RaftLeadershipTransferRequest)(nil), // 58: master_pb.RaftLeadershipTransferRequest - (*RaftLeadershipTransferResponse)(nil), // 59: master_pb.RaftLeadershipTransferResponse - (*VolumeGrowResponse)(nil), // 60: master_pb.VolumeGrowResponse - nil, // 61: master_pb.Heartbeat.MaxVolumeCountsEntry - nil, // 62: master_pb.StorageBackend.PropertiesEntry - (*SuperBlockExtra_ErasureCoding)(nil), // 63: master_pb.SuperBlockExtra.ErasureCoding - (*LookupVolumeResponse_VolumeIdLocation)(nil), // 64: master_pb.LookupVolumeResponse.VolumeIdLocation - nil, // 65: master_pb.DataNodeInfo.DiskInfosEntry - nil, // 66: master_pb.RackInfo.DiskInfosEntry - nil, // 67: master_pb.DataCenterInfo.DiskInfosEntry - nil, // 68: master_pb.TopologyInfo.DiskInfosEntry - (*LookupEcVolumeResponse_EcShardIdLocation)(nil), // 69: master_pb.LookupEcVolumeResponse.EcShardIdLocation - (*ListClusterNodesResponse_ClusterNode)(nil), // 70: master_pb.ListClusterNodesResponse.ClusterNode - (*RaftListClusterServersResponse_ClusterServers)(nil), // 71: master_pb.RaftListClusterServersResponse.ClusterServers - (*volume_server_pb.VolumeServerState)(nil), // 72: volume_server_pb.VolumeServerState + (*DiskTag)(nil), // 0: master_pb.DiskTag + (*Heartbeat)(nil), // 1: master_pb.Heartbeat + (*HeartbeatResponse)(nil), // 2: master_pb.HeartbeatResponse + (*VolumeInformationMessage)(nil), // 3: master_pb.VolumeInformationMessage + (*VolumeShortInformationMessage)(nil), // 4: master_pb.VolumeShortInformationMessage + (*VolumeEcShardInformationMessage)(nil), // 5: master_pb.VolumeEcShardInformationMessage + (*StorageBackend)(nil), // 6: master_pb.StorageBackend + (*Empty)(nil), // 7: master_pb.Empty + (*SuperBlockExtra)(nil), // 8: master_pb.SuperBlockExtra + (*KeepConnectedRequest)(nil), // 9: master_pb.KeepConnectedRequest + (*VolumeLocation)(nil), // 10: master_pb.VolumeLocation + (*ClusterNodeUpdate)(nil), // 11: master_pb.ClusterNodeUpdate + (*KeepConnectedResponse)(nil), // 12: master_pb.KeepConnectedResponse + (*LookupVolumeRequest)(nil), // 13: master_pb.LookupVolumeRequest + (*LookupVolumeResponse)(nil), // 14: master_pb.LookupVolumeResponse + (*Location)(nil), // 15: master_pb.Location + (*AssignRequest)(nil), // 16: master_pb.AssignRequest + (*VolumeGrowRequest)(nil), // 17: master_pb.VolumeGrowRequest + (*AssignResponse)(nil), // 18: master_pb.AssignResponse + (*StatisticsRequest)(nil), // 19: master_pb.StatisticsRequest + (*StatisticsResponse)(nil), // 20: master_pb.StatisticsResponse + (*Collection)(nil), // 21: master_pb.Collection + (*CollectionListRequest)(nil), // 22: master_pb.CollectionListRequest + (*CollectionListResponse)(nil), // 23: master_pb.CollectionListResponse + (*CollectionDeleteRequest)(nil), // 24: master_pb.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 25: master_pb.CollectionDeleteResponse + (*DiskInfo)(nil), // 26: master_pb.DiskInfo + (*DataNodeInfo)(nil), // 27: master_pb.DataNodeInfo + (*RackInfo)(nil), // 28: master_pb.RackInfo + (*DataCenterInfo)(nil), // 29: master_pb.DataCenterInfo + (*TopologyInfo)(nil), // 30: master_pb.TopologyInfo + (*VolumeListRequest)(nil), // 31: master_pb.VolumeListRequest + (*VolumeListResponse)(nil), // 32: master_pb.VolumeListResponse + (*LookupEcVolumeRequest)(nil), // 33: master_pb.LookupEcVolumeRequest + (*LookupEcVolumeResponse)(nil), // 34: master_pb.LookupEcVolumeResponse + (*VacuumVolumeRequest)(nil), // 35: master_pb.VacuumVolumeRequest + (*VacuumVolumeResponse)(nil), // 36: master_pb.VacuumVolumeResponse + (*DisableVacuumRequest)(nil), // 37: master_pb.DisableVacuumRequest + (*DisableVacuumResponse)(nil), // 38: master_pb.DisableVacuumResponse + (*EnableVacuumRequest)(nil), // 39: master_pb.EnableVacuumRequest + (*EnableVacuumResponse)(nil), // 40: master_pb.EnableVacuumResponse + (*VolumeMarkReadonlyRequest)(nil), // 41: master_pb.VolumeMarkReadonlyRequest + (*VolumeMarkReadonlyResponse)(nil), // 42: master_pb.VolumeMarkReadonlyResponse + (*GetMasterConfigurationRequest)(nil), // 43: master_pb.GetMasterConfigurationRequest + (*GetMasterConfigurationResponse)(nil), // 44: master_pb.GetMasterConfigurationResponse + (*ListClusterNodesRequest)(nil), // 45: master_pb.ListClusterNodesRequest + (*ListClusterNodesResponse)(nil), // 46: master_pb.ListClusterNodesResponse + (*LeaseAdminTokenRequest)(nil), // 47: master_pb.LeaseAdminTokenRequest + (*LeaseAdminTokenResponse)(nil), // 48: master_pb.LeaseAdminTokenResponse + (*ReleaseAdminTokenRequest)(nil), // 49: master_pb.ReleaseAdminTokenRequest + (*ReleaseAdminTokenResponse)(nil), // 50: master_pb.ReleaseAdminTokenResponse + (*PingRequest)(nil), // 51: master_pb.PingRequest + (*PingResponse)(nil), // 52: master_pb.PingResponse + (*RaftAddServerRequest)(nil), // 53: master_pb.RaftAddServerRequest + (*RaftAddServerResponse)(nil), // 54: master_pb.RaftAddServerResponse + (*RaftRemoveServerRequest)(nil), // 55: master_pb.RaftRemoveServerRequest + (*RaftRemoveServerResponse)(nil), // 56: master_pb.RaftRemoveServerResponse + (*RaftListClusterServersRequest)(nil), // 57: master_pb.RaftListClusterServersRequest + (*RaftListClusterServersResponse)(nil), // 58: master_pb.RaftListClusterServersResponse + (*RaftLeadershipTransferRequest)(nil), // 59: master_pb.RaftLeadershipTransferRequest + (*RaftLeadershipTransferResponse)(nil), // 60: master_pb.RaftLeadershipTransferResponse + (*VolumeGrowResponse)(nil), // 61: master_pb.VolumeGrowResponse + nil, // 62: master_pb.Heartbeat.MaxVolumeCountsEntry + nil, // 63: master_pb.StorageBackend.PropertiesEntry + (*SuperBlockExtra_ErasureCoding)(nil), // 64: master_pb.SuperBlockExtra.ErasureCoding + (*LookupVolumeResponse_VolumeIdLocation)(nil), // 65: master_pb.LookupVolumeResponse.VolumeIdLocation + nil, // 66: master_pb.DataNodeInfo.DiskInfosEntry + nil, // 67: master_pb.RackInfo.DiskInfosEntry + nil, // 68: master_pb.DataCenterInfo.DiskInfosEntry + nil, // 69: master_pb.TopologyInfo.DiskInfosEntry + (*LookupEcVolumeResponse_EcShardIdLocation)(nil), // 70: master_pb.LookupEcVolumeResponse.EcShardIdLocation + (*ListClusterNodesResponse_ClusterNode)(nil), // 71: master_pb.ListClusterNodesResponse.ClusterNode + (*RaftListClusterServersResponse_ClusterServers)(nil), // 72: master_pb.RaftListClusterServersResponse.ClusterServers + (*volume_server_pb.VolumeServerState)(nil), // 73: volume_server_pb.VolumeServerState } var file_master_proto_depIdxs = []int32{ - 2, // 0: master_pb.Heartbeat.volumes:type_name -> master_pb.VolumeInformationMessage - 3, // 1: master_pb.Heartbeat.new_volumes:type_name -> master_pb.VolumeShortInformationMessage - 3, // 2: master_pb.Heartbeat.deleted_volumes:type_name -> master_pb.VolumeShortInformationMessage - 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 - 61, // 6: master_pb.Heartbeat.max_volume_counts:type_name -> master_pb.Heartbeat.MaxVolumeCountsEntry - 72, // 7: master_pb.Heartbeat.state:type_name -> volume_server_pb.VolumeServerState - 5, // 8: master_pb.HeartbeatResponse.storage_backends:type_name -> master_pb.StorageBackend - 62, // 9: master_pb.StorageBackend.properties:type_name -> master_pb.StorageBackend.PropertiesEntry - 63, // 10: master_pb.SuperBlockExtra.erasure_coding:type_name -> master_pb.SuperBlockExtra.ErasureCoding - 9, // 11: master_pb.KeepConnectedResponse.volume_location:type_name -> master_pb.VolumeLocation - 10, // 12: master_pb.KeepConnectedResponse.cluster_node_update:type_name -> master_pb.ClusterNodeUpdate - 64, // 13: master_pb.LookupVolumeResponse.volume_id_locations:type_name -> master_pb.LookupVolumeResponse.VolumeIdLocation - 14, // 14: master_pb.AssignResponse.replicas:type_name -> master_pb.Location - 14, // 15: master_pb.AssignResponse.location:type_name -> master_pb.Location - 20, // 16: master_pb.CollectionListResponse.collections:type_name -> master_pb.Collection - 2, // 17: master_pb.DiskInfo.volume_infos:type_name -> master_pb.VolumeInformationMessage - 4, // 18: master_pb.DiskInfo.ec_shard_infos:type_name -> master_pb.VolumeEcShardInformationMessage - 65, // 19: master_pb.DataNodeInfo.diskInfos:type_name -> master_pb.DataNodeInfo.DiskInfosEntry - 26, // 20: master_pb.RackInfo.data_node_infos:type_name -> master_pb.DataNodeInfo - 66, // 21: master_pb.RackInfo.diskInfos:type_name -> master_pb.RackInfo.DiskInfosEntry - 27, // 22: master_pb.DataCenterInfo.rack_infos:type_name -> master_pb.RackInfo - 67, // 23: master_pb.DataCenterInfo.diskInfos:type_name -> master_pb.DataCenterInfo.DiskInfosEntry - 28, // 24: master_pb.TopologyInfo.data_center_infos:type_name -> master_pb.DataCenterInfo - 68, // 25: master_pb.TopologyInfo.diskInfos:type_name -> master_pb.TopologyInfo.DiskInfosEntry - 29, // 26: master_pb.VolumeListResponse.topology_info:type_name -> master_pb.TopologyInfo - 69, // 27: master_pb.LookupEcVolumeResponse.shard_id_locations:type_name -> master_pb.LookupEcVolumeResponse.EcShardIdLocation - 5, // 28: master_pb.GetMasterConfigurationResponse.storage_backends:type_name -> master_pb.StorageBackend - 70, // 29: master_pb.ListClusterNodesResponse.cluster_nodes:type_name -> master_pb.ListClusterNodesResponse.ClusterNode - 71, // 30: master_pb.RaftListClusterServersResponse.cluster_servers:type_name -> master_pb.RaftListClusterServersResponse.ClusterServers - 14, // 31: master_pb.LookupVolumeResponse.VolumeIdLocation.locations:type_name -> master_pb.Location - 25, // 32: master_pb.DataNodeInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 25, // 33: master_pb.RackInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 25, // 34: master_pb.DataCenterInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 25, // 35: master_pb.TopologyInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 14, // 36: master_pb.LookupEcVolumeResponse.EcShardIdLocation.locations:type_name -> master_pb.Location - 0, // 37: master_pb.Seaweed.SendHeartbeat:input_type -> master_pb.Heartbeat - 8, // 38: master_pb.Seaweed.KeepConnected:input_type -> master_pb.KeepConnectedRequest - 12, // 39: master_pb.Seaweed.LookupVolume:input_type -> master_pb.LookupVolumeRequest - 15, // 40: master_pb.Seaweed.Assign:input_type -> master_pb.AssignRequest - 15, // 41: master_pb.Seaweed.StreamAssign:input_type -> master_pb.AssignRequest - 18, // 42: master_pb.Seaweed.Statistics:input_type -> master_pb.StatisticsRequest - 21, // 43: master_pb.Seaweed.CollectionList:input_type -> master_pb.CollectionListRequest - 23, // 44: master_pb.Seaweed.CollectionDelete:input_type -> master_pb.CollectionDeleteRequest - 30, // 45: master_pb.Seaweed.VolumeList:input_type -> master_pb.VolumeListRequest - 32, // 46: master_pb.Seaweed.LookupEcVolume:input_type -> master_pb.LookupEcVolumeRequest - 34, // 47: master_pb.Seaweed.VacuumVolume:input_type -> master_pb.VacuumVolumeRequest - 36, // 48: master_pb.Seaweed.DisableVacuum:input_type -> master_pb.DisableVacuumRequest - 38, // 49: master_pb.Seaweed.EnableVacuum:input_type -> master_pb.EnableVacuumRequest - 40, // 50: master_pb.Seaweed.VolumeMarkReadonly:input_type -> master_pb.VolumeMarkReadonlyRequest - 42, // 51: master_pb.Seaweed.GetMasterConfiguration:input_type -> master_pb.GetMasterConfigurationRequest - 44, // 52: master_pb.Seaweed.ListClusterNodes:input_type -> master_pb.ListClusterNodesRequest - 46, // 53: master_pb.Seaweed.LeaseAdminToken:input_type -> master_pb.LeaseAdminTokenRequest - 48, // 54: master_pb.Seaweed.ReleaseAdminToken:input_type -> master_pb.ReleaseAdminTokenRequest - 50, // 55: master_pb.Seaweed.Ping:input_type -> master_pb.PingRequest - 56, // 56: master_pb.Seaweed.RaftListClusterServers:input_type -> master_pb.RaftListClusterServersRequest - 52, // 57: master_pb.Seaweed.RaftAddServer:input_type -> master_pb.RaftAddServerRequest - 54, // 58: master_pb.Seaweed.RaftRemoveServer:input_type -> master_pb.RaftRemoveServerRequest - 58, // 59: master_pb.Seaweed.RaftLeadershipTransfer:input_type -> master_pb.RaftLeadershipTransferRequest - 16, // 60: master_pb.Seaweed.VolumeGrow:input_type -> master_pb.VolumeGrowRequest - 1, // 61: master_pb.Seaweed.SendHeartbeat:output_type -> master_pb.HeartbeatResponse - 11, // 62: master_pb.Seaweed.KeepConnected:output_type -> master_pb.KeepConnectedResponse - 13, // 63: master_pb.Seaweed.LookupVolume:output_type -> master_pb.LookupVolumeResponse - 17, // 64: master_pb.Seaweed.Assign:output_type -> master_pb.AssignResponse - 17, // 65: master_pb.Seaweed.StreamAssign:output_type -> master_pb.AssignResponse - 19, // 66: master_pb.Seaweed.Statistics:output_type -> master_pb.StatisticsResponse - 22, // 67: master_pb.Seaweed.CollectionList:output_type -> master_pb.CollectionListResponse - 24, // 68: master_pb.Seaweed.CollectionDelete:output_type -> master_pb.CollectionDeleteResponse - 31, // 69: master_pb.Seaweed.VolumeList:output_type -> master_pb.VolumeListResponse - 33, // 70: master_pb.Seaweed.LookupEcVolume:output_type -> master_pb.LookupEcVolumeResponse - 35, // 71: master_pb.Seaweed.VacuumVolume:output_type -> master_pb.VacuumVolumeResponse - 37, // 72: master_pb.Seaweed.DisableVacuum:output_type -> master_pb.DisableVacuumResponse - 39, // 73: master_pb.Seaweed.EnableVacuum:output_type -> master_pb.EnableVacuumResponse - 41, // 74: master_pb.Seaweed.VolumeMarkReadonly:output_type -> master_pb.VolumeMarkReadonlyResponse - 43, // 75: master_pb.Seaweed.GetMasterConfiguration:output_type -> master_pb.GetMasterConfigurationResponse - 45, // 76: master_pb.Seaweed.ListClusterNodes:output_type -> master_pb.ListClusterNodesResponse - 47, // 77: master_pb.Seaweed.LeaseAdminToken:output_type -> master_pb.LeaseAdminTokenResponse - 49, // 78: master_pb.Seaweed.ReleaseAdminToken:output_type -> master_pb.ReleaseAdminTokenResponse - 51, // 79: master_pb.Seaweed.Ping:output_type -> master_pb.PingResponse - 57, // 80: master_pb.Seaweed.RaftListClusterServers:output_type -> master_pb.RaftListClusterServersResponse - 53, // 81: master_pb.Seaweed.RaftAddServer:output_type -> master_pb.RaftAddServerResponse - 55, // 82: master_pb.Seaweed.RaftRemoveServer:output_type -> master_pb.RaftRemoveServerResponse - 59, // 83: master_pb.Seaweed.RaftLeadershipTransfer:output_type -> master_pb.RaftLeadershipTransferResponse - 60, // 84: master_pb.Seaweed.VolumeGrow:output_type -> master_pb.VolumeGrowResponse - 61, // [61:85] is the sub-list for method output_type - 37, // [37:61] is the sub-list for method input_type - 37, // [37:37] is the sub-list for extension type_name - 37, // [37:37] is the sub-list for extension extendee - 0, // [0:37] is the sub-list for field type_name + 3, // 0: master_pb.Heartbeat.volumes:type_name -> master_pb.VolumeInformationMessage + 4, // 1: master_pb.Heartbeat.new_volumes:type_name -> master_pb.VolumeShortInformationMessage + 4, // 2: master_pb.Heartbeat.deleted_volumes:type_name -> master_pb.VolumeShortInformationMessage + 5, // 3: master_pb.Heartbeat.ec_shards:type_name -> master_pb.VolumeEcShardInformationMessage + 5, // 4: master_pb.Heartbeat.new_ec_shards:type_name -> master_pb.VolumeEcShardInformationMessage + 5, // 5: master_pb.Heartbeat.deleted_ec_shards:type_name -> master_pb.VolumeEcShardInformationMessage + 62, // 6: master_pb.Heartbeat.max_volume_counts:type_name -> master_pb.Heartbeat.MaxVolumeCountsEntry + 73, // 7: master_pb.Heartbeat.state:type_name -> volume_server_pb.VolumeServerState + 0, // 8: master_pb.Heartbeat.disk_tags:type_name -> master_pb.DiskTag + 6, // 9: master_pb.HeartbeatResponse.storage_backends:type_name -> master_pb.StorageBackend + 63, // 10: master_pb.StorageBackend.properties:type_name -> master_pb.StorageBackend.PropertiesEntry + 64, // 11: master_pb.SuperBlockExtra.erasure_coding:type_name -> master_pb.SuperBlockExtra.ErasureCoding + 10, // 12: master_pb.KeepConnectedResponse.volume_location:type_name -> master_pb.VolumeLocation + 11, // 13: master_pb.KeepConnectedResponse.cluster_node_update:type_name -> master_pb.ClusterNodeUpdate + 65, // 14: master_pb.LookupVolumeResponse.volume_id_locations:type_name -> master_pb.LookupVolumeResponse.VolumeIdLocation + 15, // 15: master_pb.AssignResponse.replicas:type_name -> master_pb.Location + 15, // 16: master_pb.AssignResponse.location:type_name -> master_pb.Location + 21, // 17: master_pb.CollectionListResponse.collections:type_name -> master_pb.Collection + 3, // 18: master_pb.DiskInfo.volume_infos:type_name -> master_pb.VolumeInformationMessage + 5, // 19: master_pb.DiskInfo.ec_shard_infos:type_name -> master_pb.VolumeEcShardInformationMessage + 66, // 20: master_pb.DataNodeInfo.diskInfos:type_name -> master_pb.DataNodeInfo.DiskInfosEntry + 27, // 21: master_pb.RackInfo.data_node_infos:type_name -> master_pb.DataNodeInfo + 67, // 22: master_pb.RackInfo.diskInfos:type_name -> master_pb.RackInfo.DiskInfosEntry + 28, // 23: master_pb.DataCenterInfo.rack_infos:type_name -> master_pb.RackInfo + 68, // 24: master_pb.DataCenterInfo.diskInfos:type_name -> master_pb.DataCenterInfo.DiskInfosEntry + 29, // 25: master_pb.TopologyInfo.data_center_infos:type_name -> master_pb.DataCenterInfo + 69, // 26: master_pb.TopologyInfo.diskInfos:type_name -> master_pb.TopologyInfo.DiskInfosEntry + 30, // 27: master_pb.VolumeListResponse.topology_info:type_name -> master_pb.TopologyInfo + 70, // 28: master_pb.LookupEcVolumeResponse.shard_id_locations:type_name -> master_pb.LookupEcVolumeResponse.EcShardIdLocation + 6, // 29: master_pb.GetMasterConfigurationResponse.storage_backends:type_name -> master_pb.StorageBackend + 71, // 30: master_pb.ListClusterNodesResponse.cluster_nodes:type_name -> master_pb.ListClusterNodesResponse.ClusterNode + 72, // 31: master_pb.RaftListClusterServersResponse.cluster_servers:type_name -> master_pb.RaftListClusterServersResponse.ClusterServers + 15, // 32: master_pb.LookupVolumeResponse.VolumeIdLocation.locations:type_name -> master_pb.Location + 26, // 33: master_pb.DataNodeInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 26, // 34: master_pb.RackInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 26, // 35: master_pb.DataCenterInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 26, // 36: master_pb.TopologyInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 15, // 37: master_pb.LookupEcVolumeResponse.EcShardIdLocation.locations:type_name -> master_pb.Location + 1, // 38: master_pb.Seaweed.SendHeartbeat:input_type -> master_pb.Heartbeat + 9, // 39: master_pb.Seaweed.KeepConnected:input_type -> master_pb.KeepConnectedRequest + 13, // 40: master_pb.Seaweed.LookupVolume:input_type -> master_pb.LookupVolumeRequest + 16, // 41: master_pb.Seaweed.Assign:input_type -> master_pb.AssignRequest + 16, // 42: master_pb.Seaweed.StreamAssign:input_type -> master_pb.AssignRequest + 19, // 43: master_pb.Seaweed.Statistics:input_type -> master_pb.StatisticsRequest + 22, // 44: master_pb.Seaweed.CollectionList:input_type -> master_pb.CollectionListRequest + 24, // 45: master_pb.Seaweed.CollectionDelete:input_type -> master_pb.CollectionDeleteRequest + 31, // 46: master_pb.Seaweed.VolumeList:input_type -> master_pb.VolumeListRequest + 33, // 47: master_pb.Seaweed.LookupEcVolume:input_type -> master_pb.LookupEcVolumeRequest + 35, // 48: master_pb.Seaweed.VacuumVolume:input_type -> master_pb.VacuumVolumeRequest + 37, // 49: master_pb.Seaweed.DisableVacuum:input_type -> master_pb.DisableVacuumRequest + 39, // 50: master_pb.Seaweed.EnableVacuum:input_type -> master_pb.EnableVacuumRequest + 41, // 51: master_pb.Seaweed.VolumeMarkReadonly:input_type -> master_pb.VolumeMarkReadonlyRequest + 43, // 52: master_pb.Seaweed.GetMasterConfiguration:input_type -> master_pb.GetMasterConfigurationRequest + 45, // 53: master_pb.Seaweed.ListClusterNodes:input_type -> master_pb.ListClusterNodesRequest + 47, // 54: master_pb.Seaweed.LeaseAdminToken:input_type -> master_pb.LeaseAdminTokenRequest + 49, // 55: master_pb.Seaweed.ReleaseAdminToken:input_type -> master_pb.ReleaseAdminTokenRequest + 51, // 56: master_pb.Seaweed.Ping:input_type -> master_pb.PingRequest + 57, // 57: master_pb.Seaweed.RaftListClusterServers:input_type -> master_pb.RaftListClusterServersRequest + 53, // 58: master_pb.Seaweed.RaftAddServer:input_type -> master_pb.RaftAddServerRequest + 55, // 59: master_pb.Seaweed.RaftRemoveServer:input_type -> master_pb.RaftRemoveServerRequest + 59, // 60: master_pb.Seaweed.RaftLeadershipTransfer:input_type -> master_pb.RaftLeadershipTransferRequest + 17, // 61: master_pb.Seaweed.VolumeGrow:input_type -> master_pb.VolumeGrowRequest + 2, // 62: master_pb.Seaweed.SendHeartbeat:output_type -> master_pb.HeartbeatResponse + 12, // 63: master_pb.Seaweed.KeepConnected:output_type -> master_pb.KeepConnectedResponse + 14, // 64: master_pb.Seaweed.LookupVolume:output_type -> master_pb.LookupVolumeResponse + 18, // 65: master_pb.Seaweed.Assign:output_type -> master_pb.AssignResponse + 18, // 66: master_pb.Seaweed.StreamAssign:output_type -> master_pb.AssignResponse + 20, // 67: master_pb.Seaweed.Statistics:output_type -> master_pb.StatisticsResponse + 23, // 68: master_pb.Seaweed.CollectionList:output_type -> master_pb.CollectionListResponse + 25, // 69: master_pb.Seaweed.CollectionDelete:output_type -> master_pb.CollectionDeleteResponse + 32, // 70: master_pb.Seaweed.VolumeList:output_type -> master_pb.VolumeListResponse + 34, // 71: master_pb.Seaweed.LookupEcVolume:output_type -> master_pb.LookupEcVolumeResponse + 36, // 72: master_pb.Seaweed.VacuumVolume:output_type -> master_pb.VacuumVolumeResponse + 38, // 73: master_pb.Seaweed.DisableVacuum:output_type -> master_pb.DisableVacuumResponse + 40, // 74: master_pb.Seaweed.EnableVacuum:output_type -> master_pb.EnableVacuumResponse + 42, // 75: master_pb.Seaweed.VolumeMarkReadonly:output_type -> master_pb.VolumeMarkReadonlyResponse + 44, // 76: master_pb.Seaweed.GetMasterConfiguration:output_type -> master_pb.GetMasterConfigurationResponse + 46, // 77: master_pb.Seaweed.ListClusterNodes:output_type -> master_pb.ListClusterNodesResponse + 48, // 78: master_pb.Seaweed.LeaseAdminToken:output_type -> master_pb.LeaseAdminTokenResponse + 50, // 79: master_pb.Seaweed.ReleaseAdminToken:output_type -> master_pb.ReleaseAdminTokenResponse + 52, // 80: master_pb.Seaweed.Ping:output_type -> master_pb.PingResponse + 58, // 81: master_pb.Seaweed.RaftListClusterServers:output_type -> master_pb.RaftListClusterServersResponse + 54, // 82: master_pb.Seaweed.RaftAddServer:output_type -> master_pb.RaftAddServerResponse + 56, // 83: master_pb.Seaweed.RaftRemoveServer:output_type -> master_pb.RaftRemoveServerResponse + 60, // 84: master_pb.Seaweed.RaftLeadershipTransfer:output_type -> master_pb.RaftLeadershipTransferResponse + 61, // 85: master_pb.Seaweed.VolumeGrow:output_type -> master_pb.VolumeGrowResponse + 62, // [62:86] is the sub-list for method output_type + 38, // [38:62] is the sub-list for method input_type + 38, // [38:38] is the sub-list for extension type_name + 38, // [38:38] is the sub-list for extension extendee + 0, // [0:38] is the sub-list for field type_name } func init() { file_master_proto_init() } @@ -4750,7 +4826,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: 72, + NumMessages: 73, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/pb/worker.proto b/weed/pb/worker.proto index b9e3d61d0..bfb775151 100644 --- a/weed/pb/worker.proto +++ b/weed/pb/worker.proto @@ -314,6 +314,7 @@ message ErasureCodingTaskConfig { int32 quiet_for_seconds = 2; // Minimum quiet time before EC int32 min_volume_size_mb = 3; // Minimum volume size for EC string collection_filter = 4; // Only process volumes from specific collections + repeated string preferred_tags = 5; // Disk tags to prioritize for EC shard placement } // BalanceTaskConfig contains balance-specific configuration diff --git a/weed/pb/worker_pb/worker.pb.go b/weed/pb/worker_pb/worker.pb.go index be2e877fc..1502f7867 100644 --- a/weed/pb/worker_pb/worker.pb.go +++ b/weed/pb/worker_pb/worker.pb.go @@ -2589,6 +2589,7 @@ type ErasureCodingTaskConfig struct { QuietForSeconds int32 `protobuf:"varint,2,opt,name=quiet_for_seconds,json=quietForSeconds,proto3" json:"quiet_for_seconds,omitempty"` // Minimum quiet time before EC MinVolumeSizeMb int32 `protobuf:"varint,3,opt,name=min_volume_size_mb,json=minVolumeSizeMb,proto3" json:"min_volume_size_mb,omitempty"` // Minimum volume size for EC CollectionFilter string `protobuf:"bytes,4,opt,name=collection_filter,json=collectionFilter,proto3" json:"collection_filter,omitempty"` // Only process volumes from specific collections + PreferredTags []string `protobuf:"bytes,5,rep,name=preferred_tags,json=preferredTags,proto3" json:"preferred_tags,omitempty"` // Disk tags to prioritize for EC shard placement unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -2651,6 +2652,13 @@ func (x *ErasureCodingTaskConfig) GetCollectionFilter() string { return "" } +func (x *ErasureCodingTaskConfig) GetPreferredTags() []string { + if x != nil { + return x.PreferredTags + } + return nil +} + // BalanceTaskConfig contains balance-specific configuration type BalanceTaskConfig struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -3559,12 +3567,13 @@ const file_worker_proto_rawDesc = "" + "\x10VacuumTaskConfig\x12+\n" + "\x11garbage_threshold\x18\x01 \x01(\x01R\x10garbageThreshold\x12/\n" + "\x14min_volume_age_hours\x18\x02 \x01(\x05R\x11minVolumeAgeHours\x120\n" + - "\x14min_interval_seconds\x18\x03 \x01(\x05R\x12minIntervalSeconds\"\xc6\x01\n" + + "\x14min_interval_seconds\x18\x03 \x01(\x05R\x12minIntervalSeconds\"\xed\x01\n" + "\x17ErasureCodingTaskConfig\x12%\n" + "\x0efullness_ratio\x18\x01 \x01(\x01R\rfullnessRatio\x12*\n" + "\x11quiet_for_seconds\x18\x02 \x01(\x05R\x0fquietForSeconds\x12+\n" + "\x12min_volume_size_mb\x18\x03 \x01(\x05R\x0fminVolumeSizeMb\x12+\n" + - "\x11collection_filter\x18\x04 \x01(\tR\x10collectionFilter\"n\n" + + "\x11collection_filter\x18\x04 \x01(\tR\x10collectionFilter\x12%\n" + + "\x0epreferred_tags\x18\x05 \x03(\tR\rpreferredTags\"n\n" + "\x11BalanceTaskConfig\x12/\n" + "\x13imbalance_threshold\x18\x01 \x01(\x01R\x12imbalanceThreshold\x12(\n" + "\x10min_server_count\x18\x02 \x01(\x05R\x0eminServerCount\"I\n" + diff --git a/weed/plugin/worker/erasure_coding_handler.go b/weed/plugin/worker/erasure_coding_handler.go index 81758289a..42cc5c427 100644 --- a/weed/plugin/worker/erasure_coding_handler.go +++ b/weed/plugin/worker/erasure_coding_handler.go @@ -11,6 +11,7 @@ import ( "github.com/seaweedfs/seaweedfs/weed/glog" "github.com/seaweedfs/seaweedfs/weed/pb/plugin_pb" "github.com/seaweedfs/seaweedfs/weed/pb/worker_pb" + "github.com/seaweedfs/seaweedfs/weed/util" ecstorage "github.com/seaweedfs/seaweedfs/weed/storage/erasure_coding" "github.com/seaweedfs/seaweedfs/weed/util/wildcard" erasurecodingtask "github.com/seaweedfs/seaweedfs/weed/worker/tasks/erasure_coding" @@ -128,6 +129,14 @@ func (h *ErasureCodingHandler) Descriptor() *plugin_pb.JobTypeDescriptor { Required: true, MinValue: &plugin_pb.ConfigValue{Kind: &plugin_pb.ConfigValue_Int64Value{Int64Value: 0}}, }, + { + Name: "preferred_tags", + Label: "Preferred Tags", + Description: "Comma-separated disk tags to prioritize for EC shard placement, ordered by preference.", + Placeholder: "fast,ssd", + FieldType: plugin_pb.ConfigFieldType_CONFIG_FIELD_TYPE_STRING, + Widget: plugin_pb.ConfigWidget_CONFIG_WIDGET_TEXT, + }, }, }, }, @@ -144,6 +153,9 @@ func (h *ErasureCodingHandler) Descriptor() *plugin_pb.JobTypeDescriptor { "min_interval_seconds": { Kind: &plugin_pb.ConfigValue_Int64Value{Int64Value: 60}, }, + "preferred_tags": { + Kind: &plugin_pb.ConfigValue_StringValue{StringValue: ""}, + }, }, }, AdminRuntimeDefaults: &plugin_pb.AdminRuntimeDefaults{ @@ -169,6 +181,9 @@ func (h *ErasureCodingHandler) Descriptor() *plugin_pb.JobTypeDescriptor { "min_interval_seconds": { Kind: &plugin_pb.ConfigValue_Int64Value{Int64Value: 60}, }, + "preferred_tags": { + Kind: &plugin_pb.ConfigValue_StringValue{StringValue: ""}, + }, }, } } @@ -601,6 +616,7 @@ func deriveErasureCodingWorkerConfig(values map[string]*plugin_pb.ConfigValue) * if minIntervalSeconds < 0 { minIntervalSeconds = 0 } + taskConfig.PreferredTags = util.NormalizeTagList(readStringListConfig(values, "preferred_tags")) return &erasureCodingWorkerConfig{ TaskConfig: taskConfig, diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index 395eb4ebd..848dc7905 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -162,6 +162,7 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ } dn.AdjustMaxVolumeCounts(heartbeat.MaxVolumeCounts) + dn.UpdateDiskTags(heartbeat.DiskTags) glog.V(4).Infof("master received heartbeat %s", heartbeat.String()) stats.MasterReceivedHeartbeatCounter.WithLabelValues("total").Inc() diff --git a/weed/server/volume_server.go b/weed/server/volume_server.go index 6bc3a6898..211ec1523 100644 --- a/weed/server/volume_server.go +++ b/weed/server/volume_server.go @@ -58,7 +58,7 @@ type VolumeServer struct { func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, port int, grpcPort int, publicUrl string, id string, - folders []string, maxCounts []int32, minFreeSpaces []util.MinFreeSpace, diskTypes []types.DiskType, + folders []string, maxCounts []int32, minFreeSpaces []util.MinFreeSpace, diskTypes []types.DiskType, diskTags [][]string, idxFolder string, needleMapKind storage.NeedleMapKind, masterNodes []pb.ServerAddress, pulsePeriod time.Duration, @@ -118,7 +118,7 @@ func NewVolumeServer(adminMux, publicMux *http.ServeMux, ip string, vs.checkWithMaster() - vs.store = storage.NewStore(vs.grpcDialOption, ip, port, grpcPort, publicUrl, id, folders, maxCounts, minFreeSpaces, idxFolder, vs.needleMapKind, diskTypes, ldbTimeout) + vs.store = storage.NewStore(vs.grpcDialOption, ip, port, grpcPort, publicUrl, id, folders, maxCounts, minFreeSpaces, idxFolder, vs.needleMapKind, diskTypes, diskTags, ldbTimeout) vs.guard = security.NewGuard(whiteList, signingKey, expiresAfterSec, readSigningKey, readExpiresAfterSec) handleStaticResources(adminMux) diff --git a/weed/storage/disk_location.go b/weed/storage/disk_location.go index 3935861c8..9ab6790e4 100644 --- a/weed/storage/disk_location.go +++ b/weed/storage/disk_location.go @@ -31,6 +31,7 @@ type DiskLocation struct { DirectoryUuid string IdxDirectory string DiskType types.DiskType + Tags []string MaxVolumeCount int32 OriginalMaxVolumeCount int32 MinFreeSpace util.MinFreeSpace @@ -76,7 +77,7 @@ func writeNewUuid(fileName string) (string, error) { return dirUuidString, nil } -func NewDiskLocation(dir string, maxVolumeCount int32, minFreeSpace util.MinFreeSpace, idxDir string, diskType types.DiskType) *DiskLocation { +func NewDiskLocation(dir string, maxVolumeCount int32, minFreeSpace util.MinFreeSpace, idxDir string, diskType types.DiskType, tags []string) *DiskLocation { glog.V(4).Infof("Added new Disk %s: maxVolumes=%d", dir, maxVolumeCount) dir = util.ResolvePath(dir) if idxDir == "" { @@ -88,11 +89,18 @@ func NewDiskLocation(dir string, maxVolumeCount int32, minFreeSpace util.MinFree if err != nil { glog.Fatalf("cannot generate uuid of dir %s: %v", dir, err) } + // Defensive copy of tags to prevent external mutation + var copiedTags []string + if len(tags) > 0 { + copiedTags = make([]string, len(tags)) + copy(copiedTags, tags) + } location := &DiskLocation{ Directory: dir, DirectoryUuid: dirUuid, IdxDirectory: idxDir, DiskType: diskType, + Tags: copiedTags, MaxVolumeCount: maxVolumeCount, OriginalMaxVolumeCount: maxVolumeCount, MinFreeSpace: minFreeSpace, diff --git a/weed/storage/store.go b/weed/storage/store.go index 3e5bcd3cf..43d3abf29 100644 --- a/weed/storage/store.go +++ b/weed/storage/store.go @@ -92,6 +92,7 @@ func NewStore( idxFolder string, needleMapKind NeedleMapKind, diskTypes []DiskType, + diskTags [][]string, ldbTimeout int64, ) (s *Store) { s = &Store{ @@ -113,7 +114,11 @@ func NewStore( var wg sync.WaitGroup for i := 0; i < len(dirnames); i++ { - location := NewDiskLocation(dirnames[i], int32(maxVolumeCounts[i]), minFreeSpaces[i], idxFolder, diskTypes[i]) + var tags []string + if i < len(diskTags) { + tags = diskTags[i] + } + location := NewDiskLocation(dirnames[i], int32(maxVolumeCounts[i]), minFreeSpaces[i], idxFolder, diskTypes[i], tags) s.Locations = append(s.Locations, location) stats.VolumeServerMaxVolumeCounter.Add(float64(maxVolumeCounts[i])) @@ -474,6 +479,13 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { for _, loc := range s.Locations { uuidList = append(uuidList, loc.DirectoryUuid) } + var diskTags []*master_pb.DiskTag + for diskID, loc := range s.Locations { + diskTags = append(diskTags, &master_pb.DiskTag{ + DiskId: uint32(diskID), + Tags: append([]string(nil), loc.Tags...), + }) + } for col, size := range collectionVolumeSize { stats.VolumeServerDiskSizeGauge.WithLabelValues(col, "normal").Set(float64(size)) @@ -504,6 +516,7 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat { HasNoVolumes: len(volumeMessages) == 0, HasNoEcShards: len(ecVolumeMessages) == 0, LocationUuids: uuidList, + DiskTags: diskTags, } } diff --git a/weed/storage/store_load_balancing_test.go b/weed/storage/store_load_balancing_test.go index a16d1474d..404f90592 100644 --- a/weed/storage/store_load_balancing_test.go +++ b/weed/storage/store_load_balancing_test.go @@ -32,7 +32,7 @@ func newTestStore(t *testing.T, numDirs int) *Store { } store := NewStore(nil, "localhost", 8080, 18080, "http://localhost:8080", "", - dirs, maxCounts, minFreeSpaces, "", NeedleMapInMemory, diskTypes, 3) + dirs, maxCounts, minFreeSpaces, "", NeedleMapInMemory, diskTypes, nil, 3) // Consume channel messages to prevent blocking done := make(chan bool) diff --git a/weed/topology/data_node.go b/weed/topology/data_node.go index a905ae16c..94c5e7c7f 100644 --- a/weed/topology/data_node.go +++ b/weed/topology/data_node.go @@ -25,6 +25,7 @@ type DataNode struct { IsTerminating bool MaintenanceMode bool + diskTags map[uint32][]string } func NewDataNode(id string) *DataNode { @@ -291,9 +292,41 @@ func (dn *DataNode) ToDataNodeInfo() *master_pb.DataNodeInfo { disk := c.(*Disk) m.DiskInfos[string(disk.Id())] = disk.ToDiskInfo() } + + dn.RLock() + diskTags := make(map[uint32][]string, len(dn.diskTags)) + for diskID, tags := range dn.diskTags { + diskTags[diskID] = append([]string(nil), tags...) + } + dn.RUnlock() + for _, diskInfo := range m.DiskInfos { + if diskInfo == nil { + continue + } + if tags, found := diskTags[diskInfo.DiskId]; found { + diskInfo.Tags = append([]string(nil), tags...) + } + } return m } +func (dn *DataNode) UpdateDiskTags(tags []*master_pb.DiskTag) { + if len(tags) == 0 { + return + } + dn.Lock() + if dn.diskTags == nil { + dn.diskTags = make(map[uint32][]string, len(tags)) + } + for _, tagInfo := range tags { + if tagInfo == nil { + continue + } + dn.diskTags[tagInfo.DiskId] = append([]string(nil), tagInfo.Tags...) + } + dn.Unlock() +} + // GetVolumeIds returns the human readable volume ids limited to count of max 100. func (dn *DataNode) GetVolumeIds() string { dn.RLock() diff --git a/weed/util/tag.go b/weed/util/tag.go new file mode 100644 index 000000000..a4f6b088a --- /dev/null +++ b/weed/util/tag.go @@ -0,0 +1,25 @@ +package util + +import "strings" + +// NormalizeTagList normalizes a list of tags by converting to lowercase, +// trimming whitespace, removing duplicates, and filtering empty strings. +func NormalizeTagList(tags []string) []string { + normalized := make([]string, 0, len(tags)) + seen := make(map[string]struct{}, len(tags)) + for _, tag := range tags { + tag = strings.ToLower(strings.TrimSpace(tag)) + if tag == "" { + continue + } + if _, exists := seen[tag]; exists { + continue + } + seen[tag] = struct{}{} + normalized = append(normalized, tag) + } + if len(normalized) == 0 { + return []string{} + } + return normalized +} diff --git a/weed/worker/tasks/erasure_coding/config.go b/weed/worker/tasks/erasure_coding/config.go index b649f065f..e9dce5cbd 100644 --- a/weed/worker/tasks/erasure_coding/config.go +++ b/weed/worker/tasks/erasure_coding/config.go @@ -12,10 +12,11 @@ import ( // Config extends BaseConfig with erasure coding specific settings type Config struct { base.BaseConfig - QuietForSeconds int `json:"quiet_for_seconds"` - FullnessRatio float64 `json:"fullness_ratio"` - CollectionFilter string `json:"collection_filter"` - MinSizeMB int `json:"min_size_mb"` + QuietForSeconds int `json:"quiet_for_seconds"` + FullnessRatio float64 `json:"fullness_ratio"` + CollectionFilter string `json:"collection_filter"` + MinSizeMB int `json:"min_size_mb"` + PreferredTags []string `json:"preferred_tags"` } // NewDefaultConfig creates a new default erasure coding configuration @@ -30,6 +31,7 @@ func NewDefaultConfig() *Config { FullnessRatio: 0.8, // 80% CollectionFilter: "", MinSizeMB: 30, // 30MB (more reasonable than 100MB) + PreferredTags: nil, } } @@ -142,12 +144,27 @@ func GetConfigSpec() base.ConfigSpec { InputType: "number", CSSClasses: "form-control", }, + { + Name: "preferred_tags", + JSONName: "preferred_tags", + Type: config.FieldTypeString, + DefaultValue: "", + Required: false, + DisplayName: "Preferred Disk Tags", + Description: "Comma-separated disk tags to prioritize for EC shard placement", + HelpText: "EC shards will be placed on disks with these tags first, then fall back to other disks if needed", + Placeholder: "fast,ssd", + InputType: "text", + CSSClasses: "form-control", + }, }, } } // ToTaskPolicy converts configuration to a TaskPolicy protobuf message func (c *Config) ToTaskPolicy() *worker_pb.TaskPolicy { + // Defensive copy of PreferredTags to prevent external mutation + preferredTagsCopy := append([]string(nil), c.PreferredTags...) return &worker_pb.TaskPolicy{ Enabled: c.Enabled, MaxConcurrent: int32(c.MaxConcurrent), @@ -159,6 +176,7 @@ func (c *Config) ToTaskPolicy() *worker_pb.TaskPolicy { QuietForSeconds: int32(c.QuietForSeconds), MinVolumeSizeMb: int32(c.MinSizeMB), CollectionFilter: c.CollectionFilter, + PreferredTags: preferredTagsCopy, }, }, } @@ -181,6 +199,7 @@ func (c *Config) FromTaskPolicy(policy *worker_pb.TaskPolicy) error { c.QuietForSeconds = int(ecConfig.QuietForSeconds) c.MinSizeMB = int(ecConfig.MinVolumeSizeMb) c.CollectionFilter = ecConfig.CollectionFilter + c.PreferredTags = append([]string(nil), ecConfig.PreferredTags...) } return nil diff --git a/weed/worker/tasks/erasure_coding/detection.go b/weed/worker/tasks/erasure_coding/detection.go index 382deccca..34bdd257e 100644 --- a/weed/worker/tasks/erasure_coding/detection.go +++ b/weed/worker/tasks/erasure_coding/detection.go @@ -11,9 +11,10 @@ import ( "github.com/seaweedfs/seaweedfs/weed/pb/worker_pb" "github.com/seaweedfs/seaweedfs/weed/storage/erasure_coding" "github.com/seaweedfs/seaweedfs/weed/storage/erasure_coding/placement" + "github.com/seaweedfs/seaweedfs/weed/util" "github.com/seaweedfs/seaweedfs/weed/util/wildcard" "github.com/seaweedfs/seaweedfs/weed/worker/tasks/base" - "github.com/seaweedfs/seaweedfs/weed/worker/tasks/util" + workerutil "github.com/seaweedfs/seaweedfs/weed/worker/tasks/util" "github.com/seaweedfs/seaweedfs/weed/worker/types" ) @@ -148,7 +149,7 @@ func Detection(ctx context.Context, metrics []*types.VolumeHealthMetrics, cluste glog.Infof("EC Detection: ActiveTopology available, planning destinations for volume %d", metric.VolumeID) if planner == nil { - planner = newECPlacementPlanner(clusterInfo.ActiveTopology) + planner = newECPlacementPlanner(clusterInfo.ActiveTopology, ecConfig.PreferredTags) } multiPlan, err := planECDestinations(planner, metric, ecConfig) if err != nil { @@ -344,21 +345,27 @@ type ecPlacementPlanner struct { candidates []*placement.DiskCandidate candidateByKey map[string]*placement.DiskCandidate diskStates map[string]*ecDiskState + diskTags map[string][]string + preferredTags []string } -func newECPlacementPlanner(activeTopology *topology.ActiveTopology) *ecPlacementPlanner { +func newECPlacementPlanner(activeTopology *topology.ActiveTopology, preferredTags []string) *ecPlacementPlanner { if activeTopology == nil { return nil } disks := activeTopology.GetDisksWithEffectiveCapacity(topology.TaskTypeErasureCoding, "", 0) candidates := diskInfosToCandidates(disks) + tagsByKey := collectDiskTags(disks) + normalizedPreferredTags := util.NormalizeTagList(preferredTags) if len(candidates) == 0 { return &ecPlacementPlanner{ activeTopology: activeTopology, candidates: candidates, candidateByKey: map[string]*placement.DiskCandidate{}, diskStates: map[string]*ecDiskState{}, + diskTags: tagsByKey, + preferredTags: normalizedPreferredTags, } } @@ -377,6 +384,8 @@ func newECPlacementPlanner(activeTopology *topology.ActiveTopology) *ecPlacement candidates: candidates, candidateByKey: candidateByKey, diskStates: diskStates, + diskTags: tagsByKey, + preferredTags: normalizedPreferredTags, } } @@ -397,11 +406,21 @@ func (p *ecPlacementPlanner) selectDestinations(sourceRack, sourceDC string, sha PreferDifferentRacks: true, } - result, err := placement.SelectDestinations(p.candidates, config) - if err != nil { - return nil, err + var lastErr error + for _, candidates := range p.buildCandidateSets(shardsNeeded) { + if len(candidates) == 0 { + continue + } + result, err := placement.SelectDestinations(candidates, config) + if err == nil { + return result.SelectedDisks, nil + } + lastErr = err } - return result.SelectedDisks, nil + if lastErr == nil { + lastErr = fmt.Errorf("no EC placement candidates available") + } + return nil, lastErr } func (p *ecPlacementPlanner) applyTaskReservations(volumeSize int64, sources []topology.TaskSourceSpec, destinations []topology.TaskDestinationSpec) { @@ -501,6 +520,77 @@ func ecDiskKey(nodeID string, diskID uint32) string { return fmt.Sprintf("%s:%d", nodeID, diskID) } +func collectDiskTags(disks []*topology.DiskInfo) map[string][]string { + tagMap := make(map[string][]string, len(disks)) + for _, disk := range disks { + if disk == nil || disk.DiskInfo == nil { + continue + } + key := ecDiskKey(disk.NodeID, disk.DiskID) + tags := util.NormalizeTagList(disk.DiskInfo.Tags) + if len(tags) > 0 { + tagMap[key] = tags + } + } + return tagMap +} + +func diskHasTag(tags []string, tag string) bool { + if tag == "" || len(tags) == 0 { + return false + } + for _, candidate := range tags { + if candidate == tag { + return true + } + } + return false +} + +// buildCandidateSets builds tiered candidate sets for preferred-tag prioritized placement. +// For a planner with preferredTags, it accumulates disks matching each tag in order into +// progressively larger tiers. It emits a candidate set once a tier reaches shardsNeeded, +// then continues accumulating for subsequent tags. Finally, it falls back to the full +// p.candidates set if preferred-tag tiers are insufficient. This ensures tagged disks +// are selected first before falling back to all available candidates. +func (p *ecPlacementPlanner) buildCandidateSets(shardsNeeded int) [][]*placement.DiskCandidate { + if p == nil { + return nil + } + if len(p.preferredTags) == 0 { + return [][]*placement.DiskCandidate{p.candidates} + } + selected := make(map[string]bool, len(p.candidates)) + var tier []*placement.DiskCandidate + var candidateSets [][]*placement.DiskCandidate + for _, tag := range p.preferredTags { + for _, candidate := range p.candidates { + key := ecDiskKey(candidate.NodeID, candidate.DiskID) + if selected[key] { + continue + } + if diskHasTag(p.diskTags[key], tag) { + selected[key] = true + tier = append(tier, candidate) + } + } + if shardsNeeded > 0 && len(tier) >= shardsNeeded { + candidateSets = append(candidateSets, append([]*placement.DiskCandidate(nil), tier...)) + } + } + // Defensive check: selectDestinations always ensures shardsNeeded > 0 before calling + // buildCandidateSets, but this branch handles direct callers and edge cases. + if shardsNeeded <= 0 && len(tier) > 0 { + candidateSets = append(candidateSets, append([]*placement.DiskCandidate(nil), tier...)) + } + if len(tier) < len(p.candidates) { + candidateSets = append(candidateSets, p.candidates) + } else if len(candidateSets) == 0 { + candidateSets = append(candidateSets, p.candidates) + } + return candidateSets +} + // planECDestinations plans the destinations for erasure coding operation // This function implements EC destination planning logic directly in the detection phase func planECDestinations(planner *ecPlacementPlanner, metric *types.VolumeHealthMetrics, ecConfig *Config) (*topology.MultiDestinationPlan, error) { @@ -550,7 +640,7 @@ func planECDestinations(planner *ecPlacementPlanner, metric *types.VolumeHealthM for _, disk := range selectedDisks { // Get the target server address - targetAddress, err := util.ResolveServerAddress(disk.NodeID, planner.activeTopology) + targetAddress, err := workerutil.ResolveServerAddress(disk.NodeID, planner.activeTopology) if err != nil { return nil, fmt.Errorf("failed to resolve address for target server %s: %v", disk.NodeID, err) } @@ -654,7 +744,7 @@ func convertTaskSourcesToProtobuf(sources []topology.TaskSourceSpec, volumeID ui var protobufSources []*worker_pb.TaskSource for _, source := range sources { - serverAddress, err := util.ResolveServerAddress(source.ServerID, activeTopology) + serverAddress, err := workerutil.ResolveServerAddress(source.ServerID, activeTopology) if err != nil { return nil, fmt.Errorf("failed to resolve address for source server %s: %v", source.ServerID, err) } diff --git a/weed/worker/tasks/erasure_coding/detection_test.go b/weed/worker/tasks/erasure_coding/detection_test.go index 06e4ce306..f47355a08 100644 --- a/weed/worker/tasks/erasure_coding/detection_test.go +++ b/weed/worker/tasks/erasure_coding/detection_test.go @@ -17,7 +17,7 @@ import ( func TestECPlacementPlannerApplyReservations(t *testing.T) { activeTopology := buildActiveTopology(t, 1, []string{"hdd"}, 10, 0) - planner := newECPlacementPlanner(activeTopology) + planner := newECPlacementPlanner(activeTopology, nil) require.NotNil(t, planner) key := ecDiskKey("10.0.0.1:8080", 0) @@ -47,7 +47,7 @@ func TestECPlacementPlannerApplyReservations(t *testing.T) { func TestPlanECDestinationsUsesPlanner(t *testing.T) { activeTopology := buildActiveTopology(t, 7, []string{"hdd", "ssd"}, 100, 0) - planner := newECPlacementPlanner(activeTopology) + planner := newECPlacementPlanner(activeTopology, nil) require.NotNil(t, planner) metric := &types.VolumeHealthMetrics{ @@ -63,6 +63,70 @@ func TestPlanECDestinationsUsesPlanner(t *testing.T) { assert.Equal(t, erasure_coding.TotalShardsCount, len(plan.Plans)) } +func TestECPlacementPlannerPrefersTaggedDisks(t *testing.T) { + activeTopology := buildActiveTopology(t, 3, []string{"hdd"}, 10, 0) + topo := activeTopology.GetTopologyInfo() + for _, dc := range topo.DataCenterInfos { + for _, rack := range dc.RackInfos { + for k, node := range rack.DataNodeInfos { + for diskType := range node.DiskInfos { + if k < 2 { + node.DiskInfos[diskType].Tags = []string{"fast"} + } else { + node.DiskInfos[diskType].Tags = []string{"slow"} + } + } + } + } + } + require.NoError(t, activeTopology.UpdateTopology(topo)) + + planner := newECPlacementPlanner(activeTopology, []string{"fast"}) + require.NotNil(t, planner) + + selected, err := planner.selectDestinations("", "", 2) + require.NoError(t, err) + require.Len(t, selected, 2) + + for _, candidate := range selected { + key := ecDiskKey(candidate.NodeID, candidate.DiskID) + assert.True(t, diskHasTag(planner.diskTags[key], "fast")) + } +} + +func TestECPlacementPlannerFallsBackWhenTagsInsufficient(t *testing.T) { + activeTopology := buildActiveTopology(t, 3, []string{"hdd"}, 10, 0) + topo := activeTopology.GetTopologyInfo() + for _, dc := range topo.DataCenterInfos { + for _, rack := range dc.RackInfos { + for i, node := range rack.DataNodeInfos { + for diskType := range node.DiskInfos { + if i == 0 { + node.DiskInfos[diskType].Tags = []string{"fast"} + } + } + } + } + } + require.NoError(t, activeTopology.UpdateTopology(topo)) + + planner := newECPlacementPlanner(activeTopology, []string{"fast"}) + require.NotNil(t, planner) + + selected, err := planner.selectDestinations("", "", 3) + require.NoError(t, err) + require.Len(t, selected, 3) + + taggedCount := 0 + for _, candidate := range selected { + key := ecDiskKey(candidate.NodeID, candidate.DiskID) + if diskHasTag(planner.diskTags[key], "fast") { + taggedCount++ + } + } + assert.Less(t, taggedCount, len(selected)) +} + func TestDetectionContextCancellation(t *testing.T) { activeTopology := buildActiveTopology(t, 5, []string{"hdd", "ssd"}, 50, 0) clusterInfo := &types.ClusterInfo{ActiveTopology: activeTopology} @@ -88,7 +152,7 @@ func TestDetectionMaxResultsHonorsLimit(t *testing.T) { func TestPlanECDestinationsFailsWithInsufficientCapacity(t *testing.T) { activeTopology := buildActiveTopology(t, 1, []string{"hdd"}, 1, 1) - planner := newECPlacementPlanner(activeTopology) + planner := newECPlacementPlanner(activeTopology, nil) require.NotNil(t, planner) metric := &types.VolumeHealthMetrics{