1 | #include <Common/DNSResolver.h> |
2 | #include <DataTypes/DataTypeString.h> |
3 | #include <DataTypes/DataTypesNumber.h> |
4 | #include <Interpreters/Cluster.h> |
5 | #include <Interpreters/Context.h> |
6 | #include <Storages/System/StorageSystemClusters.h> |
7 | |
8 | namespace DB |
9 | { |
10 | |
11 | NamesAndTypesList StorageSystemClusters::getNamesAndTypes() |
12 | { |
13 | return |
14 | { |
15 | {"cluster" , std::make_shared<DataTypeString>()}, |
16 | {"shard_num" , std::make_shared<DataTypeUInt32>()}, |
17 | {"shard_weight" , std::make_shared<DataTypeUInt32>()}, |
18 | {"replica_num" , std::make_shared<DataTypeUInt32>()}, |
19 | {"host_name" , std::make_shared<DataTypeString>()}, |
20 | {"host_address" , std::make_shared<DataTypeString>()}, |
21 | {"port" , std::make_shared<DataTypeUInt16>()}, |
22 | {"is_local" , std::make_shared<DataTypeUInt8>()}, |
23 | {"user" , std::make_shared<DataTypeString>()}, |
24 | {"default_database" , std::make_shared<DataTypeString>()}, |
25 | {"errors_count" , std::make_shared<DataTypeUInt32>()}, |
26 | {"estimated_recovery_time" , std::make_shared<DataTypeUInt32>()} |
27 | }; |
28 | } |
29 | |
30 | void StorageSystemClusters::fillData(MutableColumns & res_columns, const Context & context, const SelectQueryInfo &) const |
31 | { |
32 | for (const auto & name_and_cluster : context.getClusters().getContainer()) |
33 | { |
34 | const String & cluster_name = name_and_cluster.first; |
35 | const ClusterPtr & cluster = name_and_cluster.second; |
36 | const auto & shards_info = cluster->getShardsInfo(); |
37 | const auto & addresses_with_failover = cluster->getShardsAddresses(); |
38 | |
39 | for (size_t shard_index = 0; shard_index < shards_info.size(); ++shard_index) |
40 | { |
41 | const auto & shard_info = shards_info[shard_index]; |
42 | const auto & shard_addresses = addresses_with_failover[shard_index]; |
43 | const auto pool_status = shard_info.pool->getStatus(); |
44 | |
45 | for (size_t replica_index = 0; replica_index < shard_addresses.size(); ++replica_index) |
46 | { |
47 | size_t i = 0; |
48 | const auto & address = shard_addresses[replica_index]; |
49 | |
50 | res_columns[i++]->insert(cluster_name); |
51 | res_columns[i++]->insert(shard_info.shard_num); |
52 | res_columns[i++]->insert(shard_info.weight); |
53 | res_columns[i++]->insert(replica_index + 1); |
54 | res_columns[i++]->insert(address.host_name); |
55 | auto resolved = address.getResolvedAddress(); |
56 | res_columns[i++]->insert(resolved ? resolved->host().toString() : String()); |
57 | res_columns[i++]->insert(address.port); |
58 | res_columns[i++]->insert(address.is_local); |
59 | res_columns[i++]->insert(address.user); |
60 | res_columns[i++]->insert(address.default_database); |
61 | res_columns[i++]->insert(pool_status[replica_index].error_count); |
62 | res_columns[i++]->insert(pool_status[replica_index].estimated_recovery_time.count()); |
63 | } |
64 | } |
65 | } |
66 | } |
67 | } |
68 | |