Browse Source

Merge branch 'master' into refactoring_dat_backend

pull/1115/head
Chris Lu 5 years ago
parent
commit
ee90236a97
  1. 7
      weed/command/scaffold.go
  2. 16
      weed/operation/assign_file_id.go
  3. 1
      weed/pb/master.proto
  4. 268
      weed/pb/master_pb/master.pb.go
  5. 2
      weed/pb/volume_server_pb/volume_server.pb.go
  6. 296
      weed/sequence/etcd_sequencer.go
  7. 2
      weed/server/master_grpc_server_volume.go
  8. 38
      weed/server/master_server.go
  9. 7
      weed/server/master_server_handlers.go
  10. 4
      weed/shell/command_ec_balance.go
  11. 2
      weed/shell/command_ec_common.go
  12. 7
      weed/topology/volume_growth.go
  13. 4
      weed/util/config.go

7
weed/command/scaffold.go

@ -346,5 +346,12 @@ scripts = """
"""
sleep_minutes = 17 # sleep minutes between each script execution
sequencer_type = memory # Choose [memory|etcd] type for storing the file id sequence
# when sequencer.type = etcd, set listen client urls of etcd cluster that store file id sequence
# example : http://127.0.0.1:2379,http://127.0.0.1:2389
sequencer_etcd_urls = http://127.0.0.1:2379
`
)

16
weed/operation/assign_file_id.go

@ -11,13 +11,14 @@ import (
)
type VolumeAssignRequest struct {
Count uint64
Replication string
Collection string
Ttl string
DataCenter string
Rack string
DataNode string
Count uint64
Replication string
Collection string
Ttl string
DataCenter string
Rack string
DataNode string
WritableVolumeCount uint32
}
type AssignResult struct {
@ -53,6 +54,7 @@ func Assign(server string, grpcDialOption grpc.DialOption, primaryRequest *Volum
DataCenter: primaryRequest.DataCenter,
Rack: primaryRequest.Rack,
DataNode: primaryRequest.DataNode,
WritableVolumeCount: primaryRequest.WritableVolumeCount,
}
resp, grpcErr := masterClient.Assign(context.Background(), req)
if grpcErr != nil {

1
weed/pb/master.proto

@ -140,6 +140,7 @@ message AssignRequest {
string rack = 6;
string data_node = 7;
uint32 memory_map_max_size_mb = 8;
uint32 Writable_volume_count = 9;
}
message AssignResponse {
string fid = 1;

268
weed/pb/master_pb/master.pb.go

@ -648,14 +648,15 @@ func (m *Location) GetPublicUrl() string {
}
type AssignRequest struct {
Count uint64 `protobuf:"varint,1,opt,name=count" json:"count,omitempty"`
Replication string `protobuf:"bytes,2,opt,name=replication" json:"replication,omitempty"`
Collection string `protobuf:"bytes,3,opt,name=collection" json:"collection,omitempty"`
Ttl string `protobuf:"bytes,4,opt,name=ttl" json:"ttl,omitempty"`
DataCenter string `protobuf:"bytes,5,opt,name=data_center,json=dataCenter" json:"data_center,omitempty"`
Rack string `protobuf:"bytes,6,opt,name=rack" json:"rack,omitempty"`
DataNode string `protobuf:"bytes,7,opt,name=data_node,json=dataNode" json:"data_node,omitempty"`
MemoryMapMaxSizeMb uint32 `protobuf:"varint,8,opt,name=memory_map_max_size_mb,json=MemoryMapMaxSizeMb" json:"memory_map_max_size_mb,omitempty"`
Count uint64 `protobuf:"varint,1,opt,name=count" json:"count,omitempty"`
Replication string `protobuf:"bytes,2,opt,name=replication" json:"replication,omitempty"`
Collection string `protobuf:"bytes,3,opt,name=collection" json:"collection,omitempty"`
Ttl string `protobuf:"bytes,4,opt,name=ttl" json:"ttl,omitempty"`
DataCenter string `protobuf:"bytes,5,opt,name=data_center,json=dataCenter" json:"data_center,omitempty"`
Rack string `protobuf:"bytes,6,opt,name=rack" json:"rack,omitempty"`
DataNode string `protobuf:"bytes,7,opt,name=data_node,json=dataNode" json:"data_node,omitempty"`
MemoryMapMaxSizeMb uint32 `protobuf:"varint,8,opt,name=memory_map_max_size_mb,json=memoryMapMaxSizeMb" json:"memory_map_max_size_mb,omitempty"`
WritableVolumeCount uint32 `protobuf:"varint,9,opt,name=Writable_volume_count,json=WritableVolumeCount" json:"Writable_volume_count,omitempty"`
}
func (m *AssignRequest) Reset() { *m = AssignRequest{} }
@ -719,6 +720,13 @@ func (m *AssignRequest) GetMemoryMapMaxSizeMb() uint32 {
return 0
}
func (m *AssignRequest) GetWritableVolumeCount() uint32 {
if m != nil {
return m.WritableVolumeCount
}
return 0
}
type AssignResponse struct {
Fid string `protobuf:"bytes,1,opt,name=fid" json:"fid,omitempty"`
Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"`
@ -1809,125 +1817,127 @@ var _Seaweed_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("master.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1920 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x59, 0xcb, 0x6f, 0x1b, 0xc7,
0x19, 0xf7, 0x92, 0x14, 0x45, 0x7e, 0x7c, 0x88, 0x1c, 0xc9, 0x0a, 0xcd, 0xd4, 0x16, 0xbd, 0x29,
0x10, 0xc5, 0x4d, 0xd5, 0x54, 0x09, 0xd0, 0x02, 0x6d, 0x11, 0xd8, 0xb2, 0x92, 0x0a, 0xb6, 0x1c,
0x7b, 0xe9, 0xba, 0x40, 0x81, 0x62, 0x3b, 0xdc, 0x1d, 0x49, 0x0b, 0xed, 0xab, 0x3b, 0x43, 0x99,
0x4c, 0x8f, 0xed, 0xad, 0x40, 0x2f, 0x3d, 0xf4, 0xd4, 0x7b, 0xff, 0x86, 0x1e, 0x7a, 0xe9, 0x1f,
0xd1, 0x73, 0xff, 0x85, 0x5e, 0x8b, 0xa2, 0xc1, 0xbc, 0x76, 0x67, 0x49, 0x4a, 0xb2, 0x02, 0xf8,
0xe0, 0xdb, 0xec, 0xf7, 0x9a, 0x6f, 0x7e, 0xdf, 0x7c, 0x8f, 0x21, 0xa1, 0x1d, 0x61, 0xca, 0x48,
0xb6, 0x97, 0x66, 0x09, 0x4b, 0x50, 0x53, 0x7e, 0xb9, 0xe9, 0xc4, 0xfe, 0x63, 0x1d, 0x9a, 0x3f,
0x27, 0x38, 0x63, 0x13, 0x82, 0x19, 0xea, 0x42, 0x25, 0x48, 0x07, 0xd6, 0xc8, 0xda, 0x6d, 0x3a,
0x95, 0x20, 0x45, 0x08, 0x6a, 0x69, 0x92, 0xb1, 0x41, 0x65, 0x64, 0xed, 0x76, 0x1c, 0xb1, 0x46,
0x77, 0x01, 0xd2, 0xe9, 0x24, 0x0c, 0x3c, 0x77, 0x9a, 0x85, 0x83, 0xaa, 0x90, 0x6d, 0x4a, 0xca,
0x2f, 0xb2, 0x10, 0xed, 0x42, 0x2f, 0xc2, 0x33, 0xf7, 0x22, 0x09, 0xa7, 0x11, 0x71, 0xbd, 0x64,
0x1a, 0xb3, 0x41, 0x4d, 0xa8, 0x77, 0x23, 0x3c, 0x7b, 0x25, 0xc8, 0x07, 0x9c, 0x8a, 0x46, 0xdc,
0xab, 0x99, 0x7b, 0x12, 0x84, 0xc4, 0x3d, 0x27, 0xf3, 0xc1, 0xda, 0xc8, 0xda, 0xad, 0x39, 0x10,
0xe1, 0xd9, 0x17, 0x41, 0x48, 0x9e, 0x90, 0x39, 0xda, 0x81, 0x96, 0x8f, 0x19, 0x76, 0x3d, 0x12,
0x33, 0x92, 0x0d, 0xea, 0x62, 0x2f, 0xe0, 0xa4, 0x03, 0x41, 0xe1, 0xfe, 0x65, 0xd8, 0x3b, 0x1f,
0xac, 0x0b, 0x8e, 0x58, 0x73, 0xff, 0xb0, 0x1f, 0x05, 0xb1, 0x2b, 0x3c, 0x6f, 0x88, 0xad, 0x9b,
0x82, 0xf2, 0x9c, 0xbb, 0xff, 0x33, 0x58, 0x97, 0xbe, 0xd1, 0x41, 0x73, 0x54, 0xdd, 0x6d, 0xed,
0x7f, 0xb0, 0x97, 0xa3, 0xb1, 0x27, 0xdd, 0x3b, 0x8a, 0x4f, 0x92, 0x2c, 0xc2, 0x2c, 0x48, 0xe2,
0x63, 0x42, 0x29, 0x3e, 0x25, 0x8e, 0xd6, 0x41, 0x47, 0xd0, 0x8a, 0xc9, 0x6b, 0x57, 0x9b, 0x00,
0x61, 0x62, 0x77, 0xc9, 0xc4, 0xf8, 0x2c, 0xc9, 0xd8, 0x0a, 0x3b, 0x10, 0x93, 0xd7, 0xaf, 0x94,
0xa9, 0x17, 0xb0, 0xe1, 0x93, 0x90, 0x30, 0xe2, 0xe7, 0xe6, 0x5a, 0x37, 0x34, 0xd7, 0x55, 0x06,
0xb4, 0xc9, 0xef, 0x42, 0xf7, 0x0c, 0x53, 0x37, 0x4e, 0x72, 0x8b, 0xed, 0x91, 0xb5, 0xdb, 0x70,
0xda, 0x67, 0x98, 0x3e, 0x4b, 0xb4, 0xd4, 0x97, 0xd0, 0x24, 0x9e, 0x4b, 0xcf, 0x70, 0xe6, 0xd3,
0x41, 0x4f, 0x6c, 0xf9, 0x60, 0x69, 0xcb, 0x43, 0x6f, 0xcc, 0x05, 0x56, 0x6c, 0xda, 0x20, 0x92,
0x45, 0xd1, 0x33, 0xe8, 0x70, 0x30, 0x0a, 0x63, 0xfd, 0x1b, 0x1b, 0xe3, 0x68, 0x1e, 0x6a, 0x7b,
0xaf, 0xa0, 0xaf, 0x11, 0x29, 0x6c, 0xa2, 0x1b, 0xdb, 0xd4, 0xb0, 0xe6, 0x76, 0x3f, 0x84, 0x9e,
0x82, 0xa5, 0x30, 0xbb, 0x29, 0x80, 0xe9, 0x08, 0x60, 0xb4, 0xa0, 0xfd, 0x77, 0x0b, 0xfa, 0x79,
0x36, 0x38, 0x84, 0xa6, 0x49, 0x4c, 0x09, 0x7a, 0x00, 0x7d, 0x75, 0x9d, 0x69, 0xf0, 0x35, 0x71,
0xc3, 0x20, 0x0a, 0x98, 0x48, 0x92, 0x9a, 0xb3, 0x21, 0x19, 0xe3, 0xe0, 0x6b, 0xf2, 0x94, 0x93,
0xd1, 0x36, 0xd4, 0x43, 0x82, 0x7d, 0x92, 0x89, 0x9c, 0x69, 0x3a, 0xea, 0x0b, 0x7d, 0x08, 0x1b,
0x11, 0x61, 0x59, 0xe0, 0x51, 0x17, 0xfb, 0x7e, 0x46, 0x28, 0x55, 0xa9, 0xd3, 0x55, 0xe4, 0x87,
0x92, 0x8a, 0x7e, 0x0c, 0x03, 0x2d, 0x18, 0xf0, 0x3b, 0x7e, 0x81, 0x43, 0x97, 0x12, 0x2f, 0x89,
0x7d, 0xaa, 0xf2, 0x68, 0x5b, 0xf1, 0x8f, 0x14, 0x7b, 0x2c, 0xb9, 0xf6, 0x5f, 0xab, 0x30, 0xb8,
0xec, 0x02, 0x8b, 0xcc, 0xf6, 0x85, 0xd3, 0x1d, 0xa7, 0x12, 0xf8, 0x3c, 0x73, 0xf8, 0x61, 0x84,
0x97, 0x35, 0x47, 0xac, 0xd1, 0x3d, 0x00, 0x2f, 0x09, 0x43, 0xe2, 0x71, 0x45, 0xe5, 0x9e, 0x41,
0xe1, 0x99, 0x25, 0x92, 0xb5, 0x48, 0xea, 0x9a, 0xd3, 0xe4, 0x14, 0x99, 0xcf, 0xf7, 0xa1, 0x2d,
0x81, 0x57, 0x02, 0x32, 0x9f, 0x5b, 0x92, 0x26, 0x45, 0x3e, 0x06, 0xa4, 0x03, 0x3c, 0x99, 0xe7,
0x82, 0x75, 0x21, 0xd8, 0x53, 0x9c, 0x47, 0x73, 0x2d, 0xfd, 0x3e, 0x34, 0x33, 0x82, 0x7d, 0x37,
0x89, 0xc3, 0xb9, 0x48, 0xf1, 0x86, 0xd3, 0xe0, 0x84, 0xaf, 0xe2, 0x70, 0x8e, 0xbe, 0x07, 0xfd,
0x8c, 0xa4, 0x61, 0xe0, 0x61, 0x37, 0x0d, 0xb1, 0x47, 0x22, 0x12, 0xeb, 0x6c, 0xef, 0x29, 0xc6,
0x73, 0x4d, 0x47, 0x03, 0x58, 0xbf, 0x20, 0x19, 0xe5, 0xc7, 0x6a, 0x0a, 0x11, 0xfd, 0x89, 0x7a,
0x50, 0x65, 0x2c, 0x1c, 0x80, 0xa0, 0xf2, 0x25, 0xfa, 0x08, 0x7a, 0x5e, 0x12, 0xa5, 0xd8, 0x63,
0x6e, 0x46, 0x2e, 0x02, 0xa1, 0xd4, 0x12, 0xec, 0x0d, 0x45, 0x77, 0x14, 0x99, 0x1f, 0x27, 0x4a,
0xfc, 0xe0, 0x24, 0x20, 0xbe, 0x8b, 0x99, 0x0a, 0x93, 0x48, 0xb9, 0xaa, 0xd3, 0xd3, 0x9c, 0x87,
0x4c, 0x06, 0xc8, 0xfe, 0x9b, 0x05, 0x77, 0xaf, 0x4c, 0xe7, 0xa5, 0x20, 0x5d, 0x17, 0x90, 0xb7,
0x85, 0x81, 0x3d, 0x85, 0x9d, 0x6b, 0x92, 0xec, 0x1a, 0x5f, 0x2b, 0x4b, 0xbe, 0xda, 0xd0, 0x21,
0x9e, 0x1b, 0xc4, 0x3e, 0x99, 0xb9, 0x93, 0x80, 0xc9, 0xeb, 0xdf, 0x71, 0x5a, 0xc4, 0x3b, 0xe2,
0xb4, 0x47, 0x01, 0xa3, 0xf6, 0x3a, 0xac, 0x1d, 0x46, 0x29, 0x9b, 0xdb, 0xff, 0xb0, 0x60, 0x63,
0x3c, 0x4d, 0x49, 0xf6, 0x28, 0x4c, 0xbc, 0xf3, 0xc3, 0x19, 0xcb, 0x30, 0xfa, 0x0a, 0xba, 0x24,
0xc3, 0x74, 0x9a, 0xf1, 0x6b, 0xe3, 0x07, 0xf1, 0xa9, 0xd8, 0xbc, 0x5c, 0x2d, 0x17, 0x74, 0xf6,
0x0e, 0xa5, 0xc2, 0x81, 0x90, 0x77, 0x3a, 0xc4, 0xfc, 0x1c, 0xfe, 0x0a, 0x3a, 0x25, 0x3e, 0xcf,
0x09, 0xde, 0x5b, 0xd4, 0xa1, 0xc4, 0x9a, 0xe7, 0x73, 0x8a, 0xb3, 0x80, 0xcd, 0x55, 0x0f, 0x54,
0x5f, 0x3c, 0x17, 0x54, 0x4d, 0x08, 0x7c, 0x7e, 0x96, 0x2a, 0xef, 0x32, 0x92, 0x72, 0xe4, 0x53,
0xfb, 0x01, 0x6c, 0x3d, 0x21, 0x24, 0x3d, 0x48, 0xe2, 0x98, 0x78, 0x8c, 0xf8, 0x0e, 0xf9, 0xed,
0x94, 0x50, 0xc6, 0xb7, 0x88, 0x71, 0x44, 0x54, 0x8b, 0x15, 0x6b, 0xfb, 0x2f, 0x16, 0x74, 0x25,
0xda, 0x4f, 0x13, 0x4f, 0x60, 0xcc, 0x23, 0xc2, 0x9b, 0xab, 0x94, 0xe2, 0xcb, 0x85, 0xae, 0x5b,
0x59, 0xec, 0xba, 0x77, 0xa0, 0x21, 0xda, 0x52, 0xe1, 0xcc, 0x3a, 0xef, 0x34, 0x81, 0x4f, 0x8b,
0xb4, 0xf4, 0x25, 0xbb, 0x26, 0xd8, 0x2d, 0xdd, 0x39, 0xb8, 0x48, 0x51, 0xb4, 0xd6, 0xcc, 0xa2,
0x65, 0xbf, 0x84, 0xcd, 0xa7, 0x49, 0x72, 0x3e, 0x4d, 0xa5, 0x7b, 0xfa, 0x10, 0xe5, 0xb3, 0x5b,
0xa3, 0x2a, 0xf7, 0x25, 0x3f, 0xfb, 0x75, 0x37, 0xc1, 0xfe, 0x8f, 0x05, 0x5b, 0x65, 0xb3, 0xaa,
0xce, 0xfe, 0x06, 0x36, 0x73, 0xbb, 0x6e, 0xa8, 0xb0, 0x90, 0x1b, 0xb4, 0xf6, 0x3f, 0x31, 0xc2,
0xbc, 0x4a, 0x5b, 0xf7, 0x6e, 0x5f, 0x83, 0xe8, 0xf4, 0x2f, 0x16, 0x28, 0x74, 0x38, 0x83, 0xde,
0xa2, 0x18, 0xaf, 0x32, 0xf9, 0xae, 0x0a, 0xf1, 0x86, 0xd6, 0x44, 0x3f, 0x84, 0x66, 0xe1, 0x48,
0x45, 0x38, 0xb2, 0x59, 0x72, 0x44, 0xed, 0x55, 0x48, 0xa1, 0x2d, 0x58, 0x23, 0x59, 0x96, 0x64,
0x2a, 0x5f, 0xe5, 0x87, 0xfd, 0x13, 0x68, 0x7c, 0xeb, 0xe8, 0xda, 0xff, 0xb7, 0xa0, 0xf3, 0x90,
0xd2, 0xe0, 0x34, 0xd6, 0x21, 0xd8, 0x82, 0x35, 0x59, 0x3b, 0x65, 0x1b, 0x92, 0x1f, 0x68, 0x04,
0x2d, 0x95, 0xf6, 0x06, 0xf4, 0x26, 0xe9, 0xda, 0x8a, 0xa2, 0x4a, 0x41, 0x4d, 0xba, 0xc6, 0xcb,
0xe1, 0xc2, 0x0c, 0xb6, 0x76, 0xe9, 0x0c, 0x56, 0x37, 0x66, 0xb0, 0xf7, 0xa1, 0x29, 0x94, 0xe2,
0xc4, 0x27, 0x6a, 0x38, 0x6b, 0x70, 0xc2, 0xb3, 0xc4, 0x27, 0x68, 0x1f, 0xb6, 0x23, 0x12, 0x25,
0xd9, 0xdc, 0x8d, 0x70, 0xea, 0xf2, 0x11, 0x50, 0xb4, 0xd5, 0x68, 0xa2, 0x4a, 0x17, 0x92, 0xdc,
0x63, 0x9c, 0x1e, 0xe3, 0x19, 0xef, 0xac, 0xc7, 0x13, 0xfb, 0xcf, 0x16, 0x74, 0x35, 0x02, 0xea,
0xb6, 0xf4, 0xa0, 0x7a, 0x92, 0x47, 0x8c, 0x2f, 0x35, 0xae, 0x95, 0xcb, 0x70, 0x5d, 0x9a, 0x55,
0x73, 0x14, 0x6b, 0x26, 0x8a, 0x79, 0x00, 0xd7, 0x8c, 0x00, 0xf2, 0x63, 0xe2, 0x29, 0x3b, 0xd3,
0xc7, 0xe4, 0x6b, 0xfb, 0x14, 0xfa, 0x63, 0x86, 0x59, 0x40, 0x59, 0xe0, 0x51, 0x1d, 0x9a, 0x85,
0x20, 0x58, 0xd7, 0x05, 0xa1, 0x72, 0x59, 0x10, 0xaa, 0x79, 0x10, 0xec, 0x7f, 0x5a, 0x80, 0xcc,
0x9d, 0x14, 0x04, 0x6f, 0x61, 0x2b, 0x0e, 0x19, 0x4b, 0x18, 0x1f, 0x3a, 0xf8, 0x78, 0xa0, 0x9a,
0xbc, 0xa0, 0xf0, 0x50, 0xf0, 0xc8, 0x4e, 0x29, 0xf1, 0x25, 0x57, 0x76, 0xf8, 0x06, 0x27, 0x08,
0x66, 0x79, 0x40, 0xa8, 0x2f, 0x0c, 0x08, 0xf6, 0x43, 0x68, 0x8d, 0x59, 0x92, 0xe1, 0x53, 0xf2,
0x72, 0x9e, 0xbe, 0x89, 0xf7, 0xca, 0xbb, 0x4a, 0x01, 0xc4, 0x08, 0xe0, 0xa0, 0xf0, 0x7e, 0x55,
0x35, 0xfd, 0x1d, 0xdc, 0x2e, 0x24, 0x9e, 0x06, 0x94, 0xe9, 0xb8, 0x7c, 0x06, 0xdb, 0x41, 0xec,
0x85, 0x53, 0x9f, 0xb8, 0x31, 0x6f, 0x66, 0x61, 0x3e, 0x23, 0x5b, 0x62, 0xb4, 0xd8, 0x52, 0xdc,
0x67, 0x82, 0xa9, 0x67, 0xe5, 0x8f, 0x01, 0x69, 0x2d, 0xe2, 0xe5, 0x1a, 0x15, 0xa1, 0xd1, 0x53,
0x9c, 0x43, 0x4f, 0x49, 0xdb, 0x2f, 0x60, 0x7b, 0x71, 0x73, 0x15, 0xaa, 0x1f, 0x41, 0xab, 0x80,
0x5d, 0xd7, 0xb4, 0xdb, 0x46, 0x29, 0x29, 0xf4, 0x1c, 0x53, 0xd2, 0xfe, 0x3e, 0xbc, 0x57, 0xb0,
0x1e, 0x8b, 0xa2, 0x7d, 0x55, 0x33, 0x19, 0xc2, 0x60, 0x59, 0x5c, 0xfa, 0x60, 0xff, 0xbb, 0x02,
0xed, 0xc7, 0x2a, 0x0b, 0x79, 0x47, 0x37, 0x7a, 0x78, 0x53, 0xf4, 0xf0, 0xfb, 0xd0, 0x2e, 0xbd,
0xdb, 0xe4, 0x70, 0xd8, 0xba, 0x30, 0x1e, 0x6d, 0xab, 0x9e, 0x77, 0x55, 0x21, 0xb6, 0xf8, 0xbc,
0x7b, 0x00, 0xfd, 0x93, 0x8c, 0x90, 0xe5, 0x97, 0x60, 0xcd, 0xd9, 0xe0, 0x0c, 0x53, 0x76, 0x0f,
0x36, 0xb1, 0xc7, 0x82, 0x8b, 0x05, 0x69, 0x79, 0xbf, 0xfa, 0x92, 0x65, 0xca, 0x7f, 0x91, 0x3b,
0x1a, 0xc4, 0x27, 0x09, 0x1d, 0xd4, 0xdf, 0xfc, 0x25, 0xa7, 0x4e, 0xc3, 0x39, 0x14, 0x3d, 0x87,
0xae, 0x7e, 0x11, 0x28, 0x4b, 0xeb, 0x37, 0x7e, 0x6d, 0xb4, 0x49, 0xc1, 0xa2, 0xf6, 0x1f, 0x2a,
0xd0, 0x70, 0xb0, 0x77, 0xfe, 0x6e, 0xe3, 0xfb, 0x39, 0x6c, 0xe4, 0xf5, 0xbb, 0x04, 0xf1, 0x7b,
0x06, 0x30, 0xe6, 0x55, 0x72, 0x3a, 0xbe, 0xf1, 0x45, 0xed, 0xff, 0x59, 0xd0, 0x7d, 0x9c, 0xf7,
0x88, 0x77, 0x1b, 0x8c, 0x7d, 0x00, 0xde, 0xd4, 0x4a, 0x38, 0x98, 0x43, 0x80, 0x0e, 0xb7, 0xd3,
0xcc, 0xd4, 0x8a, 0xda, 0x7f, 0xaa, 0x40, 0xfb, 0x65, 0x92, 0x26, 0x61, 0x72, 0x3a, 0x7f, 0xb7,
0x4f, 0x7f, 0x08, 0x7d, 0xa3, 0xff, 0x97, 0x40, 0xb8, 0xb3, 0x70, 0x19, 0x8a, 0x60, 0x3b, 0x1b,
0x7e, 0xe9, 0x9b, 0xda, 0x9b, 0xd0, 0x57, 0x33, 0x6e, 0x51, 0x92, 0xed, 0xdf, 0x5b, 0x80, 0x4c,
0xaa, 0xaa, 0x95, 0x3f, 0x85, 0x0e, 0x53, 0xd8, 0x89, 0xfd, 0xd4, 0xa0, 0x6f, 0xde, 0x3d, 0x13,
0x5b, 0xa7, 0xcd, 0x4c, 0xa4, 0x7f, 0x00, 0x5b, 0x4b, 0xaf, 0x75, 0x3e, 0x5c, 0x48, 0x84, 0xfb,
0x0b, 0x0f, 0xf6, 0xe3, 0x89, 0xfd, 0x19, 0xdc, 0x96, 0x03, 0xa5, 0xae, 0xe3, 0xba, 0xbe, 0x2e,
0x4d, 0x86, 0x9d, 0x62, 0x32, 0xb4, 0xff, 0x6b, 0xc1, 0xf6, 0xa2, 0x9a, 0xf2, 0xff, 0x2a, 0x3d,
0x84, 0x01, 0xa9, 0x7a, 0x63, 0xce, 0xb8, 0x72, 0xb4, 0xfc, 0x74, 0x69, 0xc6, 0x5d, 0xb4, 0xbd,
0xa7, 0xeb, 0x50, 0x31, 0xe6, 0xf6, 0x68, 0x99, 0x40, 0x87, 0x18, 0xfa, 0x4b, 0x62, 0xfc, 0x85,
0xa0, 0xf7, 0x55, 0x3e, 0xad, 0x2b, 0xc5, 0x6f, 0x31, 0xe4, 0xda, 0x3b, 0x70, 0xf7, 0x4b, 0xc2,
0x8e, 0x85, 0xcc, 0x41, 0x12, 0x9f, 0x04, 0xa7, 0xd3, 0x4c, 0x0a, 0x15, 0xa1, 0xbd, 0x77, 0x99,
0x84, 0x82, 0x69, 0xc5, 0x4f, 0x22, 0xd6, 0x8d, 0x7f, 0x12, 0xa9, 0x5c, 0xf5, 0x93, 0xc8, 0xfe,
0xbf, 0xea, 0xb0, 0x3e, 0x26, 0xf8, 0x35, 0x21, 0x3e, 0x3a, 0x82, 0xce, 0x98, 0xc4, 0x7e, 0xf1,
0x63, 0xe7, 0x96, 0x71, 0xc6, 0x9c, 0x3a, 0xfc, 0xce, 0x2a, 0x6a, 0xde, 0x42, 0x6f, 0xed, 0x5a,
0x9f, 0x58, 0xe8, 0x05, 0x74, 0x4a, 0xaf, 0x3b, 0xb4, 0x63, 0x28, 0xad, 0x7a, 0xf7, 0x0d, 0xef,
0x2c, 0x35, 0x14, 0x8d, 0x6a, 0x6e, 0xb2, 0x6d, 0xbe, 0x6a, 0xd0, 0xbd, 0x4b, 0x9f, 0x3b, 0xd2,
0xe0, 0xce, 0x35, 0xcf, 0x21, 0xfb, 0x16, 0xfa, 0x1c, 0xea, 0x72, 0x64, 0x46, 0x03, 0x43, 0xb8,
0xf4, 0x8e, 0x28, 0xf9, 0x55, 0x9e, 0xaf, 0xed, 0x5b, 0xe8, 0x09, 0x40, 0x31, 0x74, 0x22, 0x13,
0x98, 0xa5, 0xa9, 0x77, 0x78, 0xf7, 0x12, 0x6e, 0x6e, 0xec, 0x97, 0xd0, 0x2d, 0x8f, 0x46, 0x68,
0xb4, 0x72, 0xfa, 0x31, 0xea, 0xc3, 0xf0, 0xfe, 0x15, 0x12, 0xb9, 0xe1, 0x5f, 0x43, 0x6f, 0x71,
0xe2, 0x41, 0xf6, 0x4a, 0xc5, 0xd2, 0xf4, 0x34, 0xfc, 0xe0, 0x4a, 0x19, 0x13, 0x84, 0xa2, 0x44,
0x95, 0x40, 0x58, 0xaa, 0x67, 0x25, 0x10, 0x96, 0xeb, 0x9a, 0x04, 0xa1, 0x9c, 0xd7, 0x25, 0x10,
0x56, 0x56, 0xa1, 0x12, 0x08, 0xab, 0x8b, 0x82, 0x7d, 0x0b, 0x25, 0xb0, 0xbd, 0x3a, 0xdb, 0x90,
0xf9, 0xf3, 0xc8, 0x95, 0x29, 0x3b, 0xfc, 0xe8, 0x0d, 0x24, 0xf5, 0x86, 0x93, 0xba, 0xf8, 0x27,
0xe1, 0xd3, 0x6f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x5c, 0xb0, 0xe7, 0x7c, 0x59, 0x18, 0x00, 0x00,
// 1943 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x59, 0x4b, 0x6f, 0x1b, 0xc9,
0x11, 0xf6, 0x90, 0x14, 0x45, 0x16, 0x1f, 0x22, 0x5b, 0xb2, 0x96, 0xe6, 0xc6, 0x16, 0x3d, 0x1b,
0x60, 0xb5, 0xce, 0x46, 0xd9, 0x68, 0x17, 0x48, 0x80, 0x24, 0x58, 0xd8, 0xb2, 0x76, 0x23, 0xd8,
0xf2, 0xda, 0x43, 0xc7, 0x0b, 0x04, 0x08, 0x26, 0xcd, 0x99, 0x96, 0x34, 0xd0, 0xbc, 0x32, 0xdd,
0x94, 0xc9, 0xcd, 0x31, 0xb9, 0x05, 0xc8, 0x25, 0x87, 0x9c, 0x72, 0xcf, 0x3d, 0xb7, 0x1c, 0x72,
0xc9, 0x8f, 0xc8, 0x39, 0x7f, 0x21, 0xd7, 0x20, 0x40, 0xd0, 0xaf, 0x99, 0x1e, 0x92, 0x92, 0xac,
0x05, 0x7c, 0xf0, 0x6d, 0xa6, 0xaa, 0xba, 0xba, 0xe6, 0xab, 0xae, 0xaa, 0xaf, 0x49, 0x68, 0x47,
0x98, 0x32, 0x92, 0xed, 0xa5, 0x59, 0xc2, 0x12, 0xd4, 0x94, 0x6f, 0x6e, 0x3a, 0xb1, 0xff, 0x50,
0x87, 0xe6, 0xcf, 0x09, 0xce, 0xd8, 0x84, 0x60, 0x86, 0xba, 0x50, 0x09, 0xd2, 0x81, 0x35, 0xb2,
0x76, 0x9b, 0x4e, 0x25, 0x48, 0x11, 0x82, 0x5a, 0x9a, 0x64, 0x6c, 0x50, 0x19, 0x59, 0xbb, 0x1d,
0x47, 0x3c, 0xa3, 0xbb, 0x00, 0xe9, 0x74, 0x12, 0x06, 0x9e, 0x3b, 0xcd, 0xc2, 0x41, 0x55, 0xd8,
0x36, 0xa5, 0xe4, 0x17, 0x59, 0x88, 0x76, 0xa1, 0x17, 0xe1, 0x99, 0x7b, 0x91, 0x84, 0xd3, 0x88,
0xb8, 0x5e, 0x32, 0x8d, 0xd9, 0xa0, 0x26, 0x96, 0x77, 0x23, 0x3c, 0x7b, 0x25, 0xc4, 0x07, 0x5c,
0x8a, 0x46, 0x3c, 0xaa, 0x99, 0x7b, 0x12, 0x84, 0xc4, 0x3d, 0x27, 0xf3, 0xc1, 0xda, 0xc8, 0xda,
0xad, 0x39, 0x10, 0xe1, 0xd9, 0x17, 0x41, 0x48, 0x9e, 0x90, 0x39, 0xda, 0x81, 0x96, 0x8f, 0x19,
0x76, 0x3d, 0x12, 0x33, 0x92, 0x0d, 0xea, 0x62, 0x2f, 0xe0, 0xa2, 0x03, 0x21, 0xe1, 0xf1, 0x65,
0xd8, 0x3b, 0x1f, 0xac, 0x0b, 0x8d, 0x78, 0xe6, 0xf1, 0x61, 0x3f, 0x0a, 0x62, 0x57, 0x44, 0xde,
0x10, 0x5b, 0x37, 0x85, 0xe4, 0x39, 0x0f, 0xff, 0x67, 0xb0, 0x2e, 0x63, 0xa3, 0x83, 0xe6, 0xa8,
0xba, 0xdb, 0xda, 0xff, 0x60, 0x2f, 0x47, 0x63, 0x4f, 0x86, 0x77, 0x14, 0x9f, 0x24, 0x59, 0x84,
0x59, 0x90, 0xc4, 0xc7, 0x84, 0x52, 0x7c, 0x4a, 0x1c, 0xbd, 0x06, 0x1d, 0x41, 0x2b, 0x26, 0xaf,
0x5d, 0xed, 0x02, 0x84, 0x8b, 0xdd, 0x25, 0x17, 0xe3, 0xb3, 0x24, 0x63, 0x2b, 0xfc, 0x40, 0x4c,
0x5e, 0xbf, 0x52, 0xae, 0x5e, 0xc0, 0x86, 0x4f, 0x42, 0xc2, 0x88, 0x9f, 0xbb, 0x6b, 0xdd, 0xd0,
0x5d, 0x57, 0x39, 0xd0, 0x2e, 0xbf, 0x0b, 0xdd, 0x33, 0x4c, 0xdd, 0x38, 0xc9, 0x3d, 0xb6, 0x47,
0xd6, 0x6e, 0xc3, 0x69, 0x9f, 0x61, 0xfa, 0x2c, 0xd1, 0x56, 0x5f, 0x42, 0x93, 0x78, 0x2e, 0x3d,
0xc3, 0x99, 0x4f, 0x07, 0x3d, 0xb1, 0xe5, 0x83, 0xa5, 0x2d, 0x0f, 0xbd, 0x31, 0x37, 0x58, 0xb1,
0x69, 0x83, 0x48, 0x15, 0x45, 0xcf, 0xa0, 0xc3, 0xc1, 0x28, 0x9c, 0xf5, 0x6f, 0xec, 0x8c, 0xa3,
0x79, 0xa8, 0xfd, 0xbd, 0x82, 0xbe, 0x46, 0xa4, 0xf0, 0x89, 0x6e, 0xec, 0x53, 0xc3, 0x9a, 0xfb,
0xfd, 0x10, 0x7a, 0x0a, 0x96, 0xc2, 0xed, 0xa6, 0x00, 0xa6, 0x23, 0x80, 0xd1, 0x86, 0xf6, 0xdf,
0x2d, 0xe8, 0xe7, 0xd5, 0xe0, 0x10, 0x9a, 0x26, 0x31, 0x25, 0xe8, 0x01, 0xf4, 0xd5, 0x71, 0xa6,
0xc1, 0x37, 0xc4, 0x0d, 0x83, 0x28, 0x60, 0xa2, 0x48, 0x6a, 0xce, 0x86, 0x54, 0x8c, 0x83, 0x6f,
0xc8, 0x53, 0x2e, 0x46, 0xdb, 0x50, 0x0f, 0x09, 0xf6, 0x49, 0x26, 0x6a, 0xa6, 0xe9, 0xa8, 0x37,
0xf4, 0x21, 0x6c, 0x44, 0x84, 0x65, 0x81, 0x47, 0x5d, 0xec, 0xfb, 0x19, 0xa1, 0x54, 0x95, 0x4e,
0x57, 0x89, 0x1f, 0x4a, 0x29, 0xfa, 0x31, 0x0c, 0xb4, 0x61, 0xc0, 0xcf, 0xf8, 0x05, 0x0e, 0x5d,
0x4a, 0xbc, 0x24, 0xf6, 0xa9, 0xaa, 0xa3, 0x6d, 0xa5, 0x3f, 0x52, 0xea, 0xb1, 0xd4, 0xda, 0x7f,
0xa9, 0xc2, 0xe0, 0xb2, 0x03, 0x2c, 0x2a, 0xdb, 0x17, 0x41, 0x77, 0x9c, 0x4a, 0xe0, 0xf3, 0xca,
0xe1, 0x1f, 0x23, 0xa2, 0xac, 0x39, 0xe2, 0x19, 0xdd, 0x03, 0xf0, 0x92, 0x30, 0x24, 0x1e, 0x5f,
0xa8, 0xc2, 0x33, 0x24, 0xbc, 0xb2, 0x44, 0xb1, 0x16, 0x45, 0x5d, 0x73, 0x9a, 0x5c, 0x22, 0xeb,
0xf9, 0x3e, 0xb4, 0x25, 0xf0, 0xca, 0x40, 0xd6, 0x73, 0x4b, 0xca, 0xa4, 0xc9, 0xc7, 0x80, 0x74,
0x82, 0x27, 0xf3, 0xdc, 0xb0, 0x2e, 0x0c, 0x7b, 0x4a, 0xf3, 0x68, 0xae, 0xad, 0xdf, 0x87, 0x66,
0x46, 0xb0, 0xef, 0x26, 0x71, 0x38, 0x17, 0x25, 0xde, 0x70, 0x1a, 0x5c, 0xf0, 0x55, 0x1c, 0xce,
0xd1, 0xf7, 0xa0, 0x9f, 0x91, 0x34, 0x0c, 0x3c, 0xec, 0xa6, 0x21, 0xf6, 0x48, 0x44, 0x62, 0x5d,
0xed, 0x3d, 0xa5, 0x78, 0xae, 0xe5, 0x68, 0x00, 0xeb, 0x17, 0x24, 0xa3, 0xfc, 0xb3, 0x9a, 0xc2,
0x44, 0xbf, 0xa2, 0x1e, 0x54, 0x19, 0x0b, 0x07, 0x20, 0xa4, 0xfc, 0x11, 0x7d, 0x04, 0x3d, 0x2f,
0x89, 0x52, 0xec, 0x31, 0x37, 0x23, 0x17, 0x81, 0x58, 0xd4, 0x12, 0xea, 0x0d, 0x25, 0x77, 0x94,
0x98, 0x7f, 0x4e, 0x94, 0xf8, 0xc1, 0x49, 0x40, 0x7c, 0x17, 0x33, 0x95, 0x26, 0x51, 0x72, 0x55,
0xa7, 0xa7, 0x35, 0x0f, 0x99, 0x4c, 0x90, 0xfd, 0x57, 0x0b, 0xee, 0x5e, 0x59, 0xce, 0x4b, 0x49,
0xba, 0x2e, 0x21, 0x6f, 0x0b, 0x03, 0x7b, 0x0a, 0x3b, 0xd7, 0x14, 0xd9, 0x35, 0xb1, 0x56, 0x96,
0x62, 0xb5, 0xa1, 0x43, 0x3c, 0x37, 0x88, 0x7d, 0x32, 0x73, 0x27, 0x01, 0x93, 0xc7, 0xbf, 0xe3,
0xb4, 0x88, 0x77, 0xc4, 0x65, 0x8f, 0x02, 0x46, 0xed, 0x75, 0x58, 0x3b, 0x8c, 0x52, 0x36, 0xb7,
0xff, 0x61, 0xc1, 0xc6, 0x78, 0x9a, 0x92, 0xec, 0x51, 0x98, 0x78, 0xe7, 0x87, 0x33, 0x96, 0x61,
0xf4, 0x15, 0x74, 0x49, 0x86, 0xe9, 0x34, 0xe3, 0xc7, 0xc6, 0x0f, 0xe2, 0x53, 0xb1, 0x79, 0xb9,
0x5b, 0x2e, 0xac, 0xd9, 0x3b, 0x94, 0x0b, 0x0e, 0x84, 0xbd, 0xd3, 0x21, 0xe6, 0xeb, 0xf0, 0x97,
0xd0, 0x29, 0xe9, 0x79, 0x4d, 0xf0, 0xd9, 0xa2, 0x3e, 0x4a, 0x3c, 0xf3, 0x7a, 0x4e, 0x71, 0x16,
0xb0, 0xb9, 0x9a, 0x81, 0xea, 0x8d, 0xd7, 0x82, 0xea, 0x09, 0x81, 0xcf, 0xbf, 0xa5, 0xca, 0xa7,
0x8c, 0x94, 0x1c, 0xf9, 0xd4, 0x7e, 0x00, 0x5b, 0x4f, 0x08, 0x49, 0x0f, 0x92, 0x38, 0x26, 0x1e,
0x23, 0xbe, 0x43, 0x7e, 0x33, 0x25, 0x94, 0xf1, 0x2d, 0x62, 0x1c, 0x11, 0x35, 0x62, 0xc5, 0xb3,
0xfd, 0x67, 0x0b, 0xba, 0x12, 0xed, 0xa7, 0x89, 0x27, 0x30, 0xe6, 0x19, 0xe1, 0xc3, 0x55, 0x5a,
0xf1, 0xc7, 0x85, 0xa9, 0x5b, 0x59, 0x9c, 0xba, 0x77, 0xa0, 0x21, 0xc6, 0x52, 0x11, 0xcc, 0x3a,
0x9f, 0x34, 0x81, 0x4f, 0x8b, 0xb2, 0xf4, 0xa5, 0xba, 0x26, 0xd4, 0x2d, 0x3d, 0x39, 0xb8, 0x49,
0xd1, 0xb4, 0xd6, 0xcc, 0xa6, 0x65, 0xbf, 0x84, 0xcd, 0xa7, 0x49, 0x72, 0x3e, 0x4d, 0x65, 0x78,
0xfa, 0x23, 0xca, 0xdf, 0x6e, 0x8d, 0xaa, 0x3c, 0x96, 0xfc, 0xdb, 0xaf, 0x3b, 0x09, 0xf6, 0x7f,
0x2c, 0xd8, 0x2a, 0xbb, 0x55, 0x7d, 0xf6, 0xd7, 0xb0, 0x99, 0xfb, 0x75, 0x43, 0x85, 0x85, 0xdc,
0xa0, 0xb5, 0xff, 0x89, 0x91, 0xe6, 0x55, 0xab, 0xf5, 0xec, 0xf6, 0x35, 0x88, 0x4e, 0xff, 0x62,
0x41, 0x42, 0x87, 0x33, 0xe8, 0x2d, 0x9a, 0xf1, 0x2e, 0x93, 0xef, 0xaa, 0x10, 0x6f, 0xe8, 0x95,
0xe8, 0x87, 0xd0, 0x2c, 0x02, 0xa9, 0x88, 0x40, 0x36, 0x4b, 0x81, 0xa8, 0xbd, 0x0a, 0x2b, 0xb4,
0x05, 0x6b, 0x24, 0xcb, 0x92, 0x4c, 0xd5, 0xab, 0x7c, 0xb1, 0x7f, 0x02, 0x8d, 0x6f, 0x9d, 0x5d,
0xfb, 0x6f, 0x15, 0xe8, 0x3c, 0xa4, 0x34, 0x38, 0x8d, 0x75, 0x0a, 0xb6, 0x60, 0x4d, 0xf6, 0x4e,
0x39, 0x86, 0xe4, 0x0b, 0x1a, 0x41, 0x4b, 0x95, 0xbd, 0x01, 0xbd, 0x29, 0xba, 0xb6, 0xa3, 0xa8,
0x56, 0x50, 0x93, 0xa1, 0xf1, 0x76, 0xb8, 0xc0, 0xc1, 0xd6, 0x2e, 0xe5, 0x60, 0x75, 0x83, 0x83,
0xbd, 0x0f, 0x4d, 0xb1, 0x28, 0x4e, 0x7c, 0xa2, 0xc8, 0x59, 0x83, 0x0b, 0x9e, 0x25, 0x3e, 0x41,
0xfb, 0xb0, 0x1d, 0x91, 0x28, 0xc9, 0xe6, 0x6e, 0x84, 0x53, 0x97, 0x53, 0x40, 0x31, 0x56, 0xa3,
0x89, 0x6a, 0x5d, 0x48, 0x6a, 0x8f, 0x71, 0x7a, 0x8c, 0x67, 0x7c, 0xb2, 0x1e, 0x4f, 0xd0, 0x3e,
0xdc, 0xfe, 0x3a, 0x0b, 0x18, 0x9e, 0x84, 0xa4, 0x4c, 0x2d, 0x65, 0x2b, 0xdb, 0xd4, 0x4a, 0x83,
0x5f, 0xda, 0x7f, 0xb2, 0xa0, 0xab, 0x51, 0x53, 0x27, 0xac, 0x07, 0xd5, 0x93, 0x3c, 0xcb, 0xfc,
0x51, 0xe7, 0xa2, 0x72, 0x59, 0x2e, 0x96, 0xf8, 0x6d, 0x8e, 0x7c, 0xcd, 0x44, 0x3e, 0x4f, 0xfa,
0x9a, 0x91, 0x74, 0x0e, 0x0d, 0x9e, 0xb2, 0x33, 0x0d, 0x0d, 0x7f, 0xb6, 0x4f, 0xa1, 0x3f, 0x66,
0x98, 0x05, 0x94, 0x05, 0x1e, 0xd5, 0xe9, 0x5c, 0x48, 0x9c, 0x75, 0x5d, 0xe2, 0x2a, 0x97, 0x25,
0xae, 0x9a, 0x27, 0xce, 0xfe, 0xa7, 0x05, 0xc8, 0xdc, 0x49, 0x41, 0xf0, 0x16, 0xb6, 0xe2, 0x90,
0xb1, 0x84, 0x71, 0xa2, 0xc2, 0x29, 0x85, 0x22, 0x06, 0x42, 0xc2, 0xd3, 0xc7, 0x4f, 0xc3, 0x94,
0x12, 0x5f, 0x6a, 0x25, 0x2b, 0x68, 0x70, 0x81, 0x50, 0x96, 0x49, 0x45, 0x7d, 0x81, 0x54, 0xd8,
0x0f, 0xa1, 0x35, 0x66, 0x49, 0x86, 0x4f, 0xc9, 0xcb, 0x79, 0xfa, 0x26, 0xd1, 0xab, 0xe8, 0x2a,
0x05, 0x10, 0x23, 0x80, 0x83, 0x22, 0xfa, 0x55, 0x1d, 0xf8, 0xb7, 0x70, 0xbb, 0xb0, 0x78, 0x1a,
0x50, 0xa6, 0xf3, 0xf2, 0x19, 0x6c, 0x07, 0xb1, 0x17, 0x4e, 0x7d, 0xe2, 0xc6, 0x7c, 0x00, 0x86,
0x39, 0xaf, 0xb6, 0x04, 0x1d, 0xd9, 0x52, 0xda, 0x67, 0x42, 0xa9, 0xf9, 0xf5, 0xc7, 0x80, 0xf4,
0x2a, 0xe2, 0xe5, 0x2b, 0x2a, 0x62, 0x45, 0x4f, 0x69, 0x0e, 0x3d, 0x65, 0x6d, 0xbf, 0x80, 0xed,
0xc5, 0xcd, 0x55, 0xaa, 0x7e, 0x04, 0xad, 0x02, 0x76, 0xdd, 0x07, 0x6f, 0x1b, 0xed, 0xa7, 0x58,
0xe7, 0x98, 0x96, 0xf6, 0xf7, 0xe1, 0xbd, 0x42, 0xf5, 0x58, 0x34, 0xfa, 0xab, 0x06, 0xd0, 0x10,
0x06, 0xcb, 0xe6, 0x32, 0x06, 0xfb, 0xdf, 0x15, 0x68, 0x3f, 0x56, 0x95, 0xcb, 0x59, 0x80, 0x31,
0xf7, 0x9b, 0x62, 0xee, 0xdf, 0x87, 0x76, 0xa9, 0x20, 0x25, 0xa1, 0x6c, 0x5d, 0x18, 0x17, 0xbd,
0x55, 0x57, 0xc2, 0xaa, 0x30, 0x5b, 0xbc, 0x12, 0x3e, 0x80, 0xfe, 0x49, 0x46, 0xc8, 0xf2, 0xed,
0xb1, 0xe6, 0x6c, 0x70, 0x85, 0x69, 0xbb, 0x07, 0x9b, 0xd8, 0x63, 0xc1, 0xc5, 0x82, 0xb5, 0x3c,
0x5f, 0x7d, 0xa9, 0x32, 0xed, 0xbf, 0xc8, 0x03, 0x0d, 0xe2, 0x93, 0x84, 0x0e, 0xea, 0x6f, 0x7e,
0xfb, 0x53, 0x5f, 0xc3, 0x35, 0x14, 0x3d, 0x87, 0xae, 0xbe, 0x45, 0x28, 0x4f, 0xeb, 0x37, 0xbe,
0xa1, 0xb4, 0x49, 0xa1, 0xa2, 0xf6, 0xef, 0x2b, 0xd0, 0x70, 0xb0, 0x77, 0xfe, 0x6e, 0xe3, 0xfb,
0x39, 0x6c, 0xe4, 0x3d, 0xbf, 0x04, 0xf1, 0x7b, 0x06, 0x30, 0xe6, 0x51, 0x72, 0x3a, 0xbe, 0xf1,
0x46, 0xed, 0xff, 0x59, 0xd0, 0x7d, 0x9c, 0xcf, 0x95, 0x77, 0x1b, 0x8c, 0x7d, 0x00, 0x3e, 0x08,
0x4b, 0x38, 0x98, 0xc4, 0x41, 0xa7, 0xdb, 0x69, 0x66, 0xea, 0x89, 0xda, 0x7f, 0xac, 0x40, 0xfb,
0x65, 0x92, 0x26, 0x61, 0x72, 0x3a, 0x7f, 0xb7, 0xbf, 0xfe, 0x10, 0xfa, 0x06, 0x67, 0x28, 0x81,
0x70, 0x67, 0xe1, 0x30, 0x14, 0xc9, 0x76, 0x36, 0xfc, 0xd2, 0x3b, 0xb5, 0x37, 0xa1, 0xaf, 0x78,
0x71, 0xd1, 0x92, 0xed, 0xdf, 0x59, 0x80, 0x4c, 0xa9, 0xea, 0x95, 0x3f, 0x85, 0x0e, 0x53, 0xd8,
0x89, 0xfd, 0xd4, 0xe5, 0xc0, 0x3c, 0x7b, 0x26, 0xb6, 0x4e, 0x9b, 0x99, 0x48, 0xff, 0x00, 0xb6,
0x96, 0x6e, 0xf8, 0x9c, 0x90, 0x48, 0x84, 0xfb, 0x0b, 0x97, 0xfc, 0xe3, 0x89, 0xfd, 0x19, 0xdc,
0x96, 0x24, 0x54, 0xf7, 0x71, 0xdd, 0x5f, 0x97, 0xd8, 0x64, 0xa7, 0x60, 0x93, 0xf6, 0x7f, 0x2d,
0xd8, 0x5e, 0x5c, 0xa6, 0xe2, 0xbf, 0x6a, 0x1d, 0xc2, 0x80, 0x54, 0xbf, 0x31, 0x79, 0xb1, 0xa4,
0xa3, 0x9f, 0x2e, 0xf1, 0xe2, 0x45, 0xdf, 0x7b, 0xba, 0x0f, 0x15, 0xd4, 0xb8, 0x47, 0xcb, 0x02,
0x3a, 0xc4, 0xd0, 0x5f, 0x32, 0xe3, 0xb7, 0x0a, 0xbd, 0xaf, 0x8a, 0x69, 0x5d, 0x2d, 0xfc, 0x16,
0xc4, 0xd8, 0xde, 0x81, 0xbb, 0x5f, 0x12, 0x76, 0x2c, 0x6c, 0x0e, 0x92, 0xf8, 0x24, 0x38, 0x9d,
0x66, 0xd2, 0xa8, 0x48, 0xed, 0xbd, 0xcb, 0x2c, 0x14, 0x4c, 0x2b, 0x7e, 0x46, 0xb1, 0x6e, 0xfc,
0x33, 0x4a, 0xe5, 0xaa, 0x9f, 0x51, 0xf6, 0xff, 0x55, 0x87, 0xf5, 0x31, 0xc1, 0xaf, 0x09, 0xf1,
0xd1, 0x11, 0x74, 0xc6, 0x24, 0xf6, 0x8b, 0x1f, 0x48, 0xb7, 0x8c, 0x6f, 0xcc, 0xa5, 0xc3, 0xef,
0xac, 0x92, 0xe6, 0x23, 0xf4, 0xd6, 0xae, 0xf5, 0x89, 0x85, 0x5e, 0x40, 0xa7, 0x74, 0x23, 0x44,
0x3b, 0xc6, 0xa2, 0x55, 0x77, 0xc5, 0xe1, 0x9d, 0xa5, 0x81, 0xa2, 0x51, 0xcd, 0x5d, 0xb6, 0xcd,
0x9b, 0x10, 0xba, 0x77, 0xe9, 0x15, 0x49, 0x3a, 0xdc, 0xb9, 0xe6, 0x0a, 0x65, 0xdf, 0x42, 0x9f,
0x43, 0x5d, 0x52, 0x66, 0x34, 0x30, 0x8c, 0x4b, 0x77, 0x8f, 0x52, 0x5c, 0x65, 0x7e, 0x6d, 0xdf,
0x42, 0x4f, 0x00, 0x0a, 0xd2, 0x89, 0x4c, 0x60, 0x96, 0x58, 0xef, 0xf0, 0xee, 0x25, 0xda, 0xdc,
0xd9, 0xd7, 0xd0, 0x2d, 0x53, 0x23, 0x34, 0x5a, 0xc9, 0x7e, 0x8c, 0xfe, 0x30, 0xbc, 0x7f, 0x85,
0x45, 0xee, 0xf8, 0x57, 0xd0, 0x5b, 0x64, 0x3c, 0xc8, 0x5e, 0xb9, 0xb0, 0xc4, 0x9e, 0x86, 0x1f,
0x5c, 0x69, 0x63, 0x82, 0x50, 0xb4, 0xa8, 0x12, 0x08, 0x4b, 0xfd, 0xac, 0x04, 0xc2, 0x72, 0x5f,
0x93, 0x20, 0x94, 0xeb, 0xba, 0x04, 0xc2, 0xca, 0x2e, 0x54, 0x02, 0x61, 0x75, 0x53, 0xb0, 0x6f,
0xa1, 0x04, 0xb6, 0x57, 0x57, 0x1b, 0x32, 0x7f, 0x52, 0xb9, 0xb2, 0x64, 0x87, 0x1f, 0xbd, 0x81,
0xa5, 0xde, 0x70, 0x52, 0x17, 0xff, 0x3e, 0x7c, 0xfa, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x44,
0x05, 0x7a, 0xc2, 0x8d, 0x18, 0x00, 0x00,
}

