diff --git a/weed/pb/master.proto b/weed/pb/master.proto index 7fdd45469..9b1e884c7 100644 --- a/weed/pb/master.proto +++ b/weed/pb/master.proto @@ -210,6 +210,7 @@ message DataNodeInfo { uint64 active_volume_count = 5; repeated VolumeInformationMessage volume_infos = 6; repeated VolumeEcShardInformationMessage ec_shard_infos = 7; + uint64 remote_volume_count = 8; } message RackInfo { string id = 1; @@ -218,6 +219,7 @@ message RackInfo { uint64 free_volume_count = 4; uint64 active_volume_count = 5; repeated DataNodeInfo data_node_infos = 6; + uint64 remote_volume_count = 7; } message DataCenterInfo { string id = 1; @@ -226,6 +228,7 @@ message DataCenterInfo { uint64 free_volume_count = 4; uint64 active_volume_count = 5; repeated RackInfo rack_infos = 6; + uint64 remote_volume_count = 7; } message TopologyInfo { string id = 1; @@ -234,6 +237,7 @@ message TopologyInfo { uint64 free_volume_count = 4; uint64 active_volume_count = 5; repeated DataCenterInfo data_center_infos = 6; + uint64 remote_volume_count = 7; } message VolumeListRequest { } diff --git a/weed/pb/master_pb/master.pb.go b/weed/pb/master_pb/master.pb.go index a01fb0a1f..ea4362c92 100644 --- a/weed/pb/master_pb/master.pb.go +++ b/weed/pb/master_pb/master.pb.go @@ -1043,6 +1043,7 @@ type DataNodeInfo struct { 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"` EcShardInfos []*VolumeEcShardInformationMessage `protobuf:"bytes,7,rep,name=ec_shard_infos,json=ecShardInfos" json:"ec_shard_infos,omitempty"` + RemoteVolumeCount uint64 `protobuf:"varint,8,opt,name=remote_volume_count,json=remoteVolumeCount" json:"remote_volume_count,omitempty"` } func (m *DataNodeInfo) Reset() { *m = DataNodeInfo{} } @@ -1099,6 +1100,13 @@ func (m *DataNodeInfo) GetEcShardInfos() []*VolumeEcShardInformationMessage { return nil } +func (m *DataNodeInfo) GetRemoteVolumeCount() uint64 { + if m != nil { + return m.RemoteVolumeCount + } + return 0 +} + 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"` @@ -1106,6 +1114,7 @@ type RackInfo struct { 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"` + RemoteVolumeCount uint64 `protobuf:"varint,7,opt,name=remote_volume_count,json=remoteVolumeCount" json:"remote_volume_count,omitempty"` } func (m *RackInfo) Reset() { *m = RackInfo{} } @@ -1155,6 +1164,13 @@ func (m *RackInfo) GetDataNodeInfos() []*DataNodeInfo { return nil } +func (m *RackInfo) GetRemoteVolumeCount() uint64 { + if m != nil { + return m.RemoteVolumeCount + } + return 0 +} + 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"` @@ -1162,6 +1178,7 @@ type DataCenterInfo struct { 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"` + RemoteVolumeCount uint64 `protobuf:"varint,7,opt,name=remote_volume_count,json=remoteVolumeCount" json:"remote_volume_count,omitempty"` } func (m *DataCenterInfo) Reset() { *m = DataCenterInfo{} } @@ -1211,6 +1228,13 @@ func (m *DataCenterInfo) GetRackInfos() []*RackInfo { return nil } +func (m *DataCenterInfo) GetRemoteVolumeCount() uint64 { + if m != nil { + return m.RemoteVolumeCount + } + return 0 +} + 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"` @@ -1218,6 +1242,7 @@ type TopologyInfo struct { 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"` + RemoteVolumeCount uint64 `protobuf:"varint,7,opt,name=remote_volume_count,json=remoteVolumeCount" json:"remote_volume_count,omitempty"` } func (m *TopologyInfo) Reset() { *m = TopologyInfo{} } @@ -1267,6 +1292,13 @@ func (m *TopologyInfo) GetDataCenterInfos() []*DataCenterInfo { return nil } +func (m *TopologyInfo) GetRemoteVolumeCount() uint64 { + if m != nil { + return m.RemoteVolumeCount + } + return 0 +} + type VolumeListRequest struct { } @@ -1875,136 +1907,137 @@ var _Seaweed_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("master.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 2083 bytes of a gzipped FileDescriptorProto + // 2102 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xd4, 0x59, 0x4b, 0x6f, 0x1c, 0xc7, - 0x11, 0xd6, 0x0c, 0x97, 0xcb, 0xdd, 0xda, 0x77, 0x93, 0xa2, 0x57, 0x6b, 0x4b, 0x5c, 0x8d, 0x03, - 0x98, 0x52, 0x1c, 0xc6, 0xa1, 0x0d, 0xc4, 0x48, 0x62, 0x18, 0x12, 0x45, 0x3b, 0x84, 0x44, 0x5a, - 0x9a, 0x55, 0x64, 0x20, 0x40, 0x30, 0xe9, 0x9d, 0x69, 0x92, 0x03, 0xce, 0x2b, 0xd3, 0xbd, 0x14, - 0xd7, 0xb9, 0x04, 0x48, 0x6e, 0x01, 0x72, 0xc9, 0x21, 0x7f, 0x21, 0xf7, 0xdc, 0x73, 0xc9, 0x8f, - 0xc8, 0x39, 0x7f, 0x21, 0x57, 0x23, 0x40, 0xd0, 0xaf, 0x79, 0xed, 0x92, 0x34, 0x0d, 0xe8, 0xa0, - 0xdb, 0x74, 0x55, 0x75, 0x75, 0xf5, 0x57, 0x5d, 0xd5, 0x5f, 0xef, 0x42, 0x3b, 0xc4, 0x94, 0x91, - 0x74, 0x27, 0x49, 0x63, 0x16, 0xa3, 0xa6, 0x1c, 0x39, 0xc9, 0xd4, 0xfa, 0x73, 0x1d, 0x9a, 0xbf, - 0x24, 0x38, 0x65, 0x53, 0x82, 0x19, 0xea, 0x82, 0xe9, 0x27, 0x43, 0x63, 0x6c, 0x6c, 0x37, 0x6d, - 0xd3, 0x4f, 0x10, 0x82, 0x5a, 0x12, 0xa7, 0x6c, 0x68, 0x8e, 0x8d, 0xed, 0x8e, 0x2d, 0xbe, 0xd1, - 0x5d, 0x80, 0x64, 0x36, 0x0d, 0x7c, 0xd7, 0x99, 0xa5, 0xc1, 0x70, 0x45, 0xd8, 0x36, 0xa5, 0xe4, - 0x57, 0x69, 0x80, 0xb6, 0xa1, 0x1f, 0xe2, 0x0b, 0xe7, 0x3c, 0x0e, 0x66, 0x21, 0x71, 0xdc, 0x78, - 0x16, 0xb1, 0x61, 0x4d, 0x4c, 0xef, 0x86, 0xf8, 0xe2, 0x95, 0x10, 0xef, 0x71, 0x29, 0x1a, 0xf3, - 0xa8, 0x2e, 0x9c, 0x63, 0x3f, 0x20, 0xce, 0x19, 0x99, 0x0f, 0x57, 0xc7, 0xc6, 0x76, 0xcd, 0x86, - 0x10, 0x5f, 0x7c, 0xe1, 0x07, 0xe4, 0x29, 0x99, 0xa3, 0x2d, 0x68, 0x79, 0x98, 0x61, 0xc7, 0x25, - 0x11, 0x23, 0xe9, 0xb0, 0x2e, 0xd6, 0x02, 0x2e, 0xda, 0x13, 0x12, 0x1e, 0x5f, 0x8a, 0xdd, 0xb3, - 0xe1, 0x9a, 0xd0, 0x88, 0x6f, 0x1e, 0x1f, 0xf6, 0x42, 0x3f, 0x72, 0x44, 0xe4, 0x0d, 0xb1, 0x74, - 0x53, 0x48, 0x9e, 0xf3, 0xf0, 0x3f, 0x83, 0x35, 0x19, 0x1b, 0x1d, 0x36, 0xc7, 0x2b, 0xdb, 0xad, - 0xdd, 0xf7, 0x77, 0x32, 0x34, 0x76, 0x64, 0x78, 0x07, 0xd1, 0x71, 0x9c, 0x86, 0x98, 0xf9, 0x71, - 0x74, 0x48, 0x28, 0xc5, 0x27, 0xc4, 0xd6, 0x73, 0xd0, 0x01, 0xb4, 0x22, 0xf2, 0xda, 0xd1, 0x2e, - 0x40, 0xb8, 0xd8, 0x5e, 0x70, 0x31, 0x39, 0x8d, 0x53, 0xb6, 0xc4, 0x0f, 0x44, 0xe4, 0xf5, 0x2b, - 0xe5, 0xea, 0x05, 0xf4, 0x3c, 0x12, 0x10, 0x46, 0xbc, 0xcc, 0x5d, 0xeb, 0x86, 0xee, 0xba, 0xca, - 0x81, 0x76, 0xf9, 0x03, 0xe8, 0x9e, 0x62, 0xea, 0x44, 0x71, 0xe6, 0xb1, 0x3d, 0x36, 0xb6, 0x1b, - 0x76, 0xfb, 0x14, 0xd3, 0xa3, 0x58, 0x5b, 0x7d, 0x09, 0x4d, 0xe2, 0x3a, 0xf4, 0x14, 0xa7, 0x1e, - 0x1d, 0xf6, 0xc5, 0x92, 0x0f, 0x17, 0x96, 0xdc, 0x77, 0x27, 0xdc, 0x60, 0xc9, 0xa2, 0x0d, 0x22, - 0x55, 0x14, 0x1d, 0x41, 0x87, 0x83, 0x91, 0x3b, 0x1b, 0xdc, 0xd8, 0x19, 0x47, 0x73, 0x5f, 0xfb, - 0x7b, 0x05, 0x03, 0x8d, 0x48, 0xee, 0x13, 0xdd, 0xd8, 0xa7, 0x86, 0x35, 0xf3, 0xfb, 0x01, 0xf4, - 0x15, 0x2c, 0xb9, 0xdb, 0x75, 0x01, 0x4c, 0x47, 0x00, 0xa3, 0x0d, 0xad, 0x3f, 0x98, 0x30, 0xc8, - 0xaa, 0xc1, 0x26, 0x34, 0x89, 0x23, 0x4a, 0xd0, 0x43, 0x18, 0xa8, 0xe3, 0x4c, 0xfd, 0x6f, 0x88, - 0x13, 0xf8, 0xa1, 0xcf, 0x44, 0x91, 0xd4, 0xec, 0x9e, 0x54, 0x4c, 0xfc, 0x6f, 0xc8, 0x33, 0x2e, - 0x46, 0x9b, 0x50, 0x0f, 0x08, 0xf6, 0x48, 0x2a, 0x6a, 0xa6, 0x69, 0xab, 0x11, 0xfa, 0x00, 0x7a, - 0x21, 0x61, 0xa9, 0xef, 0x52, 0x07, 0x7b, 0x5e, 0x4a, 0x28, 0x55, 0xa5, 0xd3, 0x55, 0xe2, 0x47, - 0x52, 0x8a, 0x3e, 0x85, 0xa1, 0x36, 0xf4, 0xf9, 0x19, 0x3f, 0xc7, 0x81, 0x43, 0x89, 0x1b, 0x47, - 0x1e, 0x55, 0x75, 0xb4, 0xa9, 0xf4, 0x07, 0x4a, 0x3d, 0x91, 0x5a, 0xf4, 0x04, 0xfa, 0x94, 0xc5, - 0x29, 0x3e, 0x21, 0xce, 0x14, 0xbb, 0x67, 0x84, 0xcf, 0x58, 0x15, 0xe0, 0xdd, 0x29, 0x80, 0x37, - 0x91, 0x26, 0x8f, 0xa5, 0x85, 0xdd, 0xa3, 0xa5, 0x31, 0xb5, 0xbe, 0x5d, 0x81, 0xe1, 0x65, 0x65, - 0x20, 0xfa, 0x83, 0x27, 0xb6, 0xde, 0xb1, 0x4d, 0xdf, 0xe3, 0xf5, 0xc7, 0x21, 0x11, 0x7b, 0xad, - 0xd9, 0xe2, 0x1b, 0xdd, 0x03, 0x70, 0xe3, 0x20, 0x20, 0x2e, 0x9f, 0xa8, 0x36, 0x59, 0x90, 0xf0, - 0xfa, 0x14, 0x25, 0x9f, 0xb7, 0x86, 0x9a, 0xdd, 0xe4, 0x12, 0xd9, 0x15, 0xee, 0x43, 0x5b, 0xa6, - 0x4f, 0x19, 0xc8, 0xae, 0xd0, 0x92, 0x32, 0x69, 0xf2, 0x21, 0x20, 0x7d, 0x4c, 0xa6, 0xf3, 0xcc, - 0xb0, 0x2e, 0x0c, 0xfb, 0x4a, 0xf3, 0x78, 0xae, 0xad, 0xdf, 0x85, 0x66, 0x4a, 0xb0, 0xe7, 0xc4, - 0x51, 0x30, 0x17, 0x8d, 0xa2, 0x61, 0x37, 0xb8, 0xe0, 0xab, 0x28, 0x98, 0xa3, 0x1f, 0xc2, 0x20, - 0x25, 0x49, 0xe0, 0xbb, 0xd8, 0x49, 0x02, 0xec, 0x92, 0x90, 0x44, 0xba, 0x67, 0xf4, 0x95, 0xe2, - 0xb9, 0x96, 0xa3, 0x21, 0xac, 0x9d, 0x93, 0x94, 0xf2, 0x6d, 0x35, 0x85, 0x89, 0x1e, 0xa2, 0x3e, - 0xac, 0x30, 0x16, 0x0c, 0x41, 0x48, 0xf9, 0x27, 0x7a, 0x00, 0x7d, 0x37, 0x0e, 0x13, 0xec, 0x32, - 0x27, 0x25, 0xe7, 0xbe, 0x98, 0xd4, 0x12, 0xea, 0x9e, 0x92, 0xdb, 0x4a, 0xcc, 0xb7, 0x13, 0xc6, - 0x9e, 0x7f, 0xec, 0x13, 0xcf, 0xc1, 0x4c, 0x25, 0x5b, 0x14, 0xee, 0x8a, 0xdd, 0xd7, 0x9a, 0x47, - 0x4c, 0xa6, 0x19, 0xed, 0xc0, 0x7a, 0x4a, 0xc2, 0x98, 0x11, 0x47, 0x27, 0x3b, 0xc2, 0x21, 0x19, - 0x76, 0x04, 0xce, 0x03, 0xa9, 0x52, 0x39, 0x3e, 0xc2, 0x21, 0xe1, 0xde, 0x2b, 0xf6, 0xbc, 0xd7, - 0x76, 0x85, 0x79, 0xbf, 0x64, 0xfe, 0x94, 0xcc, 0xad, 0xbf, 0x1b, 0x70, 0xf7, 0xca, 0x96, 0xb3, - 0x70, 0x04, 0xae, 0x4b, 0xf7, 0x9b, 0x42, 0xd8, 0x9a, 0xc1, 0xd6, 0x35, 0x8d, 0xe0, 0x9a, 0x58, - 0xcd, 0x85, 0x58, 0x2d, 0xe8, 0x10, 0xd7, 0xf1, 0x23, 0x8f, 0x5c, 0x38, 0x53, 0x9f, 0xc9, 0x12, - 0xed, 0xd8, 0x2d, 0xe2, 0x1e, 0x70, 0xd9, 0x63, 0x9f, 0x51, 0xeb, 0x9f, 0x06, 0x74, 0xcb, 0x35, - 0xc4, 0xab, 0x80, 0xcd, 0x13, 0xa2, 0xee, 0x4d, 0xf1, 0xad, 0x96, 0x36, 0xd5, 0x4d, 0xea, 0xa1, - 0x03, 0x80, 0x24, 0x8d, 0x13, 0x92, 0x32, 0x9f, 0x70, 0xbf, 0xbc, 0x2c, 0x1f, 0x5c, 0x5a, 0x96, - 0x3b, 0xcf, 0x33, 0xdb, 0xfd, 0x88, 0xa5, 0x73, 0xbb, 0x30, 0x79, 0xf4, 0x19, 0xf4, 0x2a, 0x6a, - 0x8e, 0x0e, 0xcf, 0xaa, 0x0c, 0x80, 0x7f, 0xa2, 0x0d, 0x58, 0x3d, 0xc7, 0xc1, 0x8c, 0xa8, 0x10, - 0xe4, 0xe0, 0x67, 0xe6, 0xa7, 0x86, 0xb5, 0x06, 0xab, 0xfb, 0x61, 0xc2, 0xe6, 0x7c, 0x27, 0xbd, - 0xc9, 0x2c, 0x21, 0xe9, 0xe3, 0x20, 0x76, 0xcf, 0xf6, 0x2f, 0x58, 0x8a, 0xd1, 0x57, 0xd0, 0x25, - 0x29, 0xa6, 0xb3, 0x94, 0x57, 0x95, 0xe7, 0x47, 0x27, 0xc2, 0x67, 0xf9, 0x4a, 0xaa, 0xcc, 0xd9, - 0xd9, 0x97, 0x13, 0xf6, 0x84, 0xbd, 0xdd, 0x21, 0xc5, 0xe1, 0xe8, 0xd7, 0xd0, 0x29, 0xe9, 0x39, - 0x58, 0xfc, 0x02, 0x57, 0x59, 0x11, 0xdf, 0xbc, 0x69, 0x26, 0x38, 0xf5, 0xd9, 0x5c, 0x11, 0x0d, - 0x35, 0xe2, 0xad, 0x42, 0x35, 0x5e, 0xdf, 0x93, 0xa0, 0x75, 0xec, 0xa6, 0x94, 0x1c, 0x78, 0xd4, - 0x7a, 0x08, 0x1b, 0x4f, 0x09, 0x49, 0xf6, 0xe2, 0x28, 0x22, 0x2e, 0x23, 0x9e, 0x4d, 0x7e, 0x37, - 0x23, 0x94, 0xf1, 0x25, 0x44, 0x4d, 0xa8, 0x7c, 0xf0, 0x6f, 0xeb, 0x6f, 0x06, 0x74, 0xe5, 0x71, - 0x79, 0x16, 0xbb, 0xe2, 0x90, 0x70, 0xd0, 0x38, 0x83, 0x51, 0xa0, 0xcd, 0xd2, 0xa0, 0x42, 0x6d, - 0xcc, 0x2a, 0xb5, 0xb9, 0x03, 0x0d, 0x71, 0xf7, 0xe7, 0xc1, 0xac, 0xf1, 0xeb, 0xdc, 0xf7, 0x68, - 0xde, 0xb5, 0x3c, 0xa9, 0xae, 0x09, 0x75, 0x4b, 0x5f, 0xcf, 0xdc, 0x24, 0xbf, 0x19, 0x56, 0x8b, - 0x37, 0x83, 0xf5, 0x12, 0xd6, 0x9f, 0xc5, 0xf1, 0xd9, 0x2c, 0x91, 0xe1, 0xe9, 0x4d, 0x94, 0xf7, - 0x6e, 0x8c, 0x57, 0x78, 0x2c, 0xd9, 0xde, 0xaf, 0x3b, 0xca, 0xd6, 0x7f, 0x0d, 0xd8, 0x28, 0xbb, - 0x55, 0x97, 0xd9, 0x6f, 0x61, 0x3d, 0xf3, 0xeb, 0x04, 0x0a, 0x0b, 0xb9, 0x40, 0x6b, 0xf7, 0xa3, - 0x42, 0x9a, 0x97, 0xcd, 0xd6, 0x04, 0xc9, 0xd3, 0x20, 0xda, 0x83, 0xf3, 0x8a, 0x84, 0x8e, 0x2e, - 0xa0, 0x5f, 0x35, 0xe3, 0x4d, 0x38, 0x5b, 0x55, 0x21, 0xde, 0xd0, 0x33, 0xd1, 0x4f, 0xa0, 0x99, - 0x07, 0x62, 0x8a, 0x40, 0xd6, 0x4b, 0x81, 0xa8, 0xb5, 0x72, 0x2b, 0x7e, 0xbc, 0x49, 0x9a, 0xc6, - 0xa9, 0x6a, 0x38, 0x72, 0x60, 0xfd, 0x1c, 0x1a, 0xdf, 0x3b, 0xbb, 0xd6, 0x3f, 0x4c, 0xe8, 0x3c, - 0xa2, 0xd4, 0x3f, 0x89, 0x74, 0x0a, 0x36, 0x60, 0x55, 0x5e, 0x2d, 0xf2, 0xae, 0x97, 0x03, 0x34, - 0x86, 0x96, 0xea, 0x5b, 0x05, 0xe8, 0x8b, 0xa2, 0x6b, 0x5b, 0xa2, 0xea, 0x65, 0x35, 0x19, 0x1a, - 0xbf, 0x2d, 0x2a, 0x44, 0x77, 0xf5, 0x52, 0xa2, 0x5b, 0x2f, 0x10, 0xdd, 0x77, 0xa1, 0x29, 0x26, - 0x45, 0xb1, 0x47, 0x14, 0x03, 0x6e, 0x70, 0xc1, 0x51, 0xec, 0x11, 0xb4, 0x0b, 0x9b, 0x21, 0x09, - 0xe3, 0x74, 0xee, 0x84, 0x38, 0x71, 0x38, 0xcf, 0x16, 0xdc, 0x25, 0x9c, 0xaa, 0xde, 0x8b, 0xa4, - 0xf6, 0x10, 0x27, 0x87, 0xf8, 0x82, 0xd3, 0x97, 0xc3, 0x29, 0xda, 0x85, 0xdb, 0x5f, 0xa7, 0x3e, - 0xc3, 0xd3, 0x80, 0x94, 0xf9, 0xbb, 0xec, 0xc5, 0xeb, 0x5a, 0x59, 0x20, 0xf1, 0xd6, 0x5f, 0x0d, - 0xe8, 0x6a, 0xd4, 0xd4, 0x09, 0xeb, 0xc3, 0xca, 0x71, 0x96, 0x65, 0xfe, 0xa9, 0x73, 0x61, 0x5e, - 0x96, 0x8b, 0x85, 0x47, 0x44, 0x86, 0x7c, 0xad, 0x88, 0x7c, 0x96, 0xf4, 0xd5, 0x42, 0xd2, 0x39, - 0x34, 0x78, 0xc6, 0x4e, 0x35, 0x34, 0xfc, 0xdb, 0x3a, 0x81, 0xc1, 0x84, 0x61, 0xe6, 0x53, 0xe6, - 0xbb, 0x54, 0xa7, 0xb3, 0x92, 0x38, 0xe3, 0xba, 0xc4, 0x99, 0x97, 0x25, 0x6e, 0x25, 0x4b, 0x9c, - 0xf5, 0x2f, 0x03, 0x50, 0x71, 0x25, 0x05, 0xc1, 0x1b, 0x58, 0x8a, 0x43, 0xc6, 0x62, 0xc6, 0xd9, - 0x20, 0x67, 0x5c, 0x8a, 0x37, 0x09, 0x09, 0x4f, 0x1f, 0x3f, 0x0d, 0x33, 0x4a, 0x3c, 0xa9, 0x95, - 0xa4, 0xa9, 0xc1, 0x05, 0x42, 0x59, 0xe6, 0x5c, 0xf5, 0x0a, 0xe7, 0xb2, 0x1e, 0x41, 0x4b, 0xdd, - 0x3f, 0x2f, 0xf9, 0xdd, 0x75, 0x7d, 0xf4, 0x2a, 0x3a, 0x33, 0x07, 0x62, 0x0c, 0xb0, 0x97, 0x47, - 0xbf, 0xac, 0x03, 0xff, 0x1e, 0x6e, 0xe7, 0x16, 0xcf, 0x7c, 0xca, 0x74, 0x5e, 0x3e, 0x81, 0x4d, - 0x3f, 0x72, 0x83, 0x99, 0x47, 0x9c, 0x88, 0xdf, 0xe0, 0x41, 0xf6, 0x78, 0x31, 0x04, 0x5b, 0xdb, - 0x50, 0xda, 0x23, 0xa1, 0xd4, 0x8f, 0x98, 0x0f, 0x01, 0xe9, 0x59, 0xc4, 0xcd, 0x66, 0x98, 0x62, - 0x46, 0x5f, 0x69, 0xf6, 0x5d, 0x65, 0x6d, 0xbd, 0x80, 0xcd, 0xea, 0xe2, 0x2a, 0x55, 0x3f, 0x85, - 0x56, 0x0e, 0xbb, 0xee, 0x83, 0xb7, 0x0b, 0xed, 0x27, 0x9f, 0x67, 0x17, 0x2d, 0xad, 0x1f, 0xc1, - 0x3b, 0xb9, 0xea, 0x89, 0x68, 0xf4, 0x57, 0x5d, 0x40, 0x23, 0x18, 0x2e, 0x9a, 0xcb, 0x18, 0xac, - 0xff, 0x98, 0xd0, 0x7e, 0xa2, 0x2a, 0x97, 0xd3, 0x98, 0x02, 0x71, 0x91, 0xec, 0xe1, 0x3e, 0xb4, - 0x4b, 0x05, 0x29, 0xf9, 0x76, 0xeb, 0xbc, 0xf0, 0x9a, 0x5e, 0xf6, 0xee, 0x5e, 0x11, 0x66, 0xd5, - 0x77, 0xf7, 0x43, 0x18, 0x1c, 0xa7, 0x84, 0x2c, 0x3e, 0xd1, 0x6b, 0x76, 0x8f, 0x2b, 0x8a, 0xb6, - 0x3b, 0xb0, 0x8e, 0x5d, 0xe6, 0x9f, 0x57, 0xac, 0xe5, 0xf9, 0x1a, 0x48, 0x55, 0xd1, 0xfe, 0x8b, - 0x2c, 0x50, 0x3f, 0x3a, 0x8e, 0xe9, 0xb0, 0xfe, 0xdd, 0x9f, 0xd8, 0x6a, 0x37, 0x5c, 0x43, 0xd1, - 0x73, 0xe8, 0xea, 0xa7, 0x9a, 0xf2, 0xb4, 0x76, 0xe3, 0x67, 0x60, 0x9b, 0xe4, 0x2a, 0x6a, 0xfd, - 0xc9, 0x84, 0x86, 0x8d, 0xdd, 0xb3, 0xb7, 0x1b, 0xdf, 0xcf, 0xa1, 0x97, 0xf5, 0xfc, 0x12, 0xc4, - 0xef, 0x14, 0x80, 0x29, 0x1e, 0x25, 0xbb, 0xe3, 0x15, 0x46, 0xd4, 0xfa, 0x9f, 0x01, 0xdd, 0x27, - 0xd9, 0xbd, 0xf2, 0x76, 0x83, 0xb1, 0x0b, 0xc0, 0x2f, 0xc2, 0x12, 0x0e, 0x45, 0xe2, 0xa0, 0xd3, - 0x6d, 0x37, 0x53, 0xf5, 0x45, 0xad, 0xbf, 0x98, 0xd0, 0x7e, 0x19, 0x27, 0x71, 0x10, 0x9f, 0xcc, - 0xdf, 0xee, 0xdd, 0xef, 0xc3, 0xa0, 0xc0, 0x19, 0x4a, 0x20, 0xdc, 0xa9, 0x1c, 0x86, 0x3c, 0xd9, - 0x76, 0xcf, 0x2b, 0x8d, 0xa9, 0xb5, 0x0e, 0x03, 0xc5, 0x8b, 0xf3, 0x96, 0x6c, 0xfd, 0xd1, 0x00, - 0x54, 0x94, 0xaa, 0x5e, 0xf9, 0x0b, 0xe8, 0x30, 0x85, 0x9d, 0x58, 0x4f, 0x3d, 0x0e, 0x8a, 0x67, - 0xaf, 0x88, 0xad, 0xdd, 0x66, 0x45, 0xa4, 0x7f, 0x0c, 0x1b, 0x0b, 0x3f, 0xa3, 0x70, 0x42, 0x22, - 0x11, 0x1e, 0x54, 0x7e, 0x49, 0x39, 0x9c, 0x5a, 0x9f, 0xc0, 0x6d, 0x49, 0x42, 0x75, 0x1f, 0xd7, - 0xfd, 0x75, 0x81, 0x4d, 0x76, 0x72, 0x36, 0x69, 0x7d, 0x6b, 0xc0, 0x66, 0x75, 0x9a, 0x8a, 0xff, - 0xaa, 0x79, 0x08, 0x03, 0x52, 0xfd, 0xa6, 0xc8, 0x8b, 0x25, 0x1d, 0xfd, 0x78, 0x81, 0x17, 0x57, - 0x7d, 0xef, 0xe8, 0x3e, 0x94, 0x53, 0xe3, 0x3e, 0x2d, 0x0b, 0xe8, 0x08, 0xc3, 0x60, 0xc1, 0x8c, - 0xbf, 0x2a, 0xf4, 0xba, 0x2a, 0xa6, 0x35, 0x35, 0xf1, 0x7b, 0x10, 0x63, 0x6b, 0x0b, 0xee, 0x7e, - 0x49, 0xd8, 0xa1, 0xb0, 0xd9, 0x8b, 0xa3, 0x63, 0xff, 0x64, 0x96, 0x4a, 0xa3, 0x3c, 0xb5, 0xf7, - 0x2e, 0xb3, 0x50, 0x30, 0x2d, 0xf9, 0xad, 0xca, 0xb8, 0xf1, 0x6f, 0x55, 0xe6, 0x55, 0xbf, 0x55, - 0xed, 0xfe, 0xbb, 0x0e, 0x6b, 0x13, 0x82, 0x5f, 0x13, 0xc2, 0x9f, 0xc6, 0x9d, 0x09, 0x89, 0xbc, - 0xfc, 0x57, 0xe8, 0x8d, 0xc2, 0x1e, 0x33, 0xe9, 0xe8, 0xbd, 0x65, 0xd2, 0xec, 0x0a, 0xbd, 0xb5, - 0x6d, 0x7c, 0x64, 0xa0, 0x17, 0xd0, 0x29, 0xbd, 0x08, 0xd1, 0x56, 0x61, 0xd2, 0xb2, 0xb7, 0xe2, - 0xe8, 0xce, 0xc2, 0x85, 0xa2, 0x51, 0xcd, 0x5c, 0xb6, 0x8b, 0x2f, 0x21, 0x74, 0xef, 0xd2, 0x27, - 0x92, 0x74, 0xb8, 0x75, 0xcd, 0x13, 0xca, 0xba, 0x85, 0x3e, 0x87, 0xba, 0xa4, 0xcc, 0x68, 0x58, - 0x30, 0x2e, 0xbd, 0x3d, 0x4a, 0x71, 0x95, 0xf9, 0xb5, 0x75, 0x0b, 0x3d, 0x05, 0xc8, 0x49, 0x27, - 0x7a, 0xaf, 0xf4, 0x33, 0x42, 0x85, 0xf5, 0x8e, 0xee, 0x5e, 0xa2, 0xcd, 0x9c, 0x7d, 0x0d, 0xdd, - 0x32, 0x35, 0x42, 0xe3, 0xa5, 0xec, 0xa7, 0xd0, 0x1f, 0x46, 0xf7, 0xaf, 0xb0, 0xc8, 0x1c, 0xff, - 0x06, 0xfa, 0x55, 0xc6, 0x83, 0xac, 0xa5, 0x13, 0x4b, 0xec, 0x69, 0xf4, 0xfe, 0x95, 0x36, 0x45, - 0x10, 0xf2, 0x16, 0x55, 0x02, 0x61, 0xa1, 0x9f, 0x95, 0x40, 0x58, 0xec, 0x6b, 0x12, 0x84, 0x72, - 0x5d, 0x97, 0x40, 0x58, 0xda, 0x85, 0x4a, 0x20, 0x2c, 0x6f, 0x0a, 0xd6, 0x2d, 0x14, 0xc3, 0xe6, - 0xf2, 0x6a, 0x43, 0xc5, 0x9f, 0x54, 0xae, 0x2c, 0xd9, 0xd1, 0x83, 0xef, 0x60, 0xa9, 0x17, 0x9c, - 0xd6, 0xc5, 0x5f, 0x3c, 0x1f, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0x82, 0x5b, 0x59, 0x60, 0xf2, - 0x19, 0x00, 0x00, + 0x11, 0xd6, 0xec, 0x2e, 0x97, 0xbb, 0xb5, 0xef, 0x26, 0x45, 0xaf, 0xd6, 0x96, 0xb5, 0x1a, 0x07, + 0x30, 0xa5, 0x38, 0x8c, 0x43, 0x1b, 0x88, 0x91, 0xc4, 0x30, 0x24, 0x8a, 0x76, 0x08, 0x89, 0xb4, + 0x34, 0x54, 0x64, 0x20, 0x40, 0x30, 0xe9, 0x9d, 0x69, 0x92, 0x03, 0xce, 0x2b, 0xd3, 0xbd, 0x14, + 0xd7, 0xb9, 0x04, 0xc8, 0x31, 0xa7, 0x20, 0x87, 0xfc, 0x85, 0x5c, 0x72, 0x4a, 0xce, 0xbe, 0xe4, + 0x47, 0xe4, 0x7f, 0xe4, 0xea, 0x4b, 0xd0, 0xaf, 0x99, 0x9e, 0x7d, 0x90, 0xa6, 0x01, 0x1f, 0x74, + 0x9b, 0xae, 0xaa, 0xae, 0xae, 0xfe, 0xaa, 0xbb, 0xea, 0xeb, 0x5d, 0x68, 0x47, 0x98, 0x32, 0x92, + 0xed, 0xa4, 0x59, 0xc2, 0x12, 0xd4, 0x94, 0x23, 0x37, 0x9d, 0xd8, 0x7f, 0xa9, 0x43, 0xf3, 0xd7, + 0x04, 0x67, 0x6c, 0x42, 0x30, 0x43, 0x5d, 0xa8, 0x04, 0xe9, 0xd0, 0x1a, 0x5b, 0xdb, 0x4d, 0xa7, + 0x12, 0xa4, 0x08, 0x41, 0x2d, 0x4d, 0x32, 0x36, 0xac, 0x8c, 0xad, 0xed, 0x8e, 0x23, 0xbe, 0xd1, + 0x5d, 0x80, 0x74, 0x3a, 0x09, 0x03, 0xcf, 0x9d, 0x66, 0xe1, 0xb0, 0x2a, 0x6c, 0x9b, 0x52, 0xf2, + 0x9b, 0x2c, 0x44, 0xdb, 0xd0, 0x8f, 0xf0, 0xa5, 0x7b, 0x91, 0x84, 0xd3, 0x88, 0xb8, 0x5e, 0x32, + 0x8d, 0xd9, 0xb0, 0x26, 0xa6, 0x77, 0x23, 0x7c, 0xf9, 0x4a, 0x88, 0xf7, 0xb8, 0x14, 0x8d, 0x79, + 0x54, 0x97, 0xee, 0x49, 0x10, 0x12, 0xf7, 0x9c, 0xcc, 0x86, 0x6b, 0x63, 0x6b, 0xbb, 0xe6, 0x40, + 0x84, 0x2f, 0x3f, 0x0f, 0x42, 0xf2, 0x94, 0xcc, 0xd0, 0x3d, 0x68, 0xf9, 0x98, 0x61, 0xd7, 0x23, + 0x31, 0x23, 0xd9, 0xb0, 0x2e, 0xd6, 0x02, 0x2e, 0xda, 0x13, 0x12, 0x1e, 0x5f, 0x86, 0xbd, 0xf3, + 0xe1, 0xba, 0xd0, 0x88, 0x6f, 0x1e, 0x1f, 0xf6, 0xa3, 0x20, 0x76, 0x45, 0xe4, 0x0d, 0xb1, 0x74, + 0x53, 0x48, 0x9e, 0xf3, 0xf0, 0x3f, 0x85, 0x75, 0x19, 0x1b, 0x1d, 0x36, 0xc7, 0xd5, 0xed, 0xd6, + 0xee, 0x7b, 0x3b, 0x39, 0x1a, 0x3b, 0x32, 0xbc, 0x83, 0xf8, 0x24, 0xc9, 0x22, 0xcc, 0x82, 0x24, + 0x3e, 0x24, 0x94, 0xe2, 0x53, 0xe2, 0xe8, 0x39, 0xe8, 0x00, 0x5a, 0x31, 0x79, 0xed, 0x6a, 0x17, + 0x20, 0x5c, 0x6c, 0x2f, 0xb8, 0x38, 0x3e, 0x4b, 0x32, 0xb6, 0xc4, 0x0f, 0xc4, 0xe4, 0xf5, 0x2b, + 0xe5, 0xea, 0x05, 0xf4, 0x7c, 0x12, 0x12, 0x46, 0xfc, 0xdc, 0x5d, 0xeb, 0x86, 0xee, 0xba, 0xca, + 0x81, 0x76, 0xf9, 0x23, 0xe8, 0x9e, 0x61, 0xea, 0xc6, 0x49, 0xee, 0xb1, 0x3d, 0xb6, 0xb6, 0x1b, + 0x4e, 0xfb, 0x0c, 0xd3, 0xa3, 0x44, 0x5b, 0x7d, 0x01, 0x4d, 0xe2, 0xb9, 0xf4, 0x0c, 0x67, 0x3e, + 0x1d, 0xf6, 0xc5, 0x92, 0x0f, 0x17, 0x96, 0xdc, 0xf7, 0x8e, 0xb9, 0xc1, 0x92, 0x45, 0x1b, 0x44, + 0xaa, 0x28, 0x3a, 0x82, 0x0e, 0x07, 0xa3, 0x70, 0x36, 0xb8, 0xb1, 0x33, 0x8e, 0xe6, 0xbe, 0xf6, + 0xf7, 0x0a, 0x06, 0x1a, 0x91, 0xc2, 0x27, 0xba, 0xb1, 0x4f, 0x0d, 0x6b, 0xee, 0xf7, 0x7d, 0xe8, + 0x2b, 0x58, 0x0a, 0xb7, 0x1b, 0x02, 0x98, 0x8e, 0x00, 0x46, 0x1b, 0xda, 0x7f, 0xaa, 0xc0, 0x20, + 0xbf, 0x0d, 0x0e, 0xa1, 0x69, 0x12, 0x53, 0x82, 0x1e, 0xc2, 0x40, 0x1d, 0x67, 0x1a, 0x7c, 0x4d, + 0xdc, 0x30, 0x88, 0x02, 0x26, 0x2e, 0x49, 0xcd, 0xe9, 0x49, 0xc5, 0x71, 0xf0, 0x35, 0x79, 0xc6, + 0xc5, 0x68, 0x0b, 0xea, 0x21, 0xc1, 0x3e, 0xc9, 0xc4, 0x9d, 0x69, 0x3a, 0x6a, 0x84, 0xde, 0x87, + 0x5e, 0x44, 0x58, 0x16, 0x78, 0xd4, 0xc5, 0xbe, 0x9f, 0x11, 0x4a, 0xd5, 0xd5, 0xe9, 0x2a, 0xf1, + 0x23, 0x29, 0x45, 0x9f, 0xc0, 0x50, 0x1b, 0x06, 0xfc, 0x8c, 0x5f, 0xe0, 0xd0, 0xa5, 0xc4, 0x4b, + 0x62, 0x9f, 0xaa, 0x7b, 0xb4, 0xa5, 0xf4, 0x07, 0x4a, 0x7d, 0x2c, 0xb5, 0xe8, 0x09, 0xf4, 0x29, + 0x4b, 0x32, 0x7c, 0x4a, 0xdc, 0x09, 0xf6, 0xce, 0x09, 0x9f, 0xb1, 0x26, 0xc0, 0xbb, 0x63, 0x80, + 0x77, 0x2c, 0x4d, 0x1e, 0x4b, 0x0b, 0xa7, 0x47, 0x4b, 0x63, 0x6a, 0x7f, 0x5b, 0x85, 0xe1, 0xaa, + 0x6b, 0x20, 0xea, 0x83, 0x2f, 0xb6, 0xde, 0x71, 0x2a, 0x81, 0xcf, 0xef, 0x1f, 0x87, 0x44, 0xec, + 0xb5, 0xe6, 0x88, 0x6f, 0xf4, 0x2e, 0x80, 0x97, 0x84, 0x21, 0xf1, 0xf8, 0x44, 0xb5, 0x49, 0x43, + 0xc2, 0xef, 0xa7, 0xb8, 0xf2, 0x45, 0x69, 0xa8, 0x39, 0x4d, 0x2e, 0x91, 0x55, 0xe1, 0x3e, 0xb4, + 0x65, 0xfa, 0x94, 0x81, 0xac, 0x0a, 0x2d, 0x29, 0x93, 0x26, 0x1f, 0x00, 0xd2, 0xc7, 0x64, 0x32, + 0xcb, 0x0d, 0xeb, 0xc2, 0xb0, 0xaf, 0x34, 0x8f, 0x67, 0xda, 0xfa, 0x6d, 0x68, 0x66, 0x04, 0xfb, + 0x6e, 0x12, 0x87, 0x33, 0x51, 0x28, 0x1a, 0x4e, 0x83, 0x0b, 0xbe, 0x8c, 0xc3, 0x19, 0xfa, 0x31, + 0x0c, 0x32, 0x92, 0x86, 0x81, 0x87, 0xdd, 0x34, 0xc4, 0x1e, 0x89, 0x48, 0xac, 0x6b, 0x46, 0x5f, + 0x29, 0x9e, 0x6b, 0x39, 0x1a, 0xc2, 0xfa, 0x05, 0xc9, 0x28, 0xdf, 0x56, 0x53, 0x98, 0xe8, 0x21, + 0xea, 0x43, 0x95, 0xb1, 0x70, 0x08, 0x42, 0xca, 0x3f, 0xd1, 0x03, 0xe8, 0x7b, 0x49, 0x94, 0x62, + 0x8f, 0xb9, 0x19, 0xb9, 0x08, 0xc4, 0xa4, 0x96, 0x50, 0xf7, 0x94, 0xdc, 0x51, 0x62, 0xbe, 0x9d, + 0x28, 0xf1, 0x83, 0x93, 0x80, 0xf8, 0x2e, 0x66, 0x2a, 0xd9, 0xe2, 0xe2, 0x56, 0x9d, 0xbe, 0xd6, + 0x3c, 0x62, 0x32, 0xcd, 0x68, 0x07, 0x36, 0x32, 0x12, 0x25, 0x8c, 0xb8, 0x3a, 0xd9, 0x31, 0x8e, + 0xc8, 0xb0, 0x23, 0x70, 0x1e, 0x48, 0x95, 0xca, 0xf1, 0x11, 0x8e, 0x08, 0xf7, 0x3e, 0x67, 0xcf, + 0x6b, 0x6d, 0x57, 0x98, 0xf7, 0x4b, 0xe6, 0x4f, 0xc9, 0xcc, 0xfe, 0x87, 0x05, 0x77, 0xaf, 0x2c, + 0x39, 0x0b, 0x47, 0xe0, 0xba, 0x74, 0xff, 0x50, 0x08, 0xdb, 0x53, 0xb8, 0x77, 0x4d, 0x21, 0xb8, + 0x26, 0xd6, 0xca, 0x42, 0xac, 0x36, 0x74, 0x88, 0xe7, 0x06, 0xb1, 0x4f, 0x2e, 0xdd, 0x49, 0xc0, + 0xe4, 0x15, 0xed, 0x38, 0x2d, 0xe2, 0x1d, 0x70, 0xd9, 0xe3, 0x80, 0x51, 0xfb, 0x1b, 0x0b, 0xba, + 0xe5, 0x3b, 0xc4, 0x6f, 0x01, 0x9b, 0xa5, 0x44, 0xf5, 0x4d, 0xf1, 0xad, 0x96, 0xae, 0xa8, 0x4e, + 0xea, 0xa3, 0x03, 0x80, 0x34, 0x4b, 0x52, 0x92, 0xb1, 0x80, 0x70, 0xbf, 0xfc, 0x5a, 0x3e, 0x58, + 0x79, 0x2d, 0x77, 0x9e, 0xe7, 0xb6, 0xfb, 0x31, 0xcb, 0x66, 0x8e, 0x31, 0x79, 0xf4, 0x29, 0xf4, + 0xe6, 0xd4, 0x1c, 0x1d, 0x9e, 0x55, 0x19, 0x00, 0xff, 0x44, 0x9b, 0xb0, 0x76, 0x81, 0xc3, 0x29, + 0x51, 0x21, 0xc8, 0xc1, 0x2f, 0x2a, 0x9f, 0x58, 0xf6, 0x3a, 0xac, 0xed, 0x47, 0x29, 0x9b, 0xf1, + 0x9d, 0xf4, 0x8e, 0xa7, 0x29, 0xc9, 0x1e, 0x87, 0x89, 0x77, 0xbe, 0x7f, 0xc9, 0x32, 0x8c, 0xbe, + 0x84, 0x2e, 0xc9, 0x30, 0x9d, 0x66, 0xfc, 0x56, 0xf9, 0x41, 0x7c, 0x2a, 0x7c, 0x96, 0x5b, 0xd2, + 0xdc, 0x9c, 0x9d, 0x7d, 0x39, 0x61, 0x4f, 0xd8, 0x3b, 0x1d, 0x62, 0x0e, 0x47, 0xbf, 0x85, 0x4e, + 0x49, 0xcf, 0xc1, 0xe2, 0x0d, 0x5c, 0x65, 0x45, 0x7c, 0xf3, 0xa2, 0x99, 0xe2, 0x2c, 0x60, 0x33, + 0x45, 0x34, 0xd4, 0x88, 0x97, 0x0a, 0x55, 0x78, 0x03, 0x5f, 0x82, 0xd6, 0x71, 0x9a, 0x52, 0x72, + 0xe0, 0x53, 0xfb, 0x21, 0x6c, 0x3e, 0x25, 0x24, 0xdd, 0x4b, 0xe2, 0x98, 0x78, 0x8c, 0xf8, 0x0e, + 0xf9, 0xc3, 0x94, 0x50, 0xc6, 0x97, 0x10, 0x77, 0x42, 0xe5, 0x83, 0x7f, 0xdb, 0x7f, 0xb7, 0xa0, + 0x2b, 0x8f, 0xcb, 0xb3, 0xc4, 0x13, 0x87, 0x84, 0x83, 0xc6, 0x19, 0x8c, 0x02, 0x6d, 0x9a, 0x85, + 0x73, 0xd4, 0xa6, 0x32, 0x4f, 0x6d, 0xee, 0x40, 0x43, 0xf4, 0xfe, 0x22, 0x98, 0x75, 0xde, 0xce, + 0x03, 0x9f, 0x16, 0x55, 0xcb, 0x97, 0xea, 0x9a, 0x50, 0xb7, 0x74, 0x7b, 0xe6, 0x26, 0x45, 0x67, + 0x58, 0x33, 0x3b, 0x83, 0xfd, 0x12, 0x36, 0x9e, 0x25, 0xc9, 0xf9, 0x34, 0x95, 0xe1, 0xe9, 0x4d, + 0x94, 0xf7, 0x6e, 0x8d, 0xab, 0x3c, 0x96, 0x7c, 0xef, 0xd7, 0x1d, 0x65, 0xfb, 0x7f, 0x16, 0x6c, + 0x96, 0xdd, 0xaa, 0x66, 0xf6, 0x7b, 0xd8, 0xc8, 0xfd, 0xba, 0xa1, 0xc2, 0x42, 0x2e, 0xd0, 0xda, + 0xfd, 0xd0, 0x48, 0xf3, 0xb2, 0xd9, 0x9a, 0x20, 0xf9, 0x1a, 0x44, 0x67, 0x70, 0x31, 0x27, 0xa1, + 0xa3, 0x4b, 0xe8, 0xcf, 0x9b, 0xf1, 0x22, 0x9c, 0xaf, 0xaa, 0x10, 0x6f, 0xe8, 0x99, 0xe8, 0x67, + 0xd0, 0x2c, 0x02, 0xa9, 0x88, 0x40, 0x36, 0x4a, 0x81, 0xa8, 0xb5, 0x0a, 0x2b, 0x7e, 0xbc, 0x49, + 0x96, 0x25, 0x99, 0x2a, 0x38, 0x72, 0x60, 0xff, 0x12, 0x1a, 0xdf, 0x3b, 0xbb, 0xf6, 0xbf, 0x2a, + 0xd0, 0x79, 0x44, 0x69, 0x70, 0x1a, 0xeb, 0x14, 0x6c, 0xc2, 0x9a, 0x6c, 0x2d, 0xb2, 0xd7, 0xcb, + 0x01, 0x1a, 0x43, 0x4b, 0xd5, 0x2d, 0x03, 0x7a, 0x53, 0x74, 0x6d, 0x49, 0x54, 0xb5, 0xac, 0x26, + 0x43, 0xe3, 0xdd, 0x62, 0x8e, 0xe8, 0xae, 0xad, 0x24, 0xba, 0x75, 0x83, 0xe8, 0xbe, 0x0d, 0x4d, + 0x31, 0x29, 0x4e, 0x7c, 0xa2, 0x18, 0x70, 0x83, 0x0b, 0x8e, 0x12, 0x9f, 0xa0, 0x5d, 0xd8, 0x8a, + 0x48, 0x94, 0x64, 0x33, 0x37, 0xc2, 0xa9, 0xcb, 0x79, 0xb6, 0xe0, 0x2e, 0xd1, 0x44, 0xd5, 0x5e, + 0x24, 0xb5, 0x87, 0x38, 0x3d, 0xc4, 0x97, 0x9c, 0xbe, 0x1c, 0x4e, 0xd0, 0x2e, 0xdc, 0xfe, 0x2a, + 0x0b, 0x18, 0x9e, 0x84, 0xa4, 0xcc, 0xdf, 0x65, 0x2d, 0xde, 0xd0, 0x4a, 0x83, 0xc4, 0xdb, 0x7f, + 0xb3, 0xa0, 0xab, 0x51, 0x53, 0x27, 0xac, 0x0f, 0xd5, 0x93, 0x3c, 0xcb, 0xfc, 0x53, 0xe7, 0xa2, + 0xb2, 0x2a, 0x17, 0x0b, 0x8f, 0x88, 0x1c, 0xf9, 0x9a, 0x89, 0x7c, 0x9e, 0xf4, 0x35, 0x23, 0xe9, + 0x1c, 0x1a, 0x3c, 0x65, 0x67, 0x1a, 0x1a, 0xfe, 0x6d, 0x9f, 0xc2, 0xe0, 0x98, 0x61, 0x16, 0x50, + 0x16, 0x78, 0x54, 0xa7, 0x73, 0x2e, 0x71, 0xd6, 0x75, 0x89, 0xab, 0xac, 0x4a, 0x5c, 0x35, 0x4f, + 0x9c, 0xfd, 0x1f, 0x0b, 0x90, 0xb9, 0x92, 0x82, 0xe0, 0x07, 0x58, 0x8a, 0x43, 0xc6, 0x12, 0xc6, + 0xd9, 0x20, 0x67, 0x5c, 0x8a, 0x37, 0x09, 0x09, 0x4f, 0x1f, 0x3f, 0x0d, 0x53, 0x4a, 0x7c, 0xa9, + 0x95, 0xa4, 0xa9, 0xc1, 0x05, 0x42, 0x59, 0xe6, 0x5c, 0xf5, 0x39, 0xce, 0x65, 0x3f, 0x82, 0x96, + 0xea, 0x3f, 0x2f, 0x79, 0xef, 0xba, 0x3e, 0x7a, 0x15, 0x5d, 0xa5, 0x00, 0x62, 0x0c, 0xb0, 0x57, + 0x44, 0xbf, 0xac, 0x02, 0xff, 0x11, 0x6e, 0x17, 0x16, 0xcf, 0x02, 0xca, 0x74, 0x5e, 0x3e, 0x86, + 0xad, 0x20, 0xf6, 0xc2, 0xa9, 0x4f, 0xdc, 0x98, 0x77, 0xf0, 0x30, 0x7f, 0xbc, 0x58, 0x82, 0xad, + 0x6d, 0x2a, 0xed, 0x91, 0x50, 0xea, 0x47, 0xcc, 0x07, 0x80, 0xf4, 0x2c, 0xe2, 0xe5, 0x33, 0x2a, + 0x62, 0x46, 0x5f, 0x69, 0xf6, 0x3d, 0x65, 0x6d, 0xbf, 0x80, 0xad, 0xf9, 0xc5, 0x55, 0xaa, 0x7e, + 0x0e, 0xad, 0x02, 0x76, 0x5d, 0x07, 0x6f, 0x1b, 0xe5, 0xa7, 0x98, 0xe7, 0x98, 0x96, 0xf6, 0x4f, + 0xe0, 0xad, 0x42, 0xf5, 0x44, 0x14, 0xfa, 0xab, 0x1a, 0xd0, 0x08, 0x86, 0x8b, 0xe6, 0x32, 0x06, + 0xfb, 0xaf, 0x55, 0x68, 0x3f, 0x51, 0x37, 0x97, 0xd3, 0x18, 0x83, 0xb8, 0x48, 0xf6, 0x70, 0x1f, + 0xda, 0xa5, 0x0b, 0x29, 0xf9, 0x76, 0xeb, 0xc2, 0x78, 0x4d, 0x2f, 0x7b, 0x77, 0x57, 0x85, 0xd9, + 0xfc, 0xbb, 0xfb, 0x21, 0x0c, 0x4e, 0x32, 0x42, 0x16, 0x9f, 0xe8, 0x35, 0xa7, 0xc7, 0x15, 0xa6, + 0xed, 0x0e, 0x6c, 0x60, 0x8f, 0x05, 0x17, 0x73, 0xd6, 0xf2, 0x7c, 0x0d, 0xa4, 0xca, 0xb4, 0xff, + 0x3c, 0x0f, 0x34, 0x88, 0x4f, 0x12, 0x3a, 0xac, 0x7f, 0xf7, 0x27, 0xb6, 0xda, 0x0d, 0xd7, 0x50, + 0xf4, 0x1c, 0xba, 0xfa, 0xa9, 0xa6, 0x3c, 0xad, 0xdf, 0xf8, 0x19, 0xd8, 0x26, 0x85, 0x8a, 0x1a, + 0xbc, 0xb9, 0xb4, 0x93, 0x86, 0xdc, 0x89, 0x54, 0x99, 0x85, 0xed, 0xdf, 0x15, 0x68, 0x38, 0xd8, + 0x3b, 0x7f, 0xb3, 0xf3, 0xf1, 0x19, 0xf4, 0xf2, 0x1e, 0x51, 0x4a, 0xc9, 0x5b, 0x06, 0x90, 0xe6, + 0xd1, 0x73, 0x3a, 0xbe, 0x31, 0x5a, 0x09, 0xdb, 0xfa, 0x2a, 0xd8, 0xfe, 0x59, 0x81, 0xee, 0x93, + 0xbc, 0x6f, 0xbd, 0xd9, 0xe0, 0xed, 0x02, 0xf0, 0x46, 0x5b, 0xc2, 0xcd, 0x24, 0x26, 0xfa, 0x78, + 0x38, 0xcd, 0x4c, 0x7d, 0xdd, 0x1c, 0xaf, 0x6f, 0x2a, 0xd0, 0x7e, 0x99, 0xa4, 0x49, 0x98, 0x9c, + 0xce, 0xde, 0x6c, 0xb4, 0xf6, 0x61, 0x60, 0x70, 0x98, 0x12, 0x68, 0x77, 0xe6, 0x0e, 0x5b, 0x71, + 0x38, 0x9c, 0x9e, 0x5f, 0x1a, 0xdf, 0x1c, 0xc0, 0x0d, 0x18, 0x28, 0x5e, 0x5f, 0xb4, 0x14, 0xfb, + 0xcf, 0x16, 0x20, 0x53, 0xaa, 0x6a, 0xfd, 0xaf, 0xa0, 0xc3, 0x14, 0xd6, 0x22, 0x3e, 0xf5, 0xb8, + 0x31, 0xef, 0x82, 0x99, 0x0b, 0xa7, 0xcd, 0xcc, 0xcc, 0xfc, 0x14, 0x36, 0x17, 0x7e, 0x06, 0xe2, + 0x84, 0x4a, 0x66, 0x64, 0x30, 0xf7, 0x4b, 0xd0, 0xe1, 0xc4, 0xfe, 0x18, 0x6e, 0x4b, 0x12, 0xad, + 0xfb, 0x90, 0xee, 0x0f, 0x0b, 0x6c, 0xb8, 0x53, 0xb0, 0x61, 0xfb, 0x5b, 0x0b, 0xb6, 0xe6, 0xa7, + 0xa9, 0xf8, 0xaf, 0x9a, 0x87, 0x30, 0x20, 0x55, 0x2f, 0x4d, 0x5e, 0x2f, 0xe9, 0xf4, 0x47, 0x0b, + 0xbc, 0x7e, 0xde, 0xf7, 0x8e, 0xae, 0xa3, 0x05, 0xb5, 0xef, 0xd3, 0xb2, 0x80, 0x8e, 0x30, 0x0c, + 0x16, 0xcc, 0xf8, 0xab, 0x48, 0xaf, 0xab, 0x62, 0x5a, 0x57, 0x13, 0xbf, 0x07, 0xb1, 0xb7, 0xef, + 0xc1, 0xdd, 0x2f, 0x08, 0x3b, 0x14, 0x36, 0x7b, 0x49, 0x7c, 0x12, 0x9c, 0x4e, 0x33, 0x69, 0x54, + 0xa4, 0xf6, 0xdd, 0x55, 0x16, 0x0a, 0xa6, 0x25, 0xbf, 0xb5, 0x59, 0x37, 0xfe, 0xad, 0xad, 0x72, + 0xd5, 0x6f, 0x6d, 0xbb, 0xff, 0xad, 0xc3, 0xfa, 0x31, 0xc1, 0xaf, 0x09, 0xe1, 0x4f, 0xfb, 0xce, + 0x31, 0x89, 0xfd, 0xe2, 0x57, 0xf4, 0x4d, 0x63, 0x8f, 0xb9, 0x74, 0xf4, 0xce, 0x32, 0x69, 0x4e, + 0x01, 0x6e, 0x6d, 0x5b, 0x1f, 0x5a, 0xe8, 0x05, 0x74, 0x4a, 0x2f, 0x5a, 0x74, 0xcf, 0x98, 0xb4, + 0xec, 0xad, 0x3b, 0xba, 0xb3, 0xd0, 0x10, 0x35, 0xaa, 0xb9, 0xcb, 0xb6, 0xf9, 0x92, 0x43, 0xef, + 0xae, 0x7c, 0xe2, 0x49, 0x87, 0xf7, 0xae, 0x79, 0x02, 0xda, 0xb7, 0xd0, 0x67, 0x50, 0x97, 0x94, + 0x1f, 0x0d, 0x0d, 0xe3, 0xd2, 0xdb, 0xa9, 0x14, 0x57, 0xf9, 0x7d, 0x60, 0xdf, 0x42, 0x4f, 0x01, + 0x0a, 0xd2, 0x8c, 0xde, 0x29, 0xfd, 0x0c, 0x32, 0xc7, 0xda, 0x47, 0x77, 0x57, 0x68, 0x73, 0x67, + 0x5f, 0x41, 0xb7, 0x4c, 0xed, 0xd0, 0x78, 0x29, 0x7b, 0x33, 0xea, 0xc3, 0xe8, 0xfe, 0x15, 0x16, + 0xb9, 0xe3, 0xdf, 0x41, 0x7f, 0x9e, 0xb1, 0x21, 0x7b, 0xe9, 0xc4, 0x12, 0xfb, 0x1b, 0xbd, 0x77, + 0xa5, 0x8d, 0x09, 0x42, 0x51, 0xa2, 0x4a, 0x20, 0x2c, 0xd4, 0xb3, 0x12, 0x08, 0x8b, 0x75, 0x4d, + 0x82, 0x50, 0xbe, 0xd7, 0x25, 0x10, 0x96, 0x56, 0xa1, 0x12, 0x08, 0xcb, 0x8b, 0x82, 0x7d, 0x0b, + 0x25, 0xb0, 0xb5, 0xfc, 0xb6, 0x21, 0xf3, 0x27, 0xa1, 0x2b, 0xaf, 0xec, 0xe8, 0xc1, 0x77, 0xb0, + 0xd4, 0x0b, 0x4e, 0xea, 0xe2, 0x2f, 0xaa, 0x8f, 0xfe, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x6c, 0x64, + 0x5c, 0xbc, 0xb2, 0x1a, 0x00, 0x00, } diff --git a/weed/server/volume_server_handlers_ui.go b/weed/server/volume_server_handlers_ui.go index 63a9fe230..8d35c9c8b 100644 --- a/weed/server/volume_server_handlers_ui.go +++ b/weed/server/volume_server_handlers_ui.go @@ -24,10 +24,10 @@ func (vs *VolumeServer) uiStatusHandler(w http.ResponseWriter, r *http.Request) volumeInfos := vs.store.VolumeInfos() var normalVolumeInfos, remoteVolumeInfos []*storage.VolumeInfo for _, vinfo := range volumeInfos { - if vinfo.RemoteStorageName == "" { - normalVolumeInfos = append(normalVolumeInfos, vinfo) - } else { + if vinfo.IsRemote() { remoteVolumeInfos = append(remoteVolumeInfos, vinfo) + } else { + normalVolumeInfos = append(normalVolumeInfos, vinfo) } } args := struct { diff --git a/weed/shell/command_volume_list.go b/weed/shell/command_volume_list.go index 91b5a0d32..c6c79d150 100644 --- a/weed/shell/command_volume_list.go +++ b/weed/shell/command_volume_list.go @@ -46,7 +46,7 @@ func (c *commandVolumeList) Do(args []string, commandEnv *CommandEnv, writer io. } func writeTopologyInfo(writer io.Writer, t *master_pb.TopologyInfo, volumeSizeLimitMb uint64) statistics { - fmt.Fprintf(writer, "Topology volume:%d/%d active:%d free:%d volumeSizeLimit:%d MB\n", t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount, volumeSizeLimitMb) + fmt.Fprintf(writer, "Topology volume:%d/%d active:%d free:%d remote:%d volumeSizeLimit:%d MB\n", t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount, t.RemoteVolumeCount, volumeSizeLimitMb) sort.Slice(t.DataCenterInfos, func(i, j int) bool { return t.DataCenterInfos[i].Id < t.DataCenterInfos[j].Id }) @@ -58,7 +58,7 @@ func writeTopologyInfo(writer io.Writer, t *master_pb.TopologyInfo, volumeSizeLi return s } func writeDataCenterInfo(writer io.Writer, t *master_pb.DataCenterInfo) statistics { - fmt.Fprintf(writer, " DataCenter %s volume:%d/%d active:%d free:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount) + fmt.Fprintf(writer, " DataCenter %s volume:%d/%d active:%d free:%d remote:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount, t.RemoteVolumeCount) var s statistics sort.Slice(t.RackInfos, func(i, j int) bool { return t.RackInfos[i].Id < t.RackInfos[j].Id @@ -70,7 +70,7 @@ func writeDataCenterInfo(writer io.Writer, t *master_pb.DataCenterInfo) statisti return s } func writeRackInfo(writer io.Writer, t *master_pb.RackInfo) statistics { - fmt.Fprintf(writer, " Rack %s volume:%d/%d active:%d free:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount) + fmt.Fprintf(writer, " Rack %s volume:%d/%d active:%d free:%d remote:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount, t.RemoteVolumeCount) var s statistics sort.Slice(t.DataNodeInfos, func(i, j int) bool { return t.DataNodeInfos[i].Id < t.DataNodeInfos[j].Id @@ -82,7 +82,7 @@ func writeRackInfo(writer io.Writer, t *master_pb.RackInfo) statistics { return s } func writeDataNodeInfo(writer io.Writer, t *master_pb.DataNodeInfo) statistics { - fmt.Fprintf(writer, " DataNode %s volume:%d/%d active:%d free:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount) + fmt.Fprintf(writer, " DataNode %s volume:%d/%d active:%d free:%d remote:%d\n", t.Id, t.VolumeCount, t.MaxVolumeCount, t.ActiveVolumeCount, t.FreeVolumeCount, t.RemoteVolumeCount) var s statistics sort.Slice(t.VolumeInfos, func(i, j int) bool { return t.VolumeInfos[i].Id < t.VolumeInfos[j].Id diff --git a/weed/storage/volume_info.go b/weed/storage/volume_info.go index 6a33aa261..3b9b667eb 100644 --- a/weed/storage/volume_info.go +++ b/weed/storage/volume_info.go @@ -64,6 +64,10 @@ func NewVolumeInfoFromShort(m *master_pb.VolumeShortInformationMessage) (vi Volu return vi, nil } +func (vi VolumeInfo) IsRemote() bool { + return vi.RemoteStorageName != "" +} + func (vi VolumeInfo) String() string { return fmt.Sprintf("Id:%d, Size:%d, ReplicaPlacement:%s, Collection:%s, Version:%v, FileCount:%d, DeleteCount:%d, DeletedByteCount:%d, ReadOnly:%v", vi.Id, vi.Size, vi.ReplicaPlacement, vi.Collection, vi.Version, vi.FileCount, vi.DeleteCount, vi.DeletedByteCount, vi.ReadOnly) diff --git a/weed/topology/data_center.go b/weed/topology/data_center.go index 640cb1937..dc3accb71 100644 --- a/weed/topology/data_center.go +++ b/weed/topology/data_center.go @@ -48,6 +48,7 @@ func (dc *DataCenter) ToDataCenterInfo() *master_pb.DataCenterInfo { MaxVolumeCount: uint64(dc.GetMaxVolumeCount()), FreeVolumeCount: uint64(dc.FreeSpace()), ActiveVolumeCount: uint64(dc.GetActiveVolumeCount()), + RemoteVolumeCount: uint64(dc.GetRemoteVolumeCount()), } for _, c := range dc.Children() { rack := c.(*Rack) diff --git a/weed/topology/data_node.go b/weed/topology/data_node.go index 3e72ccdbf..617341e54 100644 --- a/weed/topology/data_node.go +++ b/weed/topology/data_node.go @@ -2,14 +2,13 @@ package topology import ( "fmt" + "strconv" "sync" "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "github.com/chrislusf/seaweedfs/weed/storage/erasure_coding" "github.com/chrislusf/seaweedfs/weed/storage/needle" - "strconv" - "github.com/chrislusf/seaweedfs/weed/glog" "github.com/chrislusf/seaweedfs/weed/storage" ) @@ -44,15 +43,26 @@ func (dn *DataNode) String() string { func (dn *DataNode) AddOrUpdateVolume(v storage.VolumeInfo) (isNew bool) { dn.Lock() defer dn.Unlock() - if _, ok := dn.volumes[v.Id]; !ok { + if oldV, ok := dn.volumes[v.Id]; !ok { dn.volumes[v.Id] = v dn.UpAdjustVolumeCountDelta(1) + if v.IsRemote() { + dn.UpAdjustRemoteVolumeCountDelta(1) + } if !v.ReadOnly { dn.UpAdjustActiveVolumeCountDelta(1) } dn.UpAdjustMaxVolumeId(v.Id) isNew = true } else { + if oldV.IsRemote() != v.IsRemote() { + if v.IsRemote() { + dn.UpAdjustRemoteVolumeCountDelta(1) + } + if oldV.IsRemote() { + dn.UpAdjustRemoteVolumeCountDelta(-1) + } + } dn.volumes[v.Id] = v } return @@ -70,7 +80,12 @@ func (dn *DataNode) UpdateVolumes(actualVolumes []storage.VolumeInfo) (newVolume delete(dn.volumes, vid) deletedVolumes = append(deletedVolumes, v) dn.UpAdjustVolumeCountDelta(-1) - dn.UpAdjustActiveVolumeCountDelta(-1) + if v.IsRemote() { + dn.UpAdjustRemoteVolumeCountDelta(-1) + } + if !v.ReadOnly { + dn.UpAdjustActiveVolumeCountDelta(-1) + } } } dn.Unlock() @@ -88,7 +103,12 @@ func (dn *DataNode) DeltaUpdateVolumes(newlVolumes, deletedVolumes []storage.Vol for _, v := range deletedVolumes { delete(dn.volumes, v.Id) dn.UpAdjustVolumeCountDelta(-1) - dn.UpAdjustActiveVolumeCountDelta(-1) + if v.IsRemote() { + dn.UpAdjustRemoteVolumeCountDelta(-1) + } + if !v.ReadOnly { + dn.UpAdjustActiveVolumeCountDelta(-1) + } } dn.Unlock() for _, v := range newlVolumes { @@ -160,6 +180,7 @@ func (dn *DataNode) ToDataNodeInfo() *master_pb.DataNodeInfo { MaxVolumeCount: uint64(dn.GetMaxVolumeCount()), FreeVolumeCount: uint64(dn.FreeSpace()), ActiveVolumeCount: uint64(dn.GetActiveVolumeCount()), + RemoteVolumeCount: uint64(dn.GetRemoteVolumeCount()), } for _, v := range dn.GetVolumes() { m.VolumeInfos = append(m.VolumeInfos, v.ToVolumeInformationMessage()) diff --git a/weed/topology/node.go b/weed/topology/node.go index b2808f589..572a89d4d 100644 --- a/weed/topology/node.go +++ b/weed/topology/node.go @@ -20,6 +20,7 @@ type Node interface { ReserveOneVolume(r int64) (*DataNode, error) UpAdjustMaxVolumeCountDelta(maxVolumeCountDelta int64) UpAdjustVolumeCountDelta(volumeCountDelta int64) + UpAdjustRemoteVolumeCountDelta(remoteVolumeCountDelta int64) UpAdjustEcShardCountDelta(ecShardCountDelta int64) UpAdjustActiveVolumeCountDelta(activeVolumeCountDelta int64) UpAdjustMaxVolumeId(vid needle.VolumeId) @@ -27,6 +28,7 @@ type Node interface { GetVolumeCount() int64 GetEcShardCount() int64 GetActiveVolumeCount() int64 + GetRemoteVolumeCount() int64 GetMaxVolumeCount() int64 GetMaxVolumeId() needle.VolumeId SetParent(Node) @@ -44,6 +46,7 @@ type Node interface { } type NodeImpl struct { volumeCount int64 + remoteVolumeCount int64 activeVolumeCount int64 ecShardCount int64 maxVolumeCount int64 @@ -132,10 +135,11 @@ func (n *NodeImpl) Id() NodeId { return n.id } func (n *NodeImpl) FreeSpace() int64 { + freeVolumeSlotCount := n.maxVolumeCount + n.remoteVolumeCount - n.volumeCount if n.ecShardCount > 0 { - return n.maxVolumeCount - n.volumeCount - n.ecShardCount/erasure_coding.DataShardsCount - 1 + freeVolumeSlotCount = freeVolumeSlotCount - n.ecShardCount/erasure_coding.DataShardsCount - 1 } - return n.maxVolumeCount - n.volumeCount + return freeVolumeSlotCount } func (n *NodeImpl) SetParent(node Node) { n.parent = node @@ -191,6 +195,12 @@ func (n *NodeImpl) UpAdjustVolumeCountDelta(volumeCountDelta int64) { //can be n n.parent.UpAdjustVolumeCountDelta(volumeCountDelta) } } +func (n *NodeImpl) UpAdjustRemoteVolumeCountDelta(remoteVolumeCountDelta int64) { //can be negative + atomic.AddInt64(&n.remoteVolumeCount, remoteVolumeCountDelta) + if n.parent != nil { + n.parent.UpAdjustRemoteVolumeCountDelta(remoteVolumeCountDelta) + } +} func (n *NodeImpl) UpAdjustEcShardCountDelta(ecShardCountDelta int64) { //can be negative atomic.AddInt64(&n.ecShardCount, ecShardCountDelta) if n.parent != nil { @@ -220,6 +230,9 @@ func (n *NodeImpl) GetVolumeCount() int64 { func (n *NodeImpl) GetEcShardCount() int64 { return n.ecShardCount } +func (n *NodeImpl) GetRemoteVolumeCount() int64 { + return n.remoteVolumeCount +} func (n *NodeImpl) GetActiveVolumeCount() int64 { return n.activeVolumeCount } @@ -235,6 +248,7 @@ func (n *NodeImpl) LinkChildNode(node Node) { n.UpAdjustMaxVolumeCountDelta(node.GetMaxVolumeCount()) n.UpAdjustMaxVolumeId(node.GetMaxVolumeId()) n.UpAdjustVolumeCountDelta(node.GetVolumeCount()) + n.UpAdjustRemoteVolumeCountDelta(node.GetRemoteVolumeCount()) n.UpAdjustEcShardCountDelta(node.GetEcShardCount()) n.UpAdjustActiveVolumeCountDelta(node.GetActiveVolumeCount()) node.SetParent(n) @@ -250,6 +264,7 @@ func (n *NodeImpl) UnlinkChildNode(nodeId NodeId) { node.SetParent(nil) delete(n.children, node.Id()) n.UpAdjustVolumeCountDelta(-node.GetVolumeCount()) + n.UpAdjustRemoteVolumeCountDelta(-node.GetRemoteVolumeCount()) n.UpAdjustEcShardCountDelta(-node.GetEcShardCount()) n.UpAdjustActiveVolumeCountDelta(-node.GetActiveVolumeCount()) n.UpAdjustMaxVolumeCountDelta(-node.GetMaxVolumeCount()) diff --git a/weed/topology/rack.go b/weed/topology/rack.go index 932c1a804..1921c0c05 100644 --- a/weed/topology/rack.go +++ b/weed/topology/rack.go @@ -67,6 +67,7 @@ func (r *Rack) ToRackInfo() *master_pb.RackInfo { MaxVolumeCount: uint64(r.GetMaxVolumeCount()), FreeVolumeCount: uint64(r.FreeSpace()), ActiveVolumeCount: uint64(r.GetActiveVolumeCount()), + RemoteVolumeCount: uint64(r.GetRemoteVolumeCount()), } for _, c := range r.Children() { dn := c.(*DataNode) diff --git a/weed/topology/topology_event_handling.go b/weed/topology/topology_event_handling.go index 041351492..068bd401e 100644 --- a/weed/topology/topology_event_handling.go +++ b/weed/topology/topology_event_handling.go @@ -59,6 +59,7 @@ func (t *Topology) UnRegisterDataNode(dn *DataNode) { vl.SetVolumeUnavailable(dn, v.Id) } dn.UpAdjustVolumeCountDelta(-dn.GetVolumeCount()) + dn.UpAdjustRemoteVolumeCountDelta(-dn.GetRemoteVolumeCount()) dn.UpAdjustActiveVolumeCountDelta(-dn.GetActiveVolumeCount()) dn.UpAdjustMaxVolumeCountDelta(-dn.GetMaxVolumeCount()) if dn.Parent() != nil { diff --git a/weed/topology/topology_map.go b/weed/topology/topology_map.go index 0ad30f12e..73c55d77d 100644 --- a/weed/topology/topology_map.go +++ b/weed/topology/topology_map.go @@ -85,6 +85,7 @@ func (t *Topology) ToTopologyInfo() *master_pb.TopologyInfo { MaxVolumeCount: uint64(t.GetMaxVolumeCount()), FreeVolumeCount: uint64(t.FreeSpace()), ActiveVolumeCount: uint64(t.GetActiveVolumeCount()), + RemoteVolumeCount: uint64(t.GetRemoteVolumeCount()), } for _, c := range t.Children() { dc := c.(*DataCenter)