weed shell: list volumes

This commit is contained in:
Chris Lu 2019-03-17 20:27:08 -07:00
parent 22fbbf023b
commit aca653c08b
13 changed files with 643 additions and 127 deletions

View file

@ -19,6 +19,8 @@ service Seaweed {
}
rpc CollectionDelete (CollectionDeleteRequest) returns (CollectionDeleteResponse) {
}
rpc VolumeList (VolumeListRequest) returns (VolumeListResponse) {
}
}
//////////////////////////////////////////////////
@ -151,3 +153,44 @@ message CollectionDeleteRequest {
}
message CollectionDeleteResponse {
}
//
// volume related
//
message DataNodeInfo {
string id = 1;
uint64 volume_count = 2;
uint64 max_volume_count = 3;
uint64 free_volume_count = 4;
uint64 active_volume_count = 5;
repeated VolumeInformationMessage volume_infos = 6;
}
message RackInfo {
string id = 1;
uint64 volume_count = 2;
uint64 max_volume_count = 3;
uint64 free_volume_count = 4;
uint64 active_volume_count = 5;
repeated DataNodeInfo data_node_infos = 6;
}
message DataCenterInfo {
string id = 1;
uint64 volume_count = 2;
uint64 max_volume_count = 3;
uint64 free_volume_count = 4;
uint64 active_volume_count = 5;
repeated RackInfo rack_infos = 6;
}
message TopologyInfo {
string id = 1;
uint64 volume_count = 2;
uint64 max_volume_count = 3;
uint64 free_volume_count = 4;
uint64 active_volume_count = 5;
repeated DataCenterInfo data_center_infos = 6;
}
message VolumeListRequest {
}
message VolumeListResponse {
TopologyInfo topology_info = 1;
}

View file