2
weed/pb/volume_server_pb/volume_server.pb.go

@ -320,7 +320,7 @@ type AllocateVolumeRequest struct {
Preallocate int64 `protobuf:"varint,3,opt,name=preallocate" json:"preallocate,omitempty"`
Replication string `protobuf:"bytes,4,opt,name=replication" json:"replication,omitempty"`
Ttl string `protobuf:"bytes,5,opt,name=ttl" json:"ttl,omitempty"`
MemoryMapMaxSizeMb uint32 `protobuf:"varint,6,opt,name=memory_map_max_size_mb,json=MemoryMapMaxSizeMb" json:"memory_map_max_size_mb,omitempty"`
MemoryMapMaxSizeMb uint32 `protobuf:"varint,6,opt,name=memory_map_max_size_mb,json=memoryMapMaxSizeMb" json:"memory_map_max_size_mb,omitempty"`
}
func (m *AllocateVolumeRequest) Reset() { *m = AllocateVolumeRequest{} }

296
weed/sequence/etcd_sequencer.go

@ -0,0 +1,296 @@
package sequence
/*
Note :
(1) store the sequence in the ETCD cluster, and local file(sequence.dat)
(2) batch get the sequences from ETCD cluster, and store the max sequence id in the local file
(3) the sequence range is : [currentSeqId, maxSeqId), when the currentSeqId >= maxSeqId, fetch the new maxSeqId.
*/
import (
"context"
"fmt"
"sync"
"time"
"io"
"os"
"strconv"
"strings"
"github.com/chrislusf/seaweedfs/weed/glog"
"go.etcd.io/etcd/client"
)
const (
// EtcdKeyPrefix = "/seaweedfs"
EtcdKeySequence = "/master/sequence"
EtcdContextTimeoutSecond = 100 * time.Second
DefaultEtcdSteps uint64 = 500 // internal counter
SequencerFileName = "sequencer.dat"
FileMaxSequenceLength = 128
)
type EtcdSequencer struct {
sequenceLock sync.Mutex
// available sequence range : [currentSeqId, maxSeqId)
currentSeqId uint64
maxSeqId uint64
keysAPI client.KeysAPI
seqFile *os.File
}
func NewEtcdSequencer(etcdUrls string, metaFolder string) (*EtcdSequencer, error) {
file, err := openSequenceFile(metaFolder + "/" + SequencerFileName)
if nil != err {
return nil, fmt.Errorf("open sequence file fialed, %v", err)
}
cli, err := client.New(client.Config{
Endpoints: strings.Split(etcdUrls, ","),
Username: "",
Password: "",
})
if err != nil {
return nil, err
}
keysApi := client.NewKeysAPI(cli)
// TODO: the current sequence id in local file is not used
maxValue, _, err := readSequenceFile(file)
if err != nil {
return nil, fmt.Errorf("read sequence from file failed, %v", err)
}
glog.V(4).Infof("read sequence from file : %d", maxValue)
newSeq, err := setMaxSequenceToEtcd(keysApi, maxValue)
if err != nil {
return nil, err
}
sequencer := &EtcdSequencer{maxSeqId: newSeq,
currentSeqId: newSeq,
keysAPI: keysApi,
seqFile: file,
}
return sequencer, nil
}
func (es *EtcdSequencer) NextFileId(count uint64) uint64 {
es.sequenceLock.Lock()
defer es.sequenceLock.Unlock()
if (es.currentSeqId + count) >= es.maxSeqId {
reqSteps := DefaultEtcdSteps
if count > DefaultEtcdSteps {
reqSteps += count
}
maxId, err := batchGetSequenceFromEtcd(es.keysAPI, reqSteps)
glog.V(4).Infof("get max sequence id from etcd, %d", maxId)
if err != nil {
glog.Error(err)
return 0
}
es.currentSeqId, es.maxSeqId = maxId-reqSteps, maxId
glog.V(4).Infof("current id : %d, max id : %d", es.currentSeqId, es.maxSeqId)
if err := writeSequenceFile(es.seqFile, es.maxSeqId, es.currentSeqId); err != nil {
glog.Errorf("flush sequence to file failed, %v", err)
}
}
ret := es.currentSeqId
es.currentSeqId += count
return ret
}
/**
instead of collecting the max value from volume server,
the max value should be saved in local config file and ETCD cluster
*/
func (es *EtcdSequencer) SetMax(seenValue uint64) {
es.sequenceLock.Lock()
defer es.sequenceLock.Unlock()
if seenValue > es.maxSeqId {
maxId, err := setMaxSequenceToEtcd(es.keysAPI, seenValue)
if err != nil {
glog.Errorf("set Etcd Max sequence failed : %v", err)
return
}
es.currentSeqId, es.maxSeqId = maxId, maxId
if err := writeSequenceFile(es.seqFile, maxId, maxId); err != nil {
glog.Errorf("flush sequence to file failed, %v", err)
}
}
}
func (es *EtcdSequencer) GetMax() uint64 {
return es.maxSeqId
}
func (es *EtcdSequencer) Peek() uint64 {
return es.currentSeqId
}
func batchGetSequenceFromEtcd(kvApi client.KeysAPI, step uint64) (uint64, error) {
if step <= 0 {
return 0, fmt.Errorf("the step must be large than 1")
}
ctx, cancel := context.WithTimeout(context.Background(), EtcdContextTimeoutSecond)
var endSeqValue uint64 = 0
defer cancel()
for {
getResp, err := kvApi.Get(ctx, EtcdKeySequence, &client.GetOptions{Recursive: false, Quorum: true})
if err != nil {
return 0, err
}
if getResp.Node == nil {
continue
}
prevValue := getResp.Node.Value
prevSeqValue, err := strconv.ParseUint(prevValue, 10, 64)
if err != nil {
return 0, fmt.Errorf("get sequence from etcd failed, %v", err)
}
endSeqValue = prevSeqValue + step
endSeqStr := strconv.FormatUint(endSeqValue, 10)
_, err = kvApi.Set(ctx, EtcdKeySequence, endSeqStr, &client.SetOptions{PrevValue: prevValue})
if err == nil {
break
}
glog.Error(err)
}
return endSeqValue, nil
}
/**
update the value of the key EtcdKeySequence in ETCD cluster with the parameter of maxSeq,
when the value of the key EtcdKeySequence is equal to or large than the parameter maxSeq,
return the value of EtcdKeySequence in the ETCD cluster;
when the value of the EtcdKeySequence is less than the parameter maxSeq,
return the value of the parameter maxSeq
*/
func setMaxSequenceToEtcd(kvApi client.KeysAPI, maxSeq uint64) (uint64, error) {
maxSeqStr := strconv.FormatUint(maxSeq, 10)
ctx, cancel := context.WithTimeout(context.Background(), EtcdContextTimeoutSecond)
defer cancel()
for {
getResp, err := kvApi.Get(ctx, EtcdKeySequence, &client.GetOptions{Recursive: false, Quorum: true})
if err != nil {
if ce, ok := err.(client.Error); ok && (ce.Code == client.ErrorCodeKeyNotFound) {
_, err := kvApi.Create(ctx, EtcdKeySequence, maxSeqStr)
if err == nil {
continue
}
if ce, ok = err.(client.Error); ok && (ce.Code == client.ErrorCodeNodeExist) {
continue
}
return 0, err
} else {
return 0, err
}
}
if getResp.Node == nil {
continue
}
prevSeqStr := getResp.Node.Value
prevSeq, err := strconv.ParseUint(prevSeqStr, 10, 64)
if err != nil {
return 0, err
}
if prevSeq >= maxSeq {
return prevSeq, nil
}
_, err = kvApi.Set(ctx, EtcdKeySequence, maxSeqStr, &client.SetOptions{PrevValue: prevSeqStr})
if err != nil {
return 0, err
}
}
}
func openSequenceFile(file string) (*os.File, error) {
_, err := os.Stat(file)
if os.IsNotExist(err) {
fid, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
return nil, err
}
if err := writeSequenceFile(fid, 1, 0); err != nil {
return nil, err
}
return fid, nil
} else {
return os.OpenFile(file, os.O_RDWR|os.O_CREATE, 0644)
}
}
/*
read sequence and step from sequence file
*/
func readSequenceFile(file *os.File) (uint64, uint64, error) {
sequence := make([]byte, FileMaxSequenceLength)
size, err := file.ReadAt(sequence, 0)
if (err != nil) && (err != io.EOF) {
err := fmt.Errorf("cannot read file %s, %v", file.Name(), err)
return 0, 0, err
}
sequence = sequence[0:size]
seqs := strings.Split(string(sequence), ":")
maxId, err := strconv.ParseUint(seqs[0], 10, 64)
if err != nil {
return 0, 0, fmt.Errorf("parse sequence from file failed, %v", err)
}
if len(seqs) > 1 {
step, err := strconv.ParseUint(seqs[1], 10, 64)
if err != nil {
return 0, 0, fmt.Errorf("parse sequence from file failed, %v", err)
}
return maxId, step, nil
}
return maxId, 0, nil
}
/**
write the sequence and step to sequence file
*/
func writeSequenceFile(file *os.File, sequence, step uint64) error {
_ = step
seqStr := fmt.Sprintf("%d:%d", sequence, sequence)
if _, err := file.Seek(0, 0); err != nil {
err = fmt.Errorf("cannot seek to the beginning of %s: %v", file.Name(), err)
return err
}
if err := file.Truncate(0); err != nil {
return fmt.Errorf("truncate sequence file faield : %v", err)
}
if _, err := file.WriteString(seqStr); err != nil {
return fmt.Errorf("write file %s failed, %v", file.Name(), err)
}
if err := file.Sync(); err != nil {
return fmt.Errorf("flush file %s failed, %v", file.Name(), err)
}
return nil
}
// the UT helper method
// func deleteEtcdKey(kvApi client.KeysAPI, key string) error {
// ctx, cancel := context.WithTimeout(context.Background(), EtcdContextTimeoutSecond)
// defer cancel()
// _, err := kvApi.Delete(ctx, key, &client.DeleteOptions{Dir: false})
// if err != nil {
// return err
// }
// return nil
// }

