YugabyteDB (2.13.1.0-b60, 21121d69985fbf76aa6958d8f04a9bfa936293b5)

Coverage Report

Created: 2022-03-22 16:43

/Users/deen/code/yugabyte-db/src/yb/master/yql_local_vtable.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
14
#include "yb/master/yql_local_vtable.h"
15
16
#include "yb/common/ql_protocol.pb.h"
17
#include "yb/common/ql_type.h"
18
#include "yb/common/schema.h"
19
20
#include "yb/master/master.h"
21
#include "yb/master/master_heartbeat.pb.h"
22
#include "yb/master/ts_descriptor.h"
23
24
#include "yb/rpc/messenger.h"
25
26
#include "yb/util/net/dns_resolver.h"
27
#include "yb/util/net/inetaddress.h"
28
#include "yb/util/status_log.h"
29
30
namespace yb {
31
namespace master {
32
33
namespace {
34
35
const std::string kSystemLocalKeyColumn = "key";
36
const std::string kSystemLocalBootstrappedColumn = "bootstrapped";
37
const std::string kSystemLocalBroadcastAddressColumn = "broadcast_address";
38
const std::string kSystemLocalClusterNameColumn = "cluster_name";
39
const std::string kSystemLocalCQLVersionColumn = "cql_version";
40
const std::string kSystemLocalDataCenterColumn = "data_center";
41
const std::string kSystemLocalGossipGenerationColumn = "gossip_generation";
42
const std::string kSystemLocalHostIdColumn = "host_id";
43
const std::string kSystemLocalListenAddressColumn = "listen_address";
44
const std::string kSystemLocalNativeProtocolVersionColumn =
45
    "native_protocol_version";
46
const std::string kSystemLocalPartitionerColumn = "partitioner";
47
const std::string kSystemLocalRackColumn = "rack";
48
const std::string kSystemLocalRpcAddressColumn = "rpc_address";
49
const std::string kSystemLocalSchemaVersionColumn = "schema_version";
50
const std::string kSystemLocalThriftVersionColumn = "thrift_version";
51
const std::string kSystemLocalTokensColumn = "tokens";
52
const std::string kSystemLocalTruncatedAtColumn = "truncated_at";
53
54
} // namespace
55
56
LocalVTable::LocalVTable(const TableName& table_name,
57
                         const NamespaceName& namespace_name,
58
                         Master* const master)
59
3.00k
    : YQLVirtualTable(table_name, namespace_name, master, CreateSchema()) {
60
3.00k
}
61
62
Result<std::shared_ptr<QLRowBlock>> LocalVTable::RetrieveData(
63
71.1k
    const QLReadRequestPB& request) const {
64
71.1k
  vector<std::shared_ptr<TSDescriptor> > descs;
65
71.1k
  GetSortedLiveDescriptors(&descs);
66
71.1k
  auto vtable = std::make_shared<QLRowBlock>(schema());
67
68
71.1k
  struct Entry {
69
71.1k
    size_t index;
70
71.1k
    TSInformationPB ts_info;
71
71.1k
    util::PublicPrivateIPFutures ips;
72
71.1k
  };
73
74
71.1k
  std::vector<Entry> entries;
75
71.1k
  entries.reserve(descs.size());
76
77
71.1k
  InetAddress remote_ip;
78
79
71.1k
  size_t index = 0;
80
217k
  for (const std::shared_ptr<TSDescriptor>& desc : descs) {
81
217k
    ++index;
82
83
    // This is thread safe since all operations are reads.
84
217k
    TSInformationPB ts_info = *desc->GetTSInformationPB();
85
86
    // The system.local table contains only a single entry for the host that we are connected
87
    // to and hence we need to look for the 'remote_endpoint' here.
88
217k
    if (
!request.proxy_uuid().empty()217k
) {
89
217k
      if (desc->permanent_uuid() != request.proxy_uuid()) {
90
146k
        continue;
91
146k
      }
92
18.4E
    } else {
93
18.4E
      if (index == 1) {
94
0
        remote_ip = InetAddress(VERIFY_RESULT(master_->messenger()->resolver().Resolve(
95
0
            request.remote_endpoint().host())));
96
0
      }
97
18.4E
      if (!util::RemoteEndpointMatchesTServer(ts_info, remote_ip)) {
98
0
        continue;
99
0
      }
100
18.4E
    }
101
102
70.6k
    entries.push_back({index - 1, std::move(ts_info)});
103
70.6k
    entries.back().ips = util::GetPublicPrivateIPFutures(
104
70.6k
        entries.back().ts_info, &master_->messenger()->resolver());
105
70.6k
  }
106
107
71.1k
  for (const auto& entry : entries) {
108
71.1k
    QLRow& row = vtable->Extend();
109
71.1k
    InetAddress private_ip(VERIFY_RESULT(Copy(entry.ips.private_ip_future.get())));
110
71.1k
    InetAddress public_ip(VERIFY_RESULT(Copy(entry.ips.public_ip_future.get())));
111
0
    const CloudInfoPB& cloud_info = entry.ts_info.registration().common().cloud_info();
112
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalKeyColumn, "local", &row));
113
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalBootstrappedColumn, "COMPLETED", &row));
114
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalBroadcastAddressColumn, public_ip, &row));
115
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalClusterNameColumn, "local cluster", &row));
116
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalCQLVersionColumn, "3.4.2", &row));
117
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalDataCenterColumn, cloud_info.placement_region(),
118
71.1k
                                 &row));
