From 2874bd05fbf4e0197a9fbf82cdbf66b4562cc851 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 20 Oct 2026 07:34:31 -0700 Subject: [PATCH] Freeze volume growth on topology id mismatch (#11763) (#11820) * pb: ResumeVolumeGrowth rpc for operator-driven growth resume (#11763) * master: freeze volume growth on topology id mismatch (#11763) * shell: volume.growth.resume command (#11763) * master: replicate the growth freeze and gate it on veteran heartbeats (#11763) * master: block allocation while the topology id is being minted DeferAllocation only armed after the topology id persisted, so growth requests arriving during init ran ahead of the warmup window. Gate NextVolumeId on an init-pending flag spanning the whole mint. * master: stash reported topology ids until the local id is minted (#11763) * drain stashed topology id reports when the id arrives outside the mint path * persist the growth-freeze flag in the mirror file and raft snapshots * log hashicorp raft marshal and apply errors in applyGrowthFreeze --- seaweed-volume/proto/master.proto | 9 + weed/pb/master.proto | 9 + weed/pb/master_pb/master.pb.go | 709 ++++++++++++--------- weed/pb/master_pb/master_grpc.pb.go | 38 ++ weed/server/master_grpc_server.go | 3 + weed/server/master_grpc_server_volume.go | 7 + weed/server/master_server.go | 5 + weed/server/raft_common.go | 7 + weed/server/raft_server.go | 21 +- weed/shell/command_volume_growth_resume.go | 52 ++ weed/stats/metrics.go | 9 + weed/topology/cluster_commands.go | 6 + weed/topology/growth_freeze_test.go | 146 +++++ weed/topology/topology.go | 177 ++++- 14 files changed, 878 insertions(+), 320 deletions(-) create mode 100644 weed/shell/command_volume_growth_resume.go create mode 100644 weed/topology/growth_freeze_test.go diff --git a/seaweed-volume/proto/master.proto b/seaweed-volume/proto/master.proto index 9bc3022417..d1cf3dd342 100644 --- a/seaweed-volume/proto/master.proto +++ b/seaweed-volume/proto/master.proto @@ -59,6 +59,8 @@ service Seaweed { } rpc RaftLeadershipTransfer (RaftLeadershipTransferRequest) returns (RaftLeadershipTransferResponse) { } + rpc ResumeVolumeGrowth (ResumeVolumeGrowthRequest) returns (ResumeVolumeGrowthResponse) { + } rpc VolumeGrow (VolumeGrowRequest) returns (VolumeGrowResponse) { } rpc CollectionStatistics (CollectionStatisticsRequest) returns (CollectionStatisticsResponse) { @@ -324,6 +326,13 @@ message VolumeGrowRequest { float grow_avg_fill_threshold = 10; } +message ResumeVolumeGrowthRequest { +} + +message ResumeVolumeGrowthResponse { + bool was_frozen = 1; +} + message AssignResponse { string fid = 1; uint64 count = 4; diff --git a/weed/pb/master.proto b/weed/pb/master.proto index 9bc3022417..d1cf3dd342 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -59,6 +59,8 @@ service Seaweed { } rpc RaftLeadershipTransfer (RaftLeadershipTransferRequest) returns (RaftLeadershipTransferResponse) { } + rpc ResumeVolumeGrowth (ResumeVolumeGrowthRequest) returns (ResumeVolumeGrowthResponse) { + } rpc VolumeGrow (VolumeGrowRequest) returns (VolumeGrowResponse) { } rpc CollectionStatistics (CollectionStatisticsRequest) returns (CollectionStatisticsResponse) { @@ -324,6 +326,13 @@ message VolumeGrowRequest { float grow_avg_fill_threshold = 10; } +message ResumeVolumeGrowthRequest { +} + +message ResumeVolumeGrowthResponse { + bool was_frozen = 1; +} + message AssignResponse { string fid = 1; uint64 count = 4; diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index bf219ed1da..d507d81da6 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -1887,6 +1887,86 @@ func (x *VolumeGrowRequest) GetGrowAvgFillThreshold() float32 { return 0 } +type ResumeVolumeGrowthRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResumeVolumeGrowthRequest) Reset() { + *x = ResumeVolumeGrowthRequest{} + mi := &file_master_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResumeVolumeGrowthRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResumeVolumeGrowthRequest) ProtoMessage() {} + +func (x *ResumeVolumeGrowthRequest) ProtoReflect() protoreflect.Message { + mi := &file_master_proto_msgTypes[19] + 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 ResumeVolumeGrowthRequest.ProtoReflect.Descriptor instead. +func (*ResumeVolumeGrowthRequest) Descriptor() ([]byte, []int) { + return file_master_proto_rawDescGZIP(), []int{19} +} + +type ResumeVolumeGrowthResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + WasFrozen bool `protobuf:"varint,1,opt,name=was_frozen,json=wasFrozen,proto3" json:"was_frozen,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResumeVolumeGrowthResponse) Reset() { + *x = ResumeVolumeGrowthResponse{} + mi := &file_master_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResumeVolumeGrowthResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResumeVolumeGrowthResponse) ProtoMessage() {} + +func (x *ResumeVolumeGrowthResponse) ProtoReflect() protoreflect.Message { + mi := &file_master_proto_msgTypes[20] + 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 ResumeVolumeGrowthResponse.ProtoReflect.Descriptor instead. +func (*ResumeVolumeGrowthResponse) Descriptor() ([]byte, []int) { + return file_master_proto_rawDescGZIP(), []int{20} +} + +func (x *ResumeVolumeGrowthResponse) GetWasFrozen() bool { + if x != nil { + return x.WasFrozen + } + return false +} + type AssignResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Fid string `protobuf:"bytes,1,opt,name=fid,proto3" json:"fid,omitempty"` @@ -1901,7 +1981,7 @@ type AssignResponse struct { func (x *AssignResponse) Reset() { *x = AssignResponse{} - mi := &file_master_proto_msgTypes[19] + mi := &file_master_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1913,7 +1993,7 @@ func (x *AssignResponse) String() string { func (*AssignResponse) ProtoMessage() {} func (x *AssignResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[19] + mi := &file_master_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1926,7 +2006,7 @@ func (x *AssignResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssignResponse.ProtoReflect.Descriptor instead. func (*AssignResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{19} + return file_master_proto_rawDescGZIP(), []int{21} } func (x *AssignResponse) GetFid() string { @@ -1983,7 +2063,7 @@ type StatisticsRequest struct { func (x *StatisticsRequest) Reset() { *x = StatisticsRequest{} - mi := &file_master_proto_msgTypes[20] + mi := &file_master_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1995,7 +2075,7 @@ func (x *StatisticsRequest) String() string { func (*StatisticsRequest) ProtoMessage() {} func (x *StatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[20] + mi := &file_master_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2008,7 +2088,7 @@ func (x *StatisticsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatisticsRequest.ProtoReflect.Descriptor instead. func (*StatisticsRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{20} + return file_master_proto_rawDescGZIP(), []int{22} } func (x *StatisticsRequest) GetReplication() string { @@ -2055,7 +2135,7 @@ type StatisticsResponse struct { func (x *StatisticsResponse) Reset() { *x = StatisticsResponse{} - mi := &file_master_proto_msgTypes[21] + mi := &file_master_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2067,7 +2147,7 @@ func (x *StatisticsResponse) String() string { func (*StatisticsResponse) ProtoMessage() {} func (x *StatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[21] + mi := &file_master_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2080,7 +2160,7 @@ func (x *StatisticsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatisticsResponse.ProtoReflect.Descriptor instead. func (*StatisticsResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{21} + return file_master_proto_rawDescGZIP(), []int{23} } func (x *StatisticsResponse) GetTotalSize() uint64 { @@ -2128,7 +2208,7 @@ type Collection struct { func (x *Collection) Reset() { *x = Collection{} - mi := &file_master_proto_msgTypes[22] + mi := &file_master_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2140,7 +2220,7 @@ func (x *Collection) String() string { func (*Collection) ProtoMessage() {} func (x *Collection) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[22] + mi := &file_master_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2153,7 +2233,7 @@ func (x *Collection) ProtoReflect() protoreflect.Message { // Deprecated: Use Collection.ProtoReflect.Descriptor instead. func (*Collection) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{22} + return file_master_proto_rawDescGZIP(), []int{24} } func (x *Collection) GetName() string { @@ -2173,7 +2253,7 @@ type CollectionListRequest struct { func (x *CollectionListRequest) Reset() { *x = CollectionListRequest{} - mi := &file_master_proto_msgTypes[23] + mi := &file_master_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2185,7 +2265,7 @@ func (x *CollectionListRequest) String() string { func (*CollectionListRequest) ProtoMessage() {} func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[23] + mi := &file_master_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2198,7 +2278,7 @@ func (x *CollectionListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListRequest.ProtoReflect.Descriptor instead. func (*CollectionListRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{23} + return file_master_proto_rawDescGZIP(), []int{25} } func (x *CollectionListRequest) GetIncludeNormalVolumes() bool { @@ -2224,7 +2304,7 @@ type CollectionListResponse struct { func (x *CollectionListResponse) Reset() { *x = CollectionListResponse{} - mi := &file_master_proto_msgTypes[24] + mi := &file_master_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2236,7 +2316,7 @@ func (x *CollectionListResponse) String() string { func (*CollectionListResponse) ProtoMessage() {} func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[24] + mi := &file_master_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2249,7 +2329,7 @@ func (x *CollectionListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionListResponse.ProtoReflect.Descriptor instead. func (*CollectionListResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{24} + return file_master_proto_rawDescGZIP(), []int{26} } func (x *CollectionListResponse) GetCollections() []*Collection { @@ -2269,7 +2349,7 @@ type CollectionStatisticsRequest struct { func (x *CollectionStatisticsRequest) Reset() { *x = CollectionStatisticsRequest{} - mi := &file_master_proto_msgTypes[25] + mi := &file_master_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2281,7 +2361,7 @@ func (x *CollectionStatisticsRequest) String() string { func (*CollectionStatisticsRequest) ProtoMessage() {} func (x *CollectionStatisticsRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[25] + mi := &file_master_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2294,7 +2374,7 @@ func (x *CollectionStatisticsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionStatisticsRequest.ProtoReflect.Descriptor instead. func (*CollectionStatisticsRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{25} + return file_master_proto_rawDescGZIP(), []int{27} } type CollectionStatisticsResponse struct { @@ -2306,7 +2386,7 @@ type CollectionStatisticsResponse struct { func (x *CollectionStatisticsResponse) Reset() { *x = CollectionStatisticsResponse{} - mi := &file_master_proto_msgTypes[26] + mi := &file_master_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2318,7 +2398,7 @@ func (x *CollectionStatisticsResponse) String() string { func (*CollectionStatisticsResponse) ProtoMessage() {} func (x *CollectionStatisticsResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[26] + mi := &file_master_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2331,7 +2411,7 @@ func (x *CollectionStatisticsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionStatisticsResponse.ProtoReflect.Descriptor instead. func (*CollectionStatisticsResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{26} + return file_master_proto_rawDescGZIP(), []int{28} } func (x *CollectionStatisticsResponse) GetCollections() []*CollectionStatistics { @@ -2359,7 +2439,7 @@ type CollectionStatistics struct { func (x *CollectionStatistics) Reset() { *x = CollectionStatistics{} - mi := &file_master_proto_msgTypes[27] + mi := &file_master_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2371,7 +2451,7 @@ func (x *CollectionStatistics) String() string { func (*CollectionStatistics) ProtoMessage() {} func (x *CollectionStatistics) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[27] + mi := &file_master_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2384,7 +2464,7 @@ func (x *CollectionStatistics) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionStatistics.ProtoReflect.Descriptor instead. func (*CollectionStatistics) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{27} + return file_master_proto_rawDescGZIP(), []int{29} } func (x *CollectionStatistics) GetCollection() string { @@ -2445,7 +2525,7 @@ type CollectionDeleteRequest struct { func (x *CollectionDeleteRequest) Reset() { *x = CollectionDeleteRequest{} - mi := &file_master_proto_msgTypes[28] + mi := &file_master_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2457,7 +2537,7 @@ func (x *CollectionDeleteRequest) String() string { func (*CollectionDeleteRequest) ProtoMessage() {} func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[28] + mi := &file_master_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2470,7 +2550,7 @@ func (x *CollectionDeleteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteRequest.ProtoReflect.Descriptor instead. func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{28} + return file_master_proto_rawDescGZIP(), []int{30} } func (x *CollectionDeleteRequest) GetName() string { @@ -2488,7 +2568,7 @@ type CollectionDeleteResponse struct { func (x *CollectionDeleteResponse) Reset() { *x = CollectionDeleteResponse{} - mi := &file_master_proto_msgTypes[29] + mi := &file_master_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2500,7 +2580,7 @@ func (x *CollectionDeleteResponse) String() string { func (*CollectionDeleteResponse) ProtoMessage() {} func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[29] + mi := &file_master_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2513,7 +2593,7 @@ func (x *CollectionDeleteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectionDeleteResponse.ProtoReflect.Descriptor instead. func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{29} + return file_master_proto_rawDescGZIP(), []int{31} } // volume related @@ -2545,7 +2625,7 @@ type DiskInfo struct { func (x *DiskInfo) Reset() { *x = DiskInfo{} - mi := &file_master_proto_msgTypes[30] + mi := &file_master_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2557,7 +2637,7 @@ func (x *DiskInfo) String() string { func (*DiskInfo) ProtoMessage() {} func (x *DiskInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[30] + mi := &file_master_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2570,7 +2650,7 @@ func (x *DiskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DiskInfo.ProtoReflect.Descriptor instead. func (*DiskInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{30} + return file_master_proto_rawDescGZIP(), []int{32} } func (x *DiskInfo) GetType() string { @@ -2676,7 +2756,7 @@ type DataNodeInfo struct { func (x *DataNodeInfo) Reset() { *x = DataNodeInfo{} - mi := &file_master_proto_msgTypes[31] + mi := &file_master_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2688,7 +2768,7 @@ func (x *DataNodeInfo) String() string { func (*DataNodeInfo) ProtoMessage() {} func (x *DataNodeInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[31] + mi := &file_master_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2701,7 +2781,7 @@ func (x *DataNodeInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DataNodeInfo.ProtoReflect.Descriptor instead. func (*DataNodeInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{31} + return file_master_proto_rawDescGZIP(), []int{33} } func (x *DataNodeInfo) GetId() string { @@ -2743,7 +2823,7 @@ type RackInfo struct { func (x *RackInfo) Reset() { *x = RackInfo{} - mi := &file_master_proto_msgTypes[32] + mi := &file_master_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2755,7 +2835,7 @@ func (x *RackInfo) String() string { func (*RackInfo) ProtoMessage() {} func (x *RackInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[32] + mi := &file_master_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2768,7 +2848,7 @@ func (x *RackInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RackInfo.ProtoReflect.Descriptor instead. func (*RackInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{32} + return file_master_proto_rawDescGZIP(), []int{34} } func (x *RackInfo) GetId() string { @@ -2803,7 +2883,7 @@ type DataCenterInfo struct { func (x *DataCenterInfo) Reset() { *x = DataCenterInfo{} - mi := &file_master_proto_msgTypes[33] + mi := &file_master_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2815,7 +2895,7 @@ func (x *DataCenterInfo) String() string { func (*DataCenterInfo) ProtoMessage() {} func (x *DataCenterInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[33] + mi := &file_master_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2828,7 +2908,7 @@ func (x *DataCenterInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use DataCenterInfo.ProtoReflect.Descriptor instead. func (*DataCenterInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{33} + return file_master_proto_rawDescGZIP(), []int{35} } func (x *DataCenterInfo) GetId() string { @@ -2863,7 +2943,7 @@ type TopologyInfo struct { func (x *TopologyInfo) Reset() { *x = TopologyInfo{} - mi := &file_master_proto_msgTypes[34] + mi := &file_master_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2875,7 +2955,7 @@ func (x *TopologyInfo) String() string { func (*TopologyInfo) ProtoMessage() {} func (x *TopologyInfo) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[34] + mi := &file_master_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2888,7 +2968,7 @@ func (x *TopologyInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TopologyInfo.ProtoReflect.Descriptor instead. func (*TopologyInfo) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{34} + return file_master_proto_rawDescGZIP(), []int{36} } func (x *TopologyInfo) GetId() string { @@ -2934,7 +3014,7 @@ type VolumeListRequest struct { func (x *VolumeListRequest) Reset() { *x = VolumeListRequest{} - mi := &file_master_proto_msgTypes[35] + mi := &file_master_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2946,7 +3026,7 @@ func (x *VolumeListRequest) String() string { func (*VolumeListRequest) ProtoMessage() {} func (x *VolumeListRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[35] + mi := &file_master_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2959,7 +3039,7 @@ func (x *VolumeListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeListRequest.ProtoReflect.Descriptor instead. func (*VolumeListRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{35} + return file_master_proto_rawDescGZIP(), []int{37} } func (x *VolumeListRequest) GetCollection() string { @@ -3014,7 +3094,7 @@ type VolumeListResponse struct { func (x *VolumeListResponse) Reset() { *x = VolumeListResponse{} - mi := &file_master_proto_msgTypes[36] + mi := &file_master_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3026,7 +3106,7 @@ func (x *VolumeListResponse) String() string { func (*VolumeListResponse) ProtoMessage() {} func (x *VolumeListResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[36] + mi := &file_master_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3039,7 +3119,7 @@ func (x *VolumeListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeListResponse.ProtoReflect.Descriptor instead. func (*VolumeListResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{36} + return file_master_proto_rawDescGZIP(), []int{38} } func (x *VolumeListResponse) GetTopologyInfo() *TopologyInfo { @@ -3079,7 +3159,7 @@ type VolumeListStreamResponse struct { func (x *VolumeListStreamResponse) Reset() { *x = VolumeListStreamResponse{} - mi := &file_master_proto_msgTypes[37] + mi := &file_master_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3091,7 +3171,7 @@ func (x *VolumeListStreamResponse) String() string { func (*VolumeListStreamResponse) ProtoMessage() {} func (x *VolumeListStreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[37] + mi := &file_master_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3104,7 +3184,7 @@ func (x *VolumeListStreamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeListStreamResponse.ProtoReflect.Descriptor instead. func (*VolumeListStreamResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{37} + return file_master_proto_rawDescGZIP(), []int{39} } func (x *VolumeListStreamResponse) GetHeader() *VolumeListResponse { @@ -3165,7 +3245,7 @@ type LookupEcVolumeRequest struct { func (x *LookupEcVolumeRequest) Reset() { *x = LookupEcVolumeRequest{} - mi := &file_master_proto_msgTypes[38] + mi := &file_master_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3177,7 +3257,7 @@ func (x *LookupEcVolumeRequest) String() string { func (*LookupEcVolumeRequest) ProtoMessage() {} func (x *LookupEcVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[38] + mi := &file_master_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3190,7 +3270,7 @@ func (x *LookupEcVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupEcVolumeRequest.ProtoReflect.Descriptor instead. func (*LookupEcVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{38} + return file_master_proto_rawDescGZIP(), []int{40} } func (x *LookupEcVolumeRequest) GetVolumeId() uint32 { @@ -3210,7 +3290,7 @@ type LookupEcVolumeResponse struct { func (x *LookupEcVolumeResponse) Reset() { *x = LookupEcVolumeResponse{} - mi := &file_master_proto_msgTypes[39] + mi := &file_master_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3222,7 +3302,7 @@ func (x *LookupEcVolumeResponse) String() string { func (*LookupEcVolumeResponse) ProtoMessage() {} func (x *LookupEcVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[39] + mi := &file_master_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3235,7 +3315,7 @@ func (x *LookupEcVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LookupEcVolumeResponse.ProtoReflect.Descriptor instead. func (*LookupEcVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{39} + return file_master_proto_rawDescGZIP(), []int{41} } func (x *LookupEcVolumeResponse) GetVolumeId() uint32 { @@ -3263,7 +3343,7 @@ type VacuumVolumeRequest struct { func (x *VacuumVolumeRequest) Reset() { *x = VacuumVolumeRequest{} - mi := &file_master_proto_msgTypes[40] + mi := &file_master_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3275,7 +3355,7 @@ func (x *VacuumVolumeRequest) String() string { func (*VacuumVolumeRequest) ProtoMessage() {} func (x *VacuumVolumeRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[40] + mi := &file_master_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3288,7 +3368,7 @@ func (x *VacuumVolumeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VacuumVolumeRequest.ProtoReflect.Descriptor instead. func (*VacuumVolumeRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{40} + return file_master_proto_rawDescGZIP(), []int{42} } func (x *VacuumVolumeRequest) GetGarbageThreshold() float32 { @@ -3320,7 +3400,7 @@ type VacuumVolumeResponse struct { func (x *VacuumVolumeResponse) Reset() { *x = VacuumVolumeResponse{} - mi := &file_master_proto_msgTypes[41] + mi := &file_master_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3332,7 +3412,7 @@ func (x *VacuumVolumeResponse) String() string { func (*VacuumVolumeResponse) ProtoMessage() {} func (x *VacuumVolumeResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[41] + mi := &file_master_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3345,7 +3425,7 @@ func (x *VacuumVolumeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VacuumVolumeResponse.ProtoReflect.Descriptor instead. func (*VacuumVolumeResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{41} + return file_master_proto_rawDescGZIP(), []int{43} } type DisableVacuumRequest struct { @@ -3357,7 +3437,7 @@ type DisableVacuumRequest struct { func (x *DisableVacuumRequest) Reset() { *x = DisableVacuumRequest{} - mi := &file_master_proto_msgTypes[42] + mi := &file_master_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3369,7 +3449,7 @@ func (x *DisableVacuumRequest) String() string { func (*DisableVacuumRequest) ProtoMessage() {} func (x *DisableVacuumRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[42] + mi := &file_master_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3382,7 +3462,7 @@ func (x *DisableVacuumRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DisableVacuumRequest.ProtoReflect.Descriptor instead. func (*DisableVacuumRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{42} + return file_master_proto_rawDescGZIP(), []int{44} } func (x *DisableVacuumRequest) GetByPlugin() bool { @@ -3400,7 +3480,7 @@ type DisableVacuumResponse struct { func (x *DisableVacuumResponse) Reset() { *x = DisableVacuumResponse{} - mi := &file_master_proto_msgTypes[43] + mi := &file_master_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3412,7 +3492,7 @@ func (x *DisableVacuumResponse) String() string { func (*DisableVacuumResponse) ProtoMessage() {} func (x *DisableVacuumResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[43] + mi := &file_master_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3425,7 +3505,7 @@ func (x *DisableVacuumResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DisableVacuumResponse.ProtoReflect.Descriptor instead. func (*DisableVacuumResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{43} + return file_master_proto_rawDescGZIP(), []int{45} } type EnableVacuumRequest struct { @@ -3437,7 +3517,7 @@ type EnableVacuumRequest struct { func (x *EnableVacuumRequest) Reset() { *x = EnableVacuumRequest{} - mi := &file_master_proto_msgTypes[44] + mi := &file_master_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3449,7 +3529,7 @@ func (x *EnableVacuumRequest) String() string { func (*EnableVacuumRequest) ProtoMessage() {} func (x *EnableVacuumRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[44] + mi := &file_master_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3462,7 +3542,7 @@ func (x *EnableVacuumRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableVacuumRequest.ProtoReflect.Descriptor instead. func (*EnableVacuumRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{44} + return file_master_proto_rawDescGZIP(), []int{46} } func (x *EnableVacuumRequest) GetByPlugin() bool { @@ -3480,7 +3560,7 @@ type EnableVacuumResponse struct { func (x *EnableVacuumResponse) Reset() { *x = EnableVacuumResponse{} - mi := &file_master_proto_msgTypes[45] + mi := &file_master_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3492,7 +3572,7 @@ func (x *EnableVacuumResponse) String() string { func (*EnableVacuumResponse) ProtoMessage() {} func (x *EnableVacuumResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[45] + mi := &file_master_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3505,7 +3585,7 @@ func (x *EnableVacuumResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableVacuumResponse.ProtoReflect.Descriptor instead. func (*EnableVacuumResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{45} + return file_master_proto_rawDescGZIP(), []int{47} } type VolumeMarkReadonlyRequest struct { @@ -3525,7 +3605,7 @@ type VolumeMarkReadonlyRequest struct { func (x *VolumeMarkReadonlyRequest) Reset() { *x = VolumeMarkReadonlyRequest{} - mi := &file_master_proto_msgTypes[46] + mi := &file_master_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3537,7 +3617,7 @@ func (x *VolumeMarkReadonlyRequest) String() string { func (*VolumeMarkReadonlyRequest) ProtoMessage() {} func (x *VolumeMarkReadonlyRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[46] + mi := &file_master_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3550,7 +3630,7 @@ func (x *VolumeMarkReadonlyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeMarkReadonlyRequest.ProtoReflect.Descriptor instead. func (*VolumeMarkReadonlyRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{46} + return file_master_proto_rawDescGZIP(), []int{48} } func (x *VolumeMarkReadonlyRequest) GetIp() string { @@ -3624,7 +3704,7 @@ type VolumeMarkReadonlyResponse struct { func (x *VolumeMarkReadonlyResponse) Reset() { *x = VolumeMarkReadonlyResponse{} - mi := &file_master_proto_msgTypes[47] + mi := &file_master_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3636,7 +3716,7 @@ func (x *VolumeMarkReadonlyResponse) String() string { func (*VolumeMarkReadonlyResponse) ProtoMessage() {} func (x *VolumeMarkReadonlyResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[47] + mi := &file_master_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3649,7 +3729,7 @@ func (x *VolumeMarkReadonlyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeMarkReadonlyResponse.ProtoReflect.Descriptor instead. func (*VolumeMarkReadonlyResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{47} + return file_master_proto_rawDescGZIP(), []int{49} } type GetMasterConfigurationRequest struct { @@ -3660,7 +3740,7 @@ type GetMasterConfigurationRequest struct { func (x *GetMasterConfigurationRequest) Reset() { *x = GetMasterConfigurationRequest{} - mi := &file_master_proto_msgTypes[48] + mi := &file_master_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3672,7 +3752,7 @@ func (x *GetMasterConfigurationRequest) String() string { func (*GetMasterConfigurationRequest) ProtoMessage() {} func (x *GetMasterConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[48] + mi := &file_master_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3685,7 +3765,7 @@ func (x *GetMasterConfigurationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMasterConfigurationRequest.ProtoReflect.Descriptor instead. func (*GetMasterConfigurationRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{48} + return file_master_proto_rawDescGZIP(), []int{50} } type GetMasterConfigurationResponse struct { @@ -3706,7 +3786,7 @@ type GetMasterConfigurationResponse struct { func (x *GetMasterConfigurationResponse) Reset() { *x = GetMasterConfigurationResponse{} - mi := &file_master_proto_msgTypes[49] + mi := &file_master_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3718,7 +3798,7 @@ func (x *GetMasterConfigurationResponse) String() string { func (*GetMasterConfigurationResponse) ProtoMessage() {} func (x *GetMasterConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[49] + mi := &file_master_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3731,7 +3811,7 @@ func (x *GetMasterConfigurationResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMasterConfigurationResponse.ProtoReflect.Descriptor instead. func (*GetMasterConfigurationResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{49} + return file_master_proto_rawDescGZIP(), []int{51} } func (x *GetMasterConfigurationResponse) GetMetricsAddress() string { @@ -3808,7 +3888,7 @@ type ListClusterNodesRequest struct { func (x *ListClusterNodesRequest) Reset() { *x = ListClusterNodesRequest{} - mi := &file_master_proto_msgTypes[50] + mi := &file_master_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3820,7 +3900,7 @@ func (x *ListClusterNodesRequest) String() string { func (*ListClusterNodesRequest) ProtoMessage() {} func (x *ListClusterNodesRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[50] + mi := &file_master_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3833,7 +3913,7 @@ func (x *ListClusterNodesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListClusterNodesRequest.ProtoReflect.Descriptor instead. func (*ListClusterNodesRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{50} + return file_master_proto_rawDescGZIP(), []int{52} } func (x *ListClusterNodesRequest) GetClientType() string { @@ -3866,7 +3946,7 @@ type ListClusterNodesResponse struct { func (x *ListClusterNodesResponse) Reset() { *x = ListClusterNodesResponse{} - mi := &file_master_proto_msgTypes[51] + mi := &file_master_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3878,7 +3958,7 @@ func (x *ListClusterNodesResponse) String() string { func (*ListClusterNodesResponse) ProtoMessage() {} func (x *ListClusterNodesResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[51] + mi := &file_master_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3891,7 +3971,7 @@ func (x *ListClusterNodesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListClusterNodesResponse.ProtoReflect.Descriptor instead. func (*ListClusterNodesResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{51} + return file_master_proto_rawDescGZIP(), []int{53} } func (x *ListClusterNodesResponse) GetClusterNodes() []*ListClusterNodesResponse_ClusterNode { @@ -3914,7 +3994,7 @@ type LeaseAdminTokenRequest struct { func (x *LeaseAdminTokenRequest) Reset() { *x = LeaseAdminTokenRequest{} - mi := &file_master_proto_msgTypes[52] + mi := &file_master_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3926,7 +4006,7 @@ func (x *LeaseAdminTokenRequest) String() string { func (*LeaseAdminTokenRequest) ProtoMessage() {} func (x *LeaseAdminTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[52] + mi := &file_master_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3939,7 +4019,7 @@ func (x *LeaseAdminTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LeaseAdminTokenRequest.ProtoReflect.Descriptor instead. func (*LeaseAdminTokenRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{52} + return file_master_proto_rawDescGZIP(), []int{54} } func (x *LeaseAdminTokenRequest) GetPreviousToken() int64 { @@ -3987,7 +4067,7 @@ type LeaseAdminTokenResponse struct { func (x *LeaseAdminTokenResponse) Reset() { *x = LeaseAdminTokenResponse{} - mi := &file_master_proto_msgTypes[53] + mi := &file_master_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3999,7 +4079,7 @@ func (x *LeaseAdminTokenResponse) String() string { func (*LeaseAdminTokenResponse) ProtoMessage() {} func (x *LeaseAdminTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[53] + mi := &file_master_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4012,7 +4092,7 @@ func (x *LeaseAdminTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LeaseAdminTokenResponse.ProtoReflect.Descriptor instead. func (*LeaseAdminTokenResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{53} + return file_master_proto_rawDescGZIP(), []int{55} } func (x *LeaseAdminTokenResponse) GetToken() int64 { @@ -4040,7 +4120,7 @@ type ReleaseAdminTokenRequest struct { func (x *ReleaseAdminTokenRequest) Reset() { *x = ReleaseAdminTokenRequest{} - mi := &file_master_proto_msgTypes[54] + mi := &file_master_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4052,7 +4132,7 @@ func (x *ReleaseAdminTokenRequest) String() string { func (*ReleaseAdminTokenRequest) ProtoMessage() {} func (x *ReleaseAdminTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[54] + mi := &file_master_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4065,7 +4145,7 @@ func (x *ReleaseAdminTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseAdminTokenRequest.ProtoReflect.Descriptor instead. func (*ReleaseAdminTokenRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{54} + return file_master_proto_rawDescGZIP(), []int{56} } func (x *ReleaseAdminTokenRequest) GetPreviousToken() int64 { @@ -4097,7 +4177,7 @@ type ReleaseAdminTokenResponse struct { func (x *ReleaseAdminTokenResponse) Reset() { *x = ReleaseAdminTokenResponse{} - mi := &file_master_proto_msgTypes[55] + mi := &file_master_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4109,7 +4189,7 @@ func (x *ReleaseAdminTokenResponse) String() string { func (*ReleaseAdminTokenResponse) ProtoMessage() {} func (x *ReleaseAdminTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[55] + mi := &file_master_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4122,7 +4202,7 @@ func (x *ReleaseAdminTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReleaseAdminTokenResponse.ProtoReflect.Descriptor instead. func (*ReleaseAdminTokenResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{55} + return file_master_proto_rawDescGZIP(), []int{57} } type GetAdminLockStatusRequest struct { @@ -4134,7 +4214,7 @@ type GetAdminLockStatusRequest struct { func (x *GetAdminLockStatusRequest) Reset() { *x = GetAdminLockStatusRequest{} - mi := &file_master_proto_msgTypes[56] + mi := &file_master_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4146,7 +4226,7 @@ func (x *GetAdminLockStatusRequest) String() string { func (*GetAdminLockStatusRequest) ProtoMessage() {} func (x *GetAdminLockStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[56] + mi := &file_master_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4159,7 +4239,7 @@ func (x *GetAdminLockStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAdminLockStatusRequest.ProtoReflect.Descriptor instead. func (*GetAdminLockStatusRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{56} + return file_master_proto_rawDescGZIP(), []int{58} } func (x *GetAdminLockStatusRequest) GetLockName() string { @@ -4180,7 +4260,7 @@ type GetAdminLockStatusResponse struct { func (x *GetAdminLockStatusResponse) Reset() { *x = GetAdminLockStatusResponse{} - mi := &file_master_proto_msgTypes[57] + mi := &file_master_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4192,7 +4272,7 @@ func (x *GetAdminLockStatusResponse) String() string { func (*GetAdminLockStatusResponse) ProtoMessage() {} func (x *GetAdminLockStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[57] + mi := &file_master_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4205,7 +4285,7 @@ func (x *GetAdminLockStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAdminLockStatusResponse.ProtoReflect.Descriptor instead. func (*GetAdminLockStatusResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{57} + return file_master_proto_rawDescGZIP(), []int{59} } func (x *GetAdminLockStatusResponse) GetIsLocked() bool { @@ -4239,7 +4319,7 @@ type PingRequest struct { func (x *PingRequest) Reset() { *x = PingRequest{} - mi := &file_master_proto_msgTypes[58] + mi := &file_master_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4251,7 +4331,7 @@ func (x *PingRequest) String() string { func (*PingRequest) ProtoMessage() {} func (x *PingRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[58] + mi := &file_master_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4264,7 +4344,7 @@ func (x *PingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingRequest.ProtoReflect.Descriptor instead. func (*PingRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{58} + return file_master_proto_rawDescGZIP(), []int{60} } func (x *PingRequest) GetTarget() string { @@ -4292,7 +4372,7 @@ type PingResponse struct { func (x *PingResponse) Reset() { *x = PingResponse{} - mi := &file_master_proto_msgTypes[59] + mi := &file_master_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4304,7 +4384,7 @@ func (x *PingResponse) String() string { func (*PingResponse) ProtoMessage() {} func (x *PingResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[59] + mi := &file_master_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4317,7 +4397,7 @@ func (x *PingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingResponse.ProtoReflect.Descriptor instead. func (*PingResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{59} + return file_master_proto_rawDescGZIP(), []int{61} } func (x *PingResponse) GetStartTimeNs() int64 { @@ -4352,7 +4432,7 @@ type RaftAddServerRequest struct { func (x *RaftAddServerRequest) Reset() { *x = RaftAddServerRequest{} - mi := &file_master_proto_msgTypes[60] + mi := &file_master_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4364,7 +4444,7 @@ func (x *RaftAddServerRequest) String() string { func (*RaftAddServerRequest) ProtoMessage() {} func (x *RaftAddServerRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[60] + mi := &file_master_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4377,7 +4457,7 @@ func (x *RaftAddServerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftAddServerRequest.ProtoReflect.Descriptor instead. func (*RaftAddServerRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{60} + return file_master_proto_rawDescGZIP(), []int{62} } func (x *RaftAddServerRequest) GetId() string { @@ -4409,7 +4489,7 @@ type RaftAddServerResponse struct { func (x *RaftAddServerResponse) Reset() { *x = RaftAddServerResponse{} - mi := &file_master_proto_msgTypes[61] + mi := &file_master_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4421,7 +4501,7 @@ func (x *RaftAddServerResponse) String() string { func (*RaftAddServerResponse) ProtoMessage() {} func (x *RaftAddServerResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[61] + mi := &file_master_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4434,7 +4514,7 @@ func (x *RaftAddServerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftAddServerResponse.ProtoReflect.Descriptor instead. func (*RaftAddServerResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{61} + return file_master_proto_rawDescGZIP(), []int{63} } type RaftRemoveServerRequest struct { @@ -4447,7 +4527,7 @@ type RaftRemoveServerRequest struct { func (x *RaftRemoveServerRequest) Reset() { *x = RaftRemoveServerRequest{} - mi := &file_master_proto_msgTypes[62] + mi := &file_master_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4459,7 +4539,7 @@ func (x *RaftRemoveServerRequest) String() string { func (*RaftRemoveServerRequest) ProtoMessage() {} func (x *RaftRemoveServerRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[62] + mi := &file_master_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4472,7 +4552,7 @@ func (x *RaftRemoveServerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftRemoveServerRequest.ProtoReflect.Descriptor instead. func (*RaftRemoveServerRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{62} + return file_master_proto_rawDescGZIP(), []int{64} } func (x *RaftRemoveServerRequest) GetId() string { @@ -4497,7 +4577,7 @@ type RaftRemoveServerResponse struct { func (x *RaftRemoveServerResponse) Reset() { *x = RaftRemoveServerResponse{} - mi := &file_master_proto_msgTypes[63] + mi := &file_master_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4509,7 +4589,7 @@ func (x *RaftRemoveServerResponse) String() string { func (*RaftRemoveServerResponse) ProtoMessage() {} func (x *RaftRemoveServerResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[63] + mi := &file_master_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4522,7 +4602,7 @@ func (x *RaftRemoveServerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftRemoveServerResponse.ProtoReflect.Descriptor instead. func (*RaftRemoveServerResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{63} + return file_master_proto_rawDescGZIP(), []int{65} } type RaftListClusterServersRequest struct { @@ -4533,7 +4613,7 @@ type RaftListClusterServersRequest struct { func (x *RaftListClusterServersRequest) Reset() { *x = RaftListClusterServersRequest{} - mi := &file_master_proto_msgTypes[64] + mi := &file_master_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4545,7 +4625,7 @@ func (x *RaftListClusterServersRequest) String() string { func (*RaftListClusterServersRequest) ProtoMessage() {} func (x *RaftListClusterServersRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[64] + mi := &file_master_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4558,7 +4638,7 @@ func (x *RaftListClusterServersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftListClusterServersRequest.ProtoReflect.Descriptor instead. func (*RaftListClusterServersRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{64} + return file_master_proto_rawDescGZIP(), []int{66} } type RaftListClusterServersResponse struct { @@ -4570,7 +4650,7 @@ type RaftListClusterServersResponse struct { func (x *RaftListClusterServersResponse) Reset() { *x = RaftListClusterServersResponse{} - mi := &file_master_proto_msgTypes[65] + mi := &file_master_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4582,7 +4662,7 @@ func (x *RaftListClusterServersResponse) String() string { func (*RaftListClusterServersResponse) ProtoMessage() {} func (x *RaftListClusterServersResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[65] + mi := &file_master_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4595,7 +4675,7 @@ func (x *RaftListClusterServersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftListClusterServersResponse.ProtoReflect.Descriptor instead. func (*RaftListClusterServersResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{65} + return file_master_proto_rawDescGZIP(), []int{67} } func (x *RaftListClusterServersResponse) GetClusterServers() []*RaftListClusterServersResponse_ClusterServers { @@ -4615,7 +4695,7 @@ type RaftLeadershipTransferRequest struct { func (x *RaftLeadershipTransferRequest) Reset() { *x = RaftLeadershipTransferRequest{} - mi := &file_master_proto_msgTypes[66] + mi := &file_master_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4627,7 +4707,7 @@ func (x *RaftLeadershipTransferRequest) String() string { func (*RaftLeadershipTransferRequest) ProtoMessage() {} func (x *RaftLeadershipTransferRequest) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[66] + mi := &file_master_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4640,7 +4720,7 @@ func (x *RaftLeadershipTransferRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftLeadershipTransferRequest.ProtoReflect.Descriptor instead. func (*RaftLeadershipTransferRequest) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{66} + return file_master_proto_rawDescGZIP(), []int{68} } func (x *RaftLeadershipTransferRequest) GetTargetId() string { @@ -4667,7 +4747,7 @@ type RaftLeadershipTransferResponse struct { func (x *RaftLeadershipTransferResponse) Reset() { *x = RaftLeadershipTransferResponse{} - mi := &file_master_proto_msgTypes[67] + mi := &file_master_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4679,7 +4759,7 @@ func (x *RaftLeadershipTransferResponse) String() string { func (*RaftLeadershipTransferResponse) ProtoMessage() {} func (x *RaftLeadershipTransferResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[67] + mi := &file_master_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4692,7 +4772,7 @@ func (x *RaftLeadershipTransferResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RaftLeadershipTransferResponse.ProtoReflect.Descriptor instead. func (*RaftLeadershipTransferResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{67} + return file_master_proto_rawDescGZIP(), []int{69} } func (x *RaftLeadershipTransferResponse) GetPreviousLeader() string { @@ -4722,7 +4802,7 @@ type VolumeGrowResponse struct { func (x *VolumeGrowResponse) Reset() { *x = VolumeGrowResponse{} - mi := &file_master_proto_msgTypes[68] + mi := &file_master_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4734,7 +4814,7 @@ func (x *VolumeGrowResponse) String() string { func (*VolumeGrowResponse) ProtoMessage() {} func (x *VolumeGrowResponse) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[68] + mi := &file_master_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4747,7 +4827,7 @@ func (x *VolumeGrowResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VolumeGrowResponse.ProtoReflect.Descriptor instead. func (*VolumeGrowResponse) Descriptor() ([]byte, []int) { - return file_master_proto_rawDescGZIP(), []int{68} + return file_master_proto_rawDescGZIP(), []int{70} } func (x *VolumeGrowResponse) GetAvgFill() float32 { @@ -4775,7 +4855,7 @@ type SuperBlockExtra_ErasureCoding struct { func (x *SuperBlockExtra_ErasureCoding) Reset() { *x = SuperBlockExtra_ErasureCoding{} - mi := &file_master_proto_msgTypes[73] + mi := &file_master_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4787,7 +4867,7 @@ func (x *SuperBlockExtra_ErasureCoding) String() string { func (*SuperBlockExtra_ErasureCoding) ProtoMessage() {} func (x *SuperBlockExtra_ErasureCoding) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[73] + mi := &file_master_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4836,7 +4916,7 @@ type LookupVolumeResponse_VolumeIdLocation struct { func (x *LookupVolumeResponse_VolumeIdLocation) Reset() { *x = LookupVolumeResponse_VolumeIdLocation{} - mi := &file_master_proto_msgTypes[74] + mi := &file_master_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4848,7 +4928,7 @@ func (x *LookupVolumeResponse_VolumeIdLocation) String() string { func (*LookupVolumeResponse_VolumeIdLocation) ProtoMessage() {} func (x *LookupVolumeResponse_VolumeIdLocation) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[74] + mi := &file_master_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4902,7 +4982,7 @@ type LookupEcVolumeResponse_EcShardIdLocation struct { func (x *LookupEcVolumeResponse_EcShardIdLocation) Reset() { *x = LookupEcVolumeResponse_EcShardIdLocation{} - mi := &file_master_proto_msgTypes[80] + mi := &file_master_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4914,7 +4994,7 @@ func (x *LookupEcVolumeResponse_EcShardIdLocation) String() string { func (*LookupEcVolumeResponse_EcShardIdLocation) ProtoMessage() {} func (x *LookupEcVolumeResponse_EcShardIdLocation) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[80] + mi := &file_master_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4927,7 +5007,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{39, 0} + return file_master_proto_rawDescGZIP(), []int{41, 0} } func (x *LookupEcVolumeResponse_EcShardIdLocation) GetShardId() uint32 { @@ -4957,7 +5037,7 @@ type ListClusterNodesResponse_ClusterNode struct { func (x *ListClusterNodesResponse_ClusterNode) Reset() { *x = ListClusterNodesResponse_ClusterNode{} - mi := &file_master_proto_msgTypes[81] + mi := &file_master_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4969,7 +5049,7 @@ func (x *ListClusterNodesResponse_ClusterNode) String() string { func (*ListClusterNodesResponse_ClusterNode) ProtoMessage() {} func (x *ListClusterNodesResponse_ClusterNode) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[81] + mi := &file_master_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4982,7 +5062,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{51, 0} + return file_master_proto_rawDescGZIP(), []int{53, 0} } func (x *ListClusterNodesResponse_ClusterNode) GetAddress() string { @@ -5032,7 +5112,7 @@ type RaftListClusterServersResponse_ClusterServers struct { func (x *RaftListClusterServersResponse_ClusterServers) Reset() { *x = RaftListClusterServersResponse_ClusterServers{} - mi := &file_master_proto_msgTypes[82] + mi := &file_master_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5044,7 +5124,7 @@ func (x *RaftListClusterServersResponse_ClusterServers) String() string { func (*RaftListClusterServersResponse_ClusterServers) ProtoMessage() {} func (x *RaftListClusterServersResponse_ClusterServers) ProtoReflect() protoreflect.Message { - mi := &file_master_proto_msgTypes[82] + mi := &file_master_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5057,7 +5137,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{65, 0} + return file_master_proto_rawDescGZIP(), []int{67, 0} } func (x *RaftListClusterServersResponse_ClusterServers) GetId() string { @@ -5320,7 +5400,11 @@ const file_master_proto_rawDesc = "" + "\x16memory_map_max_size_mb\x18\b \x01(\rR\x12memoryMapMaxSizeMb\x12\x1b\n" + "\tdisk_type\x18\t \x01(\tR\bdiskType\x125\n" + "\x17grow_avg_fill_threshold\x18\n" + - " \x01(\x02R\x14growAvgFillThreshold\"\xc4\x01\n" + + " \x01(\x02R\x14growAvgFillThreshold\"\x1b\n" + + "\x19ResumeVolumeGrowthRequest\";\n" + + "\x1aResumeVolumeGrowthResponse\x12\x1d\n" + + "\n" + + "was_frozen\x18\x01 \x01(\bR\twasFrozen\"\xc4\x01\n" + "\x0eAssignResponse\x12\x10\n" + "\x03fid\x18\x01 \x01(\tR\x03fid\x12\x14\n" + "\x05count\x18\x04 \x01(\x04R\x05count\x12\x14\n" + @@ -5558,7 +5642,7 @@ const file_master_proto_rawDesc = "" + "new_leader\x18\x02 \x01(\tR\tnewLeader\"V\n" + "\x12VolumeGrowResponse\x12\x19\n" + "\bavg_fill\x18\x01 \x01(\x02R\aavgFill\x12%\n" + - "\x0ewritable_count\x18\x02 \x01(\rR\rwritableCount2\xf1\x12\n" + + "\x0ewritable_count\x18\x02 \x01(\rR\rwritableCount2\xd6\x13\n" + "\aSeaweed\x12I\n" + "\rSendHeartbeat\x12\x14.master_pb.Heartbeat\x1a\x1c.master_pb.HeartbeatResponse\"\x00(\x010\x01\x12X\n" + "\rKeepConnected\x12\x1f.master_pb.KeepConnectedRequest\x1a .master_pb.KeepConnectedResponse\"\x00(\x010\x01\x12Q\n" + @@ -5586,7 +5670,8 @@ const file_master_proto_rawDesc = "" + "\x16RaftListClusterServers\x12(.master_pb.RaftListClusterServersRequest\x1a).master_pb.RaftListClusterServersResponse\"\x00\x12T\n" + "\rRaftAddServer\x12\x1f.master_pb.RaftAddServerRequest\x1a .master_pb.RaftAddServerResponse\"\x00\x12]\n" + "\x10RaftRemoveServer\x12\".master_pb.RaftRemoveServerRequest\x1a#.master_pb.RaftRemoveServerResponse\"\x00\x12o\n" + - "\x16RaftLeadershipTransfer\x12(.master_pb.RaftLeadershipTransferRequest\x1a).master_pb.RaftLeadershipTransferResponse\"\x00\x12K\n" + + "\x16RaftLeadershipTransfer\x12(.master_pb.RaftLeadershipTransferRequest\x1a).master_pb.RaftLeadershipTransferResponse\"\x00\x12c\n" + + "\x12ResumeVolumeGrowth\x12$.master_pb.ResumeVolumeGrowthRequest\x1a%.master_pb.ResumeVolumeGrowthResponse\"\x00\x12K\n" + "\n" + "VolumeGrow\x12\x1c.master_pb.VolumeGrowRequest\x1a\x1d.master_pb.VolumeGrowResponse\"\x00\x12i\n" + "\x14CollectionStatistics\x12&.master_pb.CollectionStatisticsRequest\x1a'.master_pb.CollectionStatisticsResponse\"\x00B2Z0github.com/seaweedfs/seaweedfs/weed/pb/master_pbb\x06proto3" @@ -5603,7 +5688,7 @@ func file_master_proto_rawDescGZIP() []byte { return file_master_proto_rawDescData } -var file_master_proto_msgTypes = make([]protoimpl.MessageInfo, 83) +var file_master_proto_msgTypes = make([]protoimpl.MessageInfo, 85) var file_master_proto_goTypes = []any{ (*DiskTag)(nil), // 0: master_pb.DiskTag (*Heartbeat)(nil), // 1: master_pb.Heartbeat @@ -5624,71 +5709,73 @@ var file_master_proto_goTypes = []any{ (*Location)(nil), // 16: master_pb.Location (*AssignRequest)(nil), // 17: master_pb.AssignRequest (*VolumeGrowRequest)(nil), // 18: master_pb.VolumeGrowRequest - (*AssignResponse)(nil), // 19: master_pb.AssignResponse - (*StatisticsRequest)(nil), // 20: master_pb.StatisticsRequest - (*StatisticsResponse)(nil), // 21: master_pb.StatisticsResponse - (*Collection)(nil), // 22: master_pb.Collection - (*CollectionListRequest)(nil), // 23: master_pb.CollectionListRequest - (*CollectionListResponse)(nil), // 24: master_pb.CollectionListResponse - (*CollectionStatisticsRequest)(nil), // 25: master_pb.CollectionStatisticsRequest - (*CollectionStatisticsResponse)(nil), // 26: master_pb.CollectionStatisticsResponse - (*CollectionStatistics)(nil), // 27: master_pb.CollectionStatistics - (*CollectionDeleteRequest)(nil), // 28: master_pb.CollectionDeleteRequest - (*CollectionDeleteResponse)(nil), // 29: master_pb.CollectionDeleteResponse - (*DiskInfo)(nil), // 30: master_pb.DiskInfo - (*DataNodeInfo)(nil), // 31: master_pb.DataNodeInfo - (*RackInfo)(nil), // 32: master_pb.RackInfo - (*DataCenterInfo)(nil), // 33: master_pb.DataCenterInfo - (*TopologyInfo)(nil), // 34: master_pb.TopologyInfo - (*VolumeListRequest)(nil), // 35: master_pb.VolumeListRequest - (*VolumeListResponse)(nil), // 36: master_pb.VolumeListResponse - (*VolumeListStreamResponse)(nil), // 37: master_pb.VolumeListStreamResponse - (*LookupEcVolumeRequest)(nil), // 38: master_pb.LookupEcVolumeRequest - (*LookupEcVolumeResponse)(nil), // 39: master_pb.LookupEcVolumeResponse - (*VacuumVolumeRequest)(nil), // 40: master_pb.VacuumVolumeRequest - (*VacuumVolumeResponse)(nil), // 41: master_pb.VacuumVolumeResponse - (*DisableVacuumRequest)(nil), // 42: master_pb.DisableVacuumRequest - (*DisableVacuumResponse)(nil), // 43: master_pb.DisableVacuumResponse - (*EnableVacuumRequest)(nil), // 44: master_pb.EnableVacuumRequest - (*EnableVacuumResponse)(nil), // 45: master_pb.EnableVacuumResponse - (*VolumeMarkReadonlyRequest)(nil), // 46: master_pb.VolumeMarkReadonlyRequest - (*VolumeMarkReadonlyResponse)(nil), // 47: master_pb.VolumeMarkReadonlyResponse - (*GetMasterConfigurationRequest)(nil), // 48: master_pb.GetMasterConfigurationRequest - (*GetMasterConfigurationResponse)(nil), // 49: master_pb.GetMasterConfigurationResponse - (*ListClusterNodesRequest)(nil), // 50: master_pb.ListClusterNodesRequest - (*ListClusterNodesResponse)(nil), // 51: master_pb.ListClusterNodesResponse - (*LeaseAdminTokenRequest)(nil), // 52: master_pb.LeaseAdminTokenRequest - (*LeaseAdminTokenResponse)(nil), // 53: master_pb.LeaseAdminTokenResponse - (*ReleaseAdminTokenRequest)(nil), // 54: master_pb.ReleaseAdminTokenRequest - (*ReleaseAdminTokenResponse)(nil), // 55: master_pb.ReleaseAdminTokenResponse - (*GetAdminLockStatusRequest)(nil), // 56: master_pb.GetAdminLockStatusRequest - (*GetAdminLockStatusResponse)(nil), // 57: master_pb.GetAdminLockStatusResponse - (*PingRequest)(nil), // 58: master_pb.PingRequest - (*PingResponse)(nil), // 59: master_pb.PingResponse - (*RaftAddServerRequest)(nil), // 60: master_pb.RaftAddServerRequest - (*RaftAddServerResponse)(nil), // 61: master_pb.RaftAddServerResponse - (*RaftRemoveServerRequest)(nil), // 62: master_pb.RaftRemoveServerRequest - (*RaftRemoveServerResponse)(nil), // 63: master_pb.RaftRemoveServerResponse - (*RaftListClusterServersRequest)(nil), // 64: master_pb.RaftListClusterServersRequest - (*RaftListClusterServersResponse)(nil), // 65: master_pb.RaftListClusterServersResponse - (*RaftLeadershipTransferRequest)(nil), // 66: master_pb.RaftLeadershipTransferRequest - (*RaftLeadershipTransferResponse)(nil), // 67: master_pb.RaftLeadershipTransferResponse - (*VolumeGrowResponse)(nil), // 68: master_pb.VolumeGrowResponse - nil, // 69: master_pb.Heartbeat.MaxVolumeCountsEntry - nil, // 70: master_pb.Heartbeat.DiskTotalBytesEntry - nil, // 71: master_pb.Heartbeat.DiskFreeBytesEntry - nil, // 72: master_pb.StorageBackend.PropertiesEntry - (*SuperBlockExtra_ErasureCoding)(nil), // 73: master_pb.SuperBlockExtra.ErasureCoding - (*LookupVolumeResponse_VolumeIdLocation)(nil), // 74: master_pb.LookupVolumeResponse.VolumeIdLocation - nil, // 75: master_pb.DiskInfo.MaxVolumeCountByDiskEntry - nil, // 76: master_pb.DataNodeInfo.DiskInfosEntry - nil, // 77: master_pb.RackInfo.DiskInfosEntry - nil, // 78: master_pb.DataCenterInfo.DiskInfosEntry - nil, // 79: master_pb.TopologyInfo.DiskInfosEntry - (*LookupEcVolumeResponse_EcShardIdLocation)(nil), // 80: master_pb.LookupEcVolumeResponse.EcShardIdLocation - (*ListClusterNodesResponse_ClusterNode)(nil), // 81: master_pb.ListClusterNodesResponse.ClusterNode - (*RaftListClusterServersResponse_ClusterServers)(nil), // 82: master_pb.RaftListClusterServersResponse.ClusterServers - (*volume_server_pb.VolumeServerState)(nil), // 83: volume_server_pb.VolumeServerState + (*ResumeVolumeGrowthRequest)(nil), // 19: master_pb.ResumeVolumeGrowthRequest + (*ResumeVolumeGrowthResponse)(nil), // 20: master_pb.ResumeVolumeGrowthResponse + (*AssignResponse)(nil), // 21: master_pb.AssignResponse + (*StatisticsRequest)(nil), // 22: master_pb.StatisticsRequest + (*StatisticsResponse)(nil), // 23: master_pb.StatisticsResponse + (*Collection)(nil), // 24: master_pb.Collection + (*CollectionListRequest)(nil), // 25: master_pb.CollectionListRequest + (*CollectionListResponse)(nil), // 26: master_pb.CollectionListResponse + (*CollectionStatisticsRequest)(nil), // 27: master_pb.CollectionStatisticsRequest + (*CollectionStatisticsResponse)(nil), // 28: master_pb.CollectionStatisticsResponse + (*CollectionStatistics)(nil), // 29: master_pb.CollectionStatistics + (*CollectionDeleteRequest)(nil), // 30: master_pb.CollectionDeleteRequest + (*CollectionDeleteResponse)(nil), // 31: master_pb.CollectionDeleteResponse + (*DiskInfo)(nil), // 32: master_pb.DiskInfo + (*DataNodeInfo)(nil), // 33: master_pb.DataNodeInfo + (*RackInfo)(nil), // 34: master_pb.RackInfo + (*DataCenterInfo)(nil), // 35: master_pb.DataCenterInfo + (*TopologyInfo)(nil), // 36: master_pb.TopologyInfo + (*VolumeListRequest)(nil), // 37: master_pb.VolumeListRequest + (*VolumeListResponse)(nil), // 38: master_pb.VolumeListResponse + (*VolumeListStreamResponse)(nil), // 39: master_pb.VolumeListStreamResponse + (*LookupEcVolumeRequest)(nil), // 40: master_pb.LookupEcVolumeRequest + (*LookupEcVolumeResponse)(nil), // 41: master_pb.LookupEcVolumeResponse + (*VacuumVolumeRequest)(nil), // 42: master_pb.VacuumVolumeRequest + (*VacuumVolumeResponse)(nil), // 43: master_pb.VacuumVolumeResponse + (*DisableVacuumRequest)(nil), // 44: master_pb.DisableVacuumRequest + (*DisableVacuumResponse)(nil), // 45: master_pb.DisableVacuumResponse + (*EnableVacuumRequest)(nil), // 46: master_pb.EnableVacuumRequest + (*EnableVacuumResponse)(nil), // 47: master_pb.EnableVacuumResponse + (*VolumeMarkReadonlyRequest)(nil), // 48: master_pb.VolumeMarkReadonlyRequest + (*VolumeMarkReadonlyResponse)(nil), // 49: master_pb.VolumeMarkReadonlyResponse + (*GetMasterConfigurationRequest)(nil), // 50: master_pb.GetMasterConfigurationRequest + (*GetMasterConfigurationResponse)(nil), // 51: master_pb.GetMasterConfigurationResponse + (*ListClusterNodesRequest)(nil), // 52: master_pb.ListClusterNodesRequest + (*ListClusterNodesResponse)(nil), // 53: master_pb.ListClusterNodesResponse + (*LeaseAdminTokenRequest)(nil), // 54: master_pb.LeaseAdminTokenRequest + (*LeaseAdminTokenResponse)(nil), // 55: master_pb.LeaseAdminTokenResponse + (*ReleaseAdminTokenRequest)(nil), // 56: master_pb.ReleaseAdminTokenRequest + (*ReleaseAdminTokenResponse)(nil), // 57: master_pb.ReleaseAdminTokenResponse + (*GetAdminLockStatusRequest)(nil), // 58: master_pb.GetAdminLockStatusRequest + (*GetAdminLockStatusResponse)(nil), // 59: master_pb.GetAdminLockStatusResponse + (*PingRequest)(nil), // 60: master_pb.PingRequest + (*PingResponse)(nil), // 61: master_pb.PingResponse + (*RaftAddServerRequest)(nil), // 62: master_pb.RaftAddServerRequest + (*RaftAddServerResponse)(nil), // 63: master_pb.RaftAddServerResponse + (*RaftRemoveServerRequest)(nil), // 64: master_pb.RaftRemoveServerRequest + (*RaftRemoveServerResponse)(nil), // 65: master_pb.RaftRemoveServerResponse + (*RaftListClusterServersRequest)(nil), // 66: master_pb.RaftListClusterServersRequest + (*RaftListClusterServersResponse)(nil), // 67: master_pb.RaftListClusterServersResponse + (*RaftLeadershipTransferRequest)(nil), // 68: master_pb.RaftLeadershipTransferRequest + (*RaftLeadershipTransferResponse)(nil), // 69: master_pb.RaftLeadershipTransferResponse + (*VolumeGrowResponse)(nil), // 70: master_pb.VolumeGrowResponse + nil, // 71: master_pb.Heartbeat.MaxVolumeCountsEntry + nil, // 72: master_pb.Heartbeat.DiskTotalBytesEntry + nil, // 73: master_pb.Heartbeat.DiskFreeBytesEntry + nil, // 74: master_pb.StorageBackend.PropertiesEntry + (*SuperBlockExtra_ErasureCoding)(nil), // 75: master_pb.SuperBlockExtra.ErasureCoding + (*LookupVolumeResponse_VolumeIdLocation)(nil), // 76: master_pb.LookupVolumeResponse.VolumeIdLocation + nil, // 77: master_pb.DiskInfo.MaxVolumeCountByDiskEntry + nil, // 78: master_pb.DataNodeInfo.DiskInfosEntry + nil, // 79: master_pb.RackInfo.DiskInfosEntry + nil, // 80: master_pb.DataCenterInfo.DiskInfosEntry + nil, // 81: master_pb.TopologyInfo.DiskInfosEntry + (*LookupEcVolumeResponse_EcShardIdLocation)(nil), // 82: master_pb.LookupEcVolumeResponse.EcShardIdLocation + (*ListClusterNodesResponse_ClusterNode)(nil), // 83: master_pb.ListClusterNodesResponse.ClusterNode + (*RaftListClusterServersResponse_ClusterServers)(nil), // 84: master_pb.RaftListClusterServersResponse.ClusterServers + (*volume_server_pb.VolumeServerState)(nil), // 85: volume_server_pb.VolumeServerState } var file_master_proto_depIdxs = []int32{ 3, // 0: master_pb.Heartbeat.volumes:type_name -> master_pb.VolumeInformationMessage @@ -5697,103 +5784,105 @@ var file_master_proto_depIdxs = []int32{ 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 - 69, // 6: master_pb.Heartbeat.max_volume_counts:type_name -> master_pb.Heartbeat.MaxVolumeCountsEntry - 83, // 7: master_pb.Heartbeat.state:type_name -> volume_server_pb.VolumeServerState + 71, // 6: master_pb.Heartbeat.max_volume_counts:type_name -> master_pb.Heartbeat.MaxVolumeCountsEntry + 85, // 7: master_pb.Heartbeat.state:type_name -> volume_server_pb.VolumeServerState 0, // 8: master_pb.Heartbeat.disk_tags:type_name -> master_pb.DiskTag - 70, // 9: master_pb.Heartbeat.disk_total_bytes:type_name -> master_pb.Heartbeat.DiskTotalBytesEntry - 71, // 10: master_pb.Heartbeat.disk_free_bytes:type_name -> master_pb.Heartbeat.DiskFreeBytesEntry + 72, // 9: master_pb.Heartbeat.disk_total_bytes:type_name -> master_pb.Heartbeat.DiskTotalBytesEntry + 73, // 10: master_pb.Heartbeat.disk_free_bytes:type_name -> master_pb.Heartbeat.DiskFreeBytesEntry 3, // 11: master_pb.Heartbeat.changed_volumes:type_name -> master_pb.VolumeInformationMessage 6, // 12: master_pb.HeartbeatResponse.storage_backends:type_name -> master_pb.StorageBackend - 72, // 13: master_pb.StorageBackend.properties:type_name -> master_pb.StorageBackend.PropertiesEntry - 73, // 14: master_pb.SuperBlockExtra.erasure_coding:type_name -> master_pb.SuperBlockExtra.ErasureCoding + 74, // 13: master_pb.StorageBackend.properties:type_name -> master_pb.StorageBackend.PropertiesEntry + 75, // 14: master_pb.SuperBlockExtra.erasure_coding:type_name -> master_pb.SuperBlockExtra.ErasureCoding 10, // 15: master_pb.KeepConnectedResponse.volume_location:type_name -> master_pb.VolumeLocation 11, // 16: master_pb.KeepConnectedResponse.cluster_node_update:type_name -> master_pb.ClusterNodeUpdate 13, // 17: master_pb.KeepConnectedResponse.lock_ring_update:type_name -> master_pb.LockRingUpdate - 74, // 18: master_pb.LookupVolumeResponse.volume_id_locations:type_name -> master_pb.LookupVolumeResponse.VolumeIdLocation + 76, // 18: master_pb.LookupVolumeResponse.volume_id_locations:type_name -> master_pb.LookupVolumeResponse.VolumeIdLocation 16, // 19: master_pb.AssignResponse.replicas:type_name -> master_pb.Location 16, // 20: master_pb.AssignResponse.location:type_name -> master_pb.Location - 22, // 21: master_pb.CollectionListResponse.collections:type_name -> master_pb.Collection - 27, // 22: master_pb.CollectionStatisticsResponse.collections:type_name -> master_pb.CollectionStatistics + 24, // 21: master_pb.CollectionListResponse.collections:type_name -> master_pb.Collection + 29, // 22: master_pb.CollectionStatisticsResponse.collections:type_name -> master_pb.CollectionStatistics 3, // 23: master_pb.DiskInfo.volume_infos:type_name -> master_pb.VolumeInformationMessage 5, // 24: master_pb.DiskInfo.ec_shard_infos:type_name -> master_pb.VolumeEcShardInformationMessage - 75, // 25: master_pb.DiskInfo.max_volume_count_by_disk:type_name -> master_pb.DiskInfo.MaxVolumeCountByDiskEntry - 76, // 26: master_pb.DataNodeInfo.diskInfos:type_name -> master_pb.DataNodeInfo.DiskInfosEntry - 31, // 27: master_pb.RackInfo.data_node_infos:type_name -> master_pb.DataNodeInfo - 77, // 28: master_pb.RackInfo.diskInfos:type_name -> master_pb.RackInfo.DiskInfosEntry - 32, // 29: master_pb.DataCenterInfo.rack_infos:type_name -> master_pb.RackInfo - 78, // 30: master_pb.DataCenterInfo.diskInfos:type_name -> master_pb.DataCenterInfo.DiskInfosEntry - 33, // 31: master_pb.TopologyInfo.data_center_infos:type_name -> master_pb.DataCenterInfo - 79, // 32: master_pb.TopologyInfo.diskInfos:type_name -> master_pb.TopologyInfo.DiskInfosEntry - 34, // 33: master_pb.VolumeListResponse.topology_info:type_name -> master_pb.TopologyInfo - 36, // 34: master_pb.VolumeListStreamResponse.header:type_name -> master_pb.VolumeListResponse + 77, // 25: master_pb.DiskInfo.max_volume_count_by_disk:type_name -> master_pb.DiskInfo.MaxVolumeCountByDiskEntry + 78, // 26: master_pb.DataNodeInfo.diskInfos:type_name -> master_pb.DataNodeInfo.DiskInfosEntry + 33, // 27: master_pb.RackInfo.data_node_infos:type_name -> master_pb.DataNodeInfo + 79, // 28: master_pb.RackInfo.diskInfos:type_name -> master_pb.RackInfo.DiskInfosEntry + 34, // 29: master_pb.DataCenterInfo.rack_infos:type_name -> master_pb.RackInfo + 80, // 30: master_pb.DataCenterInfo.diskInfos:type_name -> master_pb.DataCenterInfo.DiskInfosEntry + 35, // 31: master_pb.TopologyInfo.data_center_infos:type_name -> master_pb.DataCenterInfo + 81, // 32: master_pb.TopologyInfo.diskInfos:type_name -> master_pb.TopologyInfo.DiskInfosEntry + 36, // 33: master_pb.VolumeListResponse.topology_info:type_name -> master_pb.TopologyInfo + 38, // 34: master_pb.VolumeListStreamResponse.header:type_name -> master_pb.VolumeListResponse 3, // 35: master_pb.VolumeListStreamResponse.volume_infos:type_name -> master_pb.VolumeInformationMessage 5, // 36: master_pb.VolumeListStreamResponse.ec_shard_infos:type_name -> master_pb.VolumeEcShardInformationMessage - 80, // 37: master_pb.LookupEcVolumeResponse.shard_id_locations:type_name -> master_pb.LookupEcVolumeResponse.EcShardIdLocation + 82, // 37: master_pb.LookupEcVolumeResponse.shard_id_locations:type_name -> master_pb.LookupEcVolumeResponse.EcShardIdLocation 6, // 38: master_pb.GetMasterConfigurationResponse.storage_backends:type_name -> master_pb.StorageBackend - 81, // 39: master_pb.ListClusterNodesResponse.cluster_nodes:type_name -> master_pb.ListClusterNodesResponse.ClusterNode - 82, // 40: master_pb.RaftListClusterServersResponse.cluster_servers:type_name -> master_pb.RaftListClusterServersResponse.ClusterServers + 83, // 39: master_pb.ListClusterNodesResponse.cluster_nodes:type_name -> master_pb.ListClusterNodesResponse.ClusterNode + 84, // 40: master_pb.RaftListClusterServersResponse.cluster_servers:type_name -> master_pb.RaftListClusterServersResponse.ClusterServers 16, // 41: master_pb.LookupVolumeResponse.VolumeIdLocation.locations:type_name -> master_pb.Location - 30, // 42: master_pb.DataNodeInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 30, // 43: master_pb.RackInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 30, // 44: master_pb.DataCenterInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo - 30, // 45: master_pb.TopologyInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 32, // 42: master_pb.DataNodeInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 32, // 43: master_pb.RackInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 32, // 44: master_pb.DataCenterInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo + 32, // 45: master_pb.TopologyInfo.DiskInfosEntry.value:type_name -> master_pb.DiskInfo 16, // 46: master_pb.LookupEcVolumeResponse.EcShardIdLocation.locations:type_name -> master_pb.Location 1, // 47: master_pb.Seaweed.SendHeartbeat:input_type -> master_pb.Heartbeat 9, // 48: master_pb.Seaweed.KeepConnected:input_type -> master_pb.KeepConnectedRequest 14, // 49: master_pb.Seaweed.LookupVolume:input_type -> master_pb.LookupVolumeRequest 17, // 50: master_pb.Seaweed.Assign:input_type -> master_pb.AssignRequest 17, // 51: master_pb.Seaweed.StreamAssign:input_type -> master_pb.AssignRequest - 20, // 52: master_pb.Seaweed.Statistics:input_type -> master_pb.StatisticsRequest - 23, // 53: master_pb.Seaweed.CollectionList:input_type -> master_pb.CollectionListRequest - 28, // 54: master_pb.Seaweed.CollectionDelete:input_type -> master_pb.CollectionDeleteRequest - 35, // 55: master_pb.Seaweed.VolumeList:input_type -> master_pb.VolumeListRequest - 35, // 56: master_pb.Seaweed.VolumeListStream:input_type -> master_pb.VolumeListRequest - 38, // 57: master_pb.Seaweed.LookupEcVolume:input_type -> master_pb.LookupEcVolumeRequest - 40, // 58: master_pb.Seaweed.VacuumVolume:input_type -> master_pb.VacuumVolumeRequest - 42, // 59: master_pb.Seaweed.DisableVacuum:input_type -> master_pb.DisableVacuumRequest - 44, // 60: master_pb.Seaweed.EnableVacuum:input_type -> master_pb.EnableVacuumRequest - 46, // 61: master_pb.Seaweed.VolumeMarkReadonly:input_type -> master_pb.VolumeMarkReadonlyRequest - 48, // 62: master_pb.Seaweed.GetMasterConfiguration:input_type -> master_pb.GetMasterConfigurationRequest - 50, // 63: master_pb.Seaweed.ListClusterNodes:input_type -> master_pb.ListClusterNodesRequest - 52, // 64: master_pb.Seaweed.LeaseAdminToken:input_type -> master_pb.LeaseAdminTokenRequest - 54, // 65: master_pb.Seaweed.ReleaseAdminToken:input_type -> master_pb.ReleaseAdminTokenRequest - 56, // 66: master_pb.Seaweed.GetAdminLockStatus:input_type -> master_pb.GetAdminLockStatusRequest - 58, // 67: master_pb.Seaweed.Ping:input_type -> master_pb.PingRequest - 64, // 68: master_pb.Seaweed.RaftListClusterServers:input_type -> master_pb.RaftListClusterServersRequest - 60, // 69: master_pb.Seaweed.RaftAddServer:input_type -> master_pb.RaftAddServerRequest - 62, // 70: master_pb.Seaweed.RaftRemoveServer:input_type -> master_pb.RaftRemoveServerRequest - 66, // 71: master_pb.Seaweed.RaftLeadershipTransfer:input_type -> master_pb.RaftLeadershipTransferRequest - 18, // 72: master_pb.Seaweed.VolumeGrow:input_type -> master_pb.VolumeGrowRequest - 25, // 73: master_pb.Seaweed.CollectionStatistics:input_type -> master_pb.CollectionStatisticsRequest - 2, // 74: master_pb.Seaweed.SendHeartbeat:output_type -> master_pb.HeartbeatResponse - 12, // 75: master_pb.Seaweed.KeepConnected:output_type -> master_pb.KeepConnectedResponse - 15, // 76: master_pb.Seaweed.LookupVolume:output_type -> master_pb.LookupVolumeResponse - 19, // 77: master_pb.Seaweed.Assign:output_type -> master_pb.AssignResponse - 19, // 78: master_pb.Seaweed.StreamAssign:output_type -> master_pb.AssignResponse - 21, // 79: master_pb.Seaweed.Statistics:output_type -> master_pb.StatisticsResponse - 24, // 80: master_pb.Seaweed.CollectionList:output_type -> master_pb.CollectionListResponse - 29, // 81: master_pb.Seaweed.CollectionDelete:output_type -> master_pb.CollectionDeleteResponse - 36, // 82: master_pb.Seaweed.VolumeList:output_type -> master_pb.VolumeListResponse - 37, // 83: master_pb.Seaweed.VolumeListStream:output_type -> master_pb.VolumeListStreamResponse - 39, // 84: master_pb.Seaweed.LookupEcVolume:output_type -> master_pb.LookupEcVolumeResponse - 41, // 85: master_pb.Seaweed.VacuumVolume:output_type -> master_pb.VacuumVolumeResponse - 43, // 86: master_pb.Seaweed.DisableVacuum:output_type -> master_pb.DisableVacuumResponse - 45, // 87: master_pb.Seaweed.EnableVacuum:output_type -> master_pb.EnableVacuumResponse - 47, // 88: master_pb.Seaweed.VolumeMarkReadonly:output_type -> master_pb.VolumeMarkReadonlyResponse - 49, // 89: master_pb.Seaweed.GetMasterConfiguration:output_type -> master_pb.GetMasterConfigurationResponse - 51, // 90: master_pb.Seaweed.ListClusterNodes:output_type -> master_pb.ListClusterNodesResponse - 53, // 91: master_pb.Seaweed.LeaseAdminToken:output_type -> master_pb.LeaseAdminTokenResponse - 55, // 92: master_pb.Seaweed.ReleaseAdminToken:output_type -> master_pb.ReleaseAdminTokenResponse - 57, // 93: master_pb.Seaweed.GetAdminLockStatus:output_type -> master_pb.GetAdminLockStatusResponse - 59, // 94: master_pb.Seaweed.Ping:output_type -> master_pb.PingResponse - 65, // 95: master_pb.Seaweed.RaftListClusterServers:output_type -> master_pb.RaftListClusterServersResponse - 61, // 96: master_pb.Seaweed.RaftAddServer:output_type -> master_pb.RaftAddServerResponse - 63, // 97: master_pb.Seaweed.RaftRemoveServer:output_type -> master_pb.RaftRemoveServerResponse - 67, // 98: master_pb.Seaweed.RaftLeadershipTransfer:output_type -> master_pb.RaftLeadershipTransferResponse - 68, // 99: master_pb.Seaweed.VolumeGrow:output_type -> master_pb.VolumeGrowResponse - 26, // 100: master_pb.Seaweed.CollectionStatistics:output_type -> master_pb.CollectionStatisticsResponse - 74, // [74:101] is the sub-list for method output_type - 47, // [47:74] is the sub-list for method input_type + 22, // 52: master_pb.Seaweed.Statistics:input_type -> master_pb.StatisticsRequest + 25, // 53: master_pb.Seaweed.CollectionList:input_type -> master_pb.CollectionListRequest + 30, // 54: master_pb.Seaweed.CollectionDelete:input_type -> master_pb.CollectionDeleteRequest + 37, // 55: master_pb.Seaweed.VolumeList:input_type -> master_pb.VolumeListRequest + 37, // 56: master_pb.Seaweed.VolumeListStream:input_type -> master_pb.VolumeListRequest + 40, // 57: master_pb.Seaweed.LookupEcVolume:input_type -> master_pb.LookupEcVolumeRequest + 42, // 58: master_pb.Seaweed.VacuumVolume:input_type -> master_pb.VacuumVolumeRequest + 44, // 59: master_pb.Seaweed.DisableVacuum:input_type -> master_pb.DisableVacuumRequest + 46, // 60: master_pb.Seaweed.EnableVacuum:input_type -> master_pb.EnableVacuumRequest + 48, // 61: master_pb.Seaweed.VolumeMarkReadonly:input_type -> master_pb.VolumeMarkReadonlyRequest + 50, // 62: master_pb.Seaweed.GetMasterConfiguration:input_type -> master_pb.GetMasterConfigurationRequest + 52, // 63: master_pb.Seaweed.ListClusterNodes:input_type -> master_pb.ListClusterNodesRequest + 54, // 64: master_pb.Seaweed.LeaseAdminToken:input_type -> master_pb.LeaseAdminTokenRequest + 56, // 65: master_pb.Seaweed.ReleaseAdminToken:input_type -> master_pb.ReleaseAdminTokenRequest + 58, // 66: master_pb.Seaweed.GetAdminLockStatus:input_type -> master_pb.GetAdminLockStatusRequest + 60, // 67: master_pb.Seaweed.Ping:input_type -> master_pb.PingRequest + 66, // 68: master_pb.Seaweed.RaftListClusterServers:input_type -> master_pb.RaftListClusterServersRequest + 62, // 69: master_pb.Seaweed.RaftAddServer:input_type -> master_pb.RaftAddServerRequest + 64, // 70: master_pb.Seaweed.RaftRemoveServer:input_type -> master_pb.RaftRemoveServerRequest + 68, // 71: master_pb.Seaweed.RaftLeadershipTransfer:input_type -> master_pb.RaftLeadershipTransferRequest + 19, // 72: master_pb.Seaweed.ResumeVolumeGrowth:input_type -> master_pb.ResumeVolumeGrowthRequest + 18, // 73: master_pb.Seaweed.VolumeGrow:input_type -> master_pb.VolumeGrowRequest + 27, // 74: master_pb.Seaweed.CollectionStatistics:input_type -> master_pb.CollectionStatisticsRequest + 2, // 75: master_pb.Seaweed.SendHeartbeat:output_type -> master_pb.HeartbeatResponse + 12, // 76: master_pb.Seaweed.KeepConnected:output_type -> master_pb.KeepConnectedResponse + 15, // 77: master_pb.Seaweed.LookupVolume:output_type -> master_pb.LookupVolumeResponse + 21, // 78: master_pb.Seaweed.Assign:output_type -> master_pb.AssignResponse + 21, // 79: master_pb.Seaweed.StreamAssign:output_type -> master_pb.AssignResponse + 23, // 80: master_pb.Seaweed.Statistics:output_type -> master_pb.StatisticsResponse + 26, // 81: master_pb.Seaweed.CollectionList:output_type -> master_pb.CollectionListResponse + 31, // 82: master_pb.Seaweed.CollectionDelete:output_type -> master_pb.CollectionDeleteResponse + 38, // 83: master_pb.Seaweed.VolumeList:output_type -> master_pb.VolumeListResponse + 39, // 84: master_pb.Seaweed.VolumeListStream:output_type -> master_pb.VolumeListStreamResponse + 41, // 85: master_pb.Seaweed.LookupEcVolume:output_type -> master_pb.LookupEcVolumeResponse + 43, // 86: master_pb.Seaweed.VacuumVolume:output_type -> master_pb.VacuumVolumeResponse + 45, // 87: master_pb.Seaweed.DisableVacuum:output_type -> master_pb.DisableVacuumResponse + 47, // 88: master_pb.Seaweed.EnableVacuum:output_type -> master_pb.EnableVacuumResponse + 49, // 89: master_pb.Seaweed.VolumeMarkReadonly:output_type -> master_pb.VolumeMarkReadonlyResponse + 51, // 90: master_pb.Seaweed.GetMasterConfiguration:output_type -> master_pb.GetMasterConfigurationResponse + 53, // 91: master_pb.Seaweed.ListClusterNodes:output_type -> master_pb.ListClusterNodesResponse + 55, // 92: master_pb.Seaweed.LeaseAdminToken:output_type -> master_pb.LeaseAdminTokenResponse + 57, // 93: master_pb.Seaweed.ReleaseAdminToken:output_type -> master_pb.ReleaseAdminTokenResponse + 59, // 94: master_pb.Seaweed.GetAdminLockStatus:output_type -> master_pb.GetAdminLockStatusResponse + 61, // 95: master_pb.Seaweed.Ping:output_type -> master_pb.PingResponse + 67, // 96: master_pb.Seaweed.RaftListClusterServers:output_type -> master_pb.RaftListClusterServersResponse + 63, // 97: master_pb.Seaweed.RaftAddServer:output_type -> master_pb.RaftAddServerResponse + 65, // 98: master_pb.Seaweed.RaftRemoveServer:output_type -> master_pb.RaftRemoveServerResponse + 69, // 99: master_pb.Seaweed.RaftLeadershipTransfer:output_type -> master_pb.RaftLeadershipTransferResponse + 20, // 100: master_pb.Seaweed.ResumeVolumeGrowth:output_type -> master_pb.ResumeVolumeGrowthResponse + 70, // 101: master_pb.Seaweed.VolumeGrow:output_type -> master_pb.VolumeGrowResponse + 28, // 102: master_pb.Seaweed.CollectionStatistics:output_type -> master_pb.CollectionStatisticsResponse + 75, // [75:103] is the sub-list for method output_type + 47, // [47:75] is the sub-list for method input_type 47, // [47:47] is the sub-list for extension type_name 47, // [47:47] is the sub-list for extension extendee 0, // [0:47] is the sub-list for field type_name @@ -5811,7 +5900,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: 83, + NumMessages: 85, NumExtensions: 0, NumServices: 1, }, diff --git a/weed/pb/master_pb/master_grpc.pb.go b/weed/pb/master_pb/master_grpc.pb.go index 5a59fcae28..c697724512 100644 --- a/weed/pb/master_pb/master_grpc.pb.go +++ b/weed/pb/master_pb/master_grpc.pb.go @@ -44,6 +44,7 @@ const ( Seaweed_RaftAddServer_FullMethodName = "/master_pb.Seaweed/RaftAddServer" Seaweed_RaftRemoveServer_FullMethodName = "/master_pb.Seaweed/RaftRemoveServer" Seaweed_RaftLeadershipTransfer_FullMethodName = "/master_pb.Seaweed/RaftLeadershipTransfer" + Seaweed_ResumeVolumeGrowth_FullMethodName = "/master_pb.Seaweed/ResumeVolumeGrowth" Seaweed_VolumeGrow_FullMethodName = "/master_pb.Seaweed/VolumeGrow" Seaweed_CollectionStatistics_FullMethodName = "/master_pb.Seaweed/CollectionStatistics" ) @@ -77,6 +78,7 @@ type SeaweedClient interface { RaftAddServer(ctx context.Context, in *RaftAddServerRequest, opts ...grpc.CallOption) (*RaftAddServerResponse, error) RaftRemoveServer(ctx context.Context, in *RaftRemoveServerRequest, opts ...grpc.CallOption) (*RaftRemoveServerResponse, error) RaftLeadershipTransfer(ctx context.Context, in *RaftLeadershipTransferRequest, opts ...grpc.CallOption) (*RaftLeadershipTransferResponse, error) + ResumeVolumeGrowth(ctx context.Context, in *ResumeVolumeGrowthRequest, opts ...grpc.CallOption) (*ResumeVolumeGrowthResponse, error) VolumeGrow(ctx context.Context, in *VolumeGrowRequest, opts ...grpc.CallOption) (*VolumeGrowResponse, error) CollectionStatistics(ctx context.Context, in *CollectionStatisticsRequest, opts ...grpc.CallOption) (*CollectionStatisticsResponse, error) } @@ -357,6 +359,16 @@ func (c *seaweedClient) RaftLeadershipTransfer(ctx context.Context, in *RaftLead return out, nil } +func (c *seaweedClient) ResumeVolumeGrowth(ctx context.Context, in *ResumeVolumeGrowthRequest, opts ...grpc.CallOption) (*ResumeVolumeGrowthResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResumeVolumeGrowthResponse) + err := c.cc.Invoke(ctx, Seaweed_ResumeVolumeGrowth_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *seaweedClient) VolumeGrow(ctx context.Context, in *VolumeGrowRequest, opts ...grpc.CallOption) (*VolumeGrowResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(VolumeGrowResponse) @@ -406,6 +418,7 @@ type SeaweedServer interface { RaftAddServer(context.Context, *RaftAddServerRequest) (*RaftAddServerResponse, error) RaftRemoveServer(context.Context, *RaftRemoveServerRequest) (*RaftRemoveServerResponse, error) RaftLeadershipTransfer(context.Context, *RaftLeadershipTransferRequest) (*RaftLeadershipTransferResponse, error) + ResumeVolumeGrowth(context.Context, *ResumeVolumeGrowthRequest) (*ResumeVolumeGrowthResponse, error) VolumeGrow(context.Context, *VolumeGrowRequest) (*VolumeGrowResponse, error) CollectionStatistics(context.Context, *CollectionStatisticsRequest) (*CollectionStatisticsResponse, error) mustEmbedUnimplementedSeaweedServer() @@ -493,6 +506,9 @@ func (UnimplementedSeaweedServer) RaftRemoveServer(context.Context, *RaftRemoveS func (UnimplementedSeaweedServer) RaftLeadershipTransfer(context.Context, *RaftLeadershipTransferRequest) (*RaftLeadershipTransferResponse, error) { return nil, status.Error(codes.Unimplemented, "method RaftLeadershipTransfer not implemented") } +func (UnimplementedSeaweedServer) ResumeVolumeGrowth(context.Context, *ResumeVolumeGrowthRequest) (*ResumeVolumeGrowthResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ResumeVolumeGrowth not implemented") +} func (UnimplementedSeaweedServer) VolumeGrow(context.Context, *VolumeGrowRequest) (*VolumeGrowResponse, error) { return nil, status.Error(codes.Unimplemented, "method VolumeGrow not implemented") } @@ -930,6 +946,24 @@ func _Seaweed_RaftLeadershipTransfer_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _Seaweed_ResumeVolumeGrowth_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResumeVolumeGrowthRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SeaweedServer).ResumeVolumeGrowth(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Seaweed_ResumeVolumeGrowth_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SeaweedServer).ResumeVolumeGrowth(ctx, req.(*ResumeVolumeGrowthRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Seaweed_VolumeGrow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(VolumeGrowRequest) if err := dec(in); err != nil { @@ -1057,6 +1091,10 @@ var Seaweed_ServiceDesc = grpc.ServiceDesc{ MethodName: "RaftLeadershipTransfer", Handler: _Seaweed_RaftLeadershipTransfer_Handler, }, + { + MethodName: "ResumeVolumeGrowth", + Handler: _Seaweed_ResumeVolumeGrowth_Handler, + }, { MethodName: "VolumeGrow", Handler: _Seaweed_VolumeGrow_Handler, diff --git a/weed/server/master_grpc_server.go b/weed/server/master_grpc_server.go index ac9e0577ef..dcba381e6d 100644 --- a/weed/server/master_grpc_server.go +++ b/weed/server/master_grpc_server.go @@ -184,6 +184,9 @@ func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServ ms.Topo.Sequence.SetMax(heartbeat.MaxFileKey) ms.Topo.UpAdjustMaxVolumeId(needle.VolumeId(heartbeat.MaxVolumeIdSeen)) + if len(heartbeat.Volumes) > 0 { + ms.Topo.CheckReportedTopologyId(heartbeat.LastSeenTopologyId) + } if dn == nil { // Skip delta heartbeat for volume server versions better than 3.28 https://github.com/seaweedfs/seaweedfs/pull/3630 if heartbeat.Ip == "" { diff --git a/weed/server/master_grpc_server_volume.go b/weed/server/master_grpc_server_volume.go index 716d06779f..53bd2c27f0 100644 --- a/weed/server/master_grpc_server_volume.go +++ b/weed/server/master_grpc_server_volume.go @@ -471,6 +471,13 @@ func (ms *MasterServer) VolumeMarkReadonly(ctx context.Context, req *master_pb.V return resp, nil } +func (ms *MasterServer) ResumeVolumeGrowth(ctx context.Context, req *master_pb.ResumeVolumeGrowthRequest) (*master_pb.ResumeVolumeGrowthResponse, error) { + if !ms.Topo.IsLeader() { + return nil, raft.NotLeaderError + } + return &master_pb.ResumeVolumeGrowthResponse{WasFrozen: ms.Topo.ResumeVolumeGrowth()}, nil +} + func (ms *MasterServer) VolumeGrow(ctx context.Context, req *master_pb.VolumeGrowRequest) (*master_pb.VolumeGrowResponse, error) { if !ms.Topo.IsLeader() { return nil, raft.NotLeaderError diff --git a/weed/server/master_server.go b/weed/server/master_server.go index 22f33176e4..b2e0de3874 100644 --- a/weed/server/master_server.go +++ b/weed/server/master_server.go @@ -122,6 +122,8 @@ func NewMasterServer(r *mux.Router, option *MasterOption, peers map[string]pb.Se v.SetDefault("master.volume_growth.reservation_timeout", "5m") v.SetDefault("master.volume_growth.disable", false) option.VolumeGrowthDisabled = v.GetBool("master.volume_growth.disable") + v.SetDefault("master.volume_growth.freeze_on_topology_mismatch", true) + v.SetDefault("master.volume_growth.state_loss_recovery_wait", "0s") topology.VolumeGrowStrategy.Copy1Count = v.GetUint32("master.volume_growth.copy_1") topology.VolumeGrowStrategy.Copy2Count = v.GetUint32("master.volume_growth.copy_2") @@ -157,6 +159,9 @@ func NewMasterServer(r *mux.Router, option *MasterOption, peers map[string]pb.Se glog.Fatalf("create sequencer failed.") } ms.Topo = topology.NewTopology("topo", seq, uint64(ms.option.VolumeSizeLimitMB)*1024*1024, 5, replicationAsMin) + ms.Topo.SetGrowthFreezeConfig( + v.GetBool("master.volume_growth.freeze_on_topology_mismatch"), + v.GetDuration("master.volume_growth.state_loss_recovery_wait")) ms.vg = topology.NewDefaultVolumeGrowth() glog.V(0).Infoln("Volume Size Limit is", ms.option.VolumeSizeLimitMB, "MB") diff --git a/weed/server/raft_common.go b/weed/server/raft_common.go index 9a87a9952b..2d13124698 100644 --- a/weed/server/raft_common.go +++ b/weed/server/raft_common.go @@ -30,9 +30,15 @@ func recoverTopologyIdFromState(fsmState []byte, topo *topology.Topology) { // It uses the provided checkLeaderFn to verify leadership and persistFn to save the new ID. func EnsureTopologyId(topo *topology.Topology, checkLeaderFn func() bool, persistFn func(string) error) { if topo.GetTopologyId() != "" { + // The id arrived through raft replay or the mirror file; reports + // stashed while it was unknown can now be checked. + topo.SetTopologyInitPending(false) return } + topo.SetTopologyInitPending(true) + defer topo.SetTopologyInitPending(false) + topologyId := uuid.New().String() for { if !checkLeaderFn() { @@ -59,6 +65,7 @@ func EnsureTopologyId(topo *topology.Topology, checkLeaderFn func() bool, persis } else { glog.V(0).Infof("TopologyId generated: %s", topologyId) } + topo.DeferAllocation(topo.WarmupDuration()) break } } diff --git a/weed/server/raft_server.go b/weed/server/raft_server.go index 8130b7838e..f274a821d2 100644 --- a/weed/server/raft_server.go +++ b/weed/server/raft_server.go @@ -60,6 +60,10 @@ func (s StateMachine) Save() ([]byte, error) { MaxVolumeId: s.topo.GetMaxVolumeId(), TopologyId: s.topo.GetTopologyId(), } + if s.topo.IsGrowthFrozen() { + state.GrowthFrozen = new(bool) + *state.GrowthFrozen = true + } glog.V(1).Infof("Save raft state %+v", state) return json.Marshal(state) } @@ -76,6 +80,9 @@ func (s StateMachine) Recovery(data []byte) error { s.topo.SetTopologyId(state.TopologyId) glog.V(0).Infof("Recovered TopologyId: %s", state.TopologyId) } + if state.GrowthFrozen != nil { + s.topo.SetGrowthFrozen(*state.GrowthFrozen) + } if err := s.topo.PersistMaxVolumeId(state.MaxVolumeId); err != nil { glog.Warningf("persist max volume id %d: %v", state.MaxVolumeId, err) } @@ -98,6 +105,9 @@ func (s *StateMachine) Apply(l *hashicorpRaft.Log) interface{} { glog.V(0).Infof("Set TopologyId from raft log: %s", state.TopologyId) } } + if state.GrowthFrozen != nil { + s.topo.SetGrowthFrozen(*state.GrowthFrozen) + } if err := s.topo.PersistMaxVolumeId(state.MaxVolumeId); err != nil { glog.Warningf("persist max volume id %d: %v", state.MaxVolumeId, err) } @@ -107,10 +117,13 @@ func (s *StateMachine) Apply(l *hashicorpRaft.Log) interface{} { } func (s *StateMachine) Snapshot() (hashicorpRaft.FSMSnapshot, error) { - return &topology.MaxVolumeIdCommand{ - MaxVolumeId: s.topo.GetMaxVolumeId(), - TopologyId: s.topo.GetTopologyId(), - }, nil + frozen := s.topo.IsGrowthFrozen() + state := &topology.MaxVolumeIdCommand{ + MaxVolumeId: s.topo.GetMaxVolumeId(), + TopologyId: s.topo.GetTopologyId(), + GrowthFrozen: &frozen, + } + return state, nil } func (s *StateMachine) Restore(r io.ReadCloser) error { diff --git a/weed/shell/command_volume_growth_resume.go b/weed/shell/command_volume_growth_resume.go new file mode 100644 index 0000000000..7cad7c71ab --- /dev/null +++ b/weed/shell/command_volume_growth_resume.go @@ -0,0 +1,52 @@ +package shell + +import ( + "context" + "fmt" + "io" + + "github.com/seaweedfs/seaweedfs/weed/pb/master_pb" +) + +func init() { + Commands = append(Commands, &commandVolumeGrowthResume{}) +} + +type commandVolumeGrowthResume struct { +} + +func (c *commandVolumeGrowthResume) Name() string { + return "volume.growth.resume" +} + +func (c *commandVolumeGrowthResume) Help() string { + return `resume volume growth frozen after detected master state loss + + volume.growth.resume + + Volume growth freezes automatically when a volume server reports a + topology id that differs from this cluster's, which means the master + state was rebuilt and max volume id knowledge may be incomplete. Run + this after verifying the cluster inventory so new ids are not reused. + +` +} + +func (c *commandVolumeGrowthResume) HasTag(CommandTag) bool { + return false +} + +func (c *commandVolumeGrowthResume) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) { + return commandEnv.MasterClient.WithClient(context.Background(), false, func(client master_pb.SeaweedClient) error { + resp, err := client.ResumeVolumeGrowth(context.Background(), &master_pb.ResumeVolumeGrowthRequest{}) + if err != nil { + return err + } + if resp.WasFrozen { + fmt.Fprintf(writer, "volume growth resumed\n") + } else { + fmt.Fprintf(writer, "volume growth was not frozen\n") + } + return nil + }) +} diff --git a/weed/stats/metrics.go b/weed/stats/metrics.go index 7b39b943be..2b37256f7a 100644 --- a/weed/stats/metrics.go +++ b/weed/stats/metrics.go @@ -101,6 +101,14 @@ var ( Help: "admin lock", }, []string{"client"}) + MasterVolumeGrowthFrozen = prometheus.NewGauge( + prometheus.GaugeOpts{ + Namespace: Namespace, + Subsystem: subsystemMaster, + Name: "volume_growth_frozen", + Help: "1 while volume growth is frozen after detected master state loss", + }) + MasterReceivedHeartbeatCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: Namespace, @@ -991,6 +999,7 @@ func init() { Gather.MustRegister(MasterClientConnectCounter) Gather.MustRegister(MasterRaftIsleader) Gather.MustRegister(MasterAdminLock) + Gather.MustRegister(MasterVolumeGrowthFrozen) Gather.MustRegister(MasterReceivedHeartbeatCounter) Gather.MustRegister(MasterLeaderChangeCounter) Gather.MustRegister(MasterReplicaPlacementMismatch) diff --git a/weed/topology/cluster_commands.go b/weed/topology/cluster_commands.go index 1c713201e7..a4d7527863 100644 --- a/weed/topology/cluster_commands.go +++ b/weed/topology/cluster_commands.go @@ -13,6 +13,9 @@ import ( type MaxVolumeIdCommand struct { MaxVolumeId needle.VolumeId `json:"maxVolumeId"` TopologyId string `json:"topologyId"` + // GrowthFrozen replicates the volume-growth freeze through raft so a + // leader change does not silently lift it. nil means no change. + GrowthFrozen *bool `json:"growthFrozen,omitempty"` } func NewMaxVolumeIdCommand(value needle.VolumeId, topologyId string) *MaxVolumeIdCommand { @@ -43,6 +46,9 @@ func (c *MaxVolumeIdCommand) Apply(server raft.Server) (interface{}, error) { } } } + if c.GrowthFrozen != nil { + topo.SetGrowthFrozen(*c.GrowthFrozen) + } if err := topo.PersistMaxVolumeId(c.MaxVolumeId); err != nil { glog.Warningf("persist max volume id %d: %v", c.MaxVolumeId, err) } diff --git a/weed/topology/growth_freeze_test.go b/weed/topology/growth_freeze_test.go new file mode 100644 index 0000000000..3b296b14df --- /dev/null +++ b/weed/topology/growth_freeze_test.go @@ -0,0 +1,146 @@ +package topology + +import ( + "testing" + "time" +) + +func TestGrowthFreezeOnTopologyMismatch(t *testing.T) { + topo := NewTopology("topo", nil, 128, 3, false) + topo.SetGrowthFreezeConfig(true, 0) + topo.SetTopologyId("cluster-a") + + topo.CheckReportedTopologyId("cluster-a") + if topo.IsGrowthFrozen() { + t.Fatal("matching topology id should not freeze growth") + } + + topo.CheckReportedTopologyId("") + topo.CheckReportedTopologyId("cluster-b") + if !topo.IsGrowthFrozen() { + t.Fatal("mismatching topology id should freeze growth") + } + + if !topo.ResumeVolumeGrowth() { + t.Fatal("resume should report the frozen state") + } + if topo.IsGrowthFrozen() { + t.Fatal("growth should be unfrozen after resume") + } + if topo.ResumeVolumeGrowth() { + t.Fatal("second resume should report no frozen state") + } +} + +func TestGrowthFreezeDisabled(t *testing.T) { + topo := NewTopology("topo", nil, 128, 3, false) + topo.SetGrowthFreezeConfig(false, 0) + topo.SetTopologyId("cluster-a") + + topo.CheckReportedTopologyId("cluster-b") + if topo.IsGrowthFrozen() { + t.Fatal("freeze_on_topology_mismatch=false should not freeze") + } +} + +func TestGrowthFreezeAutoRecovery(t *testing.T) { + topo := NewTopology("topo", nil, 128, 3, false) + topo.SetGrowthFreezeConfig(true, 50*time.Millisecond) + topo.SetTopologyId("cluster-a") + + topo.CheckReportedTopologyId("cluster-b") + if !topo.IsGrowthFrozen() { + t.Fatal("mismatching topology id should freeze growth") + } + time.Sleep(60 * time.Millisecond) + if topo.IsGrowthFrozen() { + t.Fatal("growth should auto-resume past the recovery wait") + } +} + +func TestCheckReportedTopologyIdBeforeTopologyIdKnown(t *testing.T) { + topo := NewTopology("topo", nil, 128, 3, false) + topo.SetGrowthFreezeConfig(true, 0) + + topo.CheckReportedTopologyId("cluster-b") + if topo.IsGrowthFrozen() { + t.Fatal("empty local topology id should not trigger the freeze") + } + + topo.SetTopologyId("cluster-c") + topo.SetTopologyInitPending(false) + if !topo.IsGrowthFrozen() { + t.Fatal("a report stashed before the topology id was known should still freeze growth") + } +} + +func TestReportedTopologyIdStashDoesNotFreezeOnMatch(t *testing.T) { + topo := NewTopology("topo", nil, 128, 3, false) + topo.SetGrowthFreezeConfig(true, 0) + + topo.CheckReportedTopologyId("cluster-a") + topo.SetTopologyId("cluster-a") + topo.SetTopologyInitPending(false) + if topo.IsGrowthFrozen() { + t.Fatal("a stashed report matching the minted id should not freeze growth") + } +} + +func TestGrowthFreezeSurvivesMirrorRestore(t *testing.T) { + dir := t.TempDir() + file := dir + "/max_volume_id" + + frozen := NewTopology("topo", nil, 128, 3, false) + frozen.SetGrowthFreezeConfig(true, 0) + frozen.SetMaxVolumeIdFile(file) + frozen.SetTopologyId("cluster-a") + frozen.CheckReportedTopologyId("cluster-b") + if !frozen.IsGrowthFrozen() { + t.Fatal("expected frozen growth") + } + if err := frozen.PersistMaxVolumeId(42); err != nil { + t.Fatalf("persist: %v", err) + } + + restarted := NewTopology("topo", nil, 128, 3, false) + restarted.SetGrowthFreezeConfig(true, 0) + restarted.SetMaxVolumeIdFile(file) + if !restarted.IsGrowthFrozen() { + t.Fatal("freeze flag should survive a mirror restore") + } + if !restarted.ResumeVolumeGrowth() { + t.Fatal("restored freeze should be resumable") + } +} + +func TestGrowthFreezeCommandApply(t *testing.T) { + topo := NewTopology("topo", nil, 128, 3, false) + topo.SetGrowthFreezeConfig(true, 0) + + frozen := true + topo.SetGrowthFrozen(frozen) + if !topo.IsGrowthFrozen() { + t.Fatal("replicated freeze should set the flag") + } + unfrozen := false + topo.SetGrowthFrozen(unfrozen) + if topo.IsGrowthFrozen() { + t.Fatal("replicated unfreeze should clear the flag") + } +} + +func TestAllocationDelay(t *testing.T) { + topo := NewTopology("topo", nil, 128, 3, false) + + if wait := topo.allocationDelay(); wait > 0 { + t.Fatalf("unexpected deferral: %v", wait) + } + topo.DeferAllocation(50 * time.Millisecond) + if wait := topo.allocationDelay(); wait <= 0 { + t.Fatal("expected a positive deferral after DeferAllocation") + } + topo.DeferAllocation(-time.Second) + if wait := topo.allocationDelay(); wait > 0 { + t.Fatalf("expired deferral should not delay: %v", wait) + } +} diff --git a/weed/topology/topology.go b/weed/topology/topology.go index cd4d92ab37..6933981800 100644 --- a/weed/topology/topology.go +++ b/weed/topology/topology.go @@ -84,10 +84,21 @@ type Topology struct { dataNodeIndex map[string]*DataNode dataNodeIndexLock sync.RWMutex - maxVolumeIdFile string - maxVolumeIdFileLock sync.Mutex - lastPersistedMaxVolumeId atomic.Uint32 - lastPersistedTopologyId atomic.Value + maxVolumeIdFile string + maxVolumeIdFileLock sync.Mutex + lastPersistedMaxVolumeId atomic.Uint32 + lastPersistedTopologyId atomic.Value + lastPersistedGrowthFrozen atomic.Bool + + growthFrozen atomic.Bool + growthFrozenAt atomic.Int64 + freezeOnMismatch atomic.Bool + stateLossRecoveryWait atomic.Int64 + allocationNotBefore atomic.Int64 + topologyInitPending atomic.Bool + + reportedTopologyIdsLock sync.Mutex + pendingReportedTopologyIds map[string]struct{} } func NewTopology(id string, seq sequence.Sequencer, volumeSizeLimit uint64, pulse int, replicationAsMin bool) *Topology { @@ -394,6 +405,22 @@ func (t *Topology) NextVolumeId() (needle.VolumeId, error) { return 0, fmt.Errorf("as leader can not read yet") } + for t.topologyInitPending.Load() { + if !t.IsLeaderAndCanRead() { + return 0, fmt.Errorf("as leader can not read yet") + } + time.Sleep(100 * time.Millisecond) + } + if t.IsGrowthFrozen() { + return 0, fmt.Errorf("volume growth is frozen after master state loss; verify the cluster inventory, then run: volume.growth.resume") + } + if wait := t.allocationDelay(); wait > 0 { + glog.V(0).Infof("deferring volume id allocation for %v", wait) + time.Sleep(wait) + if t.IsGrowthFrozen() { + return 0, fmt.Errorf("volume growth is frozen after master state loss; verify the cluster inventory, then run: volume.growth.resume") + } + } vid := t.GetMaxVolumeId() next := vid.Next() @@ -950,6 +977,135 @@ func (t *Topology) SetTopologyId(topologyId string) { } } +func (t *Topology) SetGrowthFreezeConfig(freezeOnMismatch bool, recoveryWait time.Duration) { + t.freezeOnMismatch.Store(freezeOnMismatch) + t.stateLossRecoveryWait.Store(int64(recoveryWait)) +} + +// CheckReportedTopologyId freezes growth when a volume server reports a +// topology id different from this cluster's: the topology id survives raft +// state cleanup, so a mismatch means the master's state was rebuilt (or a +// foreign disk was cloned in). +func (t *Topology) CheckReportedTopologyId(reported string) { + if reported == "" || !t.freezeOnMismatch.Load() { + return + } + own := t.GetTopologyId() + if own == "" { + // The local topology id is still being minted. Keep the report so a + // later heartbeat echo cannot erase the mismatch on the server side + // before the freeze check ever ran. + t.reportedTopologyIdsLock.Lock() + if t.pendingReportedTopologyIds == nil { + t.pendingReportedTopologyIds = make(map[string]struct{}) + } + t.pendingReportedTopologyIds[reported] = struct{}{} + t.reportedTopologyIdsLock.Unlock() + return + } + if reported == own { + return + } + t.growthFrozenAt.Store(time.Now().UnixNano()) + if t.growthFrozen.CompareAndSwap(false, true) { + stats.MasterVolumeGrowthFrozen.Set(1) + glog.Errorf("volume growth frozen: a volume server reports topology id %s but this cluster is %s; the master state was rebuilt. Verify the cluster inventory, then run: volume.growth.resume", reported, own) + t.applyGrowthFreeze(true) + } +} + +func (t *Topology) IsGrowthFrozen() bool { + if !t.growthFrozen.Load() { + return false + } + if wait := t.stateLossRecoveryWait.Load(); wait > 0 { + if time.Duration(time.Now().UnixNano()-t.growthFrozenAt.Load()) > time.Duration(wait) { + if t.growthFrozen.CompareAndSwap(true, false) { + stats.MasterVolumeGrowthFrozen.Set(0) + glog.V(0).Infof("volume growth unfrozen after %v", time.Duration(wait)) + } + return false + } + } + return true +} + +func (t *Topology) ResumeVolumeGrowth() bool { + if !t.growthFrozen.CompareAndSwap(true, false) { + return false + } + stats.MasterVolumeGrowthFrozen.Set(0) + glog.V(0).Infof("volume growth resumed by operator") + t.applyGrowthFreeze(false) + return true +} + +// SetGrowthFrozen applies a replicated freeze state on every master. The +// timestamp lands before the flag so a reader can never see frozen with a +// zero time and misjudge the auto-resume window. +func (t *Topology) SetGrowthFrozen(frozen bool) { + if frozen { + t.growthFrozenAt.Store(time.Now().UnixNano()) + if t.growthFrozen.CompareAndSwap(false, true) { + stats.MasterVolumeGrowthFrozen.Set(1) + glog.V(0).Infof("volume growth freeze applied from raft") + } + return + } + if t.growthFrozen.CompareAndSwap(true, false) { + stats.MasterVolumeGrowthFrozen.Set(0) + } +} + +// applyGrowthFreeze replicates the freeze flag so followers keep it across a +// leader change. No raft server (single-master test topologies) just sets it. +func (t *Topology) applyGrowthFreeze(frozen bool) { + cmd := NewMaxVolumeIdCommand(t.GetMaxVolumeId(), t.GetTopologyId()) + cmd.GrowthFrozen = &frozen + t.RaftServerAccessLock.RLock() + defer t.RaftServerAccessLock.RUnlock() + if t.RaftServer != nil { + if _, err := t.RaftServer.Do(cmd); err != nil { + glog.Warningf("apply growth freeze %v: %v", frozen, err) + } + } else if t.HashicorpRaft != nil { + if b, err := json.Marshal(cmd); err != nil { + glog.Warningf("marshal growth freeze %v: %v", frozen, err) + } else if future := t.HashicorpRaft.Apply(b, time.Second); future.Error() != nil { + glog.Warningf("apply growth freeze %v: %v", frozen, future.Error()) + } + } else { + t.SetGrowthFrozen(frozen) + } +} + +// SetTopologyInitPending gates allocation while a topology id is being +// minted, so growth cannot slip in before the warmup window is installed. +func (t *Topology) SetTopologyInitPending(pending bool) { + t.topologyInitPending.Store(pending) + if pending { + return + } + t.reportedTopologyIdsLock.Lock() + reported := t.pendingReportedTopologyIds + t.pendingReportedTopologyIds = nil + t.reportedTopologyIdsLock.Unlock() + for id := range reported { + t.CheckReportedTopologyId(id) + } +} + +// DeferAllocation holds off new id allocation for d. Called when the leader +// mints a fresh topology id: on a rebuilt master that window gives veteran +// servers a pulse to raise the bound or trip the freeze. +func (t *Topology) DeferAllocation(d time.Duration) { + t.allocationNotBefore.Store(time.Now().Add(d).UnixNano()) +} + +func (t *Topology) allocationDelay() time.Duration { + return time.Until(time.Unix(0, t.allocationNotBefore.Load())) +} + // SetMaxVolumeIdFile mirrors the allocation bound to a file outside raft, so // a master whose raft state is gone still restores a safe boundary. An // existing file seeds both the bound and the topology id. @@ -970,6 +1126,10 @@ func (t *Topology) SetMaxVolumeIdFile(file string) { if cmd.TopologyId != "" { t.SetTopologyId(cmd.TopologyId) } + if cmd.GrowthFrozen != nil { + t.lastPersistedGrowthFrozen.Store(*cmd.GrowthFrozen) + t.SetGrowthFrozen(*cmd.GrowthFrozen) + } } // PersistMaxVolumeId writes the bound to the mirror file. Called by the @@ -977,8 +1137,9 @@ func (t *Topology) SetMaxVolumeIdFile(file string) { // recovery, so follower mirrors stay current too. func (t *Topology) PersistMaxVolumeId(vid needle.VolumeId) error { topoId := t.GetTopologyId() + frozen := t.IsGrowthFrozen() mirrored := func() bool { - return t.lastPersistedMaxVolumeId.Load() >= uint32(vid) && t.lastPersistedTopologyId.Load() == topoId + return t.lastPersistedMaxVolumeId.Load() >= uint32(vid) && t.lastPersistedTopologyId.Load() == topoId && t.lastPersistedGrowthFrozen.Load() == frozen } if mirrored() { return nil @@ -991,9 +1152,12 @@ func (t *Topology) PersistMaxVolumeId(vid needle.VolumeId) error { if t.maxVolumeIdFile == "" { t.lastPersistedMaxVolumeId.Store(uint32(vid)) t.lastPersistedTopologyId.Store(topoId) + t.lastPersistedGrowthFrozen.Store(frozen) return nil } - b, err := json.Marshal(NewMaxVolumeIdCommand(vid, topoId)) + cmd := NewMaxVolumeIdCommand(vid, topoId) + cmd.GrowthFrozen = &frozen + b, err := json.Marshal(cmd) if err != nil { return err } @@ -1021,5 +1185,6 @@ func (t *Topology) PersistMaxVolumeId(vid needle.VolumeId) error { } t.lastPersistedMaxVolumeId.Store(uint32(vid)) t.lastPersistedTopologyId.Store(topoId) + t.lastPersistedGrowthFrozen.Store(frozen) return nil }