2
weed/server/master_grpc_server_volume.go

@ -78,7 +78,7 @@ func (ms *MasterServer) Assign(ctx context.Context, req *master_pb.AssignRequest
}
ms.vgLock.Lock()
if !ms.Topo.HasWritableVolume(option) {
if _, err = ms.vg.AutomaticGrowByType(option, ms.grpcDialOption, ms.Topo); err != nil {
if _, err = ms.vg.AutomaticGrowByType(option, ms.grpcDialOption, ms.Topo, int(req.WritableVolumeCount)); err != nil {
ms.vgLock.Unlock()
return nil, fmt.Errorf("Cannot grow volume group! %v", err)
}

38
weed/server/master_server.go

@ -27,6 +27,12 @@ import (
"google.golang.org/grpc"
)
const (
MasterPrefix = "master.maintenance"
SequencerType = MasterPrefix + ".sequencer_type"
SequencerEtcdUrls = MasterPrefix + ".sequencer_etcd_urls"
)
type MasterOption struct {
Port int
MetaFolder string
@ -87,7 +93,11 @@ func NewMasterServer(r *mux.Router, option *MasterOption, peers []string) *Maste
MasterClient: wdclient.NewMasterClient(context.Background(), grpcDialOption, "master", peers),
}
ms.bounedLeaderChan = make(chan int, 16)
seq := sequence.NewMemorySequencer()
seq := ms.createSequencer(option)
if nil == seq {
glog.Fatalf("create sequencer failed.")
}
ms.Topo = topology.NewTopology("topo", seq, uint64(ms.option.VolumeSizeLimitMB)*1024*1024, ms.option.PulseSeconds)
ms.vg = topology.NewDefaultVolumeGrowth()
glog.V(0).Infoln("Volume Size Limit is", ms.option.VolumeSizeLimitMB, "MB")
@ -165,8 +175,8 @@ func (ms *MasterServer) proxyToLeader(f func(w http.ResponseWriter, r *http.Requ
proxy.Transport = util.Transport
proxy.ServeHTTP(w, r)
} else {
//drop it to the floor
//writeJsonError(w, r, errors.New(ms.Topo.RaftServer.Name()+" does not know Leader yet:"+ms.Topo.RaftServer.Leader()))
// drop it to the floor
// writeJsonError(w, r, errors.New(ms.Topo.RaftServer.Name()+" does not know Leader yet:"+ms.Topo.RaftServer.Leader()))
}
}
}
@ -230,3 +240,25 @@ func (ms *MasterServer) startAdminScripts() {
}
}()
}
func (ms *MasterServer) createSequencer(option *MasterOption) sequence.Sequencer {
var seq sequence.Sequencer
seqType := strings.ToLower(util.Config().GetString(SequencerType))
glog.V(0).Infof("[%s] : [%s]", SequencerType, seqType)
switch strings.ToLower(seqType) {
case "memory":
seq = sequence.NewMemorySequencer()
case "etcd":
var err error
urls := util.Config().GetString(SequencerEtcdUrls)
glog.V(0).Infof("[%s] : [%s]", SequencerEtcdUrls, urls)
seq, err = sequence.NewEtcdSequencer(urls, option.MetaFolder)
if err != nil {
glog.Error(err)
seq = nil
}
default:
seq = sequence.NewMemorySequencer()
}
return seq
}