119
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalGossipGenerationColumn, 0, &row));
120
71.1k
    Uuid host_id;
121
71.1k
    RETURN_NOT_OK(host_id.FromHexString(entry.ts_info.tserver_instance().permanent_uuid()));
122
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalHostIdColumn, host_id, &row));
123
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalListenAddressColumn, private_ip, &row));
124
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalNativeProtocolVersionColumn, "4", &row));
125
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalPartitionerColumn,
126
71.1k
                                 "org.apache.cassandra.dht.Murmur3Partitioner", &row));
127
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalRackColumn, cloud_info.placement_zone(), &row));
128
71.1k
    RETURN_NOT_OK(SetColumnValue(yb::master::kSystemTablesReleaseVersionColumn,
129
71.1k
                                yb::master::kSystemTablesReleaseVersion, &row));
130
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalRpcAddressColumn, public_ip, &row));
131
132
71.1k
    Uuid schema_version = VERIFY_RESULT(Uuid::FromString(master::kDefaultSchemaVersion));
133
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalSchemaVersionColumn, schema_version, &row));
134
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalThriftVersionColumn, "20.1.0", &row));
135
    // setting tokens
136
71.1k
    RETURN_NOT_OK(SetColumnValue(kSystemLocalTokensColumn,
137
71.1k
                                 util::GetTokensValue(entry.index, descs.size()), &row));
138
71.1k
    break;
139
71.1k
  }
140
141
71.1k
  return vtable;
142
71.1k
}
143
144
3.00k
Schema LocalVTable::CreateSchema() const {
145
3.00k
  SchemaBuilder builder;
146
3.00k
  CHECK_OK(builder.AddHashKeyColumn(kSystemLocalKeyColumn, QLType::Create(DataType::STRING)));
147
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalBootstrappedColumn, QLType::Create(DataType::STRING)));
148
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalBroadcastAddressColumn, QLType::Create(DataType::INET)));
149
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalClusterNameColumn, QLType::Create(DataType::STRING)));
150
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalCQLVersionColumn, QLType::Create(DataType::STRING)));
151
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalDataCenterColumn, QLType::Create(DataType::STRING)));
152
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalGossipGenerationColumn, QLType::Create(DataType::INT32)));
153
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalHostIdColumn, QLType::Create(DataType::UUID)));
154
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalListenAddressColumn, QLType::Create(DataType::INET)));
155
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalNativeProtocolVersionColumn,
156
3.00k
                             QLType::Create(DataType::STRING)));
157
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalPartitionerColumn, QLType::Create(DataType::STRING)));
158
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalRackColumn, QLType::Create(DataType::STRING)));
159
3.00k
  CHECK_OK(builder.AddColumn(yb::master::kSystemTablesReleaseVersionColumn,
160
3.00k
                            QLType::Create(DataType::STRING)));
161
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalRpcAddressColumn, QLType::Create(DataType::INET)));
162
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalSchemaVersionColumn, QLType::Create(DataType::UUID)));
163
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalThriftVersionColumn, QLType::Create(DataType::STRING)));
164
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalTokensColumn, QLType::CreateTypeSet(DataType::STRING)));
165
3.00k
  CHECK_OK(builder.AddColumn(kSystemLocalTruncatedAtColumn,
166
3.00k
                             QLType::CreateTypeMap(DataType::UUID, DataType::BINARY)));
167
3.00k
  return builder.Build();
168
3.00k
}
169
170
}  // namespace master
171
}  // namespace yb