@ -23,11 +23,18 @@ It has these top-level messages:
AssignResponse
StatisticsRequest
StatisticsResponse
StorageType
Collection
CollectionListRequest
CollectionListResponse
CollectionDeleteRequest
CollectionDeleteResponse
DataNodeInfo
RackInfo
DataCenterInfo
TopologyInfo
VolumeListRequest
VolumeListResponse
*/
package master_pb
@ -680,16 +687,38 @@ func (m *StatisticsResponse) GetFileCount() uint64 {
return 0
}
type StorageType struct {
Replication string `protobuf:"bytes,1,opt,name=replication" json:"replication,omitempty"`
Ttl string `protobuf:"bytes,2,opt,name=ttl" json:"ttl,omitempty"`
}
func (m *StorageType) Reset() { *m = StorageType{} }
func (m *StorageType) String() string { return proto.CompactTextString(m) }
func (*StorageType) ProtoMessage() {}
func (*StorageType) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *StorageType) GetReplication() string {
if m != nil {
return m.Replication
}
return ""
}
func (m *StorageType) GetTtl() string {
if m != nil {
return m.Ttl
}
return ""
}
type Collection struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
Replication string `protobuf:"bytes,2,opt,name=replication" json:"replication,omitempty"`
Ttl string `protobuf:"bytes,3,opt,name=ttl" json:"ttl,omitempty"`
}
func (m *Collection) Reset() { *m = Collection{} }
func (m *Collection) String() string { return proto.CompactTextString(m) }
func (*Collection) ProtoMessage() {}
func (*Collection) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*Collection) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *Collection) GetName() string {
if m != nil {
@ -698,43 +727,13 @@ func (m *Collection) GetName() string {
return ""
}
func (m *Collection) GetReplication() string {
if m != nil {
return m.Replication
}
return ""
}
func (m *Collection) GetTtl() string {
if m != nil {
return m.Ttl
}
return ""
}
type CollectionListRequest struct {
Replication string `protobuf:"bytes,1,opt,name=replication" json:"replication,omitempty"`
Ttl string `protobuf:"bytes,2,opt,name=ttl" json:"ttl,omitempty"`
}
func (m *CollectionListRequest) Reset() { *m = CollectionListRequest{} }
func (m *CollectionListRequest) String() string { return proto.CompactTextString(m) }
func (*CollectionListRequest) ProtoMessage() {}
func (*CollectionListRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *CollectionListRequest) GetReplication() string {
if m != nil {
return m.Replication
}
return ""
}
func (m *CollectionListRequest) GetTtl() string {
if m != nil {
return m.Ttl
}
return ""
}
func (*CollectionListRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
type CollectionListResponse struct {
Collections []*Collection `protobuf:"bytes,1,rep,name=collections" json:"collections,omitempty"`
@ -743,7 +742,7 @@ type CollectionListResponse struct {
func (m *CollectionListResponse) Reset() { *m = CollectionListResponse{} }
func (m *CollectionListResponse) String() string { return proto.CompactTextString(m) }
func (*CollectionListResponse) ProtoMessage() {}
func (*CollectionListResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*CollectionListResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *CollectionListResponse) GetCollections() []*Collection {
if m != nil {
@ -759,7 +758,7 @@ type CollectionDeleteRequest struct {
func (m *CollectionDeleteRequest) Reset() { *m = CollectionDeleteRequest{} }
func (m *CollectionDeleteRequest) String() string { return proto.CompactTextString(m) }
func (*CollectionDeleteRequest) ProtoMessage() {}
func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*CollectionDeleteRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *CollectionDeleteRequest) GetName() string {
if m != nil {
@ -774,7 +773,258 @@ type CollectionDeleteResponse struct {
func (m *CollectionDeleteResponse) Reset() { *m = CollectionDeleteResponse{} }
func (m *CollectionDeleteResponse) String() string { return proto.CompactTextString(m) }
func (*CollectionDeleteResponse) ProtoMessage() {}
func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*CollectionDeleteResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
//
// volume related
//
type DataNodeInfo struct {
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
VolumeCount uint64 `protobuf:"varint,2,opt,name=volume_count,json=volumeCount" json:"volume_count,omitempty"`
MaxVolumeCount uint64 `protobuf:"varint,3,opt,name=max_volume_count,json=maxVolumeCount" json:"max_volume_count,omitempty"`
FreeVolumeCount uint64 `protobuf:"varint,4,opt,name=free_volume_count,json=freeVolumeCount" json:"free_volume_count,omitempty"`
ActiveVolumeCount uint64 `protobuf:"varint,5,opt,name=active_volume_count,json=activeVolumeCount" json:"active_volume_count,omitempty"`
VolumeInfos []*VolumeInformationMessage `protobuf:"bytes,6,rep,name=volume_infos,json=volumeInfos" json:"volume_infos,omitempty"`
}
func (m *DataNodeInfo) Reset() { *m = DataNodeInfo{} }
func (m *DataNodeInfo) String() string { return proto.CompactTextString(m) }
func (*DataNodeInfo) ProtoMessage() {}
func (*DataNodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *DataNodeInfo) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *DataNodeInfo) GetVolumeCount() uint64 {
if m != nil {
return m.VolumeCount
}
return 0
}
func (m *DataNodeInfo) GetMaxVolumeCount() uint64 {
if m != nil {
return m.MaxVolumeCount
}
return 0
}
func (m *DataNodeInfo) GetFreeVolumeCount() uint64 {
if m != nil {
return m.FreeVolumeCount
}
return 0
}
func (m *DataNodeInfo) GetActiveVolumeCount() uint64 {
if m != nil {
return m.ActiveVolumeCount
}
return 0
}
func (m *DataNodeInfo) GetVolumeInfos() []*VolumeInformationMessage {
if m != nil {
return m.VolumeInfos
}
return nil
}
type RackInfo struct {
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
VolumeCount uint64 `protobuf:"varint,2,opt,name=volume_count,json=volumeCount" json:"volume_count,omitempty"`
MaxVolumeCount uint64 `protobuf:"varint,3,opt,name=max_volume_count,json=maxVolumeCount" json:"max_volume_count,omitempty"`
FreeVolumeCount uint64 `protobuf:"varint,4,opt,name=free_volume_count,json=freeVolumeCount" json:"free_volume_count,omitempty"`
ActiveVolumeCount uint64 `protobuf:"varint,5,opt,name=active_volume_count,json=activeVolumeCount" json:"active_volume_count,omitempty"`
DataNodeInfos []*DataNodeInfo `protobuf:"bytes,6,rep,name=data_node_infos,json=dataNodeInfos" json:"data_node_infos,omitempty"`
}
func (m *RackInfo) Reset() { *m = RackInfo{} }
func (m *RackInfo) String() string { return proto.CompactTextString(m) }
func (*RackInfo) ProtoMessage() {}
func (*RackInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *RackInfo) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *RackInfo) GetVolumeCount() uint64 {
if m != nil {
return m.VolumeCount
}
return 0
}
func (m *RackInfo) GetMaxVolumeCount() uint64 {
if m != nil {
return m.MaxVolumeCount
}
return 0
}
func (m *RackInfo) GetFreeVolumeCount() uint64 {
if m != nil {
return m.FreeVolumeCount
}
return 0
}
func (m *RackInfo) GetActiveVolumeCount() uint64 {
if m != nil {
return m.ActiveVolumeCount
}
return 0
}
func (m *RackInfo) GetDataNodeInfos() []*DataNodeInfo {
if m != nil {
return m.DataNodeInfos
}
return nil
}
type DataCenterInfo struct {
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
VolumeCount uint64 `protobuf:"varint,2,opt,name=volume_count,json=volumeCount" json:"volume_count,omitempty"`
MaxVolumeCount uint64 `protobuf:"varint,3,opt,name=max_volume_count,json=maxVolumeCount" json:"max_volume_count,omitempty"`
FreeVolumeCount uint64 `protobuf:"varint,4,opt,name=free_volume_count,json=freeVolumeCount" json:"free_volume_count,omitempty"`
ActiveVolumeCount uint64 `protobuf:"varint,5,opt,name=active_volume_count,json=activeVolumeCount" json:"active_volume_count,omitempty"`
RackInfos []*RackInfo `protobuf:"bytes,6,rep,name=rack_infos,json=rackInfos" json:"rack_infos,omitempty"`
}
func (m *DataCenterInfo) Reset() { *m = DataCenterInfo{} }
func (m *DataCenterInfo) String() string { return proto.CompactTextString(m) }
func (*DataCenterInfo) ProtoMessage() {}
func (*DataCenterInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *DataCenterInfo) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *DataCenterInfo) GetVolumeCount() uint64 {
if m != nil {
return m.VolumeCount
}
return 0
}
func (m *DataCenterInfo) GetMaxVolumeCount() uint64 {
if m != nil {
return m.MaxVolumeCount
}
return 0
}
func (m *DataCenterInfo) GetFreeVolumeCount() uint64 {
if m != nil {
return m.FreeVolumeCount
}
return 0
}
func (m *DataCenterInfo) GetActiveVolumeCount() uint64 {
if m != nil {
return m.ActiveVolumeCount
}
return 0
}
func (m *DataCenterInfo) GetRackInfos() []*RackInfo {
if m != nil {
return m.RackInfos
}
return nil
}
type TopologyInfo struct {
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
VolumeCount uint64 `protobuf:"varint,2,opt,name=volume_count,json=volumeCount" json:"volume_count,omitempty"`
MaxVolumeCount uint64 `protobuf:"varint,3,opt,name=max_volume_count,json=maxVolumeCount" json:"max_volume_count,omitempty"`
FreeVolumeCount uint64 `protobuf:"varint,4,opt,name=free_volume_count,json=freeVolumeCount" json:"free_volume_count,omitempty"`
ActiveVolumeCount uint64 `protobuf:"varint,5,opt,name=active_volume_count,json=activeVolumeCount" json:"active_volume_count,omitempty"`
DataCenterInfos []*DataCenterInfo `protobuf:"bytes,6,rep,name=data_center_infos,json=dataCenterInfos" json:"data_center_infos,omitempty"`
}
func (m *TopologyInfo) Reset() { *m = TopologyInfo{} }
func (m *TopologyInfo) String() string { return proto.CompactTextString(m) }
func (*TopologyInfo) ProtoMessage() {}
func (*TopologyInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (m *TopologyInfo) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *TopologyInfo) GetVolumeCount() uint64 {
if m != nil {
return m.VolumeCount
}
return 0
}
func (m *TopologyInfo) GetMaxVolumeCount() uint64 {
if m != nil {
return m.MaxVolumeCount
}
return 0
}
func (m *TopologyInfo) GetFreeVolumeCount() uint64 {
if m != nil {
return m.FreeVolumeCount
}
return 0
}
func (m *TopologyInfo) GetActiveVolumeCount() uint64 {
if m != nil {
return m.ActiveVolumeCount
}
return 0
}
func (m *TopologyInfo) GetDataCenterInfos() []*DataCenterInfo {
if m != nil {
return m.DataCenterInfos
}
return nil
}
type VolumeListRequest struct {
}
func (m *VolumeListRequest) Reset() { *m = VolumeListRequest{} }
func (m *VolumeListRequest) String() string { return proto.CompactTextString(m) }
func (*VolumeListRequest) ProtoMessage() {}
func (*VolumeListRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
type VolumeListResponse struct {
TopologyInfo *TopologyInfo `protobuf:"bytes,1,opt,name=topology_info,json=topologyInfo" json:"topology_info,omitempty"`
}
func (m *VolumeListResponse) Reset() { *m = VolumeListResponse{} }
func (m *VolumeListResponse) String() string { return proto.CompactTextString(m) }
func (*VolumeListResponse) ProtoMessage() {}
func (*VolumeListResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (m *VolumeListResponse) GetTopologyInfo() *TopologyInfo {
if m != nil {
return m.TopologyInfo
}
return nil
}
func init() {
proto.RegisterType((*Heartbeat)(nil), "master_pb.Heartbeat")
@ -793,11 +1043,18 @@ func init() {
proto.RegisterType((*AssignResponse)(nil), "master_pb.AssignResponse")
proto.RegisterType((*StatisticsRequest)(nil), "master_pb.StatisticsRequest")
proto.RegisterType((*StatisticsResponse)(nil), "master_pb.StatisticsResponse")
proto.RegisterType((*StorageType)(nil), "master_pb.StorageType")
proto.RegisterType((*Collection)(nil), "master_pb.Collection")
proto.RegisterType((*CollectionListRequest)(nil), "master_pb.CollectionListRequest")
proto.RegisterType((*CollectionListResponse)(nil), "master_pb.CollectionListResponse")
proto.RegisterType((*CollectionDeleteRequest)(nil), "master_pb.CollectionDeleteRequest")
proto.RegisterType((*CollectionDeleteResponse)(nil), "master_pb.CollectionDeleteResponse")
proto.RegisterType((*DataNodeInfo)(nil), "master_pb.DataNodeInfo")
proto.RegisterType((*RackInfo)(nil), "master_pb.RackInfo")
proto.RegisterType((*DataCenterInfo)(nil), "master_pb.DataCenterInfo")
proto.RegisterType((*TopologyInfo)(nil), "master_pb.TopologyInfo")
proto.RegisterType((*VolumeListRequest)(nil), "master_pb.VolumeListRequest")
proto.RegisterType((*VolumeListResponse)(nil), "master_pb.VolumeListResponse")
}
// Reference imports to suppress errors if they are not otherwise used.
@ -818,6 +1075,7 @@ type SeaweedClient interface {
Statistics(ctx context.Context, in *StatisticsRequest, opts ...grpc.CallOption) (*StatisticsResponse, error)
CollectionList(ctx context.Context, in *CollectionListRequest, opts ...grpc.CallOption) (*CollectionListResponse, error)
CollectionDelete(ctx context.Context, in *CollectionDeleteRequest, opts ...grpc.CallOption) (*CollectionDeleteResponse, error)
VolumeList(ctx context.Context, in *VolumeListRequest, opts ...grpc.CallOption) (*VolumeListResponse, error)
}
type seaweedClient struct {
@ -935,6 +1193,15 @@ func (c *seaweedClient) CollectionDelete(ctx context.Context, in *CollectionDele
return out, nil
}
func (c *seaweedClient) VolumeList(ctx context.Context, in *VolumeListRequest, opts ...grpc.CallOption) (*VolumeListResponse, error) {
out := new(VolumeListResponse)
err := grpc.Invoke(ctx, "/master_pb.Seaweed/VolumeList", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for Seaweed service
type SeaweedServer interface {
@ -945,6 +1212,7 @@ type SeaweedServer interface {
Statistics(context.Context, *StatisticsRequest) (*StatisticsResponse, error)
CollectionList(context.Context, *CollectionListRequest) (*CollectionListResponse, error)
CollectionDelete(context.Context, *CollectionDeleteRequest) (*CollectionDeleteResponse, error)
VolumeList(context.Context, *VolumeListRequest) (*VolumeListResponse, error)
}
func RegisterSeaweedServer(s *grpc.Server, srv SeaweedServer) {
@ -1093,6 +1361,24 @@ func _Seaweed_CollectionDelete_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler)
}
func _Seaweed_VolumeList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(VolumeListRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(SeaweedServer).VolumeList(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/master_pb.Seaweed/VolumeList",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(SeaweedServer).VolumeList(ctx, req.(*VolumeListRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Seaweed_serviceDesc = grpc.ServiceDesc{
ServiceName: "master_pb.Seaweed",
HandlerType: (*SeaweedServer)(nil),
@ -1117,6 +1403,10 @@ var _Seaweed_serviceDesc = grpc.ServiceDesc{
MethodName: "CollectionDelete",
Handler: _Seaweed_CollectionDelete_Handler,
},
{
MethodName: "VolumeList",
Handler: _Seaweed_VolumeList_Handler,
},
},
Streams: []grpc.StreamDesc{
{
@ -1138,78 +1428,93 @@ var _Seaweed_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("master.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1164 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x57, 0xdd, 0x72, 0xdb, 0x44,
0x14, 0xae, 0xe4, 0x5f, 0x1d, 0xc7, 0xae, 0xb3, 0x49, 0x8b, 0xea, 0xd2, 0xd6, 0x55, 0x6f, 0xcc,
0x00, 0x99, 0x12, 0x2e, 0xb8, 0x60, 0x18, 0x86, 0x9a, 0x30, 0x64, 0x12, 0x68, 0xaa, 0xb4, 0x65,
0x86, 0x19, 0x46, 0x6c, 0xa4, 0x93, 0xb0, 0x13, 0x59, 0x12, 0xd2, 0x3a, 0xb1, 0x7b, 0xc3, 0x43,
0xf0, 0x3e, 0x70, 0x01, 0x77, 0x3c, 0x0a, 0x77, 0x3c, 0x01, 0xb3, 0x3f, 0x92, 0x65, 0xd9, 0x49,
0x3a, 0xcc, 0x70, 0xb7, 0xfa, 0xf6, 0xec, 0xd9, 0xb3, 0xdf, 0x77, 0x7e, 0x6c, 0xd8, 0x98, 0xd0,
0x8c, 0x63, 0xba, 0x93, 0xa4, 0x31, 0x8f, 0x89, 0xa5, 0xbe, 0xbc, 0xe4, 0xc4, 0xf9, 0xdb, 0x04,
0xeb, 0x6b, 0xa4, 0x29, 0x3f, 0x41, 0xca, 0x49, 0x0f, 0x4c, 0x96, 0xd8, 0xc6, 0xd0, 0x18, 0x59,
0xae, 0xc9, 0x12, 0x42, 0xa0, 0x9e, 0xc4, 0x29, 0xb7, 0xcd, 0xa1, 0x31, 0xea, 0xba, 0x72, 0x4d,
0x1e, 0x00, 0x24, 0xd3, 0x93, 0x90, 0xf9, 0xde, 0x34, 0x0d, 0xed, 0x9a, 0xb4, 0xb5, 0x14, 0xf2,
0x2a, 0x0d, 0xc9, 0x08, 0xfa, 0x13, 0x3a, 0xf3, 0x2e, 0xe2, 0x70, 0x3a, 0x41, 0xcf, 0x8f, 0xa7,
0x11, 0xb7, 0xeb, 0xf2, 0x78, 0x6f, 0x42, 0x67, 0xaf, 0x25, 0x3c, 0x16, 0x28, 0x19, 0x8a, 0xa8,
0x66, 0xde, 0x29, 0x0b, 0xd1, 0x3b, 0xc7, 0xb9, 0xdd, 0x18, 0x1a, 0xa3, 0xba, 0x0b, 0x13, 0x3a,
0xfb, 0x8a, 0x85, 0x78, 0x80, 0x73, 0xf2, 0x08, 0x3a, 0x01, 0xe5, 0xd4, 0xf3, 0x31, 0xe2, 0x98,
0xda, 0x4d, 0x79, 0x17, 0x08, 0x68, 0x2c, 0x11, 0x11, 0x5f, 0x4a, 0xfd, 0x73, 0xbb, 0x25, 0x77,
0xe4, 0x5a, 0xc4, 0x47, 0x83, 0x09, 0x8b, 0x3c, 0x19, 0x79, 0x5b, 0x5e, 0x6d, 0x49, 0xe4, 0x48,
0x84, 0xff, 0x19, 0xb4, 0x54, 0x6c, 0x99, 0x6d, 0x0d, 0x6b, 0xa3, 0xce, 0xee, 0x93, 0x9d, 0x82,
0x8d, 0x1d, 0x15, 0xde, 0x7e, 0x74, 0x1a, 0xa7, 0x13, 0xca, 0x59, 0x1c, 0x7d, 0x83, 0x59, 0x46,
0xcf, 0xd0, 0xcd, 0xcf, 0x90, 0x7b, 0xd0, 0x8e, 0xf0, 0xd2, 0xbb, 0x60, 0x41, 0x66, 0xc3, 0xb0,
0x36, 0xea, 0xba, 0xad, 0x08, 0x2f, 0x5f, 0xb3, 0x20, 0x23, 0x8f, 0x61, 0x23, 0xc0, 0x10, 0x39,
0x06, 0x6a, 0xbb, 0x23, 0xb7, 0x3b, 0x1a, 0x13, 0x26, 0xce, 0x2b, 0xd8, 0x2c, 0xc8, 0x76, 0x31,
0x4b, 0xe2, 0x28, 0x43, 0x32, 0x82, 0xdb, 0xca, 0xfb, 0x31, 0x7b, 0x83, 0x87, 0x6c, 0xc2, 0xb8,
0x54, 0xa0, 0xee, 0x56, 0x61, 0x72, 0x17, 0x9a, 0x21, 0xd2, 0x00, 0x53, 0x4d, 0xbb, 0xfe, 0x72,
0xfe, 0x34, 0xc1, 0xbe, 0x2a, 0x74, 0xa9, 0x69, 0x20, 0x3d, 0x76, 0x5d, 0x93, 0x05, 0x82, 0xb3,
0x8c, 0xbd, 0x41, 0xa9, 0x69, 0xdd, 0x95, 0x6b, 0xf2, 0x10, 0xc0, 0x8f, 0xc3, 0x10, 0x7d, 0x71,
0x50, 0x3b, 0x2f, 0x21, 0x82, 0x53, 0x29, 0xd3, 0x42, 0xce, 0xba, 0x6b, 0x09, 0x44, 0x29, 0x59,
0xbc, 0x5c, 0x1b, 0x28, 0x25, 0xf5, 0xcb, 0x95, 0xc9, 0x07, 0x40, 0x72, 0x72, 0x4e, 0xe6, 0x85,
0x61, 0x53, 0x1a, 0xf6, 0xf5, 0xce, 0xb3, 0x79, 0x6e, 0x7d, 0x1f, 0xac, 0x14, 0x69, 0xe0, 0xc5,
0x51, 0x38, 0x97, 0xe2, 0xb6, 0xdd, 0xb6, 0x00, 0x9e, 0x47, 0xe1, 0x9c, 0xbc, 0x0f, 0x9b, 0x29,
0x26, 0x21, 0xf3, 0xa9, 0x97, 0x84, 0xd4, 0xc7, 0x09, 0x46, 0xb9, 0xce, 0x7d, 0xbd, 0x71, 0x94,
0xe3, 0xc4, 0x86, 0xd6, 0x05, 0xa6, 0x99, 0x78, 0x96, 0x25, 0x4d, 0xf2, 0x4f, 0xd2, 0x87, 0x1a,
0xe7, 0xa1, 0x0d, 0x12, 0x15, 0x4b, 0xa7, 0x05, 0x8d, 0xbd, 0x49, 0xc2, 0xe7, 0xce, 0x6f, 0x06,
0xdc, 0x3e, 0x9e, 0x26, 0x98, 0x3e, 0x0b, 0x63, 0xff, 0x7c, 0x6f, 0xc6, 0x53, 0x4a, 0x9e, 0x43,
0x0f, 0x53, 0x9a, 0x4d, 0x53, 0x11, 0x7b, 0xc0, 0xa2, 0x33, 0x49, 0x69, 0x67, 0x77, 0x54, 0x4a,
0x9f, 0xca, 0x99, 0x9d, 0x3d, 0x75, 0x60, 0x2c, 0xed, 0xdd, 0x2e, 0x96, 0x3f, 0x07, 0xdf, 0x43,
0x77, 0x69, 0x5f, 0x08, 0x23, 0x52, 0x5b, 0x4b, 0x25, 0xd7, 0x42, 0xf1, 0x84, 0xa6, 0x8c, 0xcf,
0x75, 0x09, 0xea, 0x2f, 0x21, 0x88, 0xae, 0x30, 0x91, 0x69, 0x35, 0x99, 0x69, 0x96, 0x42, 0xf6,
0x83, 0xcc, 0x79, 0x0f, 0xb6, 0xc6, 0x21, 0xc3, 0x88, 0x1f, 0xb2, 0x8c, 0x63, 0xe4, 0xe2, 0xcf,
0x53, 0xcc, 0xb8, 0xb8, 0x21, 0xa2, 0x13, 0xd4, 0x05, 0x2e, 0xd7, 0xce, 0x2f, 0xd0, 0x53, 0xa9,
0x73, 0x18, 0xfb, 0x32, 0x6f, 0x04, 0x31, 0xa2, 0xb2, 0x95, 0x91, 0x58, 0x56, 0x4a, 0xde, 0xac,
0x96, 0x7c, 0xb9, 0x26, 0x6a, 0xd7, 0xd7, 0x44, 0x7d, 0xb5, 0x26, 0x5e, 0xc2, 0xd6, 0x61, 0x1c,
0x9f, 0x4f, 0x13, 0x15, 0x46, 0x1e, 0xeb, 0xf2, 0x0b, 0x8d, 0x61, 0x4d, 0xdc, 0x59, 0xbc, 0xb0,
0x92, 0xb1, 0x66, 0x35, 0x63, 0x9d, 0x7f, 0x0c, 0xd8, 0x5e, 0x76, 0xab, 0xab, 0xed, 0x47, 0xd8,
0x2a, 0xfc, 0x7a, 0xa1, 0x7e, 0xb3, 0xba, 0xa0, 0xb3, 0xfb, 0xb4, 0x24, 0xe6, 0xba, 0xd3, 0x79,
0x83, 0x08, 0x72, 0xb2, 0xdc, 0xcd, 0x8b, 0x0a, 0x92, 0x0d, 0x66, 0xd0, 0xaf, 0x9a, 0x89, 0x84,
0x2e, 0x6e, 0xd5, 0xcc, 0xb6, 0xf3, 0x93, 0xe4, 0x23, 0xb0, 0x16, 0x81, 0x98, 0x32, 0x90, 0xad,
0xa5, 0x40, 0xf4, 0x5d, 0x0b, 0x2b, 0xb2, 0x0d, 0x0d, 0x4c, 0xd3, 0x38, 0x6f, 0x04, 0xea, 0xc3,
0xf9, 0x14, 0xda, 0xff, 0x59, 0x45, 0xe7, 0x2f, 0x03, 0xba, 0x5f, 0x64, 0x19, 0x3b, 0x2b, 0xd2,
0x65, 0x1b, 0x1a, 0xaa, 0x4c, 0x55, 0x3b, 0x52, 0x1f, 0x64, 0x08, 0x1d, 0x5d, 0x65, 0x25, 0xea,
0xcb, 0xd0, 0x8d, 0xdd, 0x44, 0x57, 0x5e, 0x5d, 0x85, 0xc6, 0x79, 0x58, 0x6d, 0xf4, 0x8d, 0x2b,
0x1b, 0x7d, 0xb3, 0xd4, 0xe8, 0xef, 0x83, 0x25, 0x0f, 0x45, 0x71, 0x80, 0x7a, 0x02, 0xb4, 0x05,
0xf0, 0x6d, 0x1c, 0xa0, 0xf3, 0xab, 0x01, 0xbd, 0xfc, 0x35, 0x5a, 0xf9, 0x3e, 0xd4, 0x4e, 0x0b,
0xf6, 0xc5, 0x32, 0xe7, 0xc8, 0xbc, 0x8a, 0xa3, 0x95, 0xe1, 0x56, 0x30, 0x52, 0x2f, 0x33, 0x52,
0x88, 0xd1, 0x28, 0x89, 0x21, 0x42, 0xa6, 0x53, 0xfe, 0x53, 0x1e, 0xb2, 0x58, 0x3b, 0x67, 0xb0,
0x79, 0xcc, 0x29, 0x67, 0x19, 0x67, 0x7e, 0x96, 0xd3, 0x5c, 0x21, 0xd4, 0xb8, 0x89, 0x50, 0xf3,
0x2a, 0x42, 0x6b, 0x05, 0xa1, 0xce, 0x1f, 0x06, 0x90, 0xf2, 0x4d, 0x9a, 0x82, 0xff, 0xe1, 0x2a,
0x41, 0x19, 0x8f, 0x39, 0x0d, 0x3d, 0x39, 0x55, 0xf4, 0x6c, 0x90, 0x88, 0x18, 0x5c, 0x42, 0xa5,
0x69, 0x86, 0x81, 0xda, 0x55, 0x83, 0xa1, 0x2d, 0x00, 0xb9, 0xb9, 0x3c, 0x57, 0x9a, 0x95, 0xb9,
0xe2, 0xbc, 0x04, 0x18, 0x2f, 0xae, 0x5e, 0xd3, 0xbd, 0xde, 0x22, 0x19, 0x57, 0xb9, 0x39, 0x80,
0x3b, 0x0b, 0xaf, 0xa2, 0x41, 0xbe, 0xbd, 0x10, 0xda, 0x99, 0xb9, 0x70, 0xf6, 0x02, 0xee, 0x56,
0x9d, 0x69, 0xae, 0x3f, 0x81, 0xce, 0x82, 0xb7, 0xbc, 0xc1, 0xdc, 0x29, 0xd5, 0xf5, 0xe2, 0x9c,
0x5b, 0xb6, 0x74, 0x3e, 0x84, 0x77, 0x16, 0x5b, 0x5f, 0xca, 0x4e, 0x79, 0x5d, 0x03, 0x1f, 0x80,
0xbd, 0x6a, 0xae, 0x62, 0xd8, 0xfd, 0xbd, 0x0e, 0xad, 0x63, 0xa4, 0x97, 0x88, 0x01, 0xd9, 0x87,
0xee, 0x31, 0x46, 0xc1, 0xe2, 0xc7, 0xde, 0x76, 0x29, 0x96, 0x02, 0x1d, 0xbc, 0xbb, 0x0e, 0xcd,
0x1d, 0x3a, 0xb7, 0x46, 0xc6, 0x53, 0x83, 0x1c, 0x41, 0xf7, 0x00, 0x31, 0x19, 0xc7, 0x51, 0x84,
0x3e, 0xc7, 0x80, 0x3c, 0x2c, 0x3f, 0x6b, 0x75, 0xf0, 0x0c, 0xee, 0xad, 0xfc, 0xc6, 0xca, 0xfb,
0x94, 0xf6, 0xf8, 0x02, 0x36, 0xca, 0xfd, 0x76, 0xc9, 0xe1, 0x9a, 0xe9, 0x30, 0x78, 0x74, 0x43,
0xa3, 0x76, 0x6e, 0x91, 0xcf, 0xa1, 0xa9, 0x1a, 0x00, 0xb1, 0x4b, 0xc6, 0x4b, 0x1d, 0x6e, 0x29,
0xae, 0xe5, 0x6e, 0xe1, 0xdc, 0x22, 0x07, 0x00, 0x8b, 0x12, 0x22, 0x65, 0x5e, 0x56, 0x6a, 0x78,
0xf0, 0xe0, 0x8a, 0xdd, 0xc2, 0xd9, 0x77, 0xd0, 0x5b, 0xce, 0x13, 0x32, 0x5c, 0x9b, 0x0a, 0xa5,
0x7c, 0x1c, 0x3c, 0xbe, 0xc6, 0xa2, 0x70, 0xfc, 0x03, 0xf4, 0xab, 0xf2, 0x13, 0x67, 0xed, 0xc1,
0xa5, 0x54, 0x1a, 0x3c, 0xb9, 0xd6, 0x26, 0x77, 0x7f, 0xd2, 0x94, 0xff, 0x18, 0x3e, 0xfe, 0x37,
0x00, 0x00, 0xff, 0xff, 0xb1, 0x11, 0x1b, 0x49, 0x41, 0x0c, 0x00, 0x00,
// 1394 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x58, 0x4b, 0x6f, 0xdb, 0xc6,
0x13, 0x37, 0xa9, 0x87, 0xc5, 0xd1, 0xc3, 0xd2, 0xda, 0x49, 0x18, 0xe5, 0x9f, 0x44, 0x61, 0x2e,
0xfa, 0xbf, 0x8c, 0xd4, 0x3d, 0xf4, 0xd0, 0x16, 0x41, 0xe2, 0x38, 0x68, 0x10, 0xb7, 0x49, 0xe8,
0x24, 0x05, 0x0a, 0x14, 0xea, 0x9a, 0x1c, 0xbb, 0x84, 0x29, 0x92, 0x25, 0x57, 0x8e, 0x95, 0x4b,
0x2f, 0x3d, 0x16, 0xed, 0xa1, 0xdf, 0xa7, 0x97, 0xf6, 0xd6, 0x8f, 0xd2, 0x5b, 0xef, 0x05, 0x8a,
0x7d, 0x90, 0x5a, 0x52, 0xb2, 0x13, 0x14, 0xe8, 0x21, 0xb7, 0xdd, 0x99, 0xd9, 0xdd, 0xe1, 0xef,
0x37, 0x2f, 0x09, 0x3a, 0x53, 0x9a, 0x31, 0x4c, 0xb7, 0x93, 0x34, 0x66, 0x31, 0xb1, 0xe4, 0x6e,
0x92, 0x1c, 0x3a, 0xbf, 0x9b, 0x60, 0x7d, 0x82, 0x34, 0x65, 0x87, 0x48, 0x19, 0xe9, 0x81, 0x19,
0x24, 0xb6, 0x31, 0x32, 0xc6, 0x96, 0x6b, 0x06, 0x09, 0x21, 0x50, 0x4f, 0xe2, 0x94, 0xd9, 0xe6,
0xc8, 0x18, 0x77, 0x5d, 0xb1, 0x26, 0xd7, 0x01, 0x92, 0xd9, 0x61, 0x18, 0x78, 0x93, 0x59, 0x1a,
0xda, 0x35, 0x61, 0x6b, 0x49, 0xc9, 0x8b, 0x34, 0x24, 0x63, 0xe8, 0x4f, 0xe9, 0xd9, 0xe4, 0x34,
0x0e, 0x67, 0x53, 0x9c, 0x78, 0xf1, 0x2c, 0x62, 0x76, 0x5d, 0x1c, 0xef, 0x4d, 0xe9, 0xd9, 0x4b,
0x21, 0xde, 0xe5, 0x52, 0x32, 0xe2, 0x5e, 0x9d, 0x4d, 0x8e, 0x82, 0x10, 0x27, 0x27, 0x38, 0xb7,
0x1b, 0x23, 0x63, 0x5c, 0x77, 0x61, 0x4a, 0xcf, 0x1e, 0x06, 0x21, 0x3e, 0xc6, 0x39, 0xb9, 0x09,
0x6d, 0x9f, 0x32, 0x3a, 0xf1, 0x30, 0x62, 0x98, 0xda, 0x4d, 0xf1, 0x16, 0x70, 0xd1, 0xae, 0x90,
0x70, 0xff, 0x52, 0xea, 0x9d, 0xd8, 0xeb, 0x42, 0x23, 0xd6, 0xdc, 0x3f, 0xea, 0x4f, 0x83, 0x68,
0x22, 0x3c, 0x6f, 0x89, 0xa7, 0x2d, 0x21, 0x79, 0xca, 0xdd, 0xff, 0x18, 0xd6, 0xa5, 0x6f, 0x99,
0x6d, 0x8d, 0x6a, 0xe3, 0xf6, 0xce, 0xed, 0xed, 0x02, 0x8d, 0x6d, 0xe9, 0xde, 0xa3, 0xe8, 0x28,
0x4e, 0xa7, 0x94, 0x05, 0x71, 0xf4, 0x29, 0x66, 0x19, 0x3d, 0x46, 0x37, 0x3f, 0x43, 0xae, 0x42,
0x2b, 0xc2, 0x57, 0x93, 0xd3, 0xc0, 0xcf, 0x6c, 0x18, 0xd5, 0xc6, 0x5d, 0x77, 0x3d, 0xc2, 0x57,
0x2f, 0x03, 0x3f, 0x23, 0xb7, 0xa0, 0xe3, 0x63, 0x88, 0x0c, 0x7d, 0xa9, 0x6e, 0x0b, 0x75, 0x5b,
0xc9, 0xb8, 0x89, 0xf3, 0x02, 0x06, 0x05, 0xd8, 0x2e, 0x66, 0x49, 0x1c, 0x65, 0x48, 0xc6, 0xb0,
0x21, 0x6f, 0x3f, 0x08, 0x5e, 0xe3, 0x7e, 0x30, 0x0d, 0x98, 0x60, 0xa0, 0xee, 0x56, 0xc5, 0xe4,
0x32, 0x34, 0x43, 0xa4, 0x3e, 0xa6, 0x0a, 0x76, 0xb5, 0x73, 0x7e, 0x35, 0xc1, 0x3e, 0xcf, 0x75,
0xc1, 0xa9, 0x2f, 0x6e, 0xec, 0xba, 0x66, 0xe0, 0x73, 0xcc, 0xb2, 0xe0, 0x35, 0x0a, 0x4e, 0xeb,
0xae, 0x58, 0x93, 0x1b, 0x00, 0x5e, 0x1c, 0x86, 0xe8, 0xf1, 0x83, 0xea, 0x72, 0x4d, 0xc2, 0x31,
0x15, 0x34, 0x2d, 0xe8, 0xac, 0xbb, 0x16, 0x97, 0x48, 0x26, 0x8b, 0x2f, 0x57, 0x06, 0x92, 0x49,
0xf5, 0xe5, 0xd2, 0xe4, 0x7f, 0x40, 0x72, 0x70, 0x0e, 0xe7, 0x85, 0x61, 0x53, 0x18, 0xf6, 0x95,
0xe6, 0xfe, 0x3c, 0xb7, 0xbe, 0x06, 0x56, 0x8a, 0xd4, 0x9f, 0xc4, 0x51, 0x38, 0x17, 0xe4, 0xb6,
0xdc, 0x16, 0x17, 0x3c, 0x89, 0xc2, 0x39, 0xf9, 0x2f, 0x0c, 0x52, 0x4c, 0xc2, 0xc0, 0xa3, 0x93,
0x24, 0xa4, 0x1e, 0x4e, 0x31, 0xca, 0x79, 0xee, 0x2b, 0xc5, 0xd3, 0x5c, 0x4e, 0x6c, 0x58, 0x3f,
0xc5, 0x34, 0xe3, 0x9f, 0x65, 0x09, 0x93, 0x7c, 0x4b, 0xfa, 0x50, 0x63, 0x2c, 0xb4, 0x41, 0x48,
0xf9, 0xd2, 0x59, 0x87, 0xc6, 0xde, 0x34, 0x61, 0x73, 0xe7, 0x67, 0x03, 0x36, 0x0e, 0x66, 0x09,
0xa6, 0xf7, 0xc3, 0xd8, 0x3b, 0xd9, 0x3b, 0x63, 0x29, 0x25, 0x4f, 0xa0, 0x87, 0x29, 0xcd, 0x66,
0x29, 0xf7, 0xdd, 0x0f, 0xa2, 0x63, 0x01, 0x69, 0x7b, 0x67, 0xac, 0x85, 0x4f, 0xe5, 0xcc, 0xf6,
0x9e, 0x3c, 0xb0, 0x2b, 0xec, 0xdd, 0x2e, 0xea, 0xdb, 0xe1, 0x17, 0xd0, 0x2d, 0xe9, 0x39, 0x31,
0x3c, 0xb4, 0x15, 0x55, 0x62, 0xcd, 0x19, 0x4f, 0x68, 0x1a, 0xb0, 0xb9, 0x4a, 0x41, 0xb5, 0xe3,
0x84, 0xa8, 0x0c, 0xe3, 0x91, 0x56, 0x13, 0x91, 0x66, 0x49, 0xc9, 0x23, 0x3f, 0x73, 0xfe, 0x0d,
0x9b, 0xbb, 0x61, 0x80, 0x11, 0xdb, 0x0f, 0x32, 0x86, 0x91, 0x8b, 0xdf, 0xcc, 0x30, 0x63, 0xfc,
0x85, 0x88, 0x4e, 0x51, 0x25, 0xb8, 0x58, 0x3b, 0xdf, 0x42, 0x4f, 0x86, 0xce, 0x7e, 0xec, 0x89,
0xb8, 0xe1, 0xc0, 0xf0, 0xcc, 0x96, 0x46, 0x7c, 0x59, 0x49, 0x79, 0xb3, 0x9a, 0xf2, 0x7a, 0x4e,
0xd4, 0x2e, 0xce, 0x89, 0xfa, 0x72, 0x4e, 0x3c, 0x87, 0xcd, 0xfd, 0x38, 0x3e, 0x99, 0x25, 0xd2,
0x8d, 0xdc, 0xd7, 0xf2, 0x17, 0x1a, 0xa3, 0x1a, 0x7f, 0xb3, 0xf8, 0xc2, 0x4a, 0xc4, 0x9a, 0xd5,
0x88, 0x75, 0xfe, 0x30, 0x60, 0xab, 0x7c, 0xad, 0xca, 0xb6, 0xaf, 0x60, 0xb3, 0xb8, 0x77, 0x12,
0xaa, 0x6f, 0x96, 0x0f, 0xb4, 0x77, 0xee, 0x68, 0x64, 0xae, 0x3a, 0x9d, 0x17, 0x08, 0x3f, 0x07,
0xcb, 0x1d, 0x9c, 0x56, 0x24, 0xd9, 0xf0, 0x0c, 0xfa, 0x55, 0x33, 0x1e, 0xd0, 0xc5, 0xab, 0x0a,
0xd9, 0x56, 0x7e, 0x92, 0xbc, 0x07, 0xd6, 0xc2, 0x11, 0x53, 0x38, 0xb2, 0x59, 0x72, 0x44, 0xbd,
0xb5, 0xb0, 0x22, 0x5b, 0xd0, 0xc0, 0x34, 0x8d, 0xf3, 0x42, 0x20, 0x37, 0xce, 0x87, 0xd0, 0xfa,
0xdb, 0x2c, 0x3a, 0xbf, 0x19, 0xd0, 0xbd, 0x97, 0x65, 0xc1, 0x71, 0x11, 0x2e, 0x5b, 0xd0, 0x90,
0x69, 0x2a, 0xcb, 0x91, 0xdc, 0x90, 0x11, 0xb4, 0x55, 0x96, 0x69, 0xd0, 0xeb, 0xa2, 0x37, 0x56,
0x13, 0x95, 0x79, 0x75, 0xe9, 0x1a, 0x63, 0x61, 0xb5, 0xd0, 0x37, 0xce, 0x2d, 0xf4, 0x4d, 0xad,
0xd0, 0x5f, 0x03, 0x4b, 0x1c, 0x8a, 0x62, 0x1f, 0x55, 0x07, 0x68, 0x71, 0xc1, 0x67, 0xb1, 0x8f,
0xce, 0x4f, 0x06, 0xf4, 0xf2, 0xaf, 0x51, 0xcc, 0xf7, 0xa1, 0x76, 0x54, 0xa0, 0xcf, 0x97, 0x39,
0x46, 0xe6, 0x79, 0x18, 0x2d, 0x35, 0xb7, 0x02, 0x91, 0xba, 0x8e, 0x48, 0x41, 0x46, 0x43, 0x23,
0x83, 0xbb, 0x4c, 0x67, 0xec, 0xeb, 0xdc, 0x65, 0xbe, 0x76, 0x8e, 0x61, 0x70, 0xc0, 0x28, 0x0b,
0x32, 0x16, 0x78, 0x59, 0x0e, 0x73, 0x05, 0x50, 0xe3, 0x4d, 0x80, 0x9a, 0xe7, 0x01, 0x5a, 0x2b,
0x00, 0x75, 0x7e, 0x31, 0x80, 0xe8, 0x2f, 0x29, 0x08, 0xfe, 0x81, 0xa7, 0x38, 0x64, 0x2c, 0x66,
0x34, 0x9c, 0x88, 0xae, 0xa2, 0x7a, 0x83, 0x90, 0xf0, 0xc6, 0xc5, 0x59, 0x9a, 0x65, 0xe8, 0x4b,
0xad, 0x6c, 0x0c, 0x2d, 0x2e, 0x10, 0xca, 0x72, 0x5f, 0x69, 0x56, 0xfa, 0x8a, 0x73, 0x0f, 0xda,
0x07, 0x2c, 0x4e, 0xe9, 0x31, 0x3e, 0x9f, 0x27, 0x6f, 0xe3, 0xbd, 0xf2, 0xce, 0x5c, 0x00, 0x31,
0x02, 0xd8, 0x5d, 0x78, 0xbf, 0xaa, 0x00, 0x5e, 0x81, 0x4b, 0x0b, 0x0b, 0x5e, 0x2f, 0x15, 0x2f,
0xce, 0x33, 0xb8, 0x5c, 0x55, 0x28, 0x18, 0x3f, 0x80, 0xf6, 0x02, 0x92, 0xbc, 0x76, 0x5c, 0xd2,
0x52, 0x76, 0x71, 0xce, 0xd5, 0x2d, 0x9d, 0xff, 0xc3, 0x95, 0x85, 0xea, 0x81, 0x28, 0x82, 0x17,
0xd5, 0xe6, 0x21, 0xd8, 0xcb, 0xe6, 0xd2, 0x07, 0xe7, 0x47, 0x13, 0x3a, 0x0f, 0x54, 0xb4, 0xf3,
0xae, 0xaf, 0xf5, 0x79, 0x4b, 0xf4, 0xf9, 0x5b, 0xd0, 0x29, 0x0d, 0x61, 0xb2, 0xdf, 0xb7, 0x4f,
0xb5, 0x09, 0x6c, 0xd5, 0xac, 0x56, 0x13, 0x66, 0xd5, 0x59, 0xed, 0x3f, 0x30, 0x38, 0x4a, 0x11,
0x97, 0xc7, 0xba, 0xba, 0xbb, 0xc1, 0x15, 0xba, 0xed, 0x36, 0x6c, 0x52, 0x8f, 0x05, 0xa7, 0x15,
0x6b, 0xc9, 0xfd, 0x40, 0xaa, 0x74, 0xfb, 0x87, 0x85, 0xa3, 0x41, 0x74, 0x14, 0x67, 0x76, 0xf3,
0xed, 0xc7, 0x32, 0xf5, 0x35, 0x5c, 0x93, 0x39, 0xdf, 0x99, 0xd0, 0x72, 0xa9, 0x77, 0xf2, 0x6e,
0xa3, 0x71, 0x17, 0x36, 0x8a, 0xaa, 0x56, 0x02, 0xe4, 0x8a, 0x06, 0x88, 0x4e, 0xbc, 0xdb, 0xf5,
0xb5, 0x5d, 0xe6, 0xfc, 0x69, 0x40, 0xef, 0x41, 0x51, 0x39, 0xdf, 0x6d, 0x30, 0x76, 0x00, 0x78,
0xa9, 0x2f, 0xe1, 0xa0, 0xb7, 0xc6, 0x9c, 0x6e, 0xd7, 0x4a, 0xd5, 0x2a, 0x73, 0x7e, 0x30, 0xa1,
0xf3, 0x3c, 0x4e, 0xe2, 0x30, 0x3e, 0x9e, 0xbf, 0xdb, 0x5f, 0xbf, 0x07, 0x03, 0xad, 0x2b, 0x96,
0x40, 0xb8, 0x5a, 0x09, 0x86, 0x05, 0xd9, 0xee, 0x86, 0x5f, 0xda, 0x67, 0xce, 0x26, 0x0c, 0xd4,
0x84, 0xa7, 0x15, 0x37, 0x17, 0x88, 0x2e, 0x54, 0x85, 0xed, 0x23, 0xe8, 0x32, 0x05, 0x9d, 0x78,
0x4e, 0xcd, 0xb8, 0x7a, 0xe8, 0xe9, 0xd0, 0xba, 0x1d, 0xa6, 0xed, 0x76, 0xbe, 0x6f, 0xc0, 0xfa,
0x01, 0xd2, 0x57, 0x88, 0x3e, 0x79, 0x04, 0xdd, 0x03, 0x8c, 0xfc, 0xc5, 0x4f, 0xcb, 0x2d, 0xed,
0x8e, 0x42, 0x3a, 0xfc, 0xd7, 0x2a, 0x69, 0x51, 0xe3, 0xd6, 0xc6, 0xc6, 0x1d, 0x83, 0x3c, 0x85,
0xee, 0x63, 0xc4, 0x64, 0x37, 0x8e, 0x22, 0xf4, 0x18, 0xfa, 0xe4, 0x86, 0x5e, 0x69, 0x97, 0xc7,
0xdc, 0xe1, 0xd5, 0xa5, 0xd2, 0x91, 0x4f, 0x45, 0xea, 0xc6, 0x67, 0xd0, 0xd1, 0xa7, 0xbb, 0xd2,
0x85, 0x2b, 0x66, 0xd1, 0xe1, 0xcd, 0x37, 0x8c, 0x85, 0xce, 0x1a, 0xb9, 0x0b, 0x4d, 0x39, 0x6e,
0x10, 0x5b, 0x33, 0x2e, 0xcd, 0x53, 0x25, 0xbf, 0xca, 0xb3, 0x89, 0xb3, 0x46, 0x1e, 0x03, 0x2c,
0x1a, 0x36, 0xd1, 0x71, 0x59, 0x9a, 0x18, 0x86, 0xd7, 0xcf, 0xd1, 0x16, 0x97, 0x7d, 0x0e, 0xbd,
0x72, 0xeb, 0x22, 0xa3, 0x95, 0xdd, 0x49, 0x8b, 0x88, 0xe1, 0xad, 0x0b, 0x2c, 0x8a, 0x8b, 0xbf,
0x84, 0x7e, 0xb5, 0x23, 0x11, 0x67, 0xe5, 0xc1, 0x52, 0x77, 0x1b, 0xde, 0xbe, 0xd0, 0x46, 0x07,
0x61, 0x11, 0x95, 0x25, 0x10, 0x96, 0x22, 0xb8, 0x04, 0xc2, 0x72, 0x28, 0x3b, 0x6b, 0x87, 0x4d,
0xf1, 0x67, 0xc7, 0xfb, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x50, 0x28, 0x66, 0xfc, 0x10,
0x00, 0x00,
}

View file

@ -126,3 +126,16 @@ func (ms *MasterServer) Statistics(ctx context.Context, req *master_pb.Statistic
return resp, nil
}
func (ms *MasterServer) VolumeList(ctx context.Context, req *master_pb.VolumeListRequest) (*master_pb.VolumeListResponse, error) {
if !ms.Topo.IsLeader() {
return nil, raft.NotLeaderError
}
resp := &master_pb.VolumeListResponse{
TopologyInfo: ms.Topo.ToTopologyInfo(),
}
return resp, nil
}

View file

@ -30,7 +30,7 @@ func (c *commandCollectionList) Do(args []string, commandEnv *commandEnv, writer
}
for _, c := range resp.Collections {
fmt.Fprintf(writer, "collection:\"%s\"\treplication:\"%s\"\tTTL:\"%s\"\n", c.GetName(), c.GetReplication(), c.GetTtl())
fmt.Fprintf(writer, "collection:\"%s\"\n", c.GetName())
}
fmt.Fprintf(writer, "Total %d collections.\n", len(resp.Collections))

View file

@ -0,0 +1,64 @@
package shell
import (
"context"
"fmt"
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
"io"
)
func init() {
commands = append(commands, &commandVolumeList{})
}
type commandVolumeList struct {
}
func (c *commandVolumeList) Name() string {
return "volume.list"
}
func (c *commandVolumeList) Help() string {
return "# list all volumes"
}
func (c *commandVolumeList) Do(args []string, commandEnv *commandEnv, writer io.Writer) error {
resp, err := commandEnv.masterClient.VolumeList(context.Background())
if err != nil {
return err
}
writeTopologyInfo(writer,resp.TopologyInfo)
return nil
}
func writeTopologyInfo(writer io.Writer, t *master_pb.TopologyInfo) {
fmt.Fprintf(writer, "Topology volume:%d/%d active:%d free:%d\n", t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount)
for _, dc := range t.DataCenterInfos {
writeDataCenterInfo(writer, dc)
}
}
func writeDataCenterInfo(writer io.Writer, t *master_pb.DataCenterInfo) {
fmt.Fprintf(writer, " DataCenter %s volume:%d/%d active:%d free:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount)
for _, r := range t.RackInfos {
writeRackInfo(writer, r)
}
}
func writeRackInfo(writer io.Writer, t *master_pb.RackInfo) {
fmt.Fprintf(writer, " Rack %s volume:%d/%d active:%d free:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount)
for _, dn := range t.DataNodeInfos {
writeDataNodeInfo(writer, dn)
}
}
func writeDataNodeInfo(writer io.Writer, t *master_pb.DataNodeInfo) {
fmt.Fprintf(writer, " DataNode %s volume:%d/%d active:%d free:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount)
for _, vi := range t.VolumeInfos {
writeVolumeInformationMessage(writer, vi)
}
}
func writeVolumeInformationMessage(writer io.Writer, t *master_pb.VolumeInformationMessage) {
fmt.Fprintf(writer, " volume %+v \n", t)
}

View file

@ -144,24 +144,12 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat {
for _, location := range s.Locations {
maxVolumeCount = maxVolumeCount + location.MaxVolumeCount
location.Lock()
for k, v := range location.volumes {
for _, v := range location.volumes {
if maxFileKey < v.nm.MaxFileKey() {
maxFileKey = v.nm.MaxFileKey()
}
if !v.expired(s.VolumeSizeLimit) {
volumeMessage := &master_pb.VolumeInformationMessage{
Id: uint32(k),
Size: uint64(v.Size()),
Collection: v.Collection,
FileCount: uint64(v.nm.FileCount()),
DeleteCount: uint64(v.nm.DeletedCount()),
DeletedByteCount: v.nm.DeletedSize(),
ReadOnly: v.readOnly,
ReplicaPlacement: uint32(v.ReplicaPlacement.Byte()),
Version: uint32(v.Version()),
Ttl: v.Ttl.ToUint32(),
}
volumeMessages = append(volumeMessages, volumeMessage)
volumeMessages = append(volumeMessages, v.ToVolumeInformationMessage())
} else {
if v.expiredLongEnough(MAX_TTL_VOLUME_REMOVAL_DELAY) {
location.deleteVolumeById(v.Id)

View file

@ -2,6 +2,7 @@ package storage
import (
"fmt"
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
"os"
"path"
"sync"
@ -134,3 +135,18 @@ func (v *Volume) expiredLongEnough(maxDelayMinutes uint32) bool {
}
return false
}
func (v *Volume) ToVolumeInformationMessage() *master_pb.VolumeInformationMessage {
return &master_pb.VolumeInformationMessage{
Id: uint32(v.Id),
Size: uint64(v.Size()),
Collection: v.Collection,
FileCount: uint64(v.nm.FileCount()),
DeleteCount: uint64(v.nm.DeletedCount()),
DeletedByteCount: v.nm.DeletedSize(),
ReadOnly: v.readOnly,
ReplicaPlacement: uint32(v.ReplicaPlacement.Byte()),
Version: uint32(v.Version()),
Ttl: v.Ttl.ToUint32(),
}
}

View file

@ -45,6 +45,22 @@ func (vi VolumeInfo) String() string {
vi.Id, vi.Size, vi.ReplicaPlacement, vi.Collection, vi.Version, vi.FileCount, vi.DeleteCount, vi.DeletedByteCount, vi.ReadOnly)
}
func (vi VolumeInfo) ToVolumeInformationMessage() *master_pb.VolumeInformationMessage {
return &master_pb.VolumeInformationMessage{
Id: uint32(vi.Id),
Size: uint64(vi.Size),
Collection: vi.Collection,
FileCount: uint64(vi.FileCount),
DeleteCount: uint64(vi.DeleteCount),
DeletedByteCount: vi.DeletedByteCount,
ReadOnly: vi.ReadOnly,
ReplicaPlacement: uint32(vi.ReplicaPlacement.Byte()),
Version: uint32(vi.Version),
Ttl: vi.Ttl.ToUint32(),
}
}
/*VolumesInfo sorting*/
type volumeInfos []*VolumeInfo

View file

@ -1,5 +1,7 @@
package topology
import "github.com/chrislusf/seaweedfs/weed/pb/master_pb"
type DataCenter struct {
NodeImpl
}
@ -38,3 +40,18 @@ func (dc *DataCenter) ToMap() interface{} {
m["Racks"] = racks
return m
}
func (dc *DataCenter) ToDataCenterInfo() *master_pb.DataCenterInfo {
m := &master_pb.DataCenterInfo{
Id: string(dc.Id()),
VolumeCount: uint64(dc.GetVolumeCount()),
MaxVolumeCount: uint64(dc.GetMaxVolumeCount()),
FreeVolumeCount: uint64(dc.FreeSpace()),
ActiveVolumeCount: uint64(dc.GetActiveVolumeCount()),
}
for _, c := range dc.Children() {
rack := c.(*Rack)
m.RackInfos = append(m.RackInfos, rack.ToRackInfo())
}
return m
}

View file

@ -2,6 +2,7 @@ package topology
import (
"fmt"
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
"strconv"
"github.com/chrislusf/seaweedfs/weed/glog"
@ -128,3 +129,17 @@ func (dn *DataNode) ToMap() interface{} {
ret["PublicUrl"] = dn.PublicUrl
return ret
}
func (dn *DataNode) ToDataNodeInfo() *master_pb.DataNodeInfo {
m := &master_pb.DataNodeInfo{
Id: string(dn.Id()),
VolumeCount: uint64(dn.GetVolumeCount()),
MaxVolumeCount: uint64(dn.GetMaxVolumeCount()),
FreeVolumeCount: uint64(dn.FreeSpace()),
ActiveVolumeCount: uint64(dn.GetActiveVolumeCount()),
}
for _, v := range dn.GetVolumes() {
m.VolumeInfos = append(m.VolumeInfos, v.ToVolumeInformationMessage())
}
return m
}

View file

@ -1,6 +1,7 @@
package topology
import (
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
"strconv"
"time"
)
@ -58,3 +59,18 @@ func (r *Rack) ToMap() interface{} {
m["DataNodes"] = dns
return m
}
func (r *Rack) ToRackInfo() *master_pb.RackInfo {
m := &master_pb.RackInfo{
Id: string(r.Id()),
VolumeCount: uint64(r.GetVolumeCount()),
MaxVolumeCount: uint64(r.GetMaxVolumeCount()),
FreeVolumeCount: uint64(r.FreeSpace()),
ActiveVolumeCount: uint64(r.GetActiveVolumeCount()),
}
for _, c := range r.Children() {
dn := c.(*DataNode)
m.DataNodeInfos = append(m.DataNodeInfos, dn.ToDataNodeInfo())
}
return m
}

View file

@ -74,3 +74,18 @@ func (t *Topology) ToVolumeLocations() (volumeLocations []*master_pb.VolumeLocat
}
return
}
func (t *Topology) ToTopologyInfo() *master_pb.TopologyInfo {
m := &master_pb.TopologyInfo{
Id: string(t.Id()),
VolumeCount: uint64(t.GetVolumeCount()),
MaxVolumeCount: uint64(t.GetMaxVolumeCount()),
FreeVolumeCount: uint64(t.FreeSpace()),
ActiveVolumeCount: uint64(t.GetActiveVolumeCount()),
}
for _, c := range t.Children() {
dc := c.(*DataCenter)
m.DataCenterInfos = append(m.DataCenterInfos, dc.ToDataCenterInfo())
}
return m
}

View file

@ -21,3 +21,11 @@ func (mc *MasterClient) CollectionList(ctx context.Context) (resp *master_pb.Col
})
return
}
func (mc *MasterClient) VolumeList(ctx context.Context) (resp *master_pb.VolumeListResponse, err error) {
err = withMasterClient(ctx, mc.currentMaster, mc.grpcDialOption, func(ctx context.Context, client master_pb.SeaweedClient) error {
resp, err = client.VolumeList(ctx, &master_pb.VolumeListRequest{})
return err
})
return
}