7
weed/server/master_server_handlers.go

@ -100,6 +100,11 @@ func (ms *MasterServer) dirAssignHandler(w http.ResponseWriter, r *http.Request)
requestedCount = 1
}
writableVolumeCount, e := strconv.Atoi(r.FormValue("writableVolumeCount"))
if e != nil {
writableVolumeCount = 0
}
option, err := ms.getVolumeGrowOption(r)
if err != nil {
writeJsonQuiet(w, r, http.StatusNotAcceptable, operation.AssignResult{Error: err.Error()})
@ -114,7 +119,7 @@ func (ms *MasterServer) dirAssignHandler(w http.ResponseWriter, r *http.Request)
ms.vgLock.Lock()
defer ms.vgLock.Unlock()
if !ms.Topo.HasWritableVolume(option) {
if _, err = ms.vg.AutomaticGrowByType(option, ms.grpcDialOption, ms.Topo); err != nil {
if _, err = ms.vg.AutomaticGrowByType(option, ms.grpcDialOption, ms.Topo, writableVolumeCount); err != nil {
writeJsonError(w, r, http.StatusInternalServerError,
fmt.Errorf("Cannot grow volume group! %v", err))
return

4
weed/shell/command_ec_balance.go

@ -266,6 +266,10 @@ func doBalanceEcShardsAcrossRacks(ctx context.Context, commandEnv *CommandEnv, c
for shardId, ecNode := range ecShardsToMove {
rackId := pickOneRack(racks, rackToShardCount, averageShardsPerEcRack)
if rackId == "" {
fmt.Printf("ec shard %d.%d at %s can not find a destination rack\n", vid, shardId, ecNode.info.Id)
continue
}
var possibleDestinationEcNodes []*EcNode
for _, n := range racks[rackId].ecNodes {
possibleDestinationEcNodes = append(possibleDestinationEcNodes, n)

2
weed/shell/command_ec_common.go

@ -156,7 +156,7 @@ func countShards(ecShardInfos []*master_pb.VolumeEcShardInformationMessage) (cou
}
func countFreeShardSlots(dn *master_pb.DataNodeInfo) (count int) {
return int(dn.FreeVolumeCount)*10 - countShards(dn.EcShardInfos)
return int(dn.FreeVolumeCount)*erasure_coding.DataShardsCount - countShards(dn.EcShardInfos)
}
type RackId string

7
weed/topology/volume_growth.go

@ -59,8 +59,11 @@ func (vg *VolumeGrowth) findVolumeCount(copyCount int) (count int) {
return
}
func (vg *VolumeGrowth) AutomaticGrowByType(option *VolumeGrowOption, grpcDialOption grpc.DialOption, topo *Topology) (count int, err error) {
count, err = vg.GrowByCountAndType(grpcDialOption, vg.findVolumeCount(option.ReplicaPlacement.GetCopyCount()), option, topo)
func (vg *VolumeGrowth) AutomaticGrowByType(option *VolumeGrowOption, grpcDialOption grpc.DialOption, topo *Topology, targetCount int) (count int, err error) {
if targetCount == 0 {
targetCount = vg.findVolumeCount(option.ReplicaPlacement.GetCopyCount())
}
count, err = vg.GrowByCountAndType(grpcDialOption, targetCount, option, topo)
if count > 0 && count%option.ReplicaPlacement.GetCopyCount() == 0 {
return count, nil
}

4
weed/util/config.go

@ -40,5 +40,9 @@ func LoadConfiguration(configFileName string, required bool) (loaded bool) {
}
return true
}
func Config() Configuration {
return viper.GetViper()
}
Loading…
Cancel
Save