diff --git a/c-deps/libroach/protos/roachpb/metadata.pb.cc b/c-deps/libroach/protos/roachpb/metadata.pb.cc index d8daa33b8ba4..526e976865dc 100644 --- a/c-deps/libroach/protos/roachpb/metadata.pb.cc +++ b/c-deps/libroach/protos/roachpb/metadata.pb.cc @@ -2534,11 +2534,17 @@ void NodeDescriptor::InitAsDefaultInstance() { ::cockroach::roachpb::Locality::internal_default_instance()); ::cockroach::roachpb::_NodeDescriptor_default_instance_._instance.get_mutable()->serverversion_ = const_cast< ::cockroach::roachpb::Version*>( ::cockroach::roachpb::Version::internal_default_instance()); + ::cockroach::roachpb::_NodeDescriptor_default_instance_._instance.get_mutable()->sql_address_ = const_cast< ::cockroach::util::UnresolvedAddr*>( + ::cockroach::util::UnresolvedAddr::internal_default_instance()); } void NodeDescriptor::clear_address() { if (address_ != NULL) address_->Clear(); clear_has_address(); } +void NodeDescriptor::clear_sql_address() { + if (sql_address_ != NULL) sql_address_->Clear(); + clear_has_sql_address(); +} #if !defined(_MSC_VER) || _MSC_VER >= 1900 const int NodeDescriptor::kNodeIdFieldNumber; const int NodeDescriptor::kAddressFieldNumber; @@ -2549,6 +2555,7 @@ const int NodeDescriptor::kBuildTagFieldNumber; const int NodeDescriptor::kStartedAtFieldNumber; const int NodeDescriptor::kLocalityAddressFieldNumber; const int NodeDescriptor::kClusterNameFieldNumber; +const int NodeDescriptor::kSqlAddressFieldNumber; #endif // !defined(_MSC_VER) || _MSC_VER >= 1900 NodeDescriptor::NodeDescriptor() @@ -2592,6 +2599,11 @@ NodeDescriptor::NodeDescriptor(const NodeDescriptor& from) } else { serverversion_ = NULL; } + if (from.has_sql_address()) { + sql_address_ = new ::cockroach::util::UnresolvedAddr(*from.sql_address_); + } else { + sql_address_ = NULL; + } ::memcpy(&started_at_, &from.started_at_, static_cast(reinterpret_cast(&node_id_) - reinterpret_cast(&started_at_)) + sizeof(node_id_)); @@ -2618,6 +2630,7 @@ void NodeDescriptor::SharedDtor() { if (this != internal_default_instance()) delete attrs_; if (this != internal_default_instance()) delete locality_; if (this != internal_default_instance()) delete serverversion_; + if (this != internal_default_instance()) delete sql_address_; } void NodeDescriptor::SetCachedSize(int size) const { @@ -2637,7 +2650,7 @@ void NodeDescriptor::Clear() { locality_address_.Clear(); cached_has_bits = _has_bits_[0]; - if (cached_has_bits & 63u) { + if (cached_has_bits & 127u) { if (cached_has_bits & 0x00000001u) { build_tag_.ClearNonDefaultToEmptyNoArena(); } @@ -2660,12 +2673,13 @@ void NodeDescriptor::Clear() { GOOGLE_DCHECK(serverversion_ != NULL); serverversion_->Clear(); } + if (cached_has_bits & 0x00000040u) { + GOOGLE_DCHECK(sql_address_ != NULL); + sql_address_->Clear(); + } } - if (cached_has_bits & 192u) { - ::memset(&started_at_, 0, static_cast( - reinterpret_cast(&node_id_) - - reinterpret_cast(&started_at_)) + sizeof(node_id_)); - } + started_at_ = GOOGLE_LONGLONG(0); + node_id_ = 0; _has_bits_.Clear(); _internal_metadata_.Clear(); } @@ -2789,6 +2803,17 @@ bool NodeDescriptor::MergePartialFromCodedStream( break; } + case 10: { + if (static_cast< ::google::protobuf::uint8>(tag) == + static_cast< ::google::protobuf::uint8>(82u /* 82 & 0xFF */)) { + DO_(::google::protobuf::internal::WireFormatLite::ReadMessage( + input, mutable_sql_address())); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -2816,7 +2841,7 @@ void NodeDescriptor::SerializeWithCachedSizes( (void) cached_has_bits; cached_has_bits = _has_bits_[0]; - if (cached_has_bits & 0x00000080u) { + if (cached_has_bits & 0x00000100u) { ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->node_id(), output); } @@ -2845,7 +2870,7 @@ void NodeDescriptor::SerializeWithCachedSizes( 6, this->build_tag(), output); } - if (cached_has_bits & 0x00000040u) { + if (cached_has_bits & 0x00000080u) { ::google::protobuf::internal::WireFormatLite::WriteInt64(7, this->started_at(), output); } @@ -2862,6 +2887,11 @@ void NodeDescriptor::SerializeWithCachedSizes( 9, this->cluster_name(), output); } + if (cached_has_bits & 0x00000040u) { + ::google::protobuf::internal::WireFormatLite::WriteMessage( + 10, this->_internal_sql_address(), output); + } + output->WriteRaw(_internal_metadata_.unknown_fields().data(), static_cast(_internal_metadata_.unknown_fields().size())); // @@protoc_insertion_point(serialize_end:cockroach.roachpb.NodeDescriptor) @@ -2920,19 +2950,25 @@ size_t NodeDescriptor::ByteSizeLong() const { *serverversion_); } - if (has_started_at()) { + if (has_sql_address()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::Int64Size( - this->started_at()); + ::google::protobuf::internal::WireFormatLite::MessageSize( + *sql_address_); } - if (has_node_id()) { + if (has_started_at()) { total_size += 1 + - ::google::protobuf::internal::WireFormatLite::Int32Size( - this->node_id()); + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->started_at()); } } + if (has_node_id()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->node_id()); + } + int cached_size = ::google::protobuf::internal::ToCachedSize(total_size); SetCachedSize(cached_size); return total_size; @@ -2974,13 +3010,16 @@ void NodeDescriptor::MergeFrom(const NodeDescriptor& from) { mutable_serverversion()->::cockroach::roachpb::Version::MergeFrom(from.serverversion()); } if (cached_has_bits & 0x00000040u) { - started_at_ = from.started_at_; + mutable_sql_address()->::cockroach::util::UnresolvedAddr::MergeFrom(from.sql_address()); } if (cached_has_bits & 0x00000080u) { - node_id_ = from.node_id_; + started_at_ = from.started_at_; } _has_bits_[0] |= cached_has_bits; } + if (cached_has_bits & 0x00000100u) { + set_node_id(from.node_id()); + } } void NodeDescriptor::CopyFrom(const NodeDescriptor& from) { @@ -3009,6 +3048,7 @@ void NodeDescriptor::InternalSwap(NodeDescriptor* other) { swap(attrs_, other->attrs_); swap(locality_, other->locality_); swap(serverversion_, other->serverversion_); + swap(sql_address_, other->sql_address_); swap(started_at_, other->started_at_); swap(node_id_, other->node_id_); swap(_has_bits_[0], other->_has_bits_[0]); diff --git a/c-deps/libroach/protos/roachpb/metadata.pb.h b/c-deps/libroach/protos/roachpb/metadata.pb.h index 540c4ee4771d..99b287622382 100644 --- a/c-deps/libroach/protos/roachpb/metadata.pb.h +++ b/c-deps/libroach/protos/roachpb/metadata.pb.h @@ -1366,6 +1366,17 @@ class NodeDescriptor : public ::google::protobuf::MessageLite /* @@protoc_insert ::cockroach::roachpb::Version* mutable_serverversion(); void set_allocated_serverversion(::cockroach::roachpb::Version* serverversion); + bool has_sql_address() const; + void clear_sql_address(); + static const int kSqlAddressFieldNumber = 10; + private: + const ::cockroach::util::UnresolvedAddr& _internal_sql_address() const; + public: + const ::cockroach::util::UnresolvedAddr& sql_address() const; + ::cockroach::util::UnresolvedAddr* release_sql_address(); + ::cockroach::util::UnresolvedAddr* mutable_sql_address(); + void set_allocated_sql_address(::cockroach::util::UnresolvedAddr* sql_address); + bool has_started_at() const; void clear_started_at(); static const int kStartedAtFieldNumber = 7; @@ -1396,6 +1407,8 @@ class NodeDescriptor : public ::google::protobuf::MessageLite /* @@protoc_insert void clear_has_started_at(); void set_has_cluster_name(); void clear_has_cluster_name(); + void set_has_sql_address(); + void clear_has_sql_address(); ::google::protobuf::internal::InternalMetadataWithArenaLite _internal_metadata_; ::google::protobuf::internal::HasBits<1> _has_bits_; @@ -1407,6 +1420,7 @@ class NodeDescriptor : public ::google::protobuf::MessageLite /* @@protoc_insert ::cockroach::roachpb::Attributes* attrs_; ::cockroach::roachpb::Locality* locality_; ::cockroach::roachpb::Version* serverversion_; + ::cockroach::util::UnresolvedAddr* sql_address_; ::google::protobuf::int64 started_at_; ::google::protobuf::int32 node_id_; friend struct ::protobuf_roachpb_2fmetadata_2eproto::TableStruct; @@ -3276,13 +3290,13 @@ inline void StoreCapacity::set_allocated_writes_per_replica(::cockroach::roachpb // NodeDescriptor inline bool NodeDescriptor::has_node_id() const { - return (_has_bits_[0] & 0x00000080u) != 0; + return (_has_bits_[0] & 0x00000100u) != 0; } inline void NodeDescriptor::set_has_node_id() { - _has_bits_[0] |= 0x00000080u; + _has_bits_[0] |= 0x00000100u; } inline void NodeDescriptor::clear_has_node_id() { - _has_bits_[0] &= ~0x00000080u; + _has_bits_[0] &= ~0x00000100u; } inline void NodeDescriptor::clear_node_id() { node_id_ = 0; @@ -3588,13 +3602,13 @@ inline void NodeDescriptor::set_allocated_build_tag(::std::string* build_tag) { } inline bool NodeDescriptor::has_started_at() const { - return (_has_bits_[0] & 0x00000040u) != 0; + return (_has_bits_[0] & 0x00000080u) != 0; } inline void NodeDescriptor::set_has_started_at() { - _has_bits_[0] |= 0x00000040u; + _has_bits_[0] |= 0x00000080u; } inline void NodeDescriptor::clear_has_started_at() { - _has_bits_[0] &= ~0x00000040u; + _has_bits_[0] &= ~0x00000080u; } inline void NodeDescriptor::clear_started_at() { started_at_ = GOOGLE_LONGLONG(0); @@ -3704,6 +3718,59 @@ inline void NodeDescriptor::set_allocated_cluster_name(::std::string* cluster_na // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.NodeDescriptor.cluster_name) } +inline bool NodeDescriptor::has_sql_address() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void NodeDescriptor::set_has_sql_address() { + _has_bits_[0] |= 0x00000040u; +} +inline void NodeDescriptor::clear_has_sql_address() { + _has_bits_[0] &= ~0x00000040u; +} +inline const ::cockroach::util::UnresolvedAddr& NodeDescriptor::_internal_sql_address() const { + return *sql_address_; +} +inline const ::cockroach::util::UnresolvedAddr& NodeDescriptor::sql_address() const { + const ::cockroach::util::UnresolvedAddr* p = sql_address_; + // @@protoc_insertion_point(field_get:cockroach.roachpb.NodeDescriptor.sql_address) + return p != NULL ? *p : *reinterpret_cast( + &::cockroach::util::_UnresolvedAddr_default_instance_); +} +inline ::cockroach::util::UnresolvedAddr* NodeDescriptor::release_sql_address() { + // @@protoc_insertion_point(field_release:cockroach.roachpb.NodeDescriptor.sql_address) + clear_has_sql_address(); + ::cockroach::util::UnresolvedAddr* temp = sql_address_; + sql_address_ = NULL; + return temp; +} +inline ::cockroach::util::UnresolvedAddr* NodeDescriptor::mutable_sql_address() { + set_has_sql_address(); + if (sql_address_ == NULL) { + auto* p = CreateMaybeMessage<::cockroach::util::UnresolvedAddr>(GetArenaNoVirtual()); + sql_address_ = p; + } + // @@protoc_insertion_point(field_mutable:cockroach.roachpb.NodeDescriptor.sql_address) + return sql_address_; +} +inline void NodeDescriptor::set_allocated_sql_address(::cockroach::util::UnresolvedAddr* sql_address) { + ::google::protobuf::Arena* message_arena = GetArenaNoVirtual(); + if (message_arena == NULL) { + delete reinterpret_cast< ::google::protobuf::MessageLite*>(sql_address_); + } + if (sql_address) { + ::google::protobuf::Arena* submessage_arena = NULL; + if (message_arena != submessage_arena) { + sql_address = ::google::protobuf::internal::GetOwnedMessage( + message_arena, sql_address, submessage_arena); + } + set_has_sql_address(); + } else { + clear_has_sql_address(); + } + sql_address_ = sql_address; + // @@protoc_insertion_point(field_set_allocated:cockroach.roachpb.NodeDescriptor.sql_address) +} + // ------------------------------------------------------------------- // LocalityAddress diff --git a/pkg/base/addr_validation.go b/pkg/base/addr_validation.go index 9081952277c3..3e6e99aeca31 100644 --- a/pkg/base/addr_validation.go +++ b/pkg/base/addr_validation.go @@ -11,6 +11,7 @@ package base import ( + "bytes" "context" "crypto/x509" "fmt" @@ -41,22 +42,39 @@ func (cfg *Config) ValidateAddrs(ctx context.Context) error { advHost, advPort, err := validateAdvertiseAddr(ctx, cfg.AdvertiseAddr, "--listen-addr", cfg.Addr, "") if err != nil { - return errors.Wrapf(err, "invalid --advertise-addr") + return errors.Wrap(err, "invalid --advertise-addr") } cfg.AdvertiseAddr = net.JoinHostPort(advHost, advPort) - // Validate the listen address. + // Validate the RPC listen address. listenHost, listenPort, err := validateListenAddr(ctx, cfg.Addr, "") if err != nil { - return errors.Wrapf(err, "invalid --listen-addr") + return errors.Wrap(err, "invalid --listen-addr") } cfg.Addr = net.JoinHostPort(listenHost, listenPort) - // Validate the HTTP advertise address. + // Validate the SQL advertise address. Use the provided advertise + // addr as default. + advSQLHost, advSQLPort, err := validateAdvertiseAddr(ctx, + cfg.SQLAdvertiseAddr, "--sql-addr", cfg.SQLAddr, advHost) + if err != nil { + return errors.Wrap(err, "invalid --advertise-sql-addr") + } + cfg.SQLAdvertiseAddr = net.JoinHostPort(advSQLHost, advSQLPort) + + // Validate the SQL listen address - use the resolved listen addr as default. + sqlHost, sqlPort, err := validateListenAddr(ctx, cfg.SQLAddr, listenHost) + if err != nil { + return errors.Wrap(err, "invalid --sql-addr") + } + cfg.SQLAddr = net.JoinHostPort(sqlHost, sqlPort) + + // Validate the HTTP advertise address. Use the provided advertise + // addr as default. advHTTPHost, advHTTPPort, err := validateAdvertiseAddr(ctx, cfg.HTTPAdvertiseAddr, "--http-addr", cfg.HTTPAddr, advHost) if err != nil { - return errors.Wrapf(err, "cannot compute public HTTP address") + return errors.Wrap(err, "cannot compute public HTTP address") } cfg.HTTPAdvertiseAddr = net.JoinHostPort(advHTTPHost, advHTTPPort) @@ -64,7 +82,7 @@ func (cfg *Config) ValidateAddrs(ctx context.Context) error { // as default. httpHost, httpPort, err := validateListenAddr(ctx, cfg.HTTPAddr, listenHost) if err != nil { - return errors.Wrapf(err, "invalid --http-addr") + return errors.Wrap(err, "invalid --http-addr") } cfg.HTTPAddr = net.JoinHostPort(httpHost, httpPort) return nil @@ -277,6 +295,7 @@ func (cfg *Config) CheckCertificateAddrs(ctx context.Context) { // Log the certificate details in any case. This will aid during troubleshooting. log.Infof(ctx, "server certificate addresses: %s", addrInfo) + var msg bytes.Buffer // Verify the compatibility. This requires that ValidateAddrs() has // been called already. host, _, err := net.SplitHostPort(cfg.AdvertiseAddr) @@ -284,11 +303,21 @@ func (cfg *Config) CheckCertificateAddrs(ctx context.Context) { panic("programming error: call ValidateAddrs() first") } if err := cert.VerifyHostname(host); err != nil { + fmt.Fprintf(&msg, "advertise address %q not in node certificate (%s)\n", host, addrInfo) + } + host, _, err = net.SplitHostPort(cfg.SQLAdvertiseAddr) + if err != nil { + panic("programming error: call ValidateAddrs() first") + } + if err := cert.VerifyHostname(host); err != nil { + fmt.Fprintf(&msg, "advertise SQL address %q not in node certificate (%s)\n", host, addrInfo) + } + if msg.Len() > 0 { log.Shout(ctx, log.Severity_WARNING, - fmt.Sprintf("advertise address %q not in node certificate (%s)\n"+ - "Secure node-node and SQL connections are likely to fail.\n"+ - "Consider extending the node certificate or tweak --listen-addr/--advertise-addr.", - host, addrInfo)) + fmt.Sprintf("%s"+ + "Secure client connections are likely to fail.\n"+ + "Consider extending the node certificate or tweak --listen-addr/--advertise-addr/--sql-addr/--advertise-sql-addr.", + msg.String())) } } diff --git a/pkg/base/addr_validation_test.go b/pkg/base/addr_validation_test.go index f84ea87c8338..f304cecb6a19 100644 --- a/pkg/base/addr_validation_test.go +++ b/pkg/base/addr_validation_test.go @@ -23,11 +23,11 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/leaktest" ) -type addrs struct{ listen, adv, http, advhttp string } +type addrs struct{ listen, adv, http, advhttp, sql, advsql string } func (a *addrs) String() string { - return fmt.Sprintf("--listen-addr=%s --advertise-addr=%s --http-addr=%s (http adv: %s)", - a.listen, a.adv, a.http, a.advhttp) + return fmt.Sprintf("--listen-addr=%s --advertise-addr=%s --http-addr=%s (http adv: %s) --sql-addr=%s (sql adv: %s)", + a.listen, a.adv, a.http, a.advhttp, a.sql, a.advsql) } func TestValidateAddrs(t *testing.T) { @@ -76,71 +76,84 @@ func TestValidateAddrs(t *testing.T) { expected addrs }{ // Common case: no server flags, all defaults. - {addrs{":26257", "", ":8080", ""}, "", - addrs{":26257", hostname + ":26257", ":8080", hostname + ":8080"}}, + {addrs{":26257", "", ":8080", "", ":5432", ""}, "", + addrs{":26257", hostname + ":26257", ":8080", hostname + ":8080", ":5432", hostname + ":5432"}}, // Another common case: --listen-addr= - {addrs{hostname + ":26257", "", ":8080", ""}, "", - addrs{hostAddr + ":26257", hostname + ":26257", hostAddr + ":8080", hostname + ":8080"}}, + {addrs{hostname + ":26257", "", ":8080", "", ":5432", ""}, "", + addrs{hostAddr + ":26257", hostname + ":26257", hostAddr + ":8080", hostname + ":8080", hostAddr + ":5432", hostname + ":5432"}}, // Another common case: --listen-addr=localhost - {addrs{"localhost:26257", "", ":8080", ""}, "", - addrs{localAddr + ":26257", "localhost:26257", localAddr + ":8080", "localhost:8080"}}, + {addrs{"localhost:26257", "", ":8080", "", ":5432", ""}, "", + addrs{localAddr + ":26257", "localhost:26257", localAddr + ":8080", "localhost:8080", localAddr + ":5432", "localhost:5432"}}, // Correct use: --listen-addr= --advertise-host= - {addrs{hostAddr + ":26257", hostname + ":", ":8080", ""}, "", - addrs{hostAddr + ":26257", hostname + ":26257", hostAddr + ":8080", hostname + ":8080"}}, + {addrs{hostAddr + ":26257", hostname + ":", ":8080", "", ":5432", ""}, "", + addrs{hostAddr + ":26257", hostname + ":26257", hostAddr + ":8080", hostname + ":8080", hostAddr + ":5432", hostname + ":5432"}}, // Explicit port number in advertise addr. - {addrs{hostAddr + ":26257", hostname + ":12345", ":8080", ""}, "", - addrs{hostAddr + ":26257", hostname + ":12345", hostAddr + ":8080", hostname + ":8080"}}, + {addrs{hostAddr + ":26257", hostname + ":12345", ":8080", "", ":5432", ""}, "", + addrs{hostAddr + ":26257", hostname + ":12345", hostAddr + ":8080", hostname + ":8080", hostAddr + ":5432", hostname + ":5432"}}, // Use a non-numeric port number. - {addrs{":postgresql", "", ":http", ""}, "", - addrs{":5432", hostname + ":5432", ":80", hostname + ":80"}}, + {addrs{":postgresql", "", ":http", "", ":postgresql", ""}, "", + addrs{":5432", hostname + ":5432", ":80", hostname + ":80", ":5432", hostname + ":5432"}}, // Make HTTP local only. - {addrs{":26257", "", "localhost:8080", ""}, "", - addrs{":26257", hostname + ":26257", localAddr + ":8080", "localhost:8080"}}, + {addrs{":26257", "", "localhost:8080", "", ":5432", ""}, "", + addrs{":26257", hostname + ":26257", localAddr + ":8080", "localhost:8080", ":5432", hostname + ":5432"}}, // Local server but public HTTP. - {addrs{"localhost:26257", "", hostname + ":8080", ""}, "", - addrs{localAddr + ":26257", "localhost:26257", hostAddr + ":8080", hostname + ":8080"}}, + {addrs{"localhost:26257", "", hostname + ":8080", "", ":5432", ""}, "", + addrs{localAddr + ":26257", "localhost:26257", hostAddr + ":8080", hostname + ":8080", localAddr + ":5432", "localhost:5432"}}, + + // Make SQL local only. + {addrs{":26257", "", ":8080", "", "localhost:5432", ""}, "", + addrs{":26257", hostname + ":26257", ":8080", hostname + ":8080", localAddr + ":5432", "localhost:5432"}}, // Not-unreasonable case: addresses set empty. Means using port 0. - {addrs{"", "", "", ""}, "", - addrs{":0", hostname + ":0", ":0", hostname + ":0"}}, - {addrs{":", "", "", ""}, "", - addrs{":0", hostname + ":0", ":0", hostname + ":0"}}, - {addrs{"", ":", "", ""}, "", - addrs{":0", hostname + ":0", ":0", hostname + ":0"}}, - {addrs{"", "", ":", ""}, "", - addrs{":0", hostname + ":0", ":0", hostname + ":0"}}, + {addrs{"", "", "", "", "", ""}, "", + addrs{":0", hostname + ":0", ":0", hostname + ":0", ":0", hostname + ":0"}}, + // A colon means "all-addr, auto-port". + {addrs{":", "", "", "", "", ""}, "", + addrs{":0", hostname + ":0", ":0", hostname + ":0", ":0", hostname + ":0"}}, + {addrs{"", ":", "", "", "", ""}, "", + addrs{":0", hostname + ":0", ":0", hostname + ":0", ":0", hostname + ":0"}}, + {addrs{"", "", ":", "", "", ""}, "", + addrs{":0", hostname + ":0", ":0", hostname + ":0", ":0", hostname + ":0"}}, + {addrs{"", "", "", "", ":", ""}, "", + addrs{":0", hostname + ":0", ":0", hostname + ":0", ":0", hostname + ":0"}}, + {addrs{"", "", "", "", "", ":"}, "", + addrs{":0", hostname + ":0", ":0", hostname + ":0", ":0", hostname + ":0"}}, // Advertise port 0 means reuse listen port. We don't // auto-allocate ports for advertised addresses. - {addrs{":12345", ":0", "", ""}, "", - addrs{":12345", hostname + ":12345", ":0", hostname + ":0"}}, + {addrs{":12345", ":0", "", "", ":5432", ""}, "", + addrs{":12345", hostname + ":12345", ":0", hostname + ":0", ":5432", hostname + ":5432"}}, + {addrs{":12345", "", "", "", ":5432", ":0"}, "", + addrs{":12345", hostname + ":12345", ":0", hostname + ":0", ":5432", hostname + ":5432"}}, // Expected errors. // Missing port number. - {addrs{"localhost", "", "", ""}, "invalid --listen-addr.*missing port in address", addrs{}}, - {addrs{":26257", "", "localhost", ""}, "invalid --http-addr.*missing port in address", addrs{}}, + {addrs{"localhost", "", "", "", "", ""}, "invalid --listen-addr.*missing port in address", addrs{}}, + {addrs{":26257", "", "localhost", "", "", ""}, "invalid --http-addr.*missing port in address", addrs{}}, // Invalid port number. - {addrs{"localhost:-1231", "", "", ""}, "invalid port", addrs{}}, - {addrs{"localhost:nonexistent", "", "", ""}, portExpectedErr, addrs{}}, + {addrs{"localhost:-1231", "", "", "", "", ""}, "invalid port", addrs{}}, + {addrs{"localhost:nonexistent", "", "", "", "", ""}, portExpectedErr, addrs{}}, // Invalid address. - {addrs{"nonexistent.example.com:26257", "", "", ""}, "no such host", addrs{}}, - {addrs{"333.333.333.333:26257", "", "", ""}, "no such host", addrs{}}, + {addrs{"nonexistent.example.com:26257", "", "", "", "", ""}, "no such host", addrs{}}, + {addrs{"333.333.333.333:26257", "", "", "", "", ""}, "no such host", addrs{}}, } - for _, test := range testData { - t.Run(test.in.String(), func(t *testing.T) { + for i, test := range testData { + t.Run(fmt.Sprintf("%d/%s", i, test.in), func(t *testing.T) { cfg := base.Config{ - Addr: test.in.listen, - AdvertiseAddr: test.in.adv, - HTTPAddr: test.in.http, + Addr: test.in.listen, + AdvertiseAddr: test.in.adv, + HTTPAddr: test.in.http, + SQLAddr: test.in.sql, + SQLAdvertiseAddr: test.in.advsql, } if err := cfg.ValidateAddrs(context.Background()); err != nil { @@ -153,7 +166,7 @@ func TestValidateAddrs(t *testing.T) { t.Fatalf("expected error %q, got success", test.expectedErr) } - got := addrs{cfg.Addr, cfg.AdvertiseAddr, cfg.HTTPAddr, cfg.HTTPAdvertiseAddr} + got := addrs{cfg.Addr, cfg.AdvertiseAddr, cfg.HTTPAddr, cfg.HTTPAdvertiseAddr, cfg.SQLAddr, cfg.SQLAdvertiseAddr} gotStr := got.String() expStr := test.expected.String() diff --git a/pkg/base/config.go b/pkg/base/config.go index d23deb329839..71baf3a45f4a 100644 --- a/pkg/base/config.go +++ b/pkg/base/config.go @@ -35,6 +35,9 @@ const ( // From IANA Service Name and Transport Protocol Port Number Registry. See // https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml?search=cockroachdb + // + // This is used for both RPC and SQL connections unless --sql-addr + // is used on the command line and/or SQLAddr is set in the Config object. DefaultPort = "26257" // The default port for HTTP-for-humans. @@ -43,6 +46,7 @@ const ( // NB: net.JoinHostPort is not a constant. defaultAddr = ":" + DefaultPort defaultHTTPAddr = ":" + DefaultHTTPPort + defaultSQLAddr = ":" + DefaultPort // NetworkTimeout is the timeout used for network operations. NetworkTimeout = 3 * time.Second @@ -170,12 +174,19 @@ type Config struct { // existing cluster into using a new cluster name. DisableClusterNameVerification bool + // SplitListenSQL indicates whether to listen for SQL + // clients on a separate address from RPC requests. + SplitListenSQL bool + + // SQLAddr is the configured SQL listen address. + // This is used if SplitListenSQL is set to true. + SQLAddr string + + // SQLAdvertiseAddr is the advertised SQL address. + // This is computed from SQLAddr if specified otherwise Addr. + SQLAdvertiseAddr string + // HTTPAddr is the configured HTTP listen address. - // - // This is temporary, and will be removed when grpc.(*Server).ServeHTTP - // performance problems are addressed upstream. - // - // See https://github.com/grpc/grpc-go/issues/586. HTTPAddr string // HTTPAdvertiseAddr is the advertised HTTP address. @@ -218,6 +229,10 @@ func (cfg *Config) InitDefaults() { cfg.Addr = defaultAddr cfg.AdvertiseAddr = cfg.Addr cfg.HTTPAddr = defaultHTTPAddr + cfg.HTTPAdvertiseAddr = "" + cfg.SplitListenSQL = false + cfg.SQLAddr = defaultSQLAddr + cfg.SQLAdvertiseAddr = cfg.SQLAddr cfg.SSLCertsDir = DefaultCertsDirectory cfg.certificateManager = lazyCertificateManager{} cfg.RPCHeartbeatInterval = defaultRPCHeartbeatInterval @@ -313,7 +328,7 @@ func (cfg *Config) PGURL(user *url.Userinfo) (*url.URL, error) { return &url.URL{ Scheme: "postgresql", User: user, - Host: cfg.AdvertiseAddr, + Host: cfg.SQLAdvertiseAddr, RawQuery: options.Encode(), }, nil } diff --git a/pkg/base/test_server_args.go b/pkg/base/test_server_args.go index 1497c9113bf0..543161aa4e77 100644 --- a/pkg/base/test_server_args.go +++ b/pkg/base/test_server_args.go @@ -44,8 +44,10 @@ type TestServerArgs struct { // is always set to true when the server is started via a TestCluster. PartOfCluster bool - // Addr (if nonempty) is the address to use for the test server. + // Addr (if nonempty) is the RPC address to use for the test server. Addr string + // SQLAddr (if nonempty) is the SQL address to use for the test server. + SQLAddr string // HTTPAddr (if nonempty) is the HTTP address to use for the test server. HTTPAddr string diff --git a/pkg/bench/pgbench_test.go b/pkg/bench/pgbench_test.go index 23fd8f28b8de..cc0a7404d412 100644 --- a/pkg/bench/pgbench_test.go +++ b/pkg/bench/pgbench_test.go @@ -113,7 +113,7 @@ func BenchmarkPgbenchExec(b *testing.B) { defer s.Stopper().Stop(context.TODO()) pgURL, cleanupFn := sqlutils.PGUrl( - b, s.ServingAddr(), "benchmarkCockroach", url.User(security.RootUser)) + b, s.ServingSQLAddr(), "benchmarkCockroach", url.User(security.RootUser)) pgURL.RawQuery = "sslmode=disable" defer cleanupFn() diff --git a/pkg/ccl/backupccl/backup_test.go b/pkg/ccl/backupccl/backup_test.go index 4f0c6499d1e9..f51873075da3 100644 --- a/pkg/ccl/backupccl/backup_test.go +++ b/pkg/ccl/backupccl/backup_test.go @@ -2470,7 +2470,7 @@ func TestBackupRestorePermissions(t *testing.T) { sqlDB.Exec(t, `CREATE USER testuser`) pgURL, cleanupFunc := sqlutils.PGUrl( - t, tc.Server(0).ServingAddr(), "TestBackupRestorePermissions-testuser", url.User("testuser"), + t, tc.Server(0).ServingSQLAddr(), "TestBackupRestorePermissions-testuser", url.User("testuser"), ) defer cleanupFunc() testuser, err := gosql.Open("postgres", pgURL.String()) diff --git a/pkg/ccl/changefeedccl/changefeed_test.go b/pkg/ccl/changefeedccl/changefeed_test.go index 5a57c6ae374d..7791e328da02 100644 --- a/pkg/ccl/changefeedccl/changefeed_test.go +++ b/pkg/ccl/changefeedccl/changefeed_test.go @@ -1476,7 +1476,7 @@ func TestChangefeedPermissions(t *testing.T) { s := f.Server() pgURL, cleanupFunc := sqlutils.PGUrl( - t, s.ServingAddr(), "TestChangefeedPermissions-testuser", url.User("testuser"), + t, s.ServingSQLAddr(), "TestChangefeedPermissions-testuser", url.User("testuser"), ) defer cleanupFunc() testuser, err := gosql.Open("postgres", pgURL.String()) @@ -1509,7 +1509,7 @@ func TestChangefeedDescription(t *testing.T) { // Intentionally don't use the TestFeedFactory because we want to // control the placeholders. s := f.Server() - sink, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + sink, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() sink.Scheme = sinkSchemeExperimentalSQL sink.Path = `d` @@ -1698,7 +1698,7 @@ func TestChangefeedNodeShutdown(t *testing.T) { // Create a factory which uses server 1 as the output of the Sink, but // executes the CREATE CHANGEFEED statement on server 0. sink, cleanup := sqlutils.PGUrl( - t, tc.Server(0).ServingAddr(), t.Name(), url.User(security.RootUser)) + t, tc.Server(0).ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() f := cdctest.MakeTableFeedFactory(tc.Server(1), tc.ServerConn(0), flushCh, sink) foo := feed(t, f, "CREATE CHANGEFEED FOR foo") diff --git a/pkg/ccl/changefeedccl/helpers_test.go b/pkg/ccl/changefeedccl/helpers_test.go index 9c14d281f4c0..2f959684150d 100644 --- a/pkg/ccl/changefeedccl/helpers_test.go +++ b/pkg/ccl/changefeedccl/helpers_test.go @@ -225,7 +225,7 @@ func sinklessTest(testFn func(*testing.T, *gosql.DB, cdctest.TestFeedFactory)) f sqlDB.Exec(t, `SET CLUSTER SETTING changefeed.experimental_poll_interval = '10ms'`) sqlDB.Exec(t, `CREATE DATABASE d`) - sink, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + sink, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() f := cdctest.MakeSinklessFeedFactory(s, sink) testFn(t, db, f) @@ -258,7 +258,7 @@ func enterpriseTest(testFn func(*testing.T, *gosql.DB, cdctest.TestFeedFactory)) sqlDB.Exec(t, `SET CLUSTER SETTING kv.closed_timestamp.target_duration = '1s'`) sqlDB.Exec(t, `SET CLUSTER SETTING changefeed.experimental_poll_interval = '10ms'`) sqlDB.Exec(t, `CREATE DATABASE d`) - sink, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + sink, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() f := cdctest.MakeTableFeedFactory(s, db, flushCh, sink) diff --git a/pkg/ccl/changefeedccl/sink_test.go b/pkg/ccl/changefeedccl/sink_test.go index 47cfb96ff7c9..6c60f731dc41 100644 --- a/pkg/ccl/changefeedccl/sink_test.go +++ b/pkg/ccl/changefeedccl/sink_test.go @@ -186,7 +186,7 @@ func TestSQLSink(t *testing.T) { sqlDB := sqlutils.MakeSQLRunner(sqlDBRaw) sqlDB.Exec(t, `CREATE DATABASE d`) - sinkURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + sinkURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() sinkURL.Path = `d` diff --git a/pkg/cli/cli_test.go b/pkg/cli/cli_test.go index 70eabdea8ca0..7e542b09f3a7 100644 --- a/pkg/cli/cli_test.go +++ b/pkg/cli/cli_test.go @@ -68,7 +68,6 @@ type cliTestParams struct { noServer bool storeSpecs []base.StoreSpec locality roachpb.Locality - addr string } func (c *cliTest) fail(err interface{}) { @@ -132,14 +131,14 @@ func newCLITest(params cliTestParams) cliTest { SSLCertsDir: c.certsDir, StoreSpecs: params.storeSpecs, Locality: params.locality, - Addr: params.addr, }) if err != nil { c.fail(err) } c.TestServer = s.(*server.TestServer) - log.Infof(context.TODO(), "server started at %s", c.ServingAddr()) + log.Infof(context.TODO(), "server started at %s", c.ServingRPCAddr()) + log.Infof(context.TODO(), "SQL listener at %s", c.ServingSQLAddr()) } baseCfg.User = security.NodeUser @@ -167,7 +166,8 @@ func setCLIDefaultsForTests() { // stopServer stops the test server. func (c *cliTest) stopServer() { if c.TestServer != nil { - log.Infof(context.TODO(), "stopping server at %s", c.ServingAddr()) + log.Infof(context.TODO(), "stopping server at %s / %s", + c.ServingRPCAddr(), c.ServingSQLAddr()) select { case <-c.Stopper().ShouldStop(): // If ShouldStop() doesn't block, that means someone has already @@ -179,7 +179,7 @@ func (c *cliTest) stopServer() { } } -// restartServer stops and restarts the test server. The ServingAddr() may +// restartServer stops and restarts the test server. The ServingRPCAddr() may // have changed after this method returns. func (c *cliTest) restartServer(params cliTestParams) { c.stopServer() @@ -193,7 +193,8 @@ func (c *cliTest) restartServer(params cliTestParams) { c.fail(err) } c.TestServer = s.(*server.TestServer) - log.Infof(context.TODO(), "restarted server at %s", c.ServingAddr()) + log.Infof(context.TODO(), "restarted server at %s / %s", + c.ServingRPCAddr(), c.ServingSQLAddr()) } // cleanup cleans up after the test, stopping the server if necessary. @@ -352,23 +353,49 @@ func (c cliTest) RunWithArgs(origArgs []string) { redirectOutput(func() { c.runWithArgsUnredirected(origArgs) }) } +func isSQLCommand(args []string) bool { + if len(args) == 0 { + return false + } + switch args[0] { + case "user", "sql", "dump", "workload": + return true + case "node": + if len(args) == 0 { + return false + } + switch args[1] { + case "status", "ls": + return true + default: + return false + } + default: + return false + } +} + func (c cliTest) runWithArgsUnredirected(origArgs []string) { TestingReset() if err := func() error { args := append([]string(nil), origArgs[:1]...) if c.TestServer != nil { - h, p, err := net.SplitHostPort(c.ServingAddr()) + addr := c.ServingRPCAddr() + if isSQLCommand(origArgs) { + addr = c.ServingSQLAddr() + } + h, p, err := net.SplitHostPort(addr) if err != nil { return err } + args = append(args, fmt.Sprintf("--host=%s", net.JoinHostPort(h, p))) if c.Cfg.Insecure { args = append(args, "--insecure") } else { args = append(args, "--insecure=false") args = append(args, fmt.Sprintf("--certs-dir=%s", c.certsDir)) } - args = append(args, fmt.Sprintf("--host=%s", net.JoinHostPort(h, p))) } args = append(args, origArgs[1:]...) @@ -1780,15 +1807,23 @@ func checkNodeStatus(t *testing.T, c cliTest, output string, start time.Time) { t.Errorf("node address (%s) != expected (%s)", a, e) } + nodeSQLAddr, err := c.Gossip().GetNodeIDSQLAddress(nodeID) + if err != nil { + t.Fatal(err) + } + if a, e := fields[2], nodeSQLAddr.String(); a != e { + t.Errorf("node SQL address (%s) != expected (%s)", a, e) + } + // Verify Build Tag. - if a, e := fields[2], build.GetInfo().Tag; a != e { + if a, e := fields[3], build.GetInfo().Tag; a != e { t.Errorf("build tag (%s) != expected (%s)", a, e) } // Verify that updated_at and started_at are reasonably recent. // CircleCI can be very slow. This was flaky at 5s. - checkTimeElapsed(t, fields[3], 15*time.Second, start) checkTimeElapsed(t, fields[4], 15*time.Second, start) + checkTimeElapsed(t, fields[5], 15*time.Second, start) testcases := []testCase{} diff --git a/pkg/cli/cliflags/flags.go b/pkg/cli/cliflags/flags.go index fd98c6543960..6736edebffd2 100644 --- a/pkg/cli/cliflags/flags.go +++ b/pkg/cli/cliflags/flags.go @@ -351,12 +351,25 @@ or both forms can be used together, for example: ListenAddr = FlagInfo{ Name: "listen-addr", Description: ` -The address/hostname and port to listen on, for example ---listen-addr=myhost:26257 or --listen-addr=:26257 (listen on all -interfaces). If the port part is left unspecified, it defaults -to 26257. +The address/hostname and port to listen on for intra-cluster +communication, for example --listen-addr=myhost:26257 or +--listen-addr=:26257 (listen on all interfaces). +Unless --sql-addr is also specified, this address is also +used to accept SQL client connections. +
+
+
+If the address part is left unspecified, it defaults to +the "all interfaces" address (0.0.0.0 IPv4 / [::] IPv6). +If the port part is left unspecified, it defaults to 26257. +
+
+
An IPv6 address can also be specified with the notation [...], for example [::1]:26257 or [fe80::f6f2:::]:26257. +
+
+
If --advertise-addr is left unspecified, the node will also announce this address for use by other nodes. It is strongly recommended to use --advertise-addr in cloud and container deployments or any setup where @@ -379,13 +392,50 @@ NAT is present between cluster nodes.`, The address/hostname and port to advertise to other CockroachDB nodes for intra-cluster communication. It must resolve and be routable from other nodes in the cluster. +
+
+
If left unspecified, it defaults to the setting of --listen-addr. +If the flag is provided but either the address part or the port part +is left unspecified, that particular part defaults to the +same part in --listen-addr. +
+
+
An IPv6 address can also be specified with the notation [...], for example [::1]:26257 or [fe80::f6f2:::]:26257. +
+
+
The port number should be the same as in --listen-addr unless port forwarding is set up on an intermediate firewall/router.`, } + SQLAdvertiseAddr = FlagInfo{ + Name: "advertise-sql-addr", + Description: ` +The SQL address/hostname and port to advertise to CLI admin utilities +and via SQL introspection for the purpose of SQL address discovery. +It must resolve and be routable from clients. +
+
+
+If left unspecified, it defaults to the setting of --sql-addr. +If the flag is provided but either the address part or the port part +is left unspecified, that particular part defaults to the +same part in --sql-addr. +
+
+
+An IPv6 address can also be specified with the notation [...], for +example [::1]:26257 or [fe80::f6f2:::]:26257. +
+
+
+The port number should be the same as in --sql-addr unless port +forwarding is set up on an intermediate firewall/router.`, + } + AdvertiseHost = FlagInfo{ Name: "advertise-host", Description: `Alias for --advertise-addr. Deprecated.`, @@ -396,6 +446,35 @@ forwarding is set up on an intermediate firewall/router.`, Description: `Deprecated. Use --advertise-addr=:.`, } + ListenSQLAddr = FlagInfo{ + Name: "sql-addr", + Description: ` +The hostname or IP address to bind to for SQL clients, for example +--sql-addr=myhost:26257 or --sql-addr=:26257 (listen on all interfaces). +If left unspecified, the address specified by --listen-addr will be +used for both RPC and SQL connections. +
+
+
+If specified but the address part is omitted, the address part +defaults to the address part of --listen-addr. +If specified but the port number is omitted, the port +number defaults to 26257. +
+
+
+To actually use separate bindings, it is recommended to specify +both flags and use a different port number via --listen-addr, for +example --sql-addr=:26257 --listen-addr=:26258. Ensure that +--join is set accordingly on other nodes. It is also possible +to use the same port number but separate host addresses. +
+
+
+An IPv6 address can also be specified with the notation [...], for +example [::1]:26257 or [fe80::f6f2:::]:26257.`, + } + ListenHTTPAddr = FlagInfo{ Name: "http-addr", Description: ` diff --git a/pkg/cli/debug_test.go b/pkg/cli/debug_test.go index 3891d27c4cbf..def7d28aed1f 100644 --- a/pkg/cli/debug_test.go +++ b/pkg/cli/debug_test.go @@ -248,7 +248,7 @@ func TestRemoveDeadReplicas(t *testing.T) { defer tc.Stopper().Stop(ctx) grpcConn, err := tc.Server(0).RPCContext().GRPCDialNode( - tc.Server(0).ServingAddr(), + tc.Server(0).ServingRPCAddr(), tc.Server(0).NodeID(), ).Connect(ctx) if err != nil { diff --git a/pkg/cli/demo.go b/pkg/cli/demo.go index 60effcf960aa..6af08b0f4394 100644 --- a/pkg/cli/demo.go +++ b/pkg/cli/demo.go @@ -134,7 +134,7 @@ func setupTransientServers( if err := s.Start(args); err != nil { return connURL, adminURL, cleanup, err } - args.JoinAddr = s.ServingAddr() + args.JoinAddr = s.ServingRPCAddr() for i := 0; i < demoCtx.nodes-1; i++ { s := serverFactory.New(args).(*server.TestServer) if err := s.Start(args); err != nil { @@ -149,7 +149,7 @@ func setupTransientServers( url := url.URL{ Scheme: "postgres", User: url.User(security.RootUser), - Host: s.ServingAddr(), + Host: s.ServingSQLAddr(), RawQuery: options.Encode(), } if gen != nil { diff --git a/pkg/cli/dump_test.go b/pkg/cli/dump_test.go index 035ef696990c..0afcff79ab77 100644 --- a/pkg/cli/dump_test.go +++ b/pkg/cli/dump_test.go @@ -118,7 +118,7 @@ func TestDumpBytes(t *testing.T) { c := newCLITest(cliTestParams{t: t}) defer c.cleanup() - url, cleanup := sqlutils.PGUrl(t, c.ServingAddr(), t.Name(), url.User(security.RootUser)) + url, cleanup := sqlutils.PGUrl(t, c.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() conn := makeSQLConn(url.String()) @@ -182,7 +182,7 @@ func TestDumpRandom(t *testing.T) { c := newCLITest(cliTestParams{t: t}) defer c.cleanup() - url, cleanup := sqlutils.PGUrl(t, c.ServingAddr(), t.Name(), url.User(security.RootUser)) + url, cleanup := sqlutils.PGUrl(t, c.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() conn := makeSQLConn(url.String()) diff --git a/pkg/cli/flags.go b/pkg/cli/flags.go index c5d60b2b773f..04d32074f62b 100644 --- a/pkg/cli/flags.go +++ b/pkg/cli/flags.go @@ -44,7 +44,10 @@ import ( // - the underlying context parameters must receive defaults in // initCLIDefaults() even when they are otherwise overridden by the // flags logic, because some tests to not use the flag logic at all. -var serverListenPort, serverAdvertiseAddr, serverAdvertisePort string +var serverListenPort string +var serverAdvertiseAddr, serverAdvertisePort string +var serverSQLAddr, serverSQLPort string +var serverSQLAdvertiseAddr, serverSQLAdvertisePort string var serverHTTPAddr, serverHTTPPort string var localityAdvertiseHosts localityList @@ -55,6 +58,11 @@ func initPreFlagsDefaults() { serverAdvertiseAddr = "" serverAdvertisePort = "" + serverSQLAddr = "" + serverSQLPort = "" + serverSQLAdvertiseAddr = "" + serverSQLAdvertisePort = "" + serverHTTPAddr = "" serverHTTPPort = base.DefaultHTTPPort @@ -235,7 +243,7 @@ func init() { for _, cmd := range StartCmds { AddPersistentPreRunE(cmd, func(cmd *cobra.Command, _ []string) error { // Finalize the configuration of network and logging settings. - if err := extraServerFlagInit(); err != nil { + if err := extraServerFlagInit(cmd); err != nil { return err } return setDefaultStderrVerbosity(cmd, log.Severity_INFO) @@ -310,6 +318,8 @@ func init() { // Server flags. VarFlag(f, addrSetter{&startCtx.serverListenAddr, &serverListenPort}, cliflags.ListenAddr) VarFlag(f, addrSetter{&serverAdvertiseAddr, &serverAdvertisePort}, cliflags.AdvertiseAddr) + VarFlag(f, addrSetter{&serverSQLAddr, &serverSQLPort}, cliflags.ListenSQLAddr) + VarFlag(f, addrSetter{&serverSQLAdvertiseAddr, &serverSQLAdvertisePort}, cliflags.SQLAdvertiseAddr) VarFlag(f, addrSetter{&serverHTTPAddr, &serverHTTPPort}, cliflags.ListenHTTPAddr) // Backward-compatibility flags. @@ -616,7 +626,7 @@ func init() { } } -func extraServerFlagInit() error { +func extraServerFlagInit(cmd *cobra.Command) error { // Construct the main RPC listen address. serverCfg.Addr = net.JoinHostPort(startCtx.serverListenAddr, serverListenPort) @@ -629,6 +639,35 @@ func extraServerFlagInit() error { } serverCfg.AdvertiseAddr = net.JoinHostPort(serverAdvertiseAddr, serverAdvertisePort) + // Fill in the defaults for --sql-addr. + if serverSQLAddr == "" { + serverSQLAddr = startCtx.serverListenAddr + } + if serverSQLPort == "" { + serverSQLPort = serverListenPort + } + serverCfg.SQLAddr = net.JoinHostPort(serverSQLAddr, serverSQLPort) + serverCfg.SplitListenSQL = cmd.Flags().Lookup(cliflags.ListenSQLAddr.Name).Changed + + // Fill in the defaults for --advertise-sql-addr. + advSpecified := cmd.Flags().Lookup(cliflags.AdvertiseAddr.Name).Changed || + cmd.Flags().Lookup(cliflags.AdvertiseHost.Name).Changed + if serverSQLAdvertiseAddr == "" { + if advSpecified { + serverSQLAdvertiseAddr = serverAdvertiseAddr + } else { + serverSQLAdvertiseAddr = serverSQLAddr + } + } + if serverSQLAdvertisePort == "" { + if advSpecified && !serverCfg.SplitListenSQL { + serverSQLAdvertisePort = serverAdvertisePort + } else { + serverSQLAdvertisePort = serverSQLPort + } + } + serverCfg.SQLAdvertiseAddr = net.JoinHostPort(serverSQLAdvertiseAddr, serverSQLAdvertisePort) + // Fill in the defaults for --http-addr. if serverHTTPAddr == "" { serverHTTPAddr = startCtx.serverListenAddr @@ -651,6 +690,8 @@ func extraServerFlagInit() error { func extraClientFlagInit() { serverCfg.Addr = net.JoinHostPort(cliCtx.clientConnHost, cliCtx.clientConnPort) serverCfg.AdvertiseAddr = serverCfg.Addr + serverCfg.SQLAddr = net.JoinHostPort(cliCtx.clientConnHost, cliCtx.clientConnPort) + serverCfg.SQLAdvertiseAddr = serverCfg.SQLAddr if serverHTTPAddr == "" { serverHTTPAddr = startCtx.serverListenAddr } diff --git a/pkg/cli/flags_test.go b/pkg/cli/flags_test.go index 3ec425acc469..562d0750cc5f 100644 --- a/pkg/cli/flags_test.go +++ b/pkg/cli/flags_test.go @@ -409,56 +409,210 @@ func TestServerConnSettings(t *testing.T) { f := startCmd.Flags() testData := []struct { - args []string - expectedAddr string - expectedAdvertiseAddr string - expLocalityAdvertiseAddr string + args []string + expectedAddr string + expectedAdvertiseAddr string + expSQLAddr string + expSQLAdvAddr string }{ - {[]string{"start"}, ":" + base.DefaultPort, ":" + base.DefaultPort, "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1"}, "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, "[]"}, - {[]string{"start", "--listen-addr", "192.168.0.111"}, "192.168.0.111:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, "[]"}, - {[]string{"start", "--listen-addr", ":12345"}, ":12345", ":12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1:12345"}, "127.0.0.1:12345", "127.0.0.1:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1:12345", "--port", "55555"}, "127.0.0.1:55555", "127.0.0.1:55555", "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111"}, ":" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111:12345"}, ":" + base.DefaultPort, "192.168.0.111:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111"}, "127.0.0.1:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1:12345", "--advertise-addr", "192.168.0.111"}, "127.0.0.1:12345", "192.168.0.111:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111:12345"}, "127.0.0.1:" + base.DefaultPort, "192.168.0.111:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1:54321", "--advertise-addr", "192.168.0.111:12345"}, "127.0.0.1:54321", "192.168.0.111:12345", "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111", "--listen-addr", ":12345"}, ":12345", "192.168.0.111:12345", "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111:12345", "--listen-addr", ":54321"}, ":54321", "192.168.0.111:12345", "[]"}, - // confirm hostnames will work - {[]string{"start", "--listen-addr", "my.host.name"}, "my.host.name:" + base.DefaultPort, "my.host.name:" + base.DefaultPort, "[]"}, - {[]string{"start", "--listen-addr", "myhostname"}, "myhostname:" + base.DefaultPort, "myhostname:" + base.DefaultPort, "[]"}, - // confirm IPv6 works too - {[]string{"start", "--listen-addr", "[::1]"}, "[::1]:" + base.DefaultPort, "[::1]:" + base.DefaultPort, "[]"}, + {[]string{"start"}, + ":" + base.DefaultPort, ":" + base.DefaultPort, + ":" + base.DefaultPort, ":" + base.DefaultPort, + }, + {[]string{"start", "--listen-addr", "127.0.0.1"}, + "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, + "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, + }, + {[]string{"start", "--listen-addr", "192.168.0.111"}, + "192.168.0.111:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + "192.168.0.111:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + }, + {[]string{"start", "--listen-addr", ":"}, + ":", ":", + ":", ":", + }, + {[]string{"start", "--listen-addr", "127.0.0.1:"}, + "127.0.0.1:", "127.0.0.1:", + "127.0.0.1:", "127.0.0.1:", + }, + {[]string{"start", "--listen-addr", ":12345"}, + ":12345", ":12345", + ":12345", ":12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1:12345"}, + "127.0.0.1:12345", "127.0.0.1:12345", + "127.0.0.1:12345", "127.0.0.1:12345", + }, + {[]string{"start", "--listen-addr", "[::1]"}, + "[::1]:" + base.DefaultPort, "[::1]:" + base.DefaultPort, + "[::1]:" + base.DefaultPort, "[::1]:" + base.DefaultPort, + }, + {[]string{"start", "--listen-addr", "[::1]:12345"}, + "[::1]:12345", "[::1]:12345", + "[::1]:12345", "[::1]:12345", + }, {[]string{"start", "--listen-addr", "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]"}, - "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, "[]"}, + "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, + "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, + }, + // confirm hostnames will work + {[]string{"start", "--listen-addr", "my.host.name"}, + "my.host.name:" + base.DefaultPort, "my.host.name:" + base.DefaultPort, + "my.host.name:" + base.DefaultPort, "my.host.name:" + base.DefaultPort, + }, + {[]string{"start", "--listen-addr", "myhostname"}, + "myhostname:" + base.DefaultPort, "myhostname:" + base.DefaultPort, + "myhostname:" + base.DefaultPort, "myhostname:" + base.DefaultPort, + }, + + // SQL address override. + {[]string{"start", "--sql-addr", "127.0.0.1"}, + ":" + base.DefaultPort, ":" + base.DefaultPort, + "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, + }, + {[]string{"start", "--sql-addr", ":1234"}, + ":" + base.DefaultPort, ":" + base.DefaultPort, + ":1234", ":1234", + }, + {[]string{"start", "--sql-addr", "127.0.0.1:1234"}, + ":" + base.DefaultPort, ":" + base.DefaultPort, + "127.0.0.1:1234", "127.0.0.1:1234", + }, + {[]string{"start", "--sql-addr", "[::2]"}, + ":" + base.DefaultPort, ":" + base.DefaultPort, + "[::2]:" + base.DefaultPort, "[::2]:" + base.DefaultPort, + }, + {[]string{"start", "--sql-addr", "[::2]:1234"}, + ":" + base.DefaultPort, ":" + base.DefaultPort, + "[::2]:1234", "[::2]:1234", + }, + + // Configuring the components of the SQL address separately. + {[]string{"start", "--listen-addr", "127.0.0.1", "--sql-addr", "127.0.0.2"}, + "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, + "127.0.0.2:" + base.DefaultPort, "127.0.0.2:" + base.DefaultPort, + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--sql-addr", ":1234"}, + "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, + "127.0.0.1:1234", "127.0.0.1:1234", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--sql-addr", "127.0.0.2:1234"}, + "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, + "127.0.0.2:1234", "127.0.0.2:1234", + }, + {[]string{"start", "--listen-addr", "[::2]", "--sql-addr", ":1234"}, + "[::2]:" + base.DefaultPort, "[::2]:" + base.DefaultPort, + "[::2]:1234", "[::2]:1234"}, + + // --advertise-addr overrides. + {[]string{"start", "--advertise-addr", "192.168.0.111"}, + ":" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + ":" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + }, + {[]string{"start", "--advertise-addr", "192.168.0.111:12345"}, + ":" + base.DefaultPort, "192.168.0.111:12345", + ":" + base.DefaultPort, "192.168.0.111:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111"}, + "127.0.0.1:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + "127.0.0.1:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + }, + {[]string{"start", "--listen-addr", "127.0.0.1:12345", "--advertise-addr", "192.168.0.111"}, + "127.0.0.1:12345", "192.168.0.111:12345", + "127.0.0.1:12345", "192.168.0.111:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111:12345"}, + "127.0.0.1:" + base.DefaultPort, "192.168.0.111:12345", + "127.0.0.1:" + base.DefaultPort, "192.168.0.111:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1:54321", "--advertise-addr", "192.168.0.111:12345"}, + "127.0.0.1:54321", "192.168.0.111:12345", + "127.0.0.1:54321", "192.168.0.111:12345", + }, + {[]string{"start", "--advertise-addr", "192.168.0.111", "--listen-addr", ":12345"}, + ":12345", "192.168.0.111:12345", + ":12345", "192.168.0.111:12345", + }, + {[]string{"start", "--advertise-addr", "192.168.0.111:12345", "--listen-addr", ":54321"}, + ":54321", "192.168.0.111:12345", + ":54321", "192.168.0.111:12345", + }, + + // Show that if the SQL address does not have a name default, its + // advertised form picks up the RPC advertised address. + {[]string{"start", "--advertise-addr", "192.168.0.111:12345", "--sql-addr", ":54321"}, + ":" + base.DefaultPort, "192.168.0.111:12345", + ":54321", "192.168.0.111:54321", + }, + + // Show that if the SQL address is overridden, its advertised form picks the + // advertised RPC address but keeps the port. + {[]string{"start", "--advertise-addr", "192.168.0.111:12345", "--sql-addr", "127.0.0.1:54321"}, + ":" + base.DefaultPort, "192.168.0.111:12345", + "127.0.0.1:54321", "192.168.0.111:54321", + }, + {[]string{"start", "--advertise-addr", "192.168.0.111:12345", "--sql-addr", "127.0.0.1"}, + ":" + base.DefaultPort, "192.168.0.111:12345", + "127.0.0.1:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + }, + {[]string{"start", "--advertise-addr", "192.168.0.111", "--sql-addr", "127.0.0.1:12345"}, + ":" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + "127.0.0.1:12345", "192.168.0.111:12345", + }, // Backward-compatibility flag combinations. - {[]string{"start", "--host", "192.168.0.111"}, "192.168.0.111:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, "[]"}, - {[]string{"start", "--port", "12345"}, ":12345", ":12345", "[]"}, - {[]string{"start", "--advertise-host", "192.168.0.111"}, ":" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111", "--advertise-port", "12345"}, ":" + base.DefaultPort, "192.168.0.111:12345", "[]"}, - {[]string{"start", "--listen-addr", "[::1]"}, "[::1]:" + base.DefaultPort, "[::1]:" + base.DefaultPort, "[]"}, - {[]string{"start", "--listen-addr", "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]", "[]"}, - "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, "[2622:6221:e663:4922:fc2b:788b:fadd:7b48]:" + base.DefaultPort, "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1", "--port", "12345"}, "127.0.0.1:12345", "127.0.0.1:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--port", "12345"}, "127.0.0.1:12345", "192.168.0.111:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--port", "12345"}, "127.0.0.1:12345", "192.168.0.111:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--advertise-port", "12345"}, "127.0.0.1:" + base.DefaultPort, "192.168.0.111:12345", "[]"}, - {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--port", "54321", "--advertise-port", "12345"}, "127.0.0.1:54321", "192.168.0.111:12345", "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111", "--port", "12345"}, ":12345", "192.168.0.111:12345", "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111", "--advertise-port", "12345"}, ":" + base.DefaultPort, "192.168.0.111:12345", "[]"}, - {[]string{"start", "--advertise-addr", "192.168.0.111", "--port", "54321", "--advertise-port", "12345"}, ":54321", "192.168.0.111:12345", "[]"}, - - {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@235.0.0.5"}, "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, "[{{tcp 235.0.0.5:26257} zone=1}]"}, - {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@235.0.0.5,zone=2@123.0.0.5"}, "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, "[{{tcp 235.0.0.5:26257} zone=1} {{tcp 123.0.0.5:26257} zone=2}]"}, - {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@235.0.0.5:1234"}, "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, "[{{tcp 235.0.0.5:1234} zone=1}]"}, - {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@[::2]"}, "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, "[{{tcp [::2]:26257} zone=1}]"}, - {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@[::2],zone=2@123.0.0.5"}, "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, "[{{tcp [::2]:26257} zone=1} {{tcp 123.0.0.5:26257} zone=2}]"}, - {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@[::2]:1234"}, "127.0.0.1:" + base.DefaultPort, "127.0.0.1:" + base.DefaultPort, "[{{tcp [::2]:1234} zone=1}]"}, + {[]string{"start", "--host", "192.168.0.111"}, + "192.168.0.111:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + "192.168.0.111:" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + }, + {[]string{"start", "--port", "12345"}, + ":12345", ":12345", + ":12345", ":12345", + }, + {[]string{"start", "--advertise-host", "192.168.0.111"}, + ":" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + ":" + base.DefaultPort, "192.168.0.111:" + base.DefaultPort, + }, + {[]string{"start", "--advertise-addr", "192.168.0.111", "--advertise-port", "12345"}, + ":" + base.DefaultPort, "192.168.0.111:12345", + ":" + base.DefaultPort, "192.168.0.111:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--port", "12345"}, + "127.0.0.1:12345", "127.0.0.1:12345", + "127.0.0.1:12345", "127.0.0.1:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1:12345", "--port", "55555"}, + "127.0.0.1:55555", "127.0.0.1:55555", + "127.0.0.1:55555", "127.0.0.1:55555", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--port", "12345"}, + "127.0.0.1:12345", "192.168.0.111:12345", + "127.0.0.1:12345", "192.168.0.111:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--port", "12345"}, + "127.0.0.1:12345", "192.168.0.111:12345", + "127.0.0.1:12345", "192.168.0.111:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--advertise-port", "12345"}, + "127.0.0.1:" + base.DefaultPort, "192.168.0.111:12345", + "127.0.0.1:" + base.DefaultPort, "192.168.0.111:12345", + }, + {[]string{"start", "--listen-addr", "127.0.0.1", "--advertise-addr", "192.168.0.111", "--port", "54321", "--advertise-port", "12345"}, + "127.0.0.1:54321", "192.168.0.111:12345", + "127.0.0.1:54321", "192.168.0.111:12345", + }, + {[]string{"start", "--advertise-addr", "192.168.0.111", "--port", "12345"}, + ":12345", "192.168.0.111:12345", + ":12345", "192.168.0.111:12345", + }, + {[]string{"start", "--advertise-addr", "192.168.0.111", "--advertise-port", "12345"}, + ":" + base.DefaultPort, "192.168.0.111:12345", + ":" + base.DefaultPort, "192.168.0.111:12345", + }, + {[]string{"start", "--advertise-addr", "192.168.0.111", "--port", "54321", "--advertise-port", "12345"}, + ":54321", "192.168.0.111:12345", + ":54321", "192.168.0.111:12345", + }, } for i, td := range testData { @@ -468,7 +622,7 @@ func TestServerConnSettings(t *testing.T) { t.Fatalf("Parse(%#v) got unexpected error: %v", td.args, err) } - if err := extraServerFlagInit(); err != nil { + if err := extraServerFlagInit(startCmd); err != nil { t.Fatal(err) } if td.expectedAddr != serverCfg.Addr { @@ -479,6 +633,64 @@ func TestServerConnSettings(t *testing.T) { t.Errorf("%d. serverCfg.AdvertiseAddr expected '%s', but got '%s'. td.args was '%#v'.", i, td.expectedAdvertiseAddr, serverCfg.AdvertiseAddr, td.args) } + + wantSQLSplit := false + for _, r := range td.args { + if r == "--sql-addr" { + wantSQLSplit = true + break + } + } + if wantSQLSplit != serverCfg.SplitListenSQL { + t.Errorf("%d. expected combined RPC/SQL listen = %v, found %v", i, wantSQLSplit, serverCfg.SplitListenSQL) + } + + if td.expSQLAddr != serverCfg.SQLAddr { + t.Errorf("%d. serverCfg.SQLAddr expected '%s', got '%s'. td.args was '%#v'.", + i, td.expSQLAddr, serverCfg.SQLAddr, td.args) + } + if td.expSQLAdvAddr != serverCfg.SQLAdvertiseAddr { + t.Errorf("%d. serverCfg.SQLAdvertiseAddr expected '%s', got '%s'. td.args was '%#v'.", + i, td.expSQLAdvAddr, serverCfg.SQLAdvertiseAddr, td.args) + } + }) + } +} + +func TestLocalityAdvAddrFlag(t *testing.T) { + defer leaktest.AfterTest(t)() + + // Avoid leaking configuration changes after the tests end. + defer initCLIDefaults() + + f := startCmd.Flags() + testData := []struct { + args []string + expLocalityAdvertiseAddr string + }{ + {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@235.0.0.5"}, + "[{{tcp 235.0.0.5:26257} zone=1}]"}, + {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@235.0.0.5,zone=2@123.0.0.5"}, + "[{{tcp 235.0.0.5:26257} zone=1} {{tcp 123.0.0.5:26257} zone=2}]"}, + {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@235.0.0.5:1234"}, + "[{{tcp 235.0.0.5:1234} zone=1}]"}, + {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@[::2]"}, + "[{{tcp [::2]:26257} zone=1}]"}, + {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@[::2],zone=2@123.0.0.5"}, + "[{{tcp [::2]:26257} zone=1} {{tcp 123.0.0.5:26257} zone=2}]"}, + {[]string{"start", "--host", "127.0.0.1", "--locality-advertise-addr", "zone=1@[::2]:1234"}, + "[{{tcp [::2]:1234} zone=1}]"}, + } + + for i, td := range testData { + t.Run(strings.Join(td.args, " "), func(t *testing.T) { + initCLIDefaults() + if err := f.Parse(td.args); err != nil { + t.Fatalf("Parse(%#v) got unexpected error: %v", td.args, err) + } + if err := extraServerFlagInit(startCmd); err != nil { + t.Fatal(err) + } var locAddrStr strings.Builder locAddrStr.WriteString("[") for i, a := range serverCfg.LocalityAddresses { @@ -634,7 +846,7 @@ func TestHttpHostFlagValue(t *testing.T) { t.Fatalf("Parse(%#v) got unexpected error: %v", td.args, err) } - if err := extraServerFlagInit(); err != nil { + if err := extraServerFlagInit(startCmd); err != nil { t.Fatal(err) } if td.expected != serverCfg.HTTPAddr { diff --git a/pkg/cli/node.go b/pkg/cli/node.go index 2f3a057bf0be..0a78b2c48e2c 100644 --- a/pkg/cli/node.go +++ b/pkg/cli/node.go @@ -74,6 +74,7 @@ func runLsNodes(cmd *cobra.Command, args []string) error { var baseNodeColumnHeaders = []string{ "id", "address", + "sql_address", "build", "started_at", "updated_at", @@ -126,7 +127,6 @@ func runStatusNode(cmd *cobra.Command, args []string) error { } func runStatusNodeInner(showDecommissioned bool, args []string) ([]string, [][]string, error) { - joinUsingID := func(queries []string) (query string) { for i, q := range queries { if i == 0 { @@ -148,6 +148,7 @@ func runStatusNodeInner(showDecommissioned bool, args []string) ([]string, [][]s baseQuery := maybeAddActiveNodesFilter( `SELECT node_id AS id, address, + sql_address, build_tag AS build, started_at, updated_at, diff --git a/pkg/cli/sql_test.go b/pkg/cli/sql_test.go index 7ff7f79ec232..20f3437084fb 100644 --- a/pkg/cli/sql_test.go +++ b/pkg/cli/sql_test.go @@ -28,7 +28,7 @@ func Example_sql_lex() { defer c.cleanup() conn := makeSQLConn(fmt.Sprintf("postgres://%s@%s/?sslmode=disable", - security.RootUser, c.ServingAddr())) + security.RootUser, c.ServingSQLAddr())) defer conn.Close() tests := []string{` diff --git a/pkg/cli/sql_util_test.go b/pkg/cli/sql_util_test.go index dc6ca0c12e61..36eda83b3a32 100644 --- a/pkg/cli/sql_util_test.go +++ b/pkg/cli/sql_util_test.go @@ -31,7 +31,7 @@ func TestConnRecover(t *testing.T) { c := newCLITest(p) defer c.cleanup() - url, cleanup := sqlutils.PGUrl(t, c.ServingAddr(), t.Name(), url.User(security.RootUser)) + url, cleanup := sqlutils.PGUrl(t, c.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() conn := makeSQLConn(url.String()) @@ -95,7 +95,7 @@ func TestConnRecover(t *testing.T) { // number is selected randomly. func simulateServerRestart(c *cliTest, p cliTestParams, conn *sqlConn) func() { c.restartServer(p) - url2, cleanup2 := sqlutils.PGUrl(c.t, c.ServingAddr(), c.t.Name(), url.User(security.RootUser)) + url2, cleanup2 := sqlutils.PGUrl(c.t, c.ServingSQLAddr(), c.t.Name(), url.User(security.RootUser)) conn.url = url2.String() return cleanup2 } @@ -106,7 +106,7 @@ func TestRunQuery(t *testing.T) { c := newCLITest(cliTestParams{t: t}) defer c.cleanup() - url, cleanup := sqlutils.PGUrl(t, c.ServingAddr(), t.Name(), url.User(security.RootUser)) + url, cleanup := sqlutils.PGUrl(t, c.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() conn := makeSQLConn(url.String()) @@ -227,7 +227,7 @@ func TestTransactionRetry(t *testing.T) { c := newCLITest(p) defer c.cleanup() - url, cleanup := sqlutils.PGUrl(t, c.ServingAddr(), t.Name(), url.User(security.RootUser)) + url, cleanup := sqlutils.PGUrl(t, c.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() conn := makeSQLConn(url.String()) diff --git a/pkg/cli/start.go b/pkg/cli/start.go index e3f7badf50fb..667a84bf8101 100644 --- a/pkg/cli/start.go +++ b/pkg/cli/start.go @@ -729,7 +729,7 @@ If problems persist, please see ` + base.DocsURL("cluster-setup-troubleshooting. fmt.Fprintf(tw, "sql:\t%s\n", pgURL) } - fmt.Fprintf(tw, "client flags:\t%s\n", clientFlags()) + fmt.Fprintf(tw, "RPC client flags:\t%s\n", clientFlagsRPC()) if len(serverCfg.SocketFile) != 0 { fmt.Fprintf(tw, "socket:\t%s\n", serverCfg.SocketFile) } @@ -974,7 +974,7 @@ func hintServerCmdFlags(ctx context.Context, cmd *cobra.Command) { } } -func clientFlags() string { +func clientFlagsRPC() string { flags := []string{os.Args[0], ""} if serverCfg.AdvertiseAddr != "" { flags = append(flags, "--host="+serverCfg.AdvertiseAddr) diff --git a/pkg/cli/zip.go b/pkg/cli/zip.go index 61e469845a26..3dda16105416 100644 --- a/pkg/cli/zip.go +++ b/pkg/cli/zip.go @@ -17,6 +17,7 @@ import ( "encoding/json" "fmt" "io" + "net" "net/url" "os" "path/filepath" @@ -198,6 +199,22 @@ func runDebugZip(cmd *cobra.Command, args []string) error { status := serverpb.NewStatusClient(conn) admin := serverpb.NewAdminClient(conn) + // Retrieve the node status to get the SQL address. + nodeS, err := status.Node(baseCtx, &serverpb.NodeRequest{NodeId: "local"}) + if err != nil { + return err + } + sqlAddr := nodeS.Desc.SQLAddress + if sqlAddr.IsEmpty() { + // No SQL address: either a pre-19.2 node, or same address for both + // SQL and RPC. + sqlAddr = nodeS.Desc.Address + } + cliCtx.clientConnHost, cliCtx.clientConnPort, err = net.SplitHostPort(sqlAddr.AddressField) + if err != nil { + return err + } + sqlConn, err := getPasswordAndMakeSQLClient("cockroach sql") if err != nil { log.Warningf(baseCtx, "unable to open a SQL session. Debug information will be incomplete: %s", err) @@ -292,7 +309,13 @@ func runDebugZip(cmd *cobra.Command, args []string) error { // not work and if it doesn't, we let the invalid curSQLConn get // used anyway so that anything that does *not* need it will // still happen. - curSQLConn := guessNodeURL(sqlConn.url, node.Desc.Address.AddressField) + sqlAddr := node.Desc.SQLAddress + if sqlAddr.IsEmpty() { + // No SQL address: either a pre-19.2 node, or same address for both + // SQL and RPC. + sqlAddr = node.Desc.Address + } + curSQLConn := guessNodeURL(sqlConn.url, sqlAddr.AddressField) if err := z.createJSON(prefix+"/status.json", node); err != nil { return err } diff --git a/pkg/cmd/roachtest/decommission.go b/pkg/cmd/roachtest/decommission.go index e47e2297b5aa..69057b78dcbf 100644 --- a/pkg/cmd/roachtest/decommission.go +++ b/pkg/cmd/roachtest/decommission.go @@ -344,10 +344,10 @@ func runDecommissionAcceptance(ctx context.Context, t *test, c *cluster) { // versions of cockroach (versions pre commit 888813c, which // extends the node status command to include locality information). statusHeaderWithLocality := []string{ - "id", "address", "build", "started_at", "updated_at", "locality", "is_available", "is_live", + "id", "address", "sql_address", "build", "started_at", "updated_at", "locality", "is_available", "is_live", } statusHeaderNoLocality := []string{ - "id", "address", "build", "started_at", "updated_at", "is_available", "is_live", + "id", "address", "sql_address", "build", "started_at", "updated_at", "is_available", "is_live", } getStatusCsvOutput := func(ids []string, numCols int) [][]string { var res [][]string diff --git a/pkg/gossip/gossip.go b/pkg/gossip/gossip.go index 8f3b486daf3e..1cf259add586 100644 --- a/pkg/gossip/gossip.go +++ b/pkg/gossip/gossip.go @@ -517,13 +517,20 @@ func (g *Gossip) GetResolvers() []resolver.Resolver { return append([]resolver.Resolver(nil), g.resolvers...) } -// GetNodeIDAddress looks up the address of the node by ID. +// GetNodeIDAddress looks up the RPC address of the node by ID. func (g *Gossip) GetNodeIDAddress(nodeID roachpb.NodeID) (*util.UnresolvedAddr, error) { g.mu.RLock() defer g.mu.RUnlock() return g.getNodeIDAddressLocked(nodeID) } +// GetNodeIDSQLAddress looks up the SQL address of the node by ID. +func (g *Gossip) GetNodeIDSQLAddress(nodeID roachpb.NodeID) (*util.UnresolvedAddr, error) { + g.mu.RLock() + defer g.mu.RUnlock() + return g.getNodeIDSQLAddressLocked(nodeID) +} + // GetNodeIDForStoreID looks up the NodeID by StoreID. func (g *Gossip) GetNodeIDForStoreID(storeID roachpb.StoreID) (roachpb.NodeID, error) { g.mu.RLock() @@ -968,6 +975,18 @@ func (g *Gossip) getNodeIDAddressLocked(nodeID roachpb.NodeID) (*util.Unresolved return &nd.Address, nil } +// getNodeIDAddressLocked looks up the SQL address of the node by ID. The mutex is +// assumed held by the caller. This method is called externally via +// GetNodeIDSQLAddress or internally when looking up a "distant" node address to +// connect directly to. +func (g *Gossip) getNodeIDSQLAddressLocked(nodeID roachpb.NodeID) (*util.UnresolvedAddr, error) { + nd, err := g.getNodeDescriptorLocked(nodeID) + if err != nil { + return nil, err + } + return &nd.SQLAddress, nil +} + // AddInfo adds or updates an info object. Returns an error if info // couldn't be added. func (g *Gossip) AddInfo(key string, val []byte, ttl time.Duration) error { diff --git a/pkg/gossip/gossip_test.go b/pkg/gossip/gossip_test.go index b2e07518f856..208bafe5a1f4 100644 --- a/pkg/gossip/gossip_test.go +++ b/pkg/gossip/gossip_test.go @@ -171,8 +171,9 @@ func TestGossipLocalityResolver(t *testing.T) { node1PrivateAddress := util.MakeUnresolvedAddr("tcp", "1.0.0.1") node2PrivateAddress := util.MakeUnresolvedAddr("tcp", "2.0.0.1") - node1PublicAddress := util.MakeUnresolvedAddr("tcp", "1.1.1.1:1") - node2PublicAddress := util.MakeUnresolvedAddr("tcp", "2.2.2.2:2") + node1PublicAddressRPC := util.MakeUnresolvedAddr("tcp", "1.1.1.1:1") + node2PublicAddressRPC := util.MakeUnresolvedAddr("tcp", "2.2.2.2:3") + node2PublicAddressSQL := util.MakeUnresolvedAddr("tcp", "2.2.2.2:4") var node1LocalityList []roachpb.LocalityAddress nodeLocalityAddress := roachpb.LocalityAddress{} @@ -190,8 +191,17 @@ func TestGossipLocalityResolver(t *testing.T) { node2LocalityList = append(node2LocalityList, nodeLocalityAddress2) g := NewTestWithLocality(1, rpcContext, rpc.NewServer(rpcContext), stopper, metric.NewRegistry(), gossipLocalityAdvertiseList, config.DefaultZoneConfigRef()) - node1 := &roachpb.NodeDescriptor{NodeID: 1, Address: node1PublicAddress, LocalityAddress: node1LocalityList} - node2 := &roachpb.NodeDescriptor{NodeID: 2, Address: node2PublicAddress, LocalityAddress: node2LocalityList} + node1 := &roachpb.NodeDescriptor{ + NodeID: 1, + Address: node1PublicAddressRPC, + LocalityAddress: node1LocalityList, + } + node2 := &roachpb.NodeDescriptor{ + NodeID: 2, + Address: node2PublicAddressRPC, + SQLAddress: node2PublicAddressSQL, + LocalityAddress: node2LocalityList, + } if err := g.SetNodeDescriptor(node1); err != nil { t.Fatal(err) @@ -213,8 +223,17 @@ func TestGossipLocalityResolver(t *testing.T) { t.Error(err) } - if *nodeAddress != node2PublicAddress { - t.Fatalf("expected: %s but got: %s address", node2PublicAddress, *nodeAddress) + if *nodeAddress != node2PublicAddressRPC { + t.Fatalf("expected: %s but got: %s address", node2PublicAddressRPC, *nodeAddress) + } + + nodeAddressSQL, err := g.GetNodeIDSQLAddress(node2.NodeID) + if err != nil { + t.Error(err) + } + + if *nodeAddressSQL != node2PublicAddressSQL { + t.Fatalf("expected: %s but got: %s address", node2PublicAddressSQL, *nodeAddressSQL) } } diff --git a/pkg/roachpb/metadata.pb.go b/pkg/roachpb/metadata.pb.go index f2d556e89b29..636137b3e940 100644 --- a/pkg/roachpb/metadata.pb.go +++ b/pkg/roachpb/metadata.pb.go @@ -69,7 +69,7 @@ func (x *ReplicaType) UnmarshalJSON(data []byte) error { return nil } func (ReplicaType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{0} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{0} } // Attributes specifies a list of arbitrary strings describing @@ -81,7 +81,7 @@ type Attributes struct { func (m *Attributes) Reset() { *m = Attributes{} } func (*Attributes) ProtoMessage() {} func (*Attributes) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{0} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{0} } func (m *Attributes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -115,7 +115,7 @@ type ReplicationTarget struct { func (m *ReplicationTarget) Reset() { *m = ReplicationTarget{} } func (*ReplicationTarget) ProtoMessage() {} func (*ReplicationTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{1} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{1} } func (m *ReplicationTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -160,7 +160,7 @@ type ReplicaDescriptor struct { func (m *ReplicaDescriptor) Reset() { *m = ReplicaDescriptor{} } func (*ReplicaDescriptor) ProtoMessage() {} func (*ReplicaDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{2} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{2} } func (m *ReplicaDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -195,7 +195,7 @@ func (m *ReplicaIdent) Reset() { *m = ReplicaIdent{} } func (m *ReplicaIdent) String() string { return proto.CompactTextString(m) } func (*ReplicaIdent) ProtoMessage() {} func (*ReplicaIdent) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{3} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{3} } func (m *ReplicaIdent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -352,7 +352,7 @@ type RangeDescriptor struct { func (m *RangeDescriptor) Reset() { *m = RangeDescriptor{} } func (*RangeDescriptor) ProtoMessage() {} func (*RangeDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{4} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{4} } func (m *RangeDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -391,7 +391,7 @@ type Percentiles struct { func (m *Percentiles) Reset() { *m = Percentiles{} } func (*Percentiles) ProtoMessage() {} func (*Percentiles) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{5} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{5} } func (m *Percentiles) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -453,7 +453,7 @@ type StoreCapacity struct { func (m *StoreCapacity) Reset() { *m = StoreCapacity{} } func (*StoreCapacity) ProtoMessage() {} func (*StoreCapacity) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{6} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{6} } func (m *StoreCapacity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -489,13 +489,16 @@ type NodeDescriptor struct { StartedAt int64 `protobuf:"varint,7,opt,name=started_at,json=startedAt" json:"started_at"` LocalityAddress []LocalityAddress `protobuf:"bytes,8,rep,name=locality_address,json=localityAddress" json:"locality_address"` ClusterName string `protobuf:"bytes,9,opt,name=cluster_name,json=clusterName" json:"cluster_name"` + // The SQL address. If empty, indicates that the base address field + // is also used to accept SQL connections. + SQLAddress util.UnresolvedAddr `protobuf:"bytes,10,opt,name=sql_address,json=sqlAddress" json:"sql_address"` } func (m *NodeDescriptor) Reset() { *m = NodeDescriptor{} } func (m *NodeDescriptor) String() string { return proto.CompactTextString(m) } func (*NodeDescriptor) ProtoMessage() {} func (*NodeDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{7} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{7} } func (m *NodeDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -531,7 +534,7 @@ func (m *LocalityAddress) Reset() { *m = LocalityAddress{} } func (m *LocalityAddress) String() string { return proto.CompactTextString(m) } func (*LocalityAddress) ProtoMessage() {} func (*LocalityAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{8} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{8} } func (m *LocalityAddress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -569,7 +572,7 @@ func (m *StoreDescriptor) Reset() { *m = StoreDescriptor{} } func (m *StoreDescriptor) String() string { return proto.CompactTextString(m) } func (*StoreDescriptor) ProtoMessage() {} func (*StoreDescriptor) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{9} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{9} } func (m *StoreDescriptor) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -606,7 +609,7 @@ func (m *StoreDeadReplicas) Reset() { *m = StoreDeadReplicas{} } func (m *StoreDeadReplicas) String() string { return proto.CompactTextString(m) } func (*StoreDeadReplicas) ProtoMessage() {} func (*StoreDeadReplicas) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{10} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{10} } func (m *StoreDeadReplicas) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -640,7 +643,7 @@ type Locality struct { func (m *Locality) Reset() { *m = Locality{} } func (*Locality) ProtoMessage() {} func (*Locality) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{11} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{11} } func (m *Locality) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -676,7 +679,7 @@ type Tier struct { func (m *Tier) Reset() { *m = Tier{} } func (*Tier) ProtoMessage() {} func (*Tier) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{12} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{12} } func (m *Tier) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -717,7 +720,7 @@ type Version struct { func (m *Version) Reset() { *m = Version{} } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_metadata_7d3f97d4d3481352, []int{13} + return fileDescriptor_metadata_512b13eb8d4291cc, []int{13} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1253,6 +1256,14 @@ func (m *NodeDescriptor) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintMetadata(dAtA, i, uint64(len(m.ClusterName))) i += copy(dAtA[i:], m.ClusterName) + dAtA[i] = 0x52 + i++ + i = encodeVarintMetadata(dAtA, i, uint64(m.SQLAddress.Size())) + n9, err := m.SQLAddress.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 return i, nil } @@ -1274,19 +1285,19 @@ func (m *LocalityAddress) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintMetadata(dAtA, i, uint64(m.Address.Size())) - n9, err := m.Address.MarshalTo(dAtA[i:]) + n10, err := m.Address.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n9 + i += n10 dAtA[i] = 0x12 i++ i = encodeVarintMetadata(dAtA, i, uint64(m.LocalityTier.Size())) - n10, err := m.LocalityTier.MarshalTo(dAtA[i:]) + n11, err := m.LocalityTier.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n11 return i, nil } @@ -1311,27 +1322,27 @@ func (m *StoreDescriptor) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintMetadata(dAtA, i, uint64(m.Attrs.Size())) - n11, err := m.Attrs.MarshalTo(dAtA[i:]) + n12, err := m.Attrs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n12 dAtA[i] = 0x1a i++ i = encodeVarintMetadata(dAtA, i, uint64(m.Node.Size())) - n12, err := m.Node.MarshalTo(dAtA[i:]) + n13, err := m.Node.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n13 dAtA[i] = 0x22 i++ i = encodeVarintMetadata(dAtA, i, uint64(m.Capacity.Size())) - n13, err := m.Capacity.MarshalTo(dAtA[i:]) + n14, err := m.Capacity.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n14 return i, nil } @@ -1759,6 +1770,8 @@ func (m *NodeDescriptor) Size() (n int) { } l = len(m.ClusterName) n += 1 + l + sovMetadata(uint64(l)) + l = m.SQLAddress.Size() + n += 1 + l + sovMetadata(uint64(l)) return n } @@ -3147,6 +3160,36 @@ func (m *NodeDescriptor) Unmarshal(dAtA []byte) error { } m.ClusterName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SQLAddress", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMetadata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthMetadata + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SQLAddress.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipMetadata(dAtA[iNdEx:]) @@ -3957,92 +4000,93 @@ var ( ErrIntOverflowMetadata = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/metadata.proto", fileDescriptor_metadata_7d3f97d4d3481352) } - -var fileDescriptor_metadata_7d3f97d4d3481352 = []byte{ - // 1329 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x41, 0x6f, 0xdc, 0x44, - 0x14, 0x8e, 0xb3, 0xde, 0xac, 0xf7, 0x25, 0x69, 0xb2, 0xa3, 0xb6, 0xac, 0x16, 0xb1, 0xbb, 0x35, - 0x54, 0xa4, 0x05, 0x25, 0x69, 0xaa, 0xa8, 0x6a, 0xa0, 0x40, 0xb6, 0x0d, 0x52, 0x68, 0x1b, 0x22, - 0x27, 0x14, 0x89, 0x8b, 0x35, 0xb1, 0x87, 0x8d, 0xa9, 0xd7, 0x36, 0xe3, 0xd9, 0xb4, 0x7b, 0x47, - 0xe2, 0x50, 0x21, 0x71, 0x41, 0xe2, 0xd8, 0x4b, 0xff, 0x03, 0x3f, 0xa1, 0xc7, 0x1e, 0x7b, 0x8a, - 0x20, 0xbd, 0x70, 0xe6, 0xd8, 0x03, 0x42, 0xf3, 0x3c, 0x63, 0x7b, 0xd3, 0x14, 0x68, 0x91, 0xb8, - 0x79, 0xdf, 0xfb, 0xbe, 0xb7, 0x6f, 0xde, 0xfb, 0xe6, 0xbd, 0x81, 0xb3, 0x3c, 0xa6, 0xde, 0x7e, - 0xb2, 0xb7, 0x34, 0x60, 0x82, 0xfa, 0x54, 0xd0, 0xc5, 0x84, 0xc7, 0x22, 0x26, 0x0d, 0x2f, 0xf6, - 0xee, 0xa2, 0x6f, 0x51, 0x21, 0x5a, 0xad, 0xa1, 0x08, 0xc2, 0xa5, 0x61, 0xc4, 0x59, 0x1a, 0x87, - 0x07, 0xcc, 0x77, 0xa9, 0xef, 0xf3, 0x0c, 0xde, 0x6a, 0xa2, 0x6f, 0x3f, 0xf4, 0x96, 0x44, 0x30, - 0x60, 0xa9, 0xa0, 0x83, 0x44, 0x79, 0x4e, 0xf7, 0xe3, 0x7e, 0x8c, 0x9f, 0x4b, 0xf2, 0x2b, 0xb3, - 0xda, 0x1f, 0x03, 0xac, 0x0b, 0xc1, 0x83, 0xbd, 0xa1, 0x60, 0x29, 0x79, 0x0f, 0xaa, 0x54, 0x08, - 0x9e, 0x36, 0x8d, 0x6e, 0x65, 0xa1, 0xde, 0x3b, 0xf3, 0xc7, 0x61, 0xa7, 0x31, 0xa2, 0x83, 0x70, - 0xcd, 0x46, 0xf3, 0xfb, 0x5f, 0x87, 0xf1, 0x3d, 0xdb, 0xc9, 0x30, 0x6b, 0xe6, 0xcf, 0x0f, 0x3b, - 0x13, 0xf6, 0xf7, 0x06, 0x34, 0x1c, 0x96, 0x84, 0x81, 0x47, 0x45, 0x10, 0x47, 0xbb, 0x94, 0xf7, - 0x99, 0x20, 0x97, 0xa0, 0x16, 0xc5, 0x3e, 0x73, 0x03, 0xbf, 0x69, 0x74, 0x8d, 0x85, 0x6a, 0xaf, - 0xf9, 0xf8, 0xb0, 0x33, 0x71, 0x74, 0xd8, 0x99, 0xda, 0x8a, 0x7d, 0xb6, 0x79, 0xe3, 0x79, 0xfe, - 0xe5, 0x4c, 0x49, 0xe0, 0xa6, 0x4f, 0x56, 0xc1, 0x4a, 0x45, 0xcc, 0x91, 0x33, 0x89, 0x9c, 0x96, - 0xe2, 0xd4, 0x76, 0xa4, 0x1d, 0x49, 0xfa, 0xd3, 0xa9, 0x21, 0x76, 0xd3, 0x5f, 0xb3, 0x64, 0x16, - 0xbf, 0x3f, 0xec, 0x18, 0xf6, 0x9f, 0x45, 0x26, 0x37, 0x58, 0xea, 0xf1, 0x20, 0x11, 0x31, 0xff, - 0xff, 0x32, 0x21, 0xd7, 0x00, 0x78, 0xf6, 0xf7, 0x92, 0x58, 0x41, 0x62, 0x5b, 0x11, 0xeb, 0x2a, - 0x31, 0xa4, 0x16, 0x3f, 0x9c, 0xba, 0x62, 0x6c, 0xfa, 0x64, 0x05, 0x4c, 0x31, 0x4a, 0x58, 0xd3, - 0xec, 0x1a, 0x0b, 0xa7, 0x56, 0xda, 0x8b, 0x2f, 0xf4, 0x7d, 0x51, 0xd1, 0x76, 0x47, 0x09, 0x73, - 0x10, 0xbb, 0x36, 0x23, 0x0f, 0xff, 0xcb, 0xc3, 0x8e, 0x81, 0x05, 0x78, 0x60, 0xc0, 0x8c, 0x0e, - 0xed, 0xb3, 0x48, 0xc8, 0x83, 0x70, 0x1a, 0xf5, 0xf3, 0xc3, 0x57, 0x8a, 0x83, 0x38, 0xd2, 0x9e, - 0x1d, 0x44, 0x7d, 0x3a, 0x35, 0xc4, 0x6e, 0xfa, 0xe4, 0x06, 0xd4, 0x54, 0x5a, 0x78, 0xfc, 0xe9, - 0x95, 0x77, 0x5e, 0x9e, 0x4c, 0x51, 0xe9, 0x9e, 0x29, 0x63, 0x3b, 0x9a, 0x6a, 0x3f, 0xad, 0xc0, - 0x1c, 0x86, 0x2e, 0x35, 0xe3, 0x35, 0x13, 0x3a, 0x0f, 0xf5, 0x54, 0x50, 0x2e, 0xdc, 0xbb, 0x6c, - 0x84, 0x29, 0xcd, 0xf4, 0xac, 0xe7, 0x87, 0x1d, 0xd3, 0xb9, 0xc9, 0x46, 0x8e, 0x85, 0xae, 0x9b, - 0x6c, 0x44, 0xce, 0x41, 0x8d, 0x45, 0x3e, 0x82, 0x2a, 0xc7, 0x40, 0x53, 0x2c, 0xf2, 0x25, 0xe4, - 0x4b, 0x68, 0x04, 0x91, 0x60, 0x3c, 0xa2, 0xa1, 0xab, 0x12, 0x4d, 0x9b, 0x66, 0xb7, 0xf2, 0x8a, - 0x87, 0x9c, 0xd7, 0x41, 0x14, 0x20, 0x25, 0x9f, 0xc1, 0x5c, 0xc4, 0xee, 0x0b, 0xb7, 0xa4, 0x80, - 0x2a, 0x2a, 0xc0, 0x56, 0x07, 0x9c, 0xdd, 0x62, 0xf7, 0xc5, 0x4b, 0x54, 0x30, 0x1b, 0x95, 0x7c, - 0x3e, 0x69, 0x03, 0xf4, 0x59, 0xc4, 0x38, 0x5e, 0xa8, 0xe6, 0x94, 0xac, 0x93, 0x53, 0xb2, 0x90, - 0x0f, 0x01, 0x52, 0x11, 0x78, 0x77, 0x47, 0xee, 0x5e, 0x20, 0x9a, 0x35, 0x6c, 0xd1, 0x5b, 0xa5, - 0xec, 0xe5, 0x08, 0x58, 0xdc, 0x0f, 0xbd, 0xc5, 0x5d, 0x3d, 0x02, 0x9c, 0x7a, 0x46, 0xe8, 0x05, - 0x82, 0x5c, 0x86, 0x33, 0x45, 0x2c, 0xd7, 0x8b, 0x07, 0x09, 0xe5, 0x74, 0x2f, 0x64, 0x4d, 0xab, - 0x6b, 0x2c, 0x58, 0xce, 0xe9, 0xc2, 0x79, 0x3d, 0xf7, 0x1d, 0x13, 0xda, 0x23, 0x03, 0xa6, 0xb7, - 0x19, 0xf7, 0x58, 0x24, 0x82, 0x90, 0xa5, 0xe4, 0x2c, 0x54, 0x92, 0x4b, 0xcb, 0xd8, 0x51, 0x43, - 0x55, 0x48, 0x1a, 0xd0, 0xbe, 0xb2, 0x8a, 0x1d, 0x2b, 0xec, 0x2b, 0xab, 0x68, 0x5f, 0x5d, 0xc6, - 0x26, 0x15, 0xf6, 0xd5, 0x0c, 0x7f, 0x65, 0x15, 0x6f, 0x40, 0x61, 0xbf, 0x92, 0xe1, 0xaf, 0x2e, - 0x63, 0x41, 0x0b, 0xfb, 0xd5, 0x65, 0xd2, 0x04, 0x33, 0xb9, 0x4d, 0xef, 0x63, 0x89, 0xb4, 0x03, - 0x2d, 0x6a, 0x36, 0x3d, 0xaf, 0xc0, 0x2c, 0x5e, 0xd3, 0xeb, 0x34, 0xa1, 0x5e, 0x20, 0x46, 0xa4, - 0x0b, 0x96, 0xa7, 0xbe, 0x95, 0x00, 0x33, 0x56, 0x6e, 0x25, 0x36, 0xd4, 0xe9, 0x01, 0x0d, 0x42, - 0x2c, 0xc9, 0x64, 0x09, 0x52, 0x98, 0xc9, 0x79, 0x98, 0xce, 0x64, 0xec, 0xc5, 0xc3, 0x48, 0xa8, - 0xab, 0x9e, 0xa1, 0x00, 0x1d, 0xd7, 0xa5, 0x5d, 0xc2, 0x42, 0x46, 0x53, 0x0d, 0x33, 0xcb, 0x30, - 0x74, 0x64, 0xb0, 0x65, 0x68, 0xdc, 0xe3, 0x81, 0x60, 0xa9, 0x9b, 0x30, 0xee, 0xa6, 0xcc, 0x8b, - 0x23, 0x7f, 0xec, 0xac, 0x73, 0x99, 0x7b, 0x9b, 0xf1, 0x1d, 0x74, 0x92, 0x6d, 0x68, 0xec, 0x8d, - 0x34, 0x41, 0x5f, 0xd5, 0x29, 0xd4, 0xc1, 0x49, 0x73, 0xa3, 0xd4, 0x2a, 0x1d, 0x11, 0xe9, 0xdb, - 0x8c, 0x2b, 0xd1, 0x11, 0x07, 0x48, 0x29, 0x07, 0x1d, 0xb2, 0xf6, 0x0a, 0x21, 0xe7, 0xf3, 0x24, - 0x75, 0xcc, 0x26, 0x98, 0xc3, 0x94, 0xf9, 0xa8, 0x2b, 0x5d, 0x44, 0xb4, 0x90, 0x0b, 0x30, 0x1b, - 0xc6, 0xfd, 0xc0, 0xa3, 0xa1, 0x8b, 0x89, 0x34, 0xeb, 0x25, 0xc8, 0x8c, 0x72, 0xf5, 0xa4, 0x87, - 0xac, 0x00, 0xf9, 0x76, 0xc8, 0x78, 0x30, 0x5e, 0x1d, 0x28, 0x55, 0x67, 0x5e, 0xf9, 0xf3, 0xf2, - 0xa8, 0xe6, 0x3f, 0x30, 0xe1, 0x94, 0x1c, 0xec, 0xff, 0x6d, 0x17, 0x7c, 0x04, 0x35, 0xb9, 0x5d, - 0x59, 0x9a, 0xaa, 0x59, 0xd8, 0x3e, 0x7e, 0xd1, 0xbe, 0xc8, 0xf7, 0xf0, 0xba, 0xef, 0xe7, 0x53, - 0x50, 0x91, 0xc8, 0x55, 0xbd, 0x51, 0x2b, 0x2f, 0x5c, 0x53, 0x5d, 0xcb, 0x62, 0xff, 0x2a, 0x72, - 0xc6, 0x20, 0xd7, 0xc0, 0x0a, 0x63, 0x8f, 0x86, 0x52, 0xab, 0x26, 0xb2, 0xdf, 0x3c, 0x81, 0x7d, - 0x4b, 0x41, 0xb4, 0x90, 0x35, 0x85, 0x7c, 0x0a, 0xb3, 0x3b, 0x8c, 0x1f, 0x30, 0x7e, 0x87, 0xf1, - 0x54, 0x0e, 0x92, 0x2a, 0xc6, 0x68, 0x9d, 0x10, 0x43, 0x21, 0x54, 0x88, 0x71, 0x1a, 0x39, 0x07, - 0xf5, 0xbd, 0x61, 0x10, 0xfa, 0xae, 0xa0, 0x7d, 0x14, 0x59, 0x5d, 0xff, 0x15, 0x9a, 0x77, 0x69, - 0x9f, 0xbc, 0x2d, 0x07, 0x12, 0xe5, 0x42, 0x3e, 0x45, 0xb2, 0x81, 0x94, 0x5f, 0x1a, 0x65, 0x5f, - 0x17, 0x64, 0x07, 0xe6, 0x75, 0x6e, 0xae, 0x2e, 0xa9, 0x85, 0x93, 0xd7, 0xfe, 0x9b, 0x63, 0xad, - 0x67, 0x48, 0xad, 0xdb, 0x70, 0xdc, 0x4c, 0xde, 0x85, 0x19, 0x2f, 0x1c, 0xa6, 0x82, 0x71, 0x37, - 0xa2, 0x03, 0x86, 0x42, 0xd2, 0xf9, 0x4d, 0x2b, 0xcf, 0x16, 0x1d, 0x30, 0xfb, 0x27, 0x03, 0xe6, - 0x8e, 0xc5, 0x2c, 0xf7, 0xd6, 0x78, 0x9d, 0xde, 0xf6, 0xa4, 0x8c, 0xd5, 0x89, 0x44, 0xc0, 0xb8, - 0x52, 0xc8, 0x1b, 0x27, 0x1c, 0x67, 0x37, 0x60, 0xbc, 0xd0, 0x77, 0xc6, 0x91, 0x36, 0xfb, 0xbb, - 0x49, 0x98, 0xc3, 0x11, 0x35, 0xbe, 0x25, 0xf3, 0xf7, 0x87, 0xf1, 0xef, 0xdf, 0x1f, 0xb9, 0xd4, - 0x26, 0x5f, 0x59, 0x6a, 0x1f, 0x80, 0x29, 0xf5, 0xae, 0x44, 0x7a, 0xee, 0x04, 0xe6, 0xf8, 0x4d, - 0xd2, 0xb7, 0x59, 0x92, 0x48, 0xaf, 0x34, 0x53, 0x33, 0x9d, 0x76, 0x4f, 0x08, 0x30, 0x36, 0x87, - 0x8f, 0x4f, 0x5d, 0xfb, 0x07, 0x03, 0x1a, 0xaa, 0x0c, 0xd4, 0xcf, 0x97, 0xea, 0x6b, 0x16, 0x62, - 0x1d, 0xac, 0x7c, 0xb7, 0x4f, 0xa2, 0xc2, 0x3a, 0x2f, 0xdf, 0xed, 0xf8, 0x52, 0xd2, 0xf9, 0x68, - 0x9a, 0xbd, 0x01, 0x96, 0x56, 0x0b, 0xb9, 0x0c, 0x55, 0xd9, 0xdd, 0xec, 0x51, 0xfc, 0x8f, 0xed, - 0xcd, 0xb0, 0x6a, 0x06, 0x7d, 0x02, 0xa6, 0x74, 0xc9, 0x05, 0x26, 0x5f, 0x25, 0x46, 0x49, 0x9d, - 0xd2, 0x40, 0x5a, 0x50, 0x3d, 0xa0, 0xe1, 0x30, 0x5b, 0x34, 0xda, 0x93, 0x99, 0x54, 0x84, 0x47, - 0x06, 0xd4, 0xf4, 0x4d, 0xbc, 0x08, 0xf5, 0x01, 0xfd, 0x26, 0xe6, 0xee, 0x01, 0x0d, 0x55, 0x3d, - 0x66, 0x55, 0x3d, 0xaa, 0xb7, 0xa5, 0xc3, 0xb1, 0xd0, 0x7f, 0x87, 0x86, 0x88, 0x0d, 0x22, 0x85, - 0x9d, 0x3c, 0x86, 0x95, 0x0e, 0xc7, 0x42, 0xbf, 0xc4, 0xb6, 0xa0, 0x9a, 0x50, 0xe1, 0xed, 0x8f, - 0x2d, 0xb2, 0xcc, 0x24, 0x17, 0xe6, 0x30, 0x4a, 0x05, 0x6e, 0xc3, 0xf2, 0x02, 0xcb, 0xad, 0x59, - 0x9e, 0x17, 0xcf, 0xc3, 0x74, 0xe9, 0x79, 0x4a, 0xea, 0x50, 0xbd, 0xf3, 0xf9, 0xee, 0x86, 0x33, - 0x3f, 0x41, 0xa6, 0xa1, 0x76, 0x6b, 0x63, 0xdd, 0xd9, 0xda, 0x70, 0xe6, 0x8d, 0xde, 0x85, 0xc7, - 0xbf, 0xb5, 0x27, 0x1e, 0x1f, 0xb5, 0x8d, 0x27, 0x47, 0x6d, 0xe3, 0xe9, 0x51, 0xdb, 0xf8, 0xf5, - 0xa8, 0x6d, 0xfc, 0xf8, 0xac, 0x3d, 0xf1, 0xe4, 0x59, 0x7b, 0xe2, 0xe9, 0xb3, 0xf6, 0xc4, 0x57, - 0x35, 0x55, 0xd3, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xb6, 0xd6, 0x81, 0x11, 0x0d, 0x00, - 0x00, +func init() { proto.RegisterFile("roachpb/metadata.proto", fileDescriptor_metadata_512b13eb8d4291cc) } + +var fileDescriptor_metadata_512b13eb8d4291cc = []byte{ + // 1359 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x41, 0x6f, 0xdb, 0xc6, + 0x12, 0x16, 0x2d, 0xc9, 0xa2, 0x46, 0x76, 0x6c, 0x2d, 0x92, 0x3c, 0x41, 0x0f, 0x4f, 0x52, 0xf8, + 0x5e, 0xf0, 0x9c, 0xb4, 0xb0, 0x1d, 0x07, 0x46, 0x10, 0xb7, 0x69, 0x6b, 0x25, 0x2e, 0xe0, 0x26, + 0x71, 0x5d, 0xda, 0x4d, 0x81, 0x5e, 0x88, 0x35, 0xb9, 0x95, 0xd9, 0x50, 0x24, 0xb3, 0x5c, 0x39, + 0xd1, 0xbd, 0x40, 0x0f, 0x45, 0x81, 0x5e, 0x0a, 0xf4, 0x98, 0x4b, 0xfe, 0x43, 0x7f, 0x42, 0x8e, + 0x39, 0xe6, 0x64, 0xa4, 0xce, 0xa5, 0xe7, 0x1e, 0x73, 0x28, 0x8a, 0x1d, 0xee, 0x92, 0x94, 0xe3, + 0xb4, 0x49, 0x0a, 0xf4, 0x46, 0xcd, 0x7c, 0xdf, 0x68, 0x76, 0xf6, 0x9b, 0x99, 0x85, 0xb3, 0x3c, + 0xa2, 0xee, 0x7e, 0xbc, 0xb7, 0x34, 0x64, 0x82, 0x7a, 0x54, 0xd0, 0xc5, 0x98, 0x47, 0x22, 0x22, + 0x4d, 0x37, 0x72, 0xef, 0xa2, 0x6f, 0x51, 0x21, 0xda, 0xed, 0x91, 0xf0, 0x83, 0xa5, 0x51, 0xc8, + 0x59, 0x12, 0x05, 0x07, 0xcc, 0x73, 0xa8, 0xe7, 0xf1, 0x14, 0xde, 0x6e, 0xa1, 0x6f, 0x3f, 0x70, + 0x97, 0x84, 0x3f, 0x64, 0x89, 0xa0, 0xc3, 0x58, 0x79, 0x4e, 0x0f, 0xa2, 0x41, 0x84, 0x9f, 0x4b, + 0xf2, 0x2b, 0xb5, 0x5a, 0x1f, 0x02, 0xac, 0x0b, 0xc1, 0xfd, 0xbd, 0x91, 0x60, 0x09, 0x79, 0x07, + 0xaa, 0x54, 0x08, 0x9e, 0xb4, 0x8c, 0x5e, 0x79, 0xa1, 0xde, 0x3f, 0xf3, 0xdb, 0x61, 0xb7, 0x39, + 0xa6, 0xc3, 0x60, 0xcd, 0x42, 0xf3, 0xbb, 0x5f, 0x05, 0xd1, 0x7d, 0xcb, 0x4e, 0x31, 0x6b, 0x95, + 0x9f, 0x1e, 0x76, 0x4b, 0xd6, 0xb7, 0x06, 0x34, 0x6d, 0x16, 0x07, 0xbe, 0x4b, 0x85, 0x1f, 0x85, + 0xbb, 0x94, 0x0f, 0x98, 0x20, 0x97, 0xa0, 0x16, 0x46, 0x1e, 0x73, 0x7c, 0xaf, 0x65, 0xf4, 0x8c, + 0x85, 0x6a, 0xbf, 0xf5, 0xf8, 0xb0, 0x5b, 0x3a, 0x3a, 0xec, 0x4e, 0x6f, 0x45, 0x1e, 0xdb, 0xbc, + 0xf1, 0x22, 0xfb, 0xb2, 0xa7, 0x25, 0x70, 0xd3, 0x23, 0xab, 0x60, 0x26, 0x22, 0xe2, 0xc8, 0x99, + 0x42, 0x4e, 0x5b, 0x71, 0x6a, 0x3b, 0xd2, 0x8e, 0x24, 0xfd, 0x69, 0xd7, 0x10, 0xbb, 0xe9, 0xad, + 0x99, 0x32, 0x8b, 0x5f, 0x1f, 0x76, 0x0d, 0xeb, 0xf7, 0x3c, 0x93, 0x1b, 0x2c, 0x71, 0xb9, 0x1f, + 0x8b, 0x88, 0xff, 0x73, 0x99, 0x90, 0x6b, 0x00, 0x3c, 0xfd, 0x7b, 0x49, 0x2c, 0x23, 0xb1, 0xa3, + 0x88, 0x75, 0x95, 0x18, 0x52, 0xf3, 0x1f, 0x76, 0x5d, 0x31, 0x36, 0x3d, 0xb2, 0x02, 0x15, 0x31, + 0x8e, 0x59, 0xab, 0xd2, 0x33, 0x16, 0x4e, 0xad, 0x74, 0x16, 0x5f, 0xba, 0xf7, 0x45, 0x45, 0xdb, + 0x1d, 0xc7, 0xcc, 0x46, 0xec, 0xda, 0x8c, 0x3c, 0xfc, 0xcf, 0x0f, 0xbb, 0x06, 0x16, 0xe0, 0x3b, + 0x03, 0x66, 0x74, 0x68, 0x8f, 0x85, 0x42, 0x1e, 0x84, 0xd3, 0x70, 0x90, 0x1d, 0xbe, 0x9c, 0x1f, + 0xc4, 0x96, 0xf6, 0xf4, 0x20, 0xea, 0xd3, 0xae, 0x21, 0x76, 0xd3, 0x23, 0x37, 0xa0, 0xa6, 0xd2, + 0xc2, 0xe3, 0x37, 0x56, 0xfe, 0xf7, 0xea, 0x64, 0xf2, 0x4a, 0xf7, 0x2b, 0x32, 0xb6, 0xad, 0xa9, + 0xd6, 0xd3, 0x32, 0xcc, 0x61, 0xe8, 0xc2, 0x65, 0xbc, 0x65, 0x42, 0xe7, 0xa1, 0x9e, 0x08, 0xca, + 0x85, 0x73, 0x97, 0x8d, 0x31, 0xa5, 0x99, 0xbe, 0xf9, 0xe2, 0xb0, 0x5b, 0xb1, 0x6f, 0xb2, 0xb1, + 0x6d, 0xa2, 0xeb, 0x26, 0x1b, 0x93, 0x73, 0x50, 0x63, 0xa1, 0x87, 0xa0, 0xf2, 0x31, 0xd0, 0x34, + 0x0b, 0x3d, 0x09, 0xf9, 0x02, 0x9a, 0x7e, 0x28, 0x18, 0x0f, 0x69, 0xe0, 0xa8, 0x44, 0x93, 0x56, + 0xa5, 0x57, 0x7e, 0xc3, 0x43, 0xce, 0xeb, 0x20, 0x0a, 0x90, 0x90, 0x4f, 0x60, 0x2e, 0x64, 0x0f, + 0x84, 0x53, 0x50, 0x40, 0x15, 0x15, 0x60, 0xa9, 0x03, 0xce, 0x6e, 0xb1, 0x07, 0xe2, 0x15, 0x2a, + 0x98, 0x0d, 0x0b, 0x3e, 0x8f, 0x74, 0x00, 0x06, 0x2c, 0x64, 0x1c, 0x1b, 0xaa, 0x35, 0x2d, 0xeb, + 0x64, 0x17, 0x2c, 0xe4, 0x7d, 0x80, 0x44, 0xf8, 0xee, 0xdd, 0xb1, 0xb3, 0xe7, 0x8b, 0x56, 0x0d, + 0xaf, 0xe8, 0x3f, 0x85, 0xec, 0xe5, 0x08, 0x58, 0xdc, 0x0f, 0xdc, 0xc5, 0x5d, 0x3d, 0x02, 0xec, + 0x7a, 0x4a, 0xe8, 0xfb, 0x82, 0x5c, 0x86, 0x33, 0x79, 0x2c, 0xc7, 0x8d, 0x86, 0x31, 0xe5, 0x74, + 0x2f, 0x60, 0x2d, 0xb3, 0x67, 0x2c, 0x98, 0xf6, 0xe9, 0xdc, 0x79, 0x3d, 0xf3, 0x1d, 0x13, 0xda, + 0x23, 0x03, 0x1a, 0xdb, 0x8c, 0xbb, 0x2c, 0x14, 0x7e, 0xc0, 0x12, 0x72, 0x16, 0xca, 0xf1, 0xa5, + 0x65, 0xbc, 0x51, 0x43, 0x55, 0x48, 0x1a, 0xd0, 0xbe, 0xb2, 0x8a, 0x37, 0x96, 0xdb, 0x57, 0x56, + 0xd1, 0xbe, 0xba, 0x8c, 0x97, 0x94, 0xdb, 0x57, 0x53, 0xfc, 0x95, 0x55, 0xec, 0x80, 0xdc, 0x7e, + 0x25, 0xc5, 0x5f, 0x5d, 0xc6, 0x82, 0xe6, 0xf6, 0xab, 0xcb, 0xa4, 0x05, 0x95, 0xf8, 0x36, 0x7d, + 0x80, 0x25, 0xd2, 0x0e, 0xb4, 0xa8, 0xd9, 0xf4, 0xa2, 0x0c, 0xb3, 0xd8, 0xa6, 0xd7, 0x69, 0x4c, + 0x5d, 0x5f, 0x8c, 0x49, 0x0f, 0x4c, 0x57, 0x7d, 0x2b, 0x01, 0xa6, 0xac, 0xcc, 0x4a, 0x2c, 0xa8, + 0xd3, 0x03, 0xea, 0x07, 0x58, 0x92, 0xa9, 0x02, 0x24, 0x37, 0x93, 0xf3, 0xd0, 0x48, 0x65, 0xec, + 0x46, 0xa3, 0x50, 0xa8, 0x56, 0x4f, 0x51, 0x80, 0x8e, 0xeb, 0xd2, 0x2e, 0x61, 0x01, 0xa3, 0x89, + 0x86, 0x55, 0x8a, 0x30, 0x74, 0xa4, 0xb0, 0x65, 0x68, 0xde, 0xe7, 0xbe, 0x60, 0x89, 0x13, 0x33, + 0xee, 0x24, 0xcc, 0x8d, 0x42, 0x6f, 0xe2, 0xac, 0x73, 0xa9, 0x7b, 0x9b, 0xf1, 0x1d, 0x74, 0x92, + 0x6d, 0x68, 0xee, 0x8d, 0x35, 0x41, 0xb7, 0xea, 0x34, 0xea, 0xe0, 0xa4, 0xb9, 0x51, 0xb8, 0x2a, + 0x1d, 0x11, 0xe9, 0xdb, 0x8c, 0x2b, 0xd1, 0x11, 0x1b, 0x48, 0x21, 0x07, 0x1d, 0xb2, 0xf6, 0x06, + 0x21, 0xe7, 0xb3, 0x24, 0x75, 0xcc, 0x16, 0x54, 0x46, 0x09, 0xf3, 0x50, 0x57, 0xba, 0x88, 0x68, + 0x21, 0x17, 0x60, 0x36, 0x88, 0x06, 0xbe, 0x4b, 0x03, 0x07, 0x13, 0x69, 0xd5, 0x0b, 0x90, 0x19, + 0xe5, 0xea, 0x4b, 0x0f, 0x59, 0x01, 0x72, 0x6f, 0xc4, 0xb8, 0x3f, 0x59, 0x1d, 0x28, 0x54, 0x67, + 0x5e, 0xf9, 0xb3, 0xf2, 0xa8, 0xcb, 0x7f, 0x56, 0x81, 0x53, 0x72, 0xb0, 0xff, 0xbd, 0x5d, 0xf0, + 0x01, 0xd4, 0xe4, 0x76, 0x65, 0x49, 0xa2, 0x66, 0x61, 0xe7, 0x78, 0xa3, 0x7d, 0x9e, 0xed, 0xe1, + 0x75, 0xcf, 0xcb, 0xa6, 0xa0, 0x22, 0x91, 0xab, 0x7a, 0xa3, 0x96, 0x5f, 0x6a, 0x53, 0x5d, 0xcb, + 0x7c, 0xff, 0x2a, 0x72, 0xca, 0x20, 0xd7, 0xc0, 0x0c, 0x22, 0x97, 0x06, 0x52, 0xab, 0x15, 0x64, + 0xff, 0xfb, 0x04, 0xf6, 0x2d, 0x05, 0xd1, 0x42, 0xd6, 0x14, 0xf2, 0x31, 0xcc, 0xee, 0x30, 0x7e, + 0xc0, 0xf8, 0x1d, 0xc6, 0x13, 0x39, 0x48, 0xaa, 0x18, 0xa3, 0x7d, 0x42, 0x0c, 0x85, 0x50, 0x21, + 0x26, 0x69, 0xe4, 0x1c, 0xd4, 0xf7, 0x46, 0x7e, 0xe0, 0x39, 0x82, 0x0e, 0x50, 0x64, 0x75, 0xfd, + 0x57, 0x68, 0xde, 0xa5, 0x03, 0xf2, 0x5f, 0x39, 0x90, 0x28, 0x17, 0xf2, 0x29, 0x92, 0x0e, 0xa4, + 0xac, 0x69, 0x94, 0x7d, 0x5d, 0x90, 0x1d, 0x98, 0xd7, 0xb9, 0x39, 0xba, 0xa4, 0x26, 0x4e, 0x5e, + 0xeb, 0x4f, 0x8e, 0xb5, 0x9e, 0x22, 0xb5, 0x6e, 0x83, 0x49, 0x33, 0xf9, 0x3f, 0xcc, 0xb8, 0xc1, + 0x28, 0x11, 0x8c, 0x3b, 0x21, 0x1d, 0x32, 0x14, 0x92, 0xce, 0xaf, 0xa1, 0x3c, 0x5b, 0x74, 0xc8, + 0xc8, 0x0e, 0x34, 0x92, 0x7b, 0x41, 0xf6, 0xc7, 0xf0, 0x5a, 0x77, 0x49, 0x94, 0x3c, 0x60, 0xe7, + 0xb3, 0x5b, 0xea, 0x1f, 0x6d, 0x48, 0xee, 0x05, 0xea, 0xdb, 0xfa, 0xd1, 0x80, 0xb9, 0x63, 0x89, + 0x16, 0x05, 0x63, 0xbc, 0x8d, 0x60, 0xfa, 0xb2, 0x37, 0x54, 0x99, 0x84, 0xcf, 0xb8, 0x92, 0xdd, + 0xbf, 0x4e, 0xa8, 0xd1, 0xae, 0xcf, 0x78, 0xde, 0x34, 0x29, 0x47, 0xda, 0xac, 0x6f, 0xa6, 0x60, + 0x0e, 0xe7, 0xde, 0xe4, 0xea, 0xcd, 0x1e, 0x35, 0xc6, 0xeb, 0x3f, 0x6a, 0x32, 0xfd, 0x4e, 0xbd, + 0xb1, 0x7e, 0xdf, 0x83, 0x8a, 0x6c, 0x22, 0xa5, 0xfc, 0x73, 0x27, 0x30, 0x27, 0xdb, 0x53, 0x8f, + 0x08, 0x49, 0x22, 0xfd, 0xc2, 0xa0, 0x4e, 0xc5, 0xdf, 0x3b, 0x21, 0xc0, 0xc4, 0x70, 0x3f, 0x3e, + 0xca, 0xad, 0xef, 0x0d, 0x68, 0xaa, 0x32, 0x50, 0x2f, 0xdb, 0xd4, 0x6f, 0x59, 0x88, 0x75, 0x30, + 0xb3, 0x07, 0xc3, 0x14, 0xca, 0xb6, 0xfb, 0xea, 0x07, 0x03, 0x3e, 0xbf, 0x74, 0x3e, 0x9a, 0x66, + 0x6d, 0x80, 0xa9, 0xd5, 0x42, 0x2e, 0x43, 0x55, 0xde, 0x6e, 0xfa, 0xd2, 0xfe, 0xcb, 0xeb, 0x4d, + 0xb1, 0x6a, 0xb0, 0x7d, 0x04, 0x15, 0xe9, 0x92, 0x5b, 0x51, 0x3e, 0x75, 0x8c, 0x82, 0xe4, 0xa5, + 0x81, 0xb4, 0xa1, 0x7a, 0x40, 0x83, 0x51, 0xba, 0xbd, 0xb4, 0x27, 0x35, 0xa9, 0x08, 0x8f, 0x0c, + 0xa8, 0xe9, 0xf6, 0xbe, 0x08, 0xf5, 0x21, 0xfd, 0x3a, 0xe2, 0xce, 0x01, 0x0d, 0x54, 0x3d, 0x66, + 0x55, 0x3d, 0xaa, 0xb7, 0xa5, 0xc3, 0x36, 0xd1, 0x7f, 0x87, 0x06, 0x88, 0xf5, 0x43, 0x85, 0x9d, + 0x3a, 0x86, 0x95, 0x0e, 0xdb, 0x44, 0xbf, 0xc4, 0xb6, 0xa1, 0x1a, 0x53, 0xe1, 0xee, 0x4f, 0x6c, + 0xc7, 0xd4, 0x24, 0xb7, 0xf0, 0x28, 0x4c, 0x04, 0xae, 0xd8, 0xe2, 0x56, 0xcc, 0xac, 0x69, 0x9e, + 0x17, 0xcf, 0x43, 0xa3, 0xf0, 0xe6, 0x25, 0x75, 0xa8, 0xde, 0xf9, 0x74, 0x77, 0xc3, 0x9e, 0x2f, + 0x91, 0x06, 0xd4, 0x6e, 0x6d, 0xac, 0xdb, 0x5b, 0x1b, 0xf6, 0xbc, 0xd1, 0xbf, 0xf0, 0xf8, 0x97, + 0x4e, 0xe9, 0xf1, 0x51, 0xc7, 0x78, 0x72, 0xd4, 0x31, 0x9e, 0x1e, 0x75, 0x8c, 0x67, 0x47, 0x1d, + 0xe3, 0x87, 0xe7, 0x9d, 0xd2, 0x93, 0xe7, 0x9d, 0xd2, 0xd3, 0xe7, 0x9d, 0xd2, 0x97, 0x35, 0x55, + 0xd3, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x29, 0x01, 0x66, 0x7b, 0x66, 0x0d, 0x00, 0x00, } diff --git a/pkg/roachpb/metadata.proto b/pkg/roachpb/metadata.proto index 3c8ea3f1c4dd..c55162e80bcd 100644 --- a/pkg/roachpb/metadata.proto +++ b/pkg/roachpb/metadata.proto @@ -282,6 +282,9 @@ message NodeDescriptor { optional int64 started_at = 7 [(gogoproto.nullable) = false]; repeated LocalityAddress locality_address = 8 [(gogoproto.nullable) = false]; optional string cluster_name = 9 [(gogoproto.nullable) = false]; + // The SQL address. If empty, indicates that the base address field + // is also used to accept SQL connections. + optional util.UnresolvedAddr sql_address = 10 [(gogoproto.nullable) = false, (gogoproto.customname) = "SQLAddress"]; } // LocalityAddress holds the private address accessible only from other nodes diff --git a/pkg/security/certs_rotation_test.go b/pkg/security/certs_rotation_test.go index 84ca3d6ca6f7..b3b5d71b61de 100644 --- a/pkg/security/certs_rotation_test.go +++ b/pkg/security/certs_rotation_test.go @@ -83,7 +83,7 @@ func TestRotateCerts(t *testing.T) { // Create a client by calling sql.Open which loads the certificates but do not use it yet. createTestClient := func() *gosql.DB { - pgUrl := makeSecurePGUrl(s.ServingAddr(), security.RootUser, certsDir, security.EmbeddedCACert, security.EmbeddedRootCert, security.EmbeddedRootKey) + pgUrl := makeSecurePGUrl(s.ServingSQLAddr(), security.RootUser, certsDir, security.EmbeddedCACert, security.EmbeddedRootCert, security.EmbeddedRootKey) goDB, err := gosql.Open("postgres", pgUrl) if err != nil { t.Fatal(err) diff --git a/pkg/security/certs_test.go b/pkg/security/certs_test.go index 60f9d5ad9398..5bef75ae58aa 100644 --- a/pkg/security/certs_test.go +++ b/pkg/security/certs_test.go @@ -433,7 +433,7 @@ func TestUseSplitCACerts(t *testing.T) { } for i, tc := range testCases { - pgUrl := makeSecurePGUrl(s.ServingAddr(), tc.user, certsDir, tc.caName, tc.certPrefix+".crt", tc.certPrefix+".key") + pgUrl := makeSecurePGUrl(s.ServingSQLAddr(), tc.user, certsDir, tc.caName, tc.certPrefix+".crt", tc.certPrefix+".key") goDB, err := gosql.Open("postgres", pgUrl) if err != nil { t.Fatal(err) @@ -541,7 +541,7 @@ func TestUseWrongSplitCACerts(t *testing.T) { } for i, tc := range testCases { - pgUrl := makeSecurePGUrl(s.ServingAddr(), tc.user, certsDir, tc.caName, tc.certPrefix+".crt", tc.certPrefix+".key") + pgUrl := makeSecurePGUrl(s.ServingSQLAddr(), tc.user, certsDir, tc.caName, tc.certPrefix+".crt", tc.certPrefix+".key") goDB, err := gosql.Open("postgres", pgUrl) if err != nil { t.Fatal(err) diff --git a/pkg/server/authentication_test.go b/pkg/server/authentication_test.go index 7efb2da2892c..ef40c8446233 100644 --- a/pkg/server/authentication_test.go +++ b/pkg/server/authentication_test.go @@ -724,7 +724,7 @@ func TestGRPCAuthentication(t *testing.T) { }}, } - conn, err := grpc.DialContext(ctx, s.Addr(), + conn, err := grpc.DialContext(ctx, s.ServingRPCAddr(), grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{ InsecureSkipVerify: true, }))) @@ -749,7 +749,7 @@ func TestGRPCAuthentication(t *testing.T) { if err != nil { t.Fatal(err) } - conn, err = grpc.DialContext(ctx, s.Addr(), + conn, err = grpc.DialContext(ctx, s.ServingRPCAddr(), grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) if err != nil { t.Fatal(err) diff --git a/pkg/server/node.go b/pkg/server/node.go index 6af84224f5a1..07f232ae1198 100644 --- a/pkg/server/node.go +++ b/pkg/server/node.go @@ -332,7 +332,7 @@ func (n *Node) onClusterVersionChange(cv cluster.ClusterVersion) { // NodeDescriptor is available, to help bootstrapping. func (n *Node) start( ctx context.Context, - addr net.Addr, + addr, sqlAddr net.Addr, initializedEngines, emptyEngines []engine.Engine, clusterName string, attrs roachpb.Attributes, @@ -381,6 +381,7 @@ func (n *Node) start( n.Descriptor = roachpb.NodeDescriptor{ NodeID: nodeID, Address: util.MakeUnresolvedAddr(addr.Network(), addr.String()), + SQLAddress: util.MakeUnresolvedAddr(sqlAddr.Network(), sqlAddr.String()), Attrs: attrs, Locality: locality, LocalityAddress: localityAddress, diff --git a/pkg/server/node_test.go b/pkg/server/node_test.go index 014353beaede..e22496e8dd9b 100644 --- a/pkg/server/node_test.go +++ b/pkg/server/node_test.go @@ -172,7 +172,10 @@ func createAndStartTestNode( // because otherwise some of the initial ranges cannot be accessed (since // they need an epoch-based lease). cfg.NodeLiveness.StartHeartbeat(ctx, stopper, nil /* alive */) - if err := node.start(ctx, addr, bootstrappedEngines, newEngines, "", + if err := node.start(ctx, + addr, + addr, // Note: this is not really a SQL address but these tests do not use SQL so all is fine. + bootstrappedEngines, newEngines, "", roachpb.Attributes{}, locality, cv, []roachpb.LocalityAddress{}, nil, /*nodeDescriptorCallback */ ); err != nil { @@ -413,7 +416,9 @@ func TestCorruptedClusterID(t *testing.T) { t.Fatal(err) } if err := node.start( - ctx, serverAddr, bootstrappedEngines, newEngines, "", + ctx, serverAddr, + serverAddr, // Note: this is not really a SQL address but the tests in this package do not use SQL so all is fine. + bootstrappedEngines, newEngines, "", roachpb.Attributes{}, roachpb.Locality{}, cv, []roachpb.LocalityAddress{}, nil, /* nodeDescriptorCallback */ diff --git a/pkg/server/server.go b/pkg/server/server.go index 78137cbad3ac..eef1bd8121a1 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -838,17 +838,21 @@ func inspectEngines( // file", these are written once the listeners are available, before the server // is necessarily ready to serve. type listenerInfo struct { - listen string // the (RPC) listen address - advertise string // equals `listen` unless --advertise-addr is used - http string // the HTTP endpoint + listenRPC string // the (RPC) listen address, rewritten after name resolution and port allocation + advertiseRPC string // contains the original addr part of --listen/--advertise, with actual port number after port allocation if original was 0 + listenHTTP string // the HTTP endpoint + listenSQL string // the SQL endpoint, rewritten after name resolution and port allocation + advertiseSQL string // contains the original addr part of --sql-addr, with actual port number after port allocation if original was 0 } // Iter returns a mapping of file names to desired contents. func (li listenerInfo) Iter() map[string]string { return map[string]string{ - "cockroach.advertise-addr": li.advertise, - "cockroach.http-addr": li.http, - "cockroach.listen-addr": li.listen, + "cockroach.advertise-addr": li.advertiseRPC, + "cockroach.http-addr": li.listenHTTP, + "cockroach.listen-addr": li.listenRPC, + "cockroach.sql-addr": li.listenSQL, + "cockroach.advertise-sql-addr": li.advertiseSQL, } } @@ -1141,7 +1145,7 @@ func (s *Server) Start(ctx context.Context) error { // and dispatches the server worker for the RPC. // The SQL listener is returned, to start the SQL server later // below when the server has initialized. - pgL, startRPCServer, err := s.startServeRPC(ctx, workersCtx) + pgL, startRPCServer, err := s.startListenRPCAndSQL(ctx, workersCtx) if err != nil { return err } @@ -1230,9 +1234,11 @@ func (s *Server) Start(ctx context.Context) error { // Write listener info files early in the startup sequence. `listenerInfo` has a comment. listenerFiles := listenerInfo{ - advertise: s.cfg.AdvertiseAddr, - http: s.cfg.HTTPAdvertiseAddr, - listen: s.cfg.Addr, + listenRPC: s.cfg.Addr, + advertiseRPC: s.cfg.AdvertiseAddr, + listenSQL: s.cfg.SQLAddr, + advertiseSQL: s.cfg.SQLAdvertiseAddr, + listenHTTP: s.cfg.HTTPAdvertiseAddr, }.Iter() for _, storeSpec := range s.cfg.Stores.Specs { @@ -1258,6 +1264,7 @@ func (s *Server) Start(ctx context.Context) error { // advertise addresses. listenAddrU := util.NewUnresolvedAddr("tcp", s.cfg.Addr) advAddrU := util.NewUnresolvedAddr("tcp", s.cfg.AdvertiseAddr) + advSQLAddrU := util.NewUnresolvedAddr("tcp", s.cfg.SQLAdvertiseAddr) filtered := s.cfg.FilterGossipBootstrapResolvers(ctx, listenAddrU, advAddrU) s.gossip.Start(advAddrU, filtered) log.Event(ctx, "started gossip") @@ -1384,7 +1391,7 @@ func (s *Server) Start(ctx context.Context) error { // we're joining an existing cluster for the first time. if err := s.node.start( ctx, - advAddrU, + advAddrU, advSQLAddrU, bootstrappedEngines, emptyEngines, s.cfg.ClusterName, s.cfg.NodeAttributes, @@ -1418,7 +1425,7 @@ func (s *Server) Start(ctx context.Context) error { }) // We can now add the node registry. - s.recorder.AddNode(s.registry, s.node.Descriptor, s.node.startedAt, s.cfg.AdvertiseAddr, s.cfg.HTTPAdvertiseAddr) + s.recorder.AddNode(s.registry, s.node.Descriptor, s.node.startedAt, s.cfg.AdvertiseAddr, s.cfg.HTTPAdvertiseAddr, s.cfg.SQLAdvertiseAddr) // Begin recording runtime statistics. s.startSampleEnvironment(ctx, DefaultMetricsSampleInterval) @@ -1464,7 +1471,12 @@ func (s *Server) Start(ctx context.Context) error { log.Infof(ctx, "starting %s server at %s (use: %s)", s.cfg.HTTPRequestScheme(), s.cfg.HTTPAddr, s.cfg.HTTPAdvertiseAddr) - log.Infof(ctx, "starting grpc/postgres server at %s", s.cfg.Addr) + rpcConnType := "grpc/postgres" + if s.cfg.SplitListenSQL { + rpcConnType = "grpc" + log.Infof(ctx, "starting postgres server at %s (use: %s)", s.cfg.SQLAddr, s.cfg.SQLAdvertiseAddr) + } + log.Infof(ctx, "starting %s server at %s", rpcConnType, s.cfg.Addr) log.Infof(ctx, "advertising CockroachDB node at %s", s.cfg.AdvertiseAddr) log.Event(ctx, "accepting connections") @@ -1597,21 +1609,42 @@ func (s *Server) Start(ctx context.Context) error { return nil } -// startServeRPC starts the RPC and SQL listeners. +// startListenRPCAndSQL starts the RPC and SQL listeners. // It returns the SQL listener, which can be used // to start the SQL server when initialization has completed. // It also returns a function that starts the RPC server, // when the cluster is known to have bootstrapped or // when waiting for init(). -func (s *Server) startServeRPC( +func (s *Server) startListenRPCAndSQL( ctx, workersCtx context.Context, ) (sqlListener net.Listener, startRPCServer func(ctx context.Context), err error) { - ln, err := listen(ctx, &s.cfg.Addr, &s.cfg.AdvertiseAddr, "rpc/sql") + rpcChanName := "rpc/sql" + if s.cfg.SplitListenSQL { + rpcChanName = "rpc" + } + ln, err := listen(ctx, &s.cfg.Addr, &s.cfg.AdvertiseAddr, rpcChanName) if err != nil { return nil, nil, err } log.Eventf(ctx, "listening on port %s", s.cfg.Addr) + var pgL net.Listener + if s.cfg.SplitListenSQL { + pgL, err = listen(ctx, &s.cfg.SQLAddr, &s.cfg.SQLAdvertiseAddr, "sql") + if err != nil { + return nil, nil, err + } + // The SQL listener shutdown worker, which closes everything under + // the SQL port when the stopper indicates we are shutting down. + s.stopper.RunWorker(workersCtx, func(workersCtx context.Context) { + <-s.stopper.ShouldQuiesce() + if err := pgL.Close(); err != nil { + log.Fatal(workersCtx, err) + } + }) + log.Eventf(ctx, "listening on sql port %s", s.cfg.SQLAddr) + } + // The following code is a specialization of util/net.go's ListenAndServe // which adds pgwire support. A single port is used to serve all protocols // (pg, http, h2) via the following construction: @@ -1639,9 +1672,18 @@ func (s *Server) startServeRPC( m := cmux.New(ln) - pgL := m.Match(func(r io.Reader) bool { - return pgwire.Match(r) - }) + if !s.cfg.SplitListenSQL { + // If the pg port is split, it will be opened above. Otherwise, + // we make it hang off the RPC listener via cmux here. + pgL = m.Match(func(r io.Reader) bool { + return pgwire.Match(r) + }) + // Also if the pg port is not split, the actual listen + // and advertise address for SQL become equal to that of RPC, + // regardless of what was configured. + s.cfg.SQLAddr = s.cfg.Addr + s.cfg.SQLAdvertiseAddr = s.cfg.AdvertiseAddr + } anyL := m.Match(cmux.Any()) diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go index db7b3cb3c2db..9f5eca1703d1 100644 --- a/pkg/server/server_test.go +++ b/pkg/server/server_test.go @@ -542,9 +542,11 @@ func TestListenerFileCreation(t *testing.T) { } li := listenerInfo{ - advertise: s.ServingAddr(), - http: s.HTTPAddr(), - listen: s.Addr(), + advertiseRPC: s.ServingRPCAddr(), + listenHTTP: s.HTTPAddr(), + listenRPC: s.RPCAddr(), + listenSQL: s.SQLAddr(), + advertiseSQL: s.ServingSQLAddr(), } expectedFiles := li.Iter() diff --git a/pkg/server/serverpb/status.pb.go b/pkg/server/serverpb/status.pb.go index d866abb0484d..b07a25d61c2b 100644 --- a/pkg/server/serverpb/status.pb.go +++ b/pkg/server/serverpb/status.pb.go @@ -68,7 +68,7 @@ func (x FileType) String() string { return proto.EnumName(FileType_name, int32(x)) } func (FileType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{0} + return fileDescriptor_status_048c4708ce8fa32a, []int{0} } // We use an enum to allow reporting of client certs and potential others (eg: @@ -105,7 +105,7 @@ func (x CertificateDetails_CertificateType) String() string { return proto.EnumName(CertificateDetails_CertificateType_name, int32(x)) } func (CertificateDetails_CertificateType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{1, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{1, 0} } type ProfileRequest_Type int32 @@ -125,7 +125,7 @@ func (x ProfileRequest_Type) String() string { return proto.EnumName(ProfileRequest_Type_name, int32(x)) } func (ProfileRequest_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{36, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{36, 0} } // Enum for phase of execution. @@ -149,7 +149,7 @@ func (x ActiveQuery_Phase) String() string { return proto.EnumName(ActiveQuery_Phase_name, int32(x)) } func (ActiveQuery_Phase) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{43, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{43, 0} } type CertificatesRequest struct { @@ -162,7 +162,7 @@ func (m *CertificatesRequest) Reset() { *m = CertificatesRequest{} } func (m *CertificatesRequest) String() string { return proto.CompactTextString(m) } func (*CertificatesRequest) ProtoMessage() {} func (*CertificatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{0} + return fileDescriptor_status_048c4708ce8fa32a, []int{0} } func (m *CertificatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -201,7 +201,7 @@ func (m *CertificateDetails) Reset() { *m = CertificateDetails{} } func (m *CertificateDetails) String() string { return proto.CompactTextString(m) } func (*CertificateDetails) ProtoMessage() {} func (*CertificateDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{1} + return fileDescriptor_status_048c4708ce8fa32a, []int{1} } func (m *CertificateDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -242,7 +242,7 @@ func (m *CertificateDetails_Fields) Reset() { *m = CertificateDetails_Fi func (m *CertificateDetails_Fields) String() string { return proto.CompactTextString(m) } func (*CertificateDetails_Fields) ProtoMessage() {} func (*CertificateDetails_Fields) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{1, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{1, 0} } func (m *CertificateDetails_Fields) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -275,7 +275,7 @@ func (m *CertificatesResponse) Reset() { *m = CertificatesResponse{} } func (m *CertificatesResponse) String() string { return proto.CompactTextString(m) } func (*CertificatesResponse) ProtoMessage() {} func (*CertificatesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{2} + return fileDescriptor_status_048c4708ce8fa32a, []int{2} } func (m *CertificatesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -314,7 +314,7 @@ func (m *DetailsRequest) Reset() { *m = DetailsRequest{} } func (m *DetailsRequest) String() string { return proto.CompactTextString(m) } func (*DetailsRequest) ProtoMessage() {} func (*DetailsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{3} + return fileDescriptor_status_048c4708ce8fa32a, []int{3} } func (m *DetailsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -351,7 +351,7 @@ func (m *SystemInfo) Reset() { *m = SystemInfo{} } func (m *SystemInfo) String() string { return proto.CompactTextString(m) } func (*SystemInfo) ProtoMessage() {} func (*SystemInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{4} + return fileDescriptor_status_048c4708ce8fa32a, []int{4} } func (m *SystemInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -381,13 +381,14 @@ type DetailsResponse struct { Address util.UnresolvedAddr `protobuf:"bytes,2,opt,name=address,proto3" json:"address"` BuildInfo build.Info `protobuf:"bytes,3,opt,name=build_info,json=buildInfo,proto3" json:"build_info"` SystemInfo SystemInfo `protobuf:"bytes,4,opt,name=system_info,json=systemInfo,proto3" json:"system_info"` + SQLAddress util.UnresolvedAddr `protobuf:"bytes,5,opt,name=sql_address,json=sqlAddress,proto3" json:"sql_address"` } func (m *DetailsResponse) Reset() { *m = DetailsResponse{} } func (m *DetailsResponse) String() string { return proto.CompactTextString(m) } func (*DetailsResponse) ProtoMessage() {} func (*DetailsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{5} + return fileDescriptor_status_048c4708ce8fa32a, []int{5} } func (m *DetailsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -419,7 +420,7 @@ func (m *NodesRequest) Reset() { *m = NodesRequest{} } func (m *NodesRequest) String() string { return proto.CompactTextString(m) } func (*NodesRequest) ProtoMessage() {} func (*NodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{6} + return fileDescriptor_status_048c4708ce8fa32a, []int{6} } func (m *NodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -452,7 +453,7 @@ func (m *NodesResponse) Reset() { *m = NodesResponse{} } func (m *NodesResponse) String() string { return proto.CompactTextString(m) } func (*NodesResponse) ProtoMessage() {} func (*NodesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{7} + return fileDescriptor_status_048c4708ce8fa32a, []int{7} } func (m *NodesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -487,7 +488,7 @@ func (m *NodeRequest) Reset() { *m = NodeRequest{} } func (m *NodeRequest) String() string { return proto.CompactTextString(m) } func (*NodeRequest) ProtoMessage() {} func (*NodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{8} + return fileDescriptor_status_048c4708ce8fa32a, []int{8} } func (m *NodeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -532,7 +533,7 @@ func (m *RaftState) Reset() { *m = RaftState{} } func (m *RaftState) String() string { return proto.CompactTextString(m) } func (*RaftState) ProtoMessage() {} func (*RaftState) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{9} + return fileDescriptor_status_048c4708ce8fa32a, []int{9} } func (m *RaftState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -569,7 +570,7 @@ func (m *RaftState_Progress) Reset() { *m = RaftState_Progress{} } func (m *RaftState_Progress) String() string { return proto.CompactTextString(m) } func (*RaftState_Progress) ProtoMessage() {} func (*RaftState_Progress) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{9, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{9, 0} } func (m *RaftState_Progress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -614,7 +615,7 @@ func (m *RangeProblems) Reset() { *m = RangeProblems{} } func (m *RangeProblems) String() string { return proto.CompactTextString(m) } func (*RangeProblems) ProtoMessage() {} func (*RangeProblems) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{10} + return fileDescriptor_status_048c4708ce8fa32a, []int{10} } func (m *RangeProblems) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -650,7 +651,7 @@ func (m *RangeStatistics) Reset() { *m = RangeStatistics{} } func (m *RangeStatistics) String() string { return proto.CompactTextString(m) } func (*RangeStatistics) ProtoMessage() {} func (*RangeStatistics) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{11} + return fileDescriptor_status_048c4708ce8fa32a, []int{11} } func (m *RangeStatistics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -684,7 +685,7 @@ func (m *PrettySpan) Reset() { *m = PrettySpan{} } func (m *PrettySpan) String() string { return proto.CompactTextString(m) } func (*PrettySpan) ProtoMessage() {} func (*PrettySpan) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{12} + return fileDescriptor_status_048c4708ce8fa32a, []int{12} } func (m *PrettySpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -730,7 +731,7 @@ func (m *RangeInfo) Reset() { *m = RangeInfo{} } func (m *RangeInfo) String() string { return proto.CompactTextString(m) } func (*RangeInfo) ProtoMessage() {} func (*RangeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{13} + return fileDescriptor_status_048c4708ce8fa32a, []int{13} } func (m *RangeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -766,7 +767,7 @@ func (m *RangesRequest) Reset() { *m = RangesRequest{} } func (m *RangesRequest) String() string { return proto.CompactTextString(m) } func (*RangesRequest) ProtoMessage() {} func (*RangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{14} + return fileDescriptor_status_048c4708ce8fa32a, []int{14} } func (m *RangesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -799,7 +800,7 @@ func (m *RangesResponse) Reset() { *m = RangesResponse{} } func (m *RangesResponse) String() string { return proto.CompactTextString(m) } func (*RangesResponse) ProtoMessage() {} func (*RangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{15} + return fileDescriptor_status_048c4708ce8fa32a, []int{15} } func (m *RangesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -834,7 +835,7 @@ func (m *GossipRequest) Reset() { *m = GossipRequest{} } func (m *GossipRequest) String() string { return proto.CompactTextString(m) } func (*GossipRequest) ProtoMessage() {} func (*GossipRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{16} + return fileDescriptor_status_048c4708ce8fa32a, []int{16} } func (m *GossipRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,7 +869,7 @@ func (m *EngineStatsInfo) Reset() { *m = EngineStatsInfo{} } func (m *EngineStatsInfo) String() string { return proto.CompactTextString(m) } func (*EngineStatsInfo) ProtoMessage() {} func (*EngineStatsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{17} + return fileDescriptor_status_048c4708ce8fa32a, []int{17} } func (m *EngineStatsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -903,7 +904,7 @@ func (m *EngineStatsRequest) Reset() { *m = EngineStatsRequest{} } func (m *EngineStatsRequest) String() string { return proto.CompactTextString(m) } func (*EngineStatsRequest) ProtoMessage() {} func (*EngineStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{18} + return fileDescriptor_status_048c4708ce8fa32a, []int{18} } func (m *EngineStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -936,7 +937,7 @@ func (m *EngineStatsResponse) Reset() { *m = EngineStatsResponse{} } func (m *EngineStatsResponse) String() string { return proto.CompactTextString(m) } func (*EngineStatsResponse) ProtoMessage() {} func (*EngineStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{19} + return fileDescriptor_status_048c4708ce8fa32a, []int{19} } func (m *EngineStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -970,7 +971,7 @@ func (m *TraceEvent) Reset() { *m = TraceEvent{} } func (m *TraceEvent) String() string { return proto.CompactTextString(m) } func (*TraceEvent) ProtoMessage() {} func (*TraceEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{20} + return fileDescriptor_status_048c4708ce8fa32a, []int{20} } func (m *TraceEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1004,7 +1005,7 @@ func (m *AllocatorDryRun) Reset() { *m = AllocatorDryRun{} } func (m *AllocatorDryRun) String() string { return proto.CompactTextString(m) } func (*AllocatorDryRun) ProtoMessage() {} func (*AllocatorDryRun) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{21} + return fileDescriptor_status_048c4708ce8fa32a, []int{21} } func (m *AllocatorDryRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1037,7 +1038,7 @@ func (m *AllocatorRangeRequest) Reset() { *m = AllocatorRangeRequest{} } func (m *AllocatorRangeRequest) String() string { return proto.CompactTextString(m) } func (*AllocatorRangeRequest) ProtoMessage() {} func (*AllocatorRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{22} + return fileDescriptor_status_048c4708ce8fa32a, []int{22} } func (m *AllocatorRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1073,7 +1074,7 @@ func (m *AllocatorRangeResponse) Reset() { *m = AllocatorRangeResponse{} func (m *AllocatorRangeResponse) String() string { return proto.CompactTextString(m) } func (*AllocatorRangeResponse) ProtoMessage() {} func (*AllocatorRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{23} + return fileDescriptor_status_048c4708ce8fa32a, []int{23} } func (m *AllocatorRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1107,7 +1108,7 @@ func (m *AllocatorRequest) Reset() { *m = AllocatorRequest{} } func (m *AllocatorRequest) String() string { return proto.CompactTextString(m) } func (*AllocatorRequest) ProtoMessage() {} func (*AllocatorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{24} + return fileDescriptor_status_048c4708ce8fa32a, []int{24} } func (m *AllocatorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1140,7 +1141,7 @@ func (m *AllocatorResponse) Reset() { *m = AllocatorResponse{} } func (m *AllocatorResponse) String() string { return proto.CompactTextString(m) } func (*AllocatorResponse) ProtoMessage() {} func (*AllocatorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{25} + return fileDescriptor_status_048c4708ce8fa32a, []int{25} } func (m *AllocatorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1173,7 +1174,7 @@ func (m *JSONResponse) Reset() { *m = JSONResponse{} } func (m *JSONResponse) String() string { return proto.CompactTextString(m) } func (*JSONResponse) ProtoMessage() {} func (*JSONResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{26} + return fileDescriptor_status_048c4708ce8fa32a, []int{26} } func (m *JSONResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1213,7 +1214,7 @@ func (m *LogsRequest) Reset() { *m = LogsRequest{} } func (m *LogsRequest) String() string { return proto.CompactTextString(m) } func (*LogsRequest) ProtoMessage() {} func (*LogsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{27} + return fileDescriptor_status_048c4708ce8fa32a, []int{27} } func (m *LogsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1246,7 +1247,7 @@ func (m *LogEntriesResponse) Reset() { *m = LogEntriesResponse{} } func (m *LogEntriesResponse) String() string { return proto.CompactTextString(m) } func (*LogEntriesResponse) ProtoMessage() {} func (*LogEntriesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{28} + return fileDescriptor_status_048c4708ce8fa32a, []int{28} } func (m *LogEntriesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1281,7 +1282,7 @@ func (m *LogFilesListRequest) Reset() { *m = LogFilesListRequest{} } func (m *LogFilesListRequest) String() string { return proto.CompactTextString(m) } func (*LogFilesListRequest) ProtoMessage() {} func (*LogFilesListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{29} + return fileDescriptor_status_048c4708ce8fa32a, []int{29} } func (m *LogFilesListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1314,7 +1315,7 @@ func (m *LogFilesListResponse) Reset() { *m = LogFilesListResponse{} } func (m *LogFilesListResponse) String() string { return proto.CompactTextString(m) } func (*LogFilesListResponse) ProtoMessage() {} func (*LogFilesListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{30} + return fileDescriptor_status_048c4708ce8fa32a, []int{30} } func (m *LogFilesListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1350,7 +1351,7 @@ func (m *LogFileRequest) Reset() { *m = LogFileRequest{} } func (m *LogFileRequest) String() string { return proto.CompactTextString(m) } func (*LogFileRequest) ProtoMessage() {} func (*LogFileRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{31} + return fileDescriptor_status_048c4708ce8fa32a, []int{31} } func (m *LogFileRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1385,7 +1386,7 @@ func (m *StacksRequest) Reset() { *m = StacksRequest{} } func (m *StacksRequest) String() string { return proto.CompactTextString(m) } func (*StacksRequest) ProtoMessage() {} func (*StacksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{32} + return fileDescriptor_status_048c4708ce8fa32a, []int{32} } func (m *StacksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1421,7 +1422,7 @@ func (m *File) Reset() { *m = File{} } func (m *File) String() string { return proto.CompactTextString(m) } func (*File) ProtoMessage() {} func (*File) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{33} + return fileDescriptor_status_048c4708ce8fa32a, []int{33} } func (m *File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1465,7 +1466,7 @@ func (m *GetFilesRequest) Reset() { *m = GetFilesRequest{} } func (m *GetFilesRequest) String() string { return proto.CompactTextString(m) } func (*GetFilesRequest) ProtoMessage() {} func (*GetFilesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{34} + return fileDescriptor_status_048c4708ce8fa32a, []int{34} } func (m *GetFilesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1498,7 +1499,7 @@ func (m *GetFilesResponse) Reset() { *m = GetFilesResponse{} } func (m *GetFilesResponse) String() string { return proto.CompactTextString(m) } func (*GetFilesResponse) ProtoMessage() {} func (*GetFilesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{35} + return fileDescriptor_status_048c4708ce8fa32a, []int{35} } func (m *GetFilesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1535,7 +1536,7 @@ func (m *ProfileRequest) Reset() { *m = ProfileRequest{} } func (m *ProfileRequest) String() string { return proto.CompactTextString(m) } func (*ProfileRequest) ProtoMessage() {} func (*ProfileRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{36} + return fileDescriptor_status_048c4708ce8fa32a, []int{36} } func (m *ProfileRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1570,7 +1571,7 @@ func (m *MetricsRequest) Reset() { *m = MetricsRequest{} } func (m *MetricsRequest) String() string { return proto.CompactTextString(m) } func (*MetricsRequest) ProtoMessage() {} func (*MetricsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{37} + return fileDescriptor_status_048c4708ce8fa32a, []int{37} } func (m *MetricsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1604,7 +1605,7 @@ func (m *RaftRangeNode) Reset() { *m = RaftRangeNode{} } func (m *RaftRangeNode) String() string { return proto.CompactTextString(m) } func (*RaftRangeNode) ProtoMessage() {} func (*RaftRangeNode) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{38} + return fileDescriptor_status_048c4708ce8fa32a, []int{38} } func (m *RaftRangeNode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1637,7 +1638,7 @@ func (m *RaftRangeError) Reset() { *m = RaftRangeError{} } func (m *RaftRangeError) String() string { return proto.CompactTextString(m) } func (*RaftRangeError) ProtoMessage() {} func (*RaftRangeError) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{39} + return fileDescriptor_status_048c4708ce8fa32a, []int{39} } func (m *RaftRangeError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1672,7 +1673,7 @@ func (m *RaftRangeStatus) Reset() { *m = RaftRangeStatus{} } func (m *RaftRangeStatus) String() string { return proto.CompactTextString(m) } func (*RaftRangeStatus) ProtoMessage() {} func (*RaftRangeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{40} + return fileDescriptor_status_048c4708ce8fa32a, []int{40} } func (m *RaftRangeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1705,7 +1706,7 @@ func (m *RaftDebugRequest) Reset() { *m = RaftDebugRequest{} } func (m *RaftDebugRequest) String() string { return proto.CompactTextString(m) } func (*RaftDebugRequest) ProtoMessage() {} func (*RaftDebugRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{41} + return fileDescriptor_status_048c4708ce8fa32a, []int{41} } func (m *RaftDebugRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1739,7 +1740,7 @@ func (m *RaftDebugResponse) Reset() { *m = RaftDebugResponse{} } func (m *RaftDebugResponse) String() string { return proto.CompactTextString(m) } func (*RaftDebugResponse) ProtoMessage() {} func (*RaftDebugResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{42} + return fileDescriptor_status_048c4708ce8fa32a, []int{42} } func (m *RaftDebugResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1782,7 +1783,7 @@ func (m *ActiveQuery) Reset() { *m = ActiveQuery{} } func (m *ActiveQuery) String() string { return proto.CompactTextString(m) } func (*ActiveQuery) ProtoMessage() {} func (*ActiveQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{43} + return fileDescriptor_status_048c4708ce8fa32a, []int{43} } func (m *ActiveQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1817,7 +1818,7 @@ func (m *ListSessionsRequest) Reset() { *m = ListSessionsRequest{} } func (m *ListSessionsRequest) String() string { return proto.CompactTextString(m) } func (*ListSessionsRequest) ProtoMessage() {} func (*ListSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{44} + return fileDescriptor_status_048c4708ce8fa32a, []int{44} } func (m *ListSessionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1873,7 +1874,7 @@ func (m *Session) Reset() { *m = Session{} } func (m *Session) String() string { return proto.CompactTextString(m) } func (*Session) ProtoMessage() {} func (*Session) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{45} + return fileDescriptor_status_048c4708ce8fa32a, []int{45} } func (m *Session) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1910,7 +1911,7 @@ func (m *ListSessionsError) Reset() { *m = ListSessionsError{} } func (m *ListSessionsError) String() string { return proto.CompactTextString(m) } func (*ListSessionsError) ProtoMessage() {} func (*ListSessionsError) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{46} + return fileDescriptor_status_048c4708ce8fa32a, []int{46} } func (m *ListSessionsError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1947,7 +1948,7 @@ func (m *ListSessionsResponse) Reset() { *m = ListSessionsResponse{} } func (m *ListSessionsResponse) String() string { return proto.CompactTextString(m) } func (*ListSessionsResponse) ProtoMessage() {} func (*ListSessionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{47} + return fileDescriptor_status_048c4708ce8fa32a, []int{47} } func (m *ListSessionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1992,7 +1993,7 @@ func (m *CancelQueryRequest) Reset() { *m = CancelQueryRequest{} } func (m *CancelQueryRequest) String() string { return proto.CompactTextString(m) } func (*CancelQueryRequest) ProtoMessage() {} func (*CancelQueryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{48} + return fileDescriptor_status_048c4708ce8fa32a, []int{48} } func (m *CancelQueryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2029,7 +2030,7 @@ func (m *CancelQueryResponse) Reset() { *m = CancelQueryResponse{} } func (m *CancelQueryResponse) String() string { return proto.CompactTextString(m) } func (*CancelQueryResponse) ProtoMessage() {} func (*CancelQueryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{49} + return fileDescriptor_status_048c4708ce8fa32a, []int{49} } func (m *CancelQueryResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2069,7 +2070,7 @@ func (m *CancelSessionRequest) Reset() { *m = CancelSessionRequest{} } func (m *CancelSessionRequest) String() string { return proto.CompactTextString(m) } func (*CancelSessionRequest) ProtoMessage() {} func (*CancelSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{50} + return fileDescriptor_status_048c4708ce8fa32a, []int{50} } func (m *CancelSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2103,7 +2104,7 @@ func (m *CancelSessionResponse) Reset() { *m = CancelSessionResponse{} } func (m *CancelSessionResponse) String() string { return proto.CompactTextString(m) } func (*CancelSessionResponse) ProtoMessage() {} func (*CancelSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{51} + return fileDescriptor_status_048c4708ce8fa32a, []int{51} } func (m *CancelSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2138,7 +2139,7 @@ func (m *SpanStatsRequest) Reset() { *m = SpanStatsRequest{} } func (m *SpanStatsRequest) String() string { return proto.CompactTextString(m) } func (*SpanStatsRequest) ProtoMessage() {} func (*SpanStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{52} + return fileDescriptor_status_048c4708ce8fa32a, []int{52} } func (m *SpanStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2173,7 +2174,7 @@ func (m *SpanStatsResponse) Reset() { *m = SpanStatsResponse{} } func (m *SpanStatsResponse) String() string { return proto.CompactTextString(m) } func (*SpanStatsResponse) ProtoMessage() {} func (*SpanStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{53} + return fileDescriptor_status_048c4708ce8fa32a, []int{53} } func (m *SpanStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2207,7 +2208,7 @@ func (m *ProblemRangesRequest) Reset() { *m = ProblemRangesRequest{} } func (m *ProblemRangesRequest) String() string { return proto.CompactTextString(m) } func (*ProblemRangesRequest) ProtoMessage() {} func (*ProblemRangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{54} + return fileDescriptor_status_048c4708ce8fa32a, []int{54} } func (m *ProblemRangesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2242,7 +2243,7 @@ func (m *ProblemRangesResponse) Reset() { *m = ProblemRangesResponse{} } func (m *ProblemRangesResponse) String() string { return proto.CompactTextString(m) } func (*ProblemRangesResponse) ProtoMessage() {} func (*ProblemRangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{55} + return fileDescriptor_status_048c4708ce8fa32a, []int{55} } func (m *ProblemRangesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2283,7 +2284,7 @@ func (m *ProblemRangesResponse_NodeProblems) Reset() { *m = ProblemRange func (m *ProblemRangesResponse_NodeProblems) String() string { return proto.CompactTextString(m) } func (*ProblemRangesResponse_NodeProblems) ProtoMessage() {} func (*ProblemRangesResponse_NodeProblems) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{55, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{55, 0} } func (m *ProblemRangesResponse_NodeProblems) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2317,7 +2318,7 @@ func (m *HotRangesRequest) Reset() { *m = HotRangesRequest{} } func (m *HotRangesRequest) String() string { return proto.CompactTextString(m) } func (*HotRangesRequest) ProtoMessage() {} func (*HotRangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{56} + return fileDescriptor_status_048c4708ce8fa32a, []int{56} } func (m *HotRangesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2352,7 +2353,7 @@ func (m *HotRangesResponse) Reset() { *m = HotRangesResponse{} } func (m *HotRangesResponse) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse) ProtoMessage() {} func (*HotRangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{57} + return fileDescriptor_status_048c4708ce8fa32a, []int{57} } func (m *HotRangesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2386,7 +2387,7 @@ func (m *HotRangesResponse_HotRange) Reset() { *m = HotRangesResponse_Ho func (m *HotRangesResponse_HotRange) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse_HotRange) ProtoMessage() {} func (*HotRangesResponse_HotRange) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{57, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{57, 0} } func (m *HotRangesResponse_HotRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2420,7 +2421,7 @@ func (m *HotRangesResponse_StoreResponse) Reset() { *m = HotRangesRespon func (m *HotRangesResponse_StoreResponse) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse_StoreResponse) ProtoMessage() {} func (*HotRangesResponse_StoreResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{57, 1} + return fileDescriptor_status_048c4708ce8fa32a, []int{57, 1} } func (m *HotRangesResponse_StoreResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2454,7 +2455,7 @@ func (m *HotRangesResponse_NodeResponse) Reset() { *m = HotRangesRespons func (m *HotRangesResponse_NodeResponse) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse_NodeResponse) ProtoMessage() {} func (*HotRangesResponse_NodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{57, 2} + return fileDescriptor_status_048c4708ce8fa32a, []int{57, 2} } func (m *HotRangesResponse_NodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2487,7 +2488,7 @@ func (m *RangeRequest) Reset() { *m = RangeRequest{} } func (m *RangeRequest) String() string { return proto.CompactTextString(m) } func (*RangeRequest) ProtoMessage() {} func (*RangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{58} + return fileDescriptor_status_048c4708ce8fa32a, []int{58} } func (m *RangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2523,7 +2524,7 @@ func (m *RangeResponse) Reset() { *m = RangeResponse{} } func (m *RangeResponse) String() string { return proto.CompactTextString(m) } func (*RangeResponse) ProtoMessage() {} func (*RangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{59} + return fileDescriptor_status_048c4708ce8fa32a, []int{59} } func (m *RangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2558,7 +2559,7 @@ func (m *RangeResponse_NodeResponse) Reset() { *m = RangeResponse_NodeRe func (m *RangeResponse_NodeResponse) String() string { return proto.CompactTextString(m) } func (*RangeResponse_NodeResponse) ProtoMessage() {} func (*RangeResponse_NodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{59, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{59, 0} } func (m *RangeResponse_NodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2594,7 +2595,7 @@ func (m *DiagnosticsRequest) Reset() { *m = DiagnosticsRequest{} } func (m *DiagnosticsRequest) String() string { return proto.CompactTextString(m) } func (*DiagnosticsRequest) ProtoMessage() {} func (*DiagnosticsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{60} + return fileDescriptor_status_048c4708ce8fa32a, []int{60} } func (m *DiagnosticsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2629,7 +2630,7 @@ func (m *StoresRequest) Reset() { *m = StoresRequest{} } func (m *StoresRequest) String() string { return proto.CompactTextString(m) } func (*StoresRequest) ProtoMessage() {} func (*StoresRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{61} + return fileDescriptor_status_048c4708ce8fa32a, []int{61} } func (m *StoresRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2672,7 +2673,7 @@ func (m *StoreDetails) Reset() { *m = StoreDetails{} } func (m *StoreDetails) String() string { return proto.CompactTextString(m) } func (*StoreDetails) ProtoMessage() {} func (*StoreDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{62} + return fileDescriptor_status_048c4708ce8fa32a, []int{62} } func (m *StoreDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2705,7 +2706,7 @@ func (m *StoresResponse) Reset() { *m = StoresResponse{} } func (m *StoresResponse) String() string { return proto.CompactTextString(m) } func (*StoresResponse) ProtoMessage() {} func (*StoresResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{63} + return fileDescriptor_status_048c4708ce8fa32a, []int{63} } func (m *StoresResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2738,7 +2739,7 @@ func (m *StatementsRequest) Reset() { *m = StatementsRequest{} } func (m *StatementsRequest) String() string { return proto.CompactTextString(m) } func (*StatementsRequest) ProtoMessage() {} func (*StatementsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{64} + return fileDescriptor_status_048c4708ce8fa32a, []int{64} } func (m *StatementsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2776,7 +2777,7 @@ func (m *StatementsResponse) Reset() { *m = StatementsResponse{} } func (m *StatementsResponse) String() string { return proto.CompactTextString(m) } func (*StatementsResponse) ProtoMessage() {} func (*StatementsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{65} + return fileDescriptor_status_048c4708ce8fa32a, []int{65} } func (m *StatementsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2814,7 +2815,7 @@ func (m *StatementsResponse_ExtendedStatementStatisticsKey) String() string { } func (*StatementsResponse_ExtendedStatementStatisticsKey) ProtoMessage() {} func (*StatementsResponse_ExtendedStatementStatisticsKey) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{65, 0} + return fileDescriptor_status_048c4708ce8fa32a, []int{65, 0} } func (m *StatementsResponse_ExtendedStatementStatisticsKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2852,7 +2853,7 @@ func (m *StatementsResponse_CollectedStatementStatistics) String() string { } func (*StatementsResponse_CollectedStatementStatistics) ProtoMessage() {} func (*StatementsResponse_CollectedStatementStatistics) Descriptor() ([]byte, []int) { - return fileDescriptor_status_bdd8fe6aa834ce5c, []int{65, 1} + return fileDescriptor_status_048c4708ce8fa32a, []int{65, 1} } func (m *StatementsResponse_CollectedStatementStatistics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4270,6 +4271,14 @@ func (m *DetailsResponse) MarshalTo(dAtA []byte) (int, error) { return 0, err } i += n3 + dAtA[i] = 0x2a + i++ + i = encodeVarintStatus(dAtA, i, uint64(m.SQLAddress.Size())) + n4, err := m.SQLAddress.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 return i, nil } @@ -4368,11 +4377,11 @@ func (m *RaftState) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64(m.HardState.Size())) - n4, err := m.HardState.MarshalTo(dAtA[i:]) + n5, err := m.HardState.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n4 + i += n5 if m.Lead != 0 { dAtA[i] = 0x18 i++ @@ -4412,11 +4421,11 @@ func (m *RaftState) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64((&v).Size())) - n5, err := (&v).MarshalTo(dAtA[i:]) + n6, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n5 + i += n6 } } if m.LeadTransferee != 0 { @@ -4652,27 +4661,27 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintStatus(dAtA, i, uint64(m.Span.Size())) - n6, err := m.Span.MarshalTo(dAtA[i:]) + n7, err := m.Span.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n6 + i += n7 dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64(m.RaftState.Size())) - n7, err := m.RaftState.MarshalTo(dAtA[i:]) + n8, err := m.RaftState.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n7 + i += n8 dAtA[i] = 0x22 i++ i = encodeVarintStatus(dAtA, i, uint64(m.State.Size())) - n8, err := m.State.MarshalTo(dAtA[i:]) + n9, err := m.State.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n8 + i += n9 if m.SourceNodeID != 0 { dAtA[i] = 0x28 i++ @@ -4704,43 +4713,43 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x4a i++ i = encodeVarintStatus(dAtA, i, uint64(m.Problems.Size())) - n9, err := m.Problems.MarshalTo(dAtA[i:]) + n10, err := m.Problems.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n9 + i += n10 dAtA[i] = 0x52 i++ i = encodeVarintStatus(dAtA, i, uint64(m.Stats.Size())) - n10, err := m.Stats.MarshalTo(dAtA[i:]) + n11, err := m.Stats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n10 + i += n11 dAtA[i] = 0x5a i++ i = encodeVarintStatus(dAtA, i, uint64(m.LatchesLocal.Size())) - n11, err := m.LatchesLocal.MarshalTo(dAtA[i:]) + n12, err := m.LatchesLocal.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n11 + i += n12 dAtA[i] = 0x62 i++ i = encodeVarintStatus(dAtA, i, uint64(m.LatchesGlobal.Size())) - n12, err := m.LatchesGlobal.MarshalTo(dAtA[i:]) + n13, err := m.LatchesGlobal.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n12 + i += n13 dAtA[i] = 0x6a i++ i = encodeVarintStatus(dAtA, i, uint64(m.LeaseStatus.Size())) - n13, err := m.LeaseStatus.MarshalTo(dAtA[i:]) + n14, err := m.LeaseStatus.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n13 + i += n14 if m.Quiescent { dAtA[i] = 0x70 i++ @@ -4786,22 +4795,22 @@ func (m *RangesRequest) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.NodeId) } if len(m.RangeIDs) > 0 { - dAtA15 := make([]byte, len(m.RangeIDs)*10) - var j14 int + dAtA16 := make([]byte, len(m.RangeIDs)*10) + var j15 int for _, num1 := range m.RangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA15[j14] = uint8(uint64(num)&0x7f | 0x80) + dAtA16[j15] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j14++ + j15++ } - dAtA15[j14] = uint8(num) - j14++ + dAtA16[j15] = uint8(num) + j15++ } dAtA[i] = 0x12 i++ - i = encodeVarintStatus(dAtA, i, uint64(j14)) - i += copy(dAtA[i:], dAtA15[:j14]) + i = encodeVarintStatus(dAtA, i, uint64(j15)) + i += copy(dAtA[i:], dAtA16[:j15]) } return i, nil } @@ -4884,11 +4893,11 @@ func (m *EngineStatsInfo) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64(m.TickersAndHistograms.Size())) - n16, err := m.TickersAndHistograms.MarshalTo(dAtA[i:]) + n17, err := m.TickersAndHistograms.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n16 + i += n17 } return i, nil } @@ -4965,11 +4974,11 @@ func (m *TraceEvent) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintStatus(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Time))) - n17, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i:]) + n18, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i:]) if err != nil { return 0, err } - i += n17 + i += n18 if len(m.Message) > 0 { dAtA[i] = 0x12 i++ @@ -5061,11 +5070,11 @@ func (m *AllocatorRangeResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64(m.DryRun.Size())) - n18, err := m.DryRun.MarshalTo(dAtA[i:]) + n19, err := m.DryRun.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n18 + i += n19 } return i, nil } @@ -5092,22 +5101,22 @@ func (m *AllocatorRequest) MarshalTo(dAtA []byte) (int, error) { i += copy(dAtA[i:], m.NodeId) } if len(m.RangeIDs) > 0 { - dAtA20 := make([]byte, len(m.RangeIDs)*10) - var j19 int + dAtA21 := make([]byte, len(m.RangeIDs)*10) + var j20 int for _, num1 := range m.RangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA20[j19] = uint8(uint64(num)&0x7f | 0x80) + dAtA21[j20] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j19++ + j20++ } - dAtA20[j19] = uint8(num) - j19++ + dAtA21[j20] = uint8(num) + j20++ } dAtA[i] = 0x12 i++ - i = encodeVarintStatus(dAtA, i, uint64(j19)) - i += copy(dAtA[i:], dAtA20[:j19]) + i = encodeVarintStatus(dAtA, i, uint64(j20)) + i += copy(dAtA[i:], dAtA21[:j20]) } return i, nil } @@ -5553,11 +5562,11 @@ func (m *RaftRangeNode) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64(m.Range.Size())) - n21, err := m.Range.MarshalTo(dAtA[i:]) + n22, err := m.Range.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n21 + i += n22 return i, nil } @@ -5648,22 +5657,22 @@ func (m *RaftDebugRequest) MarshalTo(dAtA []byte) (int, error) { var l int _ = l if len(m.RangeIDs) > 0 { - dAtA23 := make([]byte, len(m.RangeIDs)*10) - var j22 int + dAtA24 := make([]byte, len(m.RangeIDs)*10) + var j23 int for _, num1 := range m.RangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA23[j22] = uint8(uint64(num)&0x7f | 0x80) + dAtA24[j23] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j22++ + j23++ } - dAtA23[j22] = uint8(num) - j22++ + dAtA24[j23] = uint8(num) + j23++ } dAtA[i] = 0xa i++ - i = encodeVarintStatus(dAtA, i, uint64(j22)) - i += copy(dAtA[i:], dAtA23[:j22]) + i = encodeVarintStatus(dAtA, i, uint64(j23)) + i += copy(dAtA[i:], dAtA24[:j23]) } return i, nil } @@ -5706,11 +5715,11 @@ func (m *RaftDebugResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64((&v).Size())) - n24, err := (&v).MarshalTo(dAtA[i:]) + n25, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n24 + i += n25 } } if len(m.Errors) > 0 { @@ -5758,11 +5767,11 @@ func (m *ActiveQuery) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintStatus(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Start))) - n25, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) + n26, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) if err != nil { return 0, err } - i += n25 + i += n26 if m.IsDistributed { dAtA[i] = 0x20 i++ @@ -5858,20 +5867,20 @@ func (m *Session) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintStatus(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Start))) - n26, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) + n27, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) if err != nil { return 0, err } - i += n26 + i += n27 if m.KvTxnID != nil { dAtA[i] = 0x3a i++ i = encodeVarintStatus(dAtA, i, uint64(m.KvTxnID.Size())) - n27, err := m.KvTxnID.MarshalTo(dAtA[i:]) + n28, err := m.KvTxnID.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n27 + i += n28 } if len(m.LastActiveQuery) > 0 { dAtA[i] = 0x42 @@ -6163,11 +6172,11 @@ func (m *SpanStatsResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintStatus(dAtA, i, uint64(m.TotalStats.Size())) - n28, err := m.TotalStats.MarshalTo(dAtA[i:]) + n29, err := m.TotalStats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n29 if m.RangeCount != 0 { dAtA[i] = 0x10 i++ @@ -6248,11 +6257,11 @@ func (m *ProblemRangesResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64((&v).Size())) - n29, err := (&v).MarshalTo(dAtA[i:]) + n30, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n30 } } return i, nil @@ -6280,148 +6289,148 @@ func (m *ProblemRangesResponse_NodeProblems) MarshalTo(dAtA []byte) (int, error) i += copy(dAtA[i:], m.ErrorMessage) } if len(m.UnavailableRangeIDs) > 0 { - dAtA31 := make([]byte, len(m.UnavailableRangeIDs)*10) - var j30 int + dAtA32 := make([]byte, len(m.UnavailableRangeIDs)*10) + var j31 int for _, num1 := range m.UnavailableRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA31[j30] = uint8(uint64(num)&0x7f | 0x80) + dAtA32[j31] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j30++ + j31++ } - dAtA31[j30] = uint8(num) - j30++ + dAtA32[j31] = uint8(num) + j31++ } dAtA[i] = 0x12 i++ - i = encodeVarintStatus(dAtA, i, uint64(j30)) - i += copy(dAtA[i:], dAtA31[:j30]) + i = encodeVarintStatus(dAtA, i, uint64(j31)) + i += copy(dAtA[i:], dAtA32[:j31]) } if len(m.RaftLeaderNotLeaseHolderRangeIDs) > 0 { - dAtA33 := make([]byte, len(m.RaftLeaderNotLeaseHolderRangeIDs)*10) - var j32 int + dAtA34 := make([]byte, len(m.RaftLeaderNotLeaseHolderRangeIDs)*10) + var j33 int for _, num1 := range m.RaftLeaderNotLeaseHolderRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA33[j32] = uint8(uint64(num)&0x7f | 0x80) + dAtA34[j33] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j32++ + j33++ } - dAtA33[j32] = uint8(num) - j32++ + dAtA34[j33] = uint8(num) + j33++ } dAtA[i] = 0x1a i++ - i = encodeVarintStatus(dAtA, i, uint64(j32)) - i += copy(dAtA[i:], dAtA33[:j32]) + i = encodeVarintStatus(dAtA, i, uint64(j33)) + i += copy(dAtA[i:], dAtA34[:j33]) } if len(m.NoRaftLeaderRangeIDs) > 0 { - dAtA35 := make([]byte, len(m.NoRaftLeaderRangeIDs)*10) - var j34 int + dAtA36 := make([]byte, len(m.NoRaftLeaderRangeIDs)*10) + var j35 int for _, num1 := range m.NoRaftLeaderRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA35[j34] = uint8(uint64(num)&0x7f | 0x80) + dAtA36[j35] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j34++ + j35++ } - dAtA35[j34] = uint8(num) - j34++ + dAtA36[j35] = uint8(num) + j35++ } dAtA[i] = 0x22 i++ - i = encodeVarintStatus(dAtA, i, uint64(j34)) - i += copy(dAtA[i:], dAtA35[:j34]) + i = encodeVarintStatus(dAtA, i, uint64(j35)) + i += copy(dAtA[i:], dAtA36[:j35]) } if len(m.NoLeaseRangeIDs) > 0 { - dAtA37 := make([]byte, len(m.NoLeaseRangeIDs)*10) - var j36 int + dAtA38 := make([]byte, len(m.NoLeaseRangeIDs)*10) + var j37 int for _, num1 := range m.NoLeaseRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA37[j36] = uint8(uint64(num)&0x7f | 0x80) + dAtA38[j37] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j36++ + j37++ } - dAtA37[j36] = uint8(num) - j36++ + dAtA38[j37] = uint8(num) + j37++ } dAtA[i] = 0x2a i++ - i = encodeVarintStatus(dAtA, i, uint64(j36)) - i += copy(dAtA[i:], dAtA37[:j36]) + i = encodeVarintStatus(dAtA, i, uint64(j37)) + i += copy(dAtA[i:], dAtA38[:j37]) } if len(m.UnderreplicatedRangeIDs) > 0 { - dAtA39 := make([]byte, len(m.UnderreplicatedRangeIDs)*10) - var j38 int + dAtA40 := make([]byte, len(m.UnderreplicatedRangeIDs)*10) + var j39 int for _, num1 := range m.UnderreplicatedRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA39[j38] = uint8(uint64(num)&0x7f | 0x80) + dAtA40[j39] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j38++ + j39++ } - dAtA39[j38] = uint8(num) - j38++ + dAtA40[j39] = uint8(num) + j39++ } dAtA[i] = 0x32 i++ - i = encodeVarintStatus(dAtA, i, uint64(j38)) - i += copy(dAtA[i:], dAtA39[:j38]) + i = encodeVarintStatus(dAtA, i, uint64(j39)) + i += copy(dAtA[i:], dAtA40[:j39]) } if len(m.QuiescentEqualsTickingRangeIDs) > 0 { - dAtA41 := make([]byte, len(m.QuiescentEqualsTickingRangeIDs)*10) - var j40 int + dAtA42 := make([]byte, len(m.QuiescentEqualsTickingRangeIDs)*10) + var j41 int for _, num1 := range m.QuiescentEqualsTickingRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA41[j40] = uint8(uint64(num)&0x7f | 0x80) + dAtA42[j41] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j40++ + j41++ } - dAtA41[j40] = uint8(num) - j40++ + dAtA42[j41] = uint8(num) + j41++ } dAtA[i] = 0x3a i++ - i = encodeVarintStatus(dAtA, i, uint64(j40)) - i += copy(dAtA[i:], dAtA41[:j40]) + i = encodeVarintStatus(dAtA, i, uint64(j41)) + i += copy(dAtA[i:], dAtA42[:j41]) } if len(m.RaftLogTooLargeRangeIDs) > 0 { - dAtA43 := make([]byte, len(m.RaftLogTooLargeRangeIDs)*10) - var j42 int + dAtA44 := make([]byte, len(m.RaftLogTooLargeRangeIDs)*10) + var j43 int for _, num1 := range m.RaftLogTooLargeRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA43[j42] = uint8(uint64(num)&0x7f | 0x80) + dAtA44[j43] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j42++ + j43++ } - dAtA43[j42] = uint8(num) - j42++ + dAtA44[j43] = uint8(num) + j43++ } dAtA[i] = 0x42 i++ - i = encodeVarintStatus(dAtA, i, uint64(j42)) - i += copy(dAtA[i:], dAtA43[:j42]) + i = encodeVarintStatus(dAtA, i, uint64(j43)) + i += copy(dAtA[i:], dAtA44[:j43]) } if len(m.OverreplicatedRangeIDs) > 0 { - dAtA45 := make([]byte, len(m.OverreplicatedRangeIDs)*10) - var j44 int + dAtA46 := make([]byte, len(m.OverreplicatedRangeIDs)*10) + var j45 int for _, num1 := range m.OverreplicatedRangeIDs { num := uint64(num1) for num >= 1<<7 { - dAtA45[j44] = uint8(uint64(num)&0x7f | 0x80) + dAtA46[j45] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j44++ + j45++ } - dAtA45[j44] = uint8(num) - j44++ + dAtA46[j45] = uint8(num) + j45++ } dAtA[i] = 0x4a i++ - i = encodeVarintStatus(dAtA, i, uint64(j44)) - i += copy(dAtA[i:], dAtA45[:j44]) + i = encodeVarintStatus(dAtA, i, uint64(j45)) + i += copy(dAtA[i:], dAtA46[:j45]) } return i, nil } @@ -6493,11 +6502,11 @@ func (m *HotRangesResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64((&v).Size())) - n46, err := (&v).MarshalTo(dAtA[i:]) + n47, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n46 + i += n47 } } return i, nil @@ -6521,11 +6530,11 @@ func (m *HotRangesResponse_HotRange) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintStatus(dAtA, i, uint64(m.Desc.Size())) - n47, err := m.Desc.MarshalTo(dAtA[i:]) + n48, err := m.Desc.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n47 + i += n48 if m.QueriesPerSecond != 0 { dAtA[i] = 0x11 i++ @@ -6677,11 +6686,11 @@ func (m *RangeResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64((&v).Size())) - n48, err := (&v).MarshalTo(dAtA[i:]) + n49, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n48 + i += n49 } } return i, nil @@ -6914,11 +6923,11 @@ func (m *StatementsResponse) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintStatus(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.LastReset))) - n49, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastReset, dAtA[i:]) + n50, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastReset, dAtA[i:]) if err != nil { return 0, err } - i += n49 + i += n50 if len(m.InternalAppNamePrefix) > 0 { dAtA[i] = 0x22 i++ @@ -6946,11 +6955,11 @@ func (m *StatementsResponse_ExtendedStatementStatisticsKey) MarshalTo(dAtA []byt dAtA[i] = 0xa i++ i = encodeVarintStatus(dAtA, i, uint64(m.KeyData.Size())) - n50, err := m.KeyData.MarshalTo(dAtA[i:]) + n51, err := m.KeyData.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n50 + i += n51 if m.NodeID != 0 { dAtA[i] = 0x10 i++ @@ -6977,19 +6986,19 @@ func (m *StatementsResponse_CollectedStatementStatistics) MarshalTo(dAtA []byte) dAtA[i] = 0xa i++ i = encodeVarintStatus(dAtA, i, uint64(m.Key.Size())) - n51, err := m.Key.MarshalTo(dAtA[i:]) + n52, err := m.Key.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n51 + i += n52 dAtA[i] = 0x12 i++ i = encodeVarintStatus(dAtA, i, uint64(m.Stats.Size())) - n52, err := m.Stats.MarshalTo(dAtA[i:]) + n53, err := m.Stats.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n52 + i += n53 return i, nil } @@ -7153,6 +7162,8 @@ func (m *DetailsResponse) Size() (n int) { n += 1 + l + sovStatus(uint64(l)) l = m.SystemInfo.Size() n += 1 + l + sovStatus(uint64(l)) + l = m.SQLAddress.Size() + n += 1 + l + sovStatus(uint64(l)) return n } @@ -9435,6 +9446,36 @@ func (m *DetailsResponse) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SQLAddress", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStatus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStatus + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SQLAddress.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipStatus(dAtA[iNdEx:]) @@ -18394,325 +18435,326 @@ var ( ) func init() { - proto.RegisterFile("server/serverpb/status.proto", fileDescriptor_status_bdd8fe6aa834ce5c) + proto.RegisterFile("server/serverpb/status.proto", fileDescriptor_status_048c4708ce8fa32a) } -var fileDescriptor_status_bdd8fe6aa834ce5c = []byte{ - // 5046 bytes of a gzipped FileDescriptorProto +var fileDescriptor_status_048c4708ce8fa32a = []byte{ + // 5071 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5c, 0x5f, 0x6c, 0x1c, 0xc7, 0x79, 0xd7, 0x92, 0x77, 0xc7, 0xbb, 0x8f, 0xff, 0x8e, 0x43, 0x8a, 0x3a, 0x9d, 0x64, 0x9e, 0xb2, 0x92, 0x65, 0x4a, 0xb6, 0xee, 0x62, 0xc5, 0xae, 0x15, 0x35, 0x8e, 0xcd, 0x7f, 0x92, 0x28, 0xd1, - 0x14, 0xbd, 0x24, 0x9b, 0x54, 0x68, 0xb3, 0x5d, 0xde, 0x0e, 0x8f, 0x1b, 0xee, 0xed, 0x9e, 0x76, - 0xf7, 0x58, 0x5d, 0x0c, 0x27, 0xae, 0x8b, 0xf4, 0x4f, 0xda, 0xa6, 0x89, 0xfb, 0x07, 0x79, 0x68, - 0x81, 0x22, 0x0f, 0x6d, 0x5f, 0x5a, 0xa4, 0xe8, 0x43, 0xd1, 0xa7, 0x02, 0x45, 0xd1, 0x18, 0x28, - 0x50, 0xa4, 0x68, 0x1f, 0x82, 0x16, 0xa0, 0x53, 0xba, 0x0f, 0x7d, 0xee, 0x63, 0x80, 0x02, 0xc5, - 0x7c, 0x33, 0xbb, 0x37, 0x7b, 0x77, 0xdc, 0x3b, 0x8a, 0x96, 0xd1, 0x07, 0x9b, 0x37, 0x33, 0xdf, - 0x7c, 0xf3, 0x9b, 0x6f, 0xbe, 0xf9, 0xe6, 0x9b, 0xef, 0x9b, 0x15, 0x5c, 0xf4, 0xa9, 0x77, 0x40, - 0xbd, 0x0a, 0xff, 0xd3, 0xd8, 0xa9, 0xf8, 0x81, 0x11, 0x34, 0xfd, 0x72, 0xc3, 0x73, 0x03, 0x97, - 0x9c, 0xaf, 0xba, 0xd5, 0x7d, 0xcf, 0x35, 0xaa, 0x7b, 0x65, 0x4e, 0x50, 0x0e, 0xe9, 0x8a, 0xf9, - 0x9d, 0xa6, 0x65, 0x9b, 0x15, 0xcb, 0xd9, 0x75, 0x39, 0x71, 0x71, 0xba, 0xe6, 0xfa, 0xbe, 0xd5, - 0xa8, 0xf0, 0x3f, 0xa2, 0xf2, 0x1c, 0xf6, 0x6e, 0xec, 0x54, 0x8c, 0x46, 0x43, 0x67, 0xbc, 0x05, - 0xeb, 0x22, 0x09, 0x1b, 0x4c, 0x23, 0x30, 0x44, 0xdd, 0x6c, 0x58, 0x57, 0xa7, 0x81, 0x21, 0xd5, - 0x5f, 0x15, 0x20, 0x4d, 0xcb, 0xa8, 0x39, 0xae, 0x1f, 0x58, 0x55, 0x9f, 0x75, 0x6c, 0x97, 0x04, - 0xdd, 0xe5, 0x70, 0x32, 0x38, 0x07, 0xf1, 0xa7, 0x63, 0x4e, 0x45, 0xd5, 0x0f, 0x5c, 0xcf, 0xa8, - 0xd1, 0x0a, 0x75, 0x6a, 0x96, 0x13, 0xfe, 0x61, 0x83, 0x1e, 0x54, 0xab, 0x82, 0xe6, 0xf9, 0xe3, - 0x68, 0x3c, 0xb7, 0xba, 0xef, 0x9b, 0x3b, 0x82, 0xec, 0x4a, 0x48, 0x26, 0xfe, 0x36, 0x76, 0x2a, - 0x36, 0x35, 0x7c, 0xaa, 0xc7, 0x06, 0x7c, 0xae, 0x9b, 0x8a, 0xb5, 0xd3, 0x50, 0x10, 0xcd, 0xc0, - 0xb2, 0x2b, 0xb6, 0x5b, 0x63, 0xff, 0x89, 0xba, 0x22, 0xd6, 0x35, 0x1d, 0x8f, 0xfa, 0xae, 0x7d, - 0x40, 0x4d, 0xdd, 0x30, 0x4d, 0x4f, 0xb4, 0x5d, 0xa0, 0x41, 0xd5, 0xac, 0x78, 0xc6, 0x6e, 0x80, - 0xff, 0x63, 0xa0, 0x8c, 0xdd, 0x40, 0x34, 0xce, 0xd4, 0xdc, 0x9a, 0x8b, 0x3f, 0x2b, 0xec, 0x97, - 0xa8, 0xbd, 0x58, 0x73, 0xdd, 0x9a, 0x4d, 0x2b, 0x46, 0xc3, 0xaa, 0x18, 0x8e, 0xe3, 0x06, 0x46, - 0x60, 0xb9, 0x4e, 0x88, 0xaf, 0x24, 0x5a, 0xb1, 0xb4, 0xd3, 0xdc, 0xad, 0x04, 0x56, 0x9d, 0xfa, - 0x81, 0x51, 0x17, 0x6b, 0xa8, 0x96, 0x61, 0x7a, 0x89, 0x7a, 0x81, 0xb5, 0x6b, 0x55, 0x8d, 0x80, - 0xfa, 0x1a, 0x7d, 0xdc, 0xa4, 0x7e, 0x40, 0xce, 0xc1, 0x88, 0xe3, 0x9a, 0x54, 0xb7, 0xcc, 0x82, - 0x72, 0x49, 0x99, 0xcf, 0x69, 0x19, 0x56, 0x5c, 0x35, 0xd5, 0xff, 0x4d, 0x01, 0x91, 0x3a, 0x2c, - 0xd3, 0xc0, 0xb0, 0x6c, 0x9f, 0xbc, 0x0d, 0xa9, 0xa0, 0xd5, 0xa0, 0x48, 0x3c, 0x71, 0xf3, 0xf5, - 0xf2, 0xb1, 0xba, 0x55, 0xee, 0xee, 0x2c, 0x57, 0x6d, 0xb5, 0x1a, 0x54, 0x43, 0x56, 0xe4, 0x32, - 0x8c, 0x53, 0xcf, 0x73, 0x3d, 0xbd, 0x4e, 0x7d, 0xdf, 0xa8, 0xd1, 0xc2, 0x10, 0x02, 0x19, 0xc3, - 0xca, 0xb7, 0x78, 0x1d, 0x21, 0x90, 0x62, 0xba, 0x54, 0x18, 0xbe, 0xa4, 0xcc, 0x8f, 0x69, 0xf8, - 0x9b, 0x68, 0x90, 0xd9, 0xb5, 0xa8, 0x6d, 0xfa, 0x85, 0xd4, 0xa5, 0xe1, 0xf9, 0xd1, 0x9b, 0xaf, - 0x9c, 0x0c, 0xcd, 0x1d, 0xec, 0xbb, 0x98, 0xfa, 0xf0, 0xb0, 0x74, 0x46, 0x13, 0x9c, 0x8a, 0x7f, - 0x3d, 0x04, 0x19, 0xde, 0x40, 0x66, 0x21, 0x63, 0xf9, 0x7e, 0x93, 0x7a, 0xa1, 0x64, 0x78, 0x89, - 0x14, 0x60, 0xc4, 0x6f, 0xee, 0x7c, 0x95, 0x56, 0x03, 0x81, 0x34, 0x2c, 0x92, 0xe7, 0x00, 0x0e, - 0x0c, 0xdb, 0x32, 0xf5, 0x5d, 0xcf, 0xad, 0x23, 0xd4, 0x61, 0x2d, 0x87, 0x35, 0x77, 0x3c, 0xb7, - 0x4e, 0x4a, 0x30, 0xca, 0x9b, 0x9b, 0x4e, 0x60, 0xd9, 0x85, 0x14, 0xb6, 0xf3, 0x1e, 0xdb, 0xac, - 0x86, 0x5c, 0x84, 0x1c, 0xd3, 0x11, 0xea, 0xfb, 0xd4, 0x2f, 0xa4, 0x2f, 0x0d, 0xcf, 0xe7, 0xb4, - 0x76, 0x05, 0xa9, 0xc0, 0xb4, 0x6f, 0xd5, 0x1c, 0x23, 0x68, 0x7a, 0x54, 0x37, 0xec, 0x9a, 0xeb, - 0x59, 0xc1, 0x5e, 0xbd, 0x90, 0x41, 0x0c, 0x24, 0x6a, 0x5a, 0x08, 0x5b, 0x18, 0x9c, 0x46, 0x73, - 0xc7, 0xb6, 0xaa, 0xfa, 0x3e, 0x6d, 0x15, 0x46, 0x90, 0x2e, 0xc7, 0x6b, 0x1e, 0xd0, 0x16, 0xb9, - 0x00, 0xb9, 0x7d, 0xda, 0xd2, 0x9b, 0x28, 0xf3, 0x2c, 0x8e, 0x96, 0xdd, 0xa7, 0xad, 0x6d, 0x94, - 0xf7, 0x4b, 0x40, 0xe8, 0x93, 0x80, 0x3a, 0x26, 0x35, 0xf5, 0x36, 0x55, 0x0e, 0xa9, 0xf2, 0x61, - 0xcb, 0x03, 0x41, 0xad, 0xbe, 0x0d, 0x93, 0x1d, 0x6b, 0x4b, 0x32, 0x30, 0xb4, 0xb4, 0x90, 0x3f, - 0x43, 0xb2, 0x90, 0x5a, 0x7f, 0xb8, 0xbc, 0x92, 0x57, 0xc8, 0x38, 0xe4, 0x96, 0xd6, 0x56, 0x57, - 0xd6, 0xb7, 0xf4, 0xa5, 0x85, 0xfc, 0x10, 0x01, 0xc8, 0xf0, 0x62, 0x7e, 0x98, 0xe4, 0x20, 0xbd, - 0xbd, 0xca, 0xaa, 0x53, 0xac, 0xdf, 0xf6, 0x6a, 0x3e, 0xad, 0xba, 0x30, 0x13, 0xd7, 0x57, 0xbf, - 0xe1, 0x3a, 0x3e, 0x25, 0x5f, 0x82, 0xb1, 0xaa, 0x54, 0x5f, 0x50, 0x70, 0xe9, 0x6f, 0x9c, 0x68, - 0xe9, 0xc5, 0x9a, 0xc7, 0x18, 0xa9, 0x6f, 0xc0, 0x84, 0x68, 0xee, 0xb7, 0x37, 0xc8, 0x0c, 0xa4, - 0x3d, 0x6a, 0x98, 0x2d, 0x5c, 0xff, 0xac, 0xc6, 0x0b, 0xea, 0x3a, 0xc0, 0x66, 0xcb, 0x0f, 0x68, - 0x7d, 0xd5, 0xd9, 0x75, 0xd9, 0x62, 0xfb, 0x58, 0xd2, 0x99, 0x75, 0x15, 0x0c, 0xc0, 0x8f, 0x11, - 0xec, 0x53, 0xcf, 0xa1, 0x36, 0x27, 0xe0, 0xaa, 0x04, 0xbc, 0x8a, 0x11, 0xa8, 0x7f, 0x33, 0x04, - 0x93, 0x11, 0x22, 0x31, 0xfb, 0x47, 0x71, 0x48, 0xe9, 0xc5, 0x85, 0xa3, 0xc3, 0x52, 0x66, 0x9d, - 0xc1, 0x5a, 0xfe, 0xe9, 0x61, 0xe9, 0x73, 0x35, 0x2b, 0xd8, 0x6b, 0xee, 0x94, 0xab, 0x6e, 0xbd, - 0x12, 0x09, 0xc4, 0xdc, 0x69, 0xff, 0xae, 0x34, 0xf6, 0x6b, 0x15, 0x61, 0xa0, 0xcb, 0xbc, 0x5b, - 0x34, 0xab, 0x2f, 0xc2, 0x88, 0x50, 0x36, 0x04, 0x33, 0x7a, 0x73, 0x4e, 0x12, 0x2a, 0xb3, 0x65, - 0xe5, 0xed, 0xc8, 0x96, 0x2d, 0x98, 0xa6, 0x27, 0xa4, 0x18, 0x76, 0x22, 0xb7, 0x01, 0xf0, 0x38, - 0xe1, 0xf3, 0x19, 0x46, 0x16, 0x67, 0x25, 0x16, 0xd8, 0x58, 0x66, 0x53, 0x13, 0x3d, 0x73, 0x58, - 0x83, 0xc2, 0x58, 0x8b, 0x4b, 0x2b, 0x85, 0x9d, 0x9f, 0x4f, 0x58, 0xd4, 0xb6, 0xa4, 0x05, 0x33, - 0x49, 0xb4, 0xea, 0x04, 0x8c, 0xb1, 0xb9, 0x85, 0x0b, 0xa9, 0xfe, 0x3c, 0x8c, 0x8b, 0xb2, 0x10, - 0xe3, 0x3d, 0x48, 0xb3, 0x49, 0x87, 0xda, 0xf3, 0x52, 0x8f, 0x81, 0xb8, 0xf1, 0x0f, 0x4f, 0x1f, - 0x94, 0xd5, 0x26, 0x16, 0xc4, 0x78, 0x9c, 0x81, 0x7a, 0x15, 0x46, 0x59, 0x53, 0x5f, 0x73, 0xfa, - 0x83, 0x14, 0xe4, 0x34, 0x63, 0x37, 0x60, 0x3c, 0xd8, 0xee, 0x02, 0x8f, 0x36, 0x6c, 0xab, 0x6a, - 0x84, 0x94, 0xa9, 0xc5, 0xf1, 0xa3, 0xc3, 0x52, 0x4e, 0xe3, 0xb5, 0xab, 0xcb, 0x5a, 0x4e, 0x10, - 0xac, 0x9a, 0xe4, 0x67, 0x00, 0xf6, 0x0c, 0xcf, 0xc4, 0x03, 0x89, 0x8a, 0xb5, 0x99, 0x2a, 0xf3, - 0x73, 0xa3, 0x7c, 0xcf, 0xf0, 0x4c, 0x64, 0x1a, 0x0a, 0x75, 0x2f, 0xac, 0x60, 0x36, 0xd3, 0xa6, - 0x86, 0x89, 0x4b, 0x91, 0xd2, 0xf0, 0x37, 0x53, 0x5d, 0xce, 0x26, 0x85, 0xf0, 0x78, 0x81, 0x99, - 0x34, 0xa3, 0xd1, 0xb0, 0x2d, 0x6a, 0x16, 0xd2, 0x48, 0x1c, 0x16, 0xc9, 0x16, 0x64, 0x1b, 0x9e, - 0x5b, 0x43, 0xad, 0xc8, 0xa0, 0xb0, 0x6e, 0x26, 0xac, 0x4a, 0x34, 0xc3, 0xf2, 0x86, 0xe8, 0xb4, - 0xe2, 0x04, 0x5e, 0x4b, 0x40, 0x8b, 0x38, 0x91, 0x17, 0x60, 0x92, 0xa1, 0xd1, 0x03, 0xcf, 0x70, - 0xfc, 0x5d, 0xea, 0x51, 0x8a, 0xe6, 0x29, 0xa5, 0x4d, 0xb0, 0xea, 0xad, 0xa8, 0xb6, 0xf8, 0x3b, - 0x0a, 0x64, 0x43, 0x56, 0x0c, 0x7b, 0xdd, 0x08, 0xaa, 0x7b, 0x5c, 0x60, 0x1a, 0x2f, 0xb0, 0x59, - 0x3a, 0xf4, 0x09, 0xb7, 0xc5, 0x29, 0x0d, 0x7f, 0xb7, 0x67, 0x39, 0x2c, 0xcf, 0x72, 0x16, 0x32, - 0x0d, 0xa3, 0xe9, 0x53, 0x13, 0x27, 0x9f, 0xd5, 0x44, 0x89, 0x5c, 0x83, 0x7c, 0x83, 0x3a, 0xa6, - 0xe5, 0xd4, 0x74, 0xdf, 0x31, 0x1a, 0xfe, 0x9e, 0x1b, 0x08, 0x31, 0x4c, 0x8a, 0xfa, 0x4d, 0x51, - 0x5d, 0xfc, 0x2a, 0x8c, 0xc7, 0x66, 0x46, 0xf2, 0x30, 0xcc, 0x8c, 0x2b, 0x47, 0xc4, 0x7e, 0x92, - 0x25, 0x48, 0x1f, 0x18, 0x76, 0x33, 0x5c, 0xa8, 0x1b, 0x27, 0x12, 0x97, 0xc6, 0xfb, 0xde, 0x1e, - 0xba, 0xa5, 0xa8, 0x47, 0x43, 0x30, 0xae, 0x19, 0x4e, 0x8d, 0x6e, 0x78, 0xee, 0x8e, 0x4d, 0xeb, - 0x3e, 0xb9, 0x04, 0xa3, 0x4d, 0xc7, 0x38, 0x30, 0x2c, 0xdb, 0xd8, 0xb1, 0xf9, 0x19, 0x9c, 0xd5, - 0xe4, 0x2a, 0xf2, 0x2a, 0x9c, 0x63, 0x12, 0xa4, 0x9e, 0xee, 0xb8, 0x81, 0xce, 0xfd, 0x98, 0x3d, - 0xd7, 0x36, 0xa9, 0x27, 0x6c, 0xd5, 0x0c, 0x6f, 0x5e, 0x77, 0x83, 0x35, 0xd6, 0x78, 0x0f, 0xdb, - 0xc8, 0x15, 0x98, 0x70, 0x5c, 0x9d, 0x69, 0x94, 0xce, 0xdb, 0x51, 0x70, 0x59, 0x6d, 0xcc, 0x71, - 0x19, 0xc6, 0x35, 0xac, 0x23, 0xf3, 0x30, 0xd9, 0x74, 0x4c, 0xea, 0x09, 0xcd, 0x0c, 0x22, 0x41, - 0x76, 0x56, 0x93, 0xf3, 0x90, 0x75, 0x5c, 0x3e, 0x3c, 0x4a, 0x32, 0xab, 0x8d, 0x38, 0x2e, 0x0e, - 0x48, 0x6e, 0x41, 0xe1, 0x71, 0xd3, 0xa2, 0x7e, 0x95, 0x3a, 0x81, 0x4e, 0x1f, 0x37, 0x0d, 0xdb, - 0xd7, 0x03, 0xab, 0xba, 0x6f, 0x39, 0x35, 0x3c, 0xca, 0xb2, 0xda, 0x6c, 0xd4, 0xbe, 0x82, 0xcd, - 0x5b, 0xbc, 0x95, 0xbc, 0x08, 0x84, 0x23, 0x74, 0x6b, 0x7a, 0xe0, 0xba, 0xba, 0x6d, 0x78, 0x35, - 0xae, 0x37, 0x59, 0x6d, 0x92, 0xb5, 0xac, 0xb9, 0xb5, 0x2d, 0xd7, 0x5d, 0x63, 0xd5, 0xe4, 0x2a, - 0x4c, 0xb8, 0x07, 0x31, 0xa8, 0x59, 0x24, 0xec, 0xa8, 0x55, 0xf7, 0x61, 0x12, 0x65, 0xcc, 0x96, - 0xc1, 0x42, 0x37, 0x94, 0x1d, 0x7d, 0x8f, 0x9b, 0xd4, 0xb3, 0xa8, 0xaf, 0x37, 0xa8, 0xa7, 0xfb, - 0xb4, 0xea, 0x3a, 0x7c, 0x93, 0x2a, 0x5a, 0x5e, 0xb4, 0x6c, 0x50, 0x6f, 0x13, 0xeb, 0xc9, 0x75, - 0x98, 0xfa, 0x65, 0xcf, 0x0a, 0xe2, 0xc4, 0x43, 0x48, 0x3c, 0xc9, 0x1b, 0x22, 0x5a, 0xf5, 0x1e, - 0xc0, 0x86, 0x47, 0x83, 0xa0, 0xb5, 0xd9, 0x30, 0x1c, 0x76, 0xfe, 0xfa, 0x81, 0xe1, 0x05, 0x7a, - 0xa8, 0x40, 0x39, 0x2d, 0x8b, 0x15, 0xec, 0x70, 0x3e, 0x07, 0x23, 0xd4, 0xc1, 0xa3, 0x57, 0x9c, - 0x0c, 0x19, 0xea, 0xb0, 0xf3, 0xf6, 0x76, 0xea, 0xbf, 0xff, 0xa4, 0xa4, 0xa8, 0xff, 0x33, 0xc2, - 0xcc, 0x89, 0x53, 0xa3, 0x68, 0x3d, 0xdf, 0x80, 0x94, 0xdf, 0x30, 0x1c, 0x64, 0x92, 0x6c, 0x36, - 0xdb, 0xc3, 0x8b, 0x3d, 0x89, 0x1d, 0xc9, 0x2a, 0x00, 0x8a, 0x56, 0xb6, 0x30, 0x57, 0x06, 0x51, - 0xdc, 0xd0, 0xe8, 0x78, 0x91, 0x69, 0x5b, 0x94, 0x0d, 0xcc, 0xe8, 0xcd, 0xab, 0x32, 0x17, 0xee, - 0x3a, 0x97, 0x23, 0x17, 0xba, 0x1c, 0x4d, 0x21, 0x34, 0xaa, 0x7c, 0xa3, 0xd6, 0x61, 0xc2, 0x77, - 0x9b, 0x5e, 0x95, 0xea, 0xa1, 0x31, 0x4d, 0xe3, 0x61, 0x77, 0xf7, 0xe8, 0xb0, 0x34, 0xb6, 0x89, - 0x2d, 0xa7, 0x3b, 0xf2, 0xc6, 0xfc, 0x36, 0x13, 0x93, 0x3c, 0x86, 0x49, 0x31, 0x1c, 0x43, 0x86, - 0xe3, 0x65, 0x70, 0xbc, 0xd5, 0xa3, 0xc3, 0xd2, 0x38, 0x1f, 0x6f, 0x93, 0xb5, 0xe0, 0x80, 0xaf, - 0x9c, 0x68, 0x40, 0xd1, 0x4f, 0x1b, 0xf7, 0x25, 0x36, 0x66, 0xb7, 0xcf, 0x3b, 0xd2, 0xc3, 0xe7, - 0x5d, 0x82, 0x71, 0xb1, 0x83, 0x2d, 0x06, 0xac, 0x85, 0x4e, 0xda, 0xe8, 0xcd, 0x82, 0x24, 0xd2, - 0x70, 0x18, 0xdc, 0x5b, 0xa1, 0x5b, 0x83, 0x9d, 0xee, 0xf1, 0x3e, 0xe4, 0x3e, 0x1a, 0x70, 0xb4, - 0x1f, 0x85, 0x1c, 0x2e, 0xc9, 0x7c, 0xe2, 0xc2, 0x4a, 0xf6, 0x46, 0x32, 0xdb, 0xdc, 0xfe, 0xdc, - 0xe1, 0x6b, 0xeb, 0x17, 0x00, 0x19, 0x5d, 0xef, 0xc7, 0xa8, 0xbd, 0xa9, 0xe4, 0xf5, 0xf5, 0xc9, - 0x97, 0x61, 0xdc, 0x66, 0xb6, 0x9b, 0xfa, 0xba, 0xed, 0x56, 0x0d, 0xbb, 0x30, 0xda, 0x6d, 0x2a, - 0xbb, 0x74, 0x65, 0x8d, 0xf5, 0x78, 0xcb, 0x70, 0x8c, 0x1a, 0xf5, 0x24, 0x95, 0x19, 0x13, 0x9c, - 0xd6, 0x18, 0x23, 0xf2, 0x08, 0x26, 0x42, 0xce, 0x35, 0xdb, 0xdd, 0x31, 0xec, 0xc2, 0xd8, 0xd3, - 0xb3, 0x0e, 0x41, 0xde, 0x45, 0x4e, 0xe4, 0x2e, 0x8c, 0xc9, 0x17, 0xc3, 0xc2, 0x78, 0x97, 0x93, - 0x14, 0x72, 0xc6, 0xd5, 0x88, 0x79, 0x0b, 0xa3, 0x76, 0xbb, 0x8a, 0xb9, 0xf9, 0x91, 0x89, 0x2b, - 0x4c, 0xa0, 0x59, 0x6a, 0x57, 0xb0, 0xb3, 0x38, 0xb4, 0x87, 0x93, 0xdc, 0x74, 0x8a, 0xa2, 0xfa, - 0x5b, 0x8a, 0x38, 0x10, 0xfa, 0x7b, 0xa8, 0x06, 0xe4, 0x3c, 0x46, 0xa9, 0x5b, 0x26, 0xf3, 0xe6, - 0x86, 0xe7, 0x87, 0x17, 0x97, 0x8f, 0x0e, 0x4b, 0x59, 0xbe, 0xe1, 0x96, 0xfd, 0x13, 0xeb, 0xb1, - 0xe8, 0xa8, 0x65, 0x91, 0xed, 0xaa, 0xe9, 0xab, 0x5b, 0x30, 0x11, 0x82, 0x11, 0x5e, 0xd5, 0x22, - 0x64, 0xb0, 0x35, 0x74, 0xab, 0xae, 0xf4, 0xd3, 0x0f, 0x49, 0xd6, 0xa2, 0xa7, 0x3a, 0x0f, 0xe3, - 0x77, 0x31, 0xf4, 0xd0, 0xd7, 0xa3, 0xfa, 0x89, 0x02, 0x93, 0x2b, 0x78, 0xa5, 0x67, 0x62, 0xf5, - 0xd1, 0x10, 0x7e, 0x05, 0xb2, 0xd1, 0x16, 0xe6, 0xfe, 0xf1, 0xd2, 0xd1, 0x61, 0x69, 0xe4, 0xb4, - 0x9b, 0x77, 0xc4, 0x17, 0xdb, 0xb6, 0x0e, 0xb3, 0x6c, 0x31, 0xa8, 0xe7, 0xeb, 0x86, 0x63, 0xf2, - 0x7d, 0x59, 0xf3, 0x8c, 0x7a, 0xe8, 0x31, 0xbf, 0xd6, 0x43, 0x19, 0x78, 0xd8, 0xa1, 0x1c, 0x46, - 0x1f, 0xca, 0x5b, 0x9c, 0xc1, 0x82, 0x63, 0xde, 0x8b, 0xba, 0x6b, 0x33, 0x41, 0x8f, 0x5a, 0xf5, - 0x06, 0x10, 0x69, 0x86, 0x7d, 0x25, 0xf2, 0x8b, 0x30, 0x1d, 0x23, 0x17, 0xcb, 0x12, 0xed, 0x5a, - 0xbe, 0x2a, 0x49, 0xbb, 0xb6, 0x43, 0x9e, 0xb1, 0x5d, 0xab, 0xfe, 0x12, 0xc0, 0x96, 0x67, 0x54, - 0xe9, 0xca, 0x01, 0x53, 0xd3, 0x5b, 0x90, 0x0a, 0xac, 0x3a, 0x15, 0x67, 0x4e, 0xb1, 0xcc, 0xe3, - 0x0f, 0xe5, 0x30, 0xfe, 0x50, 0xde, 0x0a, 0xe3, 0x0f, 0x8b, 0x59, 0xc6, 0xe4, 0x3b, 0x1f, 0x95, - 0x14, 0x0d, 0x7b, 0x30, 0x05, 0x8f, 0xdf, 0xf4, 0xc3, 0xa2, 0xfa, 0x03, 0x05, 0x26, 0x17, 0x6c, - 0x66, 0x12, 0x02, 0xd7, 0x5b, 0xf6, 0x5a, 0x5a, 0xd3, 0x61, 0x4b, 0x1a, 0x6a, 0x32, 0x8e, 0x35, - 0xcc, 0x97, 0x54, 0xe8, 0xe3, 0x53, 0xeb, 0xf1, 0x88, 0xd0, 0x63, 0xf2, 0x3a, 0x64, 0x28, 0x9b, - 0x10, 0xdf, 0x26, 0xc9, 0xa7, 0x67, 0x7b, 0xfa, 0x9a, 0xe8, 0xa4, 0xde, 0x84, 0xb3, 0x11, 0x62, - 0xe4, 0x1d, 0xae, 0xd2, 0xf9, 0x4e, 0xdc, 0xd1, 0x90, 0xea, 0xdf, 0x2a, 0x30, 0xdb, 0xd9, 0xa9, - 0xf7, 0xfd, 0x6e, 0xf8, 0x93, 0xbc, 0xdf, 0x2d, 0xc1, 0x88, 0xe9, 0xb5, 0x74, 0xaf, 0xe9, 0x08, - 0x6d, 0x4d, 0xd2, 0x84, 0x8e, 0x65, 0xd0, 0x32, 0x26, 0xfe, 0x55, 0xbf, 0xad, 0x40, 0xbe, 0x8d, - 0xfd, 0xff, 0x81, 0x19, 0x7a, 0x04, 0x53, 0x12, 0x1e, 0x21, 0xc6, 0x15, 0xc8, 0x8a, 0xa9, 0x0e, - 0xa2, 0xf5, 0x9d, 0x73, 0x1d, 0xe1, 0x73, 0xf5, 0x55, 0x15, 0xc6, 0xee, 0x6f, 0x3e, 0x5c, 0x8f, - 0xd8, 0x86, 0x41, 0x28, 0xa5, 0x1d, 0x84, 0x52, 0xbf, 0xaf, 0xc0, 0xe8, 0x9a, 0x5b, 0x1b, 0x28, - 0x68, 0x60, 0xd3, 0x03, 0x6a, 0x0b, 0xa5, 0xe7, 0x05, 0xf2, 0x1c, 0x00, 0x77, 0x02, 0x71, 0x33, - 0xf1, 0xeb, 0x0a, 0x77, 0x0b, 0xd9, 0x06, 0x62, 0x5a, 0xc4, 0xdc, 0x40, 0x6c, 0xe4, 0x37, 0x36, - 0xe6, 0x16, 0x62, 0x53, 0x1e, 0x86, 0xeb, 0xc6, 0x13, 0xf4, 0x8c, 0x72, 0x1a, 0xfb, 0xc9, 0x36, - 0x56, 0xc3, 0x08, 0x02, 0xea, 0x39, 0x22, 0x28, 0x14, 0x16, 0xd5, 0x87, 0x40, 0xd6, 0xdc, 0x1a, - 0xbb, 0xb1, 0x58, 0x92, 0xbd, 0xfe, 0x3c, 0xf3, 0x31, 0xb1, 0x4a, 0x08, 0xe9, 0x7c, 0xe7, 0x85, - 0xdf, 0x76, 0x6b, 0x65, 0xf9, 0x06, 0x17, 0xd2, 0xab, 0x65, 0x98, 0x5e, 0x73, 0x6b, 0x77, 0x2c, - 0x9b, 0xfa, 0x6b, 0x96, 0x1f, 0xf4, 0x35, 0x4d, 0x1b, 0x30, 0x13, 0xa7, 0x17, 0x10, 0x6e, 0x41, - 0x7a, 0x97, 0x55, 0x0a, 0x00, 0x17, 0x7b, 0x01, 0x60, 0xbd, 0x64, 0x6b, 0x84, 0x1d, 0xd4, 0xd7, - 0x61, 0x42, 0x70, 0xec, 0x2b, 0x79, 0x02, 0x29, 0xd6, 0x47, 0x08, 0x1e, 0x7f, 0xb3, 0x73, 0x66, - 0x33, 0x30, 0xaa, 0xfb, 0xfd, 0xad, 0xea, 0x26, 0xa4, 0xd8, 0x28, 0x78, 0xcf, 0x34, 0x84, 0xc1, - 0xcb, 0x69, 0xf8, 0x9b, 0xb9, 0xf0, 0x8c, 0x9b, 0xee, 0x5b, 0x5f, 0xe3, 0xec, 0x87, 0xb5, 0x2c, - 0xab, 0xd8, 0xb4, 0xbe, 0x46, 0x49, 0x11, 0xb2, 0x55, 0xd7, 0x09, 0xd0, 0xb6, 0xf0, 0xb0, 0x65, - 0x54, 0x56, 0xff, 0x48, 0x81, 0xc9, 0xbb, 0x34, 0x40, 0x81, 0xf4, 0xc5, 0x7f, 0x01, 0x72, 0xb6, - 0xe5, 0x07, 0xba, 0xeb, 0xd8, 0x61, 0xc8, 0x29, 0xcb, 0x2a, 0x1e, 0x3a, 0x76, 0x8b, 0xbc, 0x26, - 0x02, 0xb2, 0x69, 0x0c, 0xc8, 0x5e, 0x4e, 0x50, 0x73, 0x36, 0x98, 0x14, 0x76, 0x2d, 0x42, 0x56, - 0xa8, 0x07, 0xbf, 0xd9, 0xe7, 0xb4, 0xa8, 0xac, 0xae, 0x42, 0xbe, 0x8d, 0x4e, 0x2c, 0xd5, 0xab, - 0xf1, 0xa5, 0x2a, 0xf5, 0x19, 0x29, 0x5c, 0xa7, 0x6f, 0xc0, 0xc4, 0x86, 0xe7, 0xee, 0x0e, 0xb2, - 0x4e, 0x8b, 0xb1, 0xa9, 0x94, 0x13, 0xaf, 0x31, 0x32, 0xc7, 0x72, 0x7b, 0x56, 0x6a, 0x1e, 0x52, - 0x18, 0x7e, 0xcc, 0x42, 0xea, 0xde, 0xca, 0xc2, 0x46, 0xfe, 0x8c, 0x7a, 0x0d, 0x26, 0xde, 0xa2, - 0x81, 0x67, 0x55, 0xfb, 0x2f, 0xf5, 0x5f, 0xa0, 0x83, 0xb5, 0x1b, 0xa0, 0x95, 0x61, 0xd6, 0xf3, - 0x99, 0xc6, 0xdb, 0xde, 0x84, 0x34, 0x5a, 0xb1, 0x81, 0xee, 0x5b, 0x1d, 0xf7, 0x24, 0xec, 0xa8, - 0x5e, 0x67, 0x2e, 0x98, 0x80, 0xbb, 0xc2, 0x6e, 0x0e, 0xf2, 0xd9, 0xaa, 0xc4, 0xcf, 0xd6, 0xf7, - 0x86, 0xd8, 0x4d, 0x57, 0x10, 0x0b, 0x47, 0xf4, 0x59, 0x9f, 0xad, 0x77, 0x21, 0x83, 0x17, 0x9a, - 0xf0, 0x6c, 0xbd, 0xd6, 0xe7, 0x4a, 0xd9, 0x9e, 0x48, 0xe8, 0x15, 0xf2, 0xee, 0x64, 0x39, 0x8c, - 0xd7, 0x0d, 0x23, 0x9f, 0xf9, 0x41, 0xf8, 0x30, 0x69, 0xc7, 0x63, 0x75, 0x4d, 0xc8, 0xb3, 0xd6, - 0x65, 0xba, 0xd3, 0xac, 0x85, 0xba, 0x10, 0x3b, 0xa1, 0x94, 0x67, 0x72, 0x42, 0xfd, 0xdb, 0x10, - 0x4c, 0x49, 0xe3, 0x8a, 0xed, 0xf4, 0x6d, 0xa5, 0xc3, 0x5b, 0xbe, 0xd5, 0x67, 0x52, 0xb1, 0xee, - 0x7c, 0x18, 0x11, 0x5d, 0xfb, 0x02, 0x9b, 0xe4, 0xfb, 0x1f, 0x3d, 0x25, 0x50, 0x81, 0xe2, 0x13, - 0x5b, 0xac, 0x22, 0x85, 0x51, 0x09, 0x9d, 0x1c, 0x21, 0x1b, 0xe6, 0x11, 0xb2, 0x37, 0xe3, 0x11, - 0xb2, 0xeb, 0x83, 0x0c, 0xc4, 0x35, 0x56, 0x0e, 0x8f, 0x7d, 0x73, 0x08, 0x46, 0x17, 0xaa, 0x81, - 0x75, 0x40, 0xdf, 0x6e, 0x52, 0xaf, 0x45, 0x66, 0x61, 0x28, 0xdc, 0xd0, 0x8b, 0x99, 0xa3, 0xc3, - 0xd2, 0xd0, 0xea, 0xb2, 0x36, 0x64, 0x99, 0x6c, 0x7c, 0xff, 0x71, 0x78, 0xea, 0xb2, 0x9f, 0xe4, - 0x36, 0x3a, 0xc4, 0x5e, 0x20, 0x62, 0xd4, 0x83, 0xf9, 0xae, 0xbc, 0x0b, 0x79, 0x1e, 0x26, 0x2c, - 0x5f, 0x37, 0x2d, 0x3f, 0xf0, 0xac, 0x9d, 0x66, 0x3b, 0x04, 0x36, 0x6e, 0xf9, 0xcb, 0xed, 0x4a, - 0xb2, 0x08, 0xe9, 0xc6, 0x5e, 0x18, 0xfd, 0x9a, 0xe8, 0x19, 0x60, 0x8e, 0xbc, 0x8f, 0xf6, 0x1c, - 0xca, 0x1b, 0xac, 0x8f, 0xc6, 0xbb, 0xaa, 0xcf, 0x43, 0x1a, 0xcb, 0x64, 0x1c, 0x72, 0x1b, 0xda, - 0xca, 0xc6, 0x82, 0xb6, 0xba, 0x7e, 0x37, 0x7f, 0x86, 0x15, 0x57, 0xbe, 0xbc, 0xb2, 0xb4, 0xbd, - 0xc5, 0x8a, 0x8a, 0xfa, 0x32, 0x4c, 0xb3, 0x23, 0x75, 0x93, 0xfa, 0xbe, 0xe5, 0x3a, 0x91, 0x91, - 0x2b, 0x42, 0xb6, 0xe9, 0x53, 0x4f, 0x3a, 0xb2, 0xa2, 0xb2, 0xfa, 0x2f, 0x29, 0x18, 0x11, 0xf4, - 0xcf, 0xd4, 0xc2, 0xc9, 0x18, 0x86, 0xe2, 0x18, 0x98, 0x20, 0xab, 0xb6, 0x45, 0x9d, 0x40, 0x0f, - 0x93, 0x0e, 0xdc, 0xf9, 0x19, 0xe7, 0xb5, 0x0b, 0x22, 0xa9, 0x70, 0x0d, 0xf2, 0x18, 0x8a, 0xae, - 0x62, 0xb6, 0x53, 0x47, 0x56, 0xdc, 0x11, 0x9a, 0x94, 0xea, 0xd7, 0x19, 0xc7, 0x4d, 0x98, 0x30, - 0x50, 0x96, 0xba, 0x08, 0xd2, 0x61, 0x0a, 0xad, 0x23, 0x04, 0x75, 0xbc, 0xf0, 0xc3, 0x4b, 0xbf, - 0x11, 0x55, 0x59, 0xd4, 0x6f, 0xeb, 0x4a, 0xe6, 0xe4, 0xba, 0xf2, 0x15, 0xc8, 0xed, 0x1f, 0xe8, - 0xc1, 0x13, 0x87, 0x09, 0x77, 0x84, 0x79, 0x00, 0x8b, 0x8b, 0xff, 0x3e, 0xa8, 0x48, 0x79, 0xf2, - 0xb8, 0x69, 0x99, 0xe5, 0xed, 0xed, 0x55, 0x66, 0x92, 0x46, 0x1e, 0x1c, 0x6c, 0x3d, 0x71, 0x98, - 0x79, 0xdd, 0xc7, 0x1f, 0x18, 0x7a, 0xb4, 0x0d, 0x3f, 0xd0, 0xa5, 0x59, 0xb7, 0x30, 0xcc, 0x99, - 0xd3, 0x26, 0x59, 0x43, 0xf7, 0xee, 0xc8, 0x21, 0x08, 0x79, 0x77, 0x94, 0x60, 0xd4, 0x60, 0xee, - 0xaf, 0xbe, 0xd3, 0x0a, 0x28, 0x0f, 0xec, 0x0c, 0x6b, 0x80, 0x55, 0x8b, 0xac, 0x86, 0x5c, 0x85, - 0xc9, 0xba, 0xf1, 0x44, 0x97, 0x89, 0x46, 0x91, 0x68, 0xbc, 0x6e, 0x3c, 0x59, 0x88, 0xe8, 0xd4, - 0xdf, 0x54, 0x60, 0x4a, 0xd6, 0x43, 0x7e, 0x1e, 0x3d, 0x4b, 0xed, 0x3a, 0xfe, 0x1e, 0xf9, 0xe7, - 0x0a, 0xcc, 0xc4, 0xf7, 0x84, 0x30, 0xba, 0xcb, 0x90, 0xf5, 0x45, 0x9d, 0xb0, 0xba, 0x6a, 0x52, - 0x8e, 0x89, 0x93, 0x86, 0x61, 0xb0, 0xb0, 0x27, 0xb9, 0xdf, 0x61, 0x29, 0x93, 0x76, 0x77, 0x97, - 0x48, 0xe2, 0xc6, 0x52, 0x7d, 0x0c, 0x64, 0xc9, 0x70, 0xaa, 0xd4, 0xc6, 0x65, 0xea, 0xeb, 0x22, - 0x5d, 0x85, 0x2c, 0x2e, 0x33, 0x6b, 0xc1, 0x49, 0x2f, 0x8e, 0x32, 0xd5, 0xc0, 0xce, 0x4c, 0x35, - 0xb0, 0xb1, 0x63, 0xe7, 0x0d, 0x77, 0xec, 0xfe, 0xbb, 0x30, 0x1d, 0x1b, 0x52, 0xc8, 0x86, 0xb9, - 0xab, 0x58, 0x4d, 0x4d, 0x91, 0x59, 0x88, 0xca, 0xec, 0xee, 0x82, 0x78, 0xc3, 0xbb, 0x0b, 0x16, - 0xd4, 0x16, 0xcc, 0x70, 0x46, 0x62, 0x82, 0x7d, 0xd1, 0xbf, 0x04, 0x20, 0x84, 0x18, 0xe2, 0x1f, - 0xe3, 0x69, 0x2f, 0xc1, 0x60, 0x75, 0x59, 0xcb, 0x09, 0x82, 0x3e, 0x73, 0x58, 0x85, 0xb3, 0x1d, - 0x43, 0x3f, 0xf5, 0x2c, 0xfe, 0x43, 0x81, 0xfc, 0x66, 0xc3, 0x70, 0x62, 0x31, 0x96, 0xcb, 0x1d, - 0x53, 0x58, 0x84, 0xb6, 0xde, 0x46, 0xd3, 0xd1, 0xe4, 0x00, 0x3e, 0x9f, 0xcd, 0xab, 0x3f, 0x3d, - 0x2c, 0xbd, 0x7c, 0xb2, 0x63, 0xf8, 0x01, 0x6d, 0x49, 0x71, 0xff, 0xf5, 0x76, 0xdc, 0x7f, 0xf8, - 0x34, 0x1c, 0x45, 0xba, 0x40, 0xfd, 0x3b, 0x05, 0xa6, 0xa4, 0xd9, 0x09, 0x29, 0x6d, 0xc2, 0x68, - 0xe0, 0x06, 0x86, 0xad, 0x87, 0x81, 0x21, 0xa5, 0x53, 0x8d, 0x8f, 0x09, 0x5e, 0xbd, 0xf5, 0x73, - 0x4b, 0x4b, 0xc8, 0x2a, 0xcc, 0xba, 0x22, 0x1b, 0xac, 0x61, 0xa6, 0x84, 0xbb, 0x52, 0x55, 0xb7, - 0xe9, 0xf0, 0x7c, 0x5c, 0x5a, 0x03, 0xac, 0x5a, 0x62, 0x35, 0xe4, 0x15, 0x98, 0x35, 0x1a, 0x0d, - 0xcf, 0x7d, 0x62, 0xd5, 0x8d, 0x80, 0xb2, 0x43, 0x74, 0x5f, 0x58, 0x14, 0x9e, 0xa1, 0x9c, 0x91, - 0x5a, 0x97, 0x2d, 0x7f, 0x9f, 0x1b, 0x96, 0x9f, 0x85, 0x19, 0x11, 0x90, 0x8e, 0xc7, 0x3e, 0x07, - 0x59, 0x22, 0xf5, 0x7b, 0xe3, 0x70, 0xb6, 0xa3, 0x77, 0x77, 0xa4, 0x25, 0xfb, 0x49, 0x5b, 0xa6, - 0x7f, 0x54, 0x60, 0x3a, 0x0c, 0x9a, 0xeb, 0x3b, 0xad, 0x28, 0x8b, 0x91, 0x43, 0x73, 0x71, 0x27, - 0xf9, 0x62, 0xd3, 0x8d, 0xb5, 0x1c, 0x05, 0xe4, 0x5b, 0x3c, 0x63, 0xc1, 0xdd, 0xbe, 0x87, 0x6c, - 0x05, 0x8e, 0x0e, 0x4b, 0xf9, 0x8e, 0xe6, 0xe5, 0xf7, 0x3f, 0x7a, 0x3a, 0xf8, 0xf9, 0x46, 0xc7, - 0x38, 0xc5, 0x7f, 0xce, 0xf1, 0x4c, 0x7a, 0x94, 0x81, 0xec, 0xca, 0x5b, 0x28, 0x3d, 0xf2, 0x16, - 0xbf, 0xaa, 0xc0, 0x59, 0x29, 0x29, 0xa9, 0x77, 0x86, 0x80, 0x1e, 0x1e, 0x1d, 0x96, 0xa6, 0xb7, - 0xdb, 0x04, 0xa7, 0xf6, 0xb5, 0xa7, 0x9b, 0x9d, 0xcc, 0x4c, 0x9f, 0xfc, 0xa5, 0x02, 0x57, 0xa5, - 0x8c, 0x66, 0x57, 0x42, 0x54, 0x82, 0x35, 0x8c, 0xb0, 0x7e, 0xe1, 0xe8, 0xb0, 0x74, 0xa9, 0x9d, - 0xee, 0x8c, 0xa7, 0x48, 0x4f, 0x8d, 0xf1, 0x92, 0x97, 0xc8, 0xd9, 0xf4, 0xc9, 0x6f, 0x28, 0x50, - 0x88, 0x67, 0x61, 0x25, 0x88, 0x29, 0x84, 0xb8, 0x71, 0x74, 0x58, 0x9a, 0x59, 0x97, 0x72, 0xb2, - 0xa7, 0x86, 0x35, 0xe3, 0x74, 0x71, 0x33, 0x7d, 0xf2, 0x04, 0x48, 0x98, 0xbf, 0x95, 0x30, 0xa4, - 0x11, 0xc3, 0x83, 0xa3, 0xc3, 0xd2, 0xe4, 0x3a, 0xcf, 0xe6, 0x9e, 0x7a, 0xf8, 0x49, 0x47, 0x66, - 0x64, 0xfa, 0xe4, 0x77, 0x15, 0x38, 0xdf, 0x91, 0x4d, 0x96, 0x10, 0x64, 0x10, 0xc1, 0xe6, 0xd1, - 0x61, 0xe9, 0xdc, 0x76, 0x9c, 0xe8, 0xd4, 0x48, 0xce, 0x35, 0x7b, 0x31, 0x34, 0x7d, 0xf2, 0xa7, - 0x0a, 0xa8, 0xc7, 0x65, 0xac, 0x25, 0x68, 0x23, 0x08, 0xed, 0xd1, 0xd1, 0x61, 0x69, 0xee, 0xed, - 0x9e, 0xf9, 0xeb, 0x53, 0x23, 0x9c, 0x7b, 0x9c, 0xc0, 0xd7, 0xf4, 0xc9, 0x07, 0x0a, 0x5c, 0xec, - 0x4e, 0x90, 0x4b, 0x10, 0xb3, 0x6d, 0xe9, 0x69, 0xf1, 0x74, 0xf9, 0xe9, 0xa5, 0xe7, 0xf5, 0x62, - 0x68, 0xfa, 0xe4, 0xb7, 0x15, 0x28, 0xc4, 0x53, 0xee, 0x12, 0xa0, 0x1c, 0x02, 0xd2, 0x8e, 0x0e, - 0x4b, 0xb3, 0x0f, 0x0f, 0x3e, 0xd1, 0xd5, 0x9c, 0x75, 0x0f, 0x7a, 0x2d, 0x66, 0xf1, 0x7d, 0x25, - 0x3a, 0x0f, 0xe2, 0xd6, 0x54, 0xbe, 0xa6, 0xa6, 0xf9, 0x35, 0x75, 0x33, 0x7e, 0x4d, 0x7d, 0xfd, - 0xc4, 0x66, 0x5b, 0xb6, 0x9c, 0xd2, 0xcd, 0xf5, 0x7e, 0x2a, 0xab, 0xe4, 0xb3, 0xea, 0x6b, 0x90, - 0xbf, 0xe7, 0x06, 0x4f, 0x71, 0xa6, 0x7d, 0x6b, 0x04, 0xa6, 0xa4, 0x9e, 0x9f, 0xc2, 0xcb, 0xb0, - 0x1f, 0x2a, 0x70, 0x76, 0xcf, 0x0d, 0xf8, 0xca, 0xc5, 0x4e, 0x34, 0xee, 0x00, 0x2f, 0x25, 0x88, - 0xa6, 0x0b, 0x69, 0xbb, 0x26, 0x7e, 0x9c, 0x6d, 0x88, 0xe3, 0x6c, 0xaa, 0xb3, 0xfd, 0xa9, 0xcf, - 0xb3, 0xa9, 0xbd, 0xce, 0x91, 0x8a, 0x07, 0x90, 0x0d, 0xd9, 0x93, 0x2f, 0x40, 0xca, 0xa4, 0x7e, - 0x55, 0x78, 0x3f, 0x6a, 0x8f, 0xac, 0x3a, 0xd2, 0x2d, 0x53, 0xbf, 0xea, 0x59, 0x8d, 0x20, 0x72, - 0xdd, 0xb1, 0xd7, 0x31, 0xaf, 0x44, 0x86, 0x7a, 0xbf, 0x12, 0x29, 0xfe, 0x93, 0x02, 0xe3, 0x98, - 0x4d, 0x8c, 0xd6, 0xeb, 0x59, 0xa7, 0x2a, 0x1f, 0x01, 0xb4, 0x97, 0x4c, 0xac, 0xd3, 0xab, 0x4f, - 0xb5, 0x4e, 0xd1, 0xc3, 0xb2, 0x90, 0xa2, 0xf8, 0xeb, 0x0a, 0x77, 0x0b, 0xa2, 0xc9, 0x0c, 0xe4, - 0x16, 0x68, 0x90, 0x41, 0x70, 0x21, 0x9a, 0xdb, 0x27, 0x42, 0x13, 0x93, 0x9e, 0x26, 0x38, 0x15, - 0xbf, 0x01, 0xb3, 0xbd, 0xd5, 0xa9, 0xc7, 0x7e, 0x7e, 0x18, 0xdf, 0xcf, 0x9f, 0x3f, 0xd1, 0xf0, - 0xf2, 0x74, 0xe5, 0x28, 0xd4, 0x35, 0x18, 0x1b, 0x34, 0xed, 0xf7, 0x67, 0x69, 0x91, 0xbe, 0xff, - 0x54, 0xf6, 0xac, 0x1c, 0xdb, 0x1d, 0x7a, 0x06, 0xb1, 0xdd, 0xbf, 0x57, 0x60, 0xc6, 0x13, 0x13, - 0x89, 0x99, 0x04, 0x1e, 0xa2, 0x7d, 0xa3, 0x5f, 0x34, 0xbb, 0x1d, 0xc9, 0x0c, 0x99, 0x1c, 0x63, - 0x0e, 0x3a, 0xdb, 0x9f, 0xde, 0x1c, 0x78, 0x9d, 0x23, 0x15, 0xbf, 0xdb, 0xa9, 0xc8, 0x45, 0xc8, - 0x86, 0x54, 0xe1, 0xf5, 0xd1, 0x3b, 0x56, 0xc9, 0x7b, 0xbd, 0x53, 0x7f, 0x13, 0xd2, 0x96, 0xb3, - 0xeb, 0x86, 0x91, 0xea, 0x13, 0x05, 0xf5, 0xb1, 0x63, 0xf1, 0x1d, 0x98, 0xed, 0x2d, 0x92, 0x1e, - 0x2a, 0xfd, 0x20, 0xae, 0xd2, 0xaf, 0x0e, 0x2c, 0xf4, 0x63, 0xd4, 0xf9, 0x7e, 0x2a, 0x9b, 0xca, - 0xa7, 0xd5, 0x1b, 0x40, 0x96, 0xdb, 0xdf, 0x65, 0xf4, 0x4d, 0x9b, 0xcc, 0x0b, 0xdb, 0xd6, 0x9f, - 0xf2, 0xaf, 0x86, 0x60, 0x0c, 0x49, 0xc3, 0xcf, 0x09, 0x9e, 0xb5, 0x15, 0x7c, 0x11, 0xa6, 0xa8, - 0x53, 0xf5, 0x5a, 0x0d, 0x8c, 0x1e, 0x8a, 0x87, 0x3b, 0x78, 0x55, 0xd7, 0xf2, 0xed, 0x06, 0x91, - 0x0e, 0x29, 0x85, 0xb7, 0x62, 0x9e, 0xe7, 0xe2, 0x97, 0x52, 0x7e, 0xc3, 0xc5, 0x54, 0x58, 0x9b, - 0x80, 0xdf, 0x5a, 0x53, 0x12, 0x01, 0x0f, 0x96, 0xcd, 0x43, 0x5e, 0x04, 0xe3, 0xf6, 0x69, 0x4b, - 0xb0, 0xe1, 0x2f, 0x49, 0x45, 0x68, 0xf2, 0x01, 0x6d, 0x71, 0x56, 0x71, 0x4a, 0xce, 0x2f, 0xd3, - 0x41, 0xc9, 0xef, 0xbf, 0x5f, 0x82, 0x89, 0x50, 0xba, 0x51, 0x76, 0x3b, 0x34, 0xa4, 0x3c, 0x86, - 0xf5, 0x42, 0x52, 0x0c, 0x4b, 0x92, 0x76, 0x18, 0x7a, 0xe2, 0x9d, 0xd5, 0x5b, 0x30, 0x85, 0x4f, - 0xf6, 0xea, 0xd4, 0x39, 0x59, 0xe0, 0x43, 0xfd, 0x20, 0x0d, 0x44, 0xee, 0x2a, 0x70, 0x35, 0x30, - 0x97, 0x2d, 0x6a, 0x05, 0xb6, 0xfb, 0x89, 0xd8, 0x3a, 0x59, 0x94, 0x97, 0x5c, 0xdb, 0xa6, 0xd5, - 0x80, 0x9a, 0x51, 0x5b, 0xd7, 0x1b, 0x32, 0x69, 0x0c, 0xb2, 0x04, 0x80, 0x11, 0x50, 0x8f, 0xfa, - 0xf4, 0x64, 0xe1, 0xfc, 0x1c, 0xeb, 0xa7, 0xb1, 0x6e, 0xe4, 0x35, 0x28, 0x58, 0x4e, 0x40, 0x3d, - 0xc7, 0xb0, 0x75, 0xa3, 0xd1, 0xc0, 0x18, 0xb3, 0xde, 0xf0, 0xe8, 0xae, 0xf5, 0x44, 0x84, 0x9a, - 0xcf, 0x86, 0xed, 0x0b, 0x8d, 0xc6, 0xba, 0x51, 0xa7, 0x1b, 0xd8, 0x58, 0xfc, 0x07, 0x05, 0xe6, - 0x56, 0xc4, 0xa7, 0x10, 0x3d, 0xf0, 0x3e, 0xa0, 0x2d, 0x72, 0x07, 0xb2, 0x6c, 0x7d, 0xa3, 0x57, - 0x03, 0x1d, 0xef, 0x4b, 0x1e, 0xdb, 0xe5, 0xde, 0x1d, 0xc3, 0x7c, 0xfb, 0x3e, 0x6d, 0x2d, 0x1b, - 0x81, 0x21, 0x9f, 0x14, 0x43, 0x9f, 0xf0, 0x49, 0xc1, 0xa6, 0x71, 0x31, 0x49, 0xee, 0xc4, 0x6c, - 0xdb, 0x9d, 0xd1, 0x9b, 0x6b, 0x27, 0x5b, 0xd0, 0x64, 0xf9, 0x88, 0x69, 0xa2, 0x2d, 0xfb, 0x62, - 0xf8, 0x4c, 0x69, 0xa8, 0xcb, 0x1f, 0x3b, 0x46, 0x4e, 0xb1, 0xe7, 0x49, 0xd7, 0xaf, 0x40, 0x36, - 0xcc, 0x70, 0xb7, 0xb3, 0xbf, 0x64, 0x02, 0xe0, 0xee, 0x43, 0xed, 0xe1, 0xf6, 0xd6, 0xea, 0xfa, - 0xca, 0x66, 0x5e, 0xb9, 0xf9, 0xc3, 0x39, 0xc8, 0x88, 0xed, 0xfe, 0x3d, 0x05, 0xc6, 0xe4, 0x4f, - 0x4c, 0x48, 0x79, 0xb0, 0x8f, 0x48, 0xc2, 0xbd, 0x52, 0xac, 0x0c, 0x4c, 0xcf, 0x85, 0xa1, 0xbe, - 0xf0, 0xfe, 0xbf, 0xfe, 0xd7, 0xef, 0x0d, 0x7d, 0x86, 0x94, 0x2a, 0xc2, 0x14, 0x55, 0xe4, 0x2f, - 0x50, 0x2a, 0xef, 0x88, 0x25, 0x7e, 0x97, 0xdd, 0x82, 0x47, 0x42, 0x13, 0x99, 0x94, 0x87, 0x8b, - 0x7f, 0xb0, 0x52, 0xbc, 0x3e, 0x08, 0xa9, 0xc0, 0x72, 0x03, 0xb1, 0xbc, 0x40, 0x8a, 0x11, 0x16, - 0x93, 0x53, 0xb4, 0x61, 0x3c, 0xca, 0x91, 0x91, 0xca, 0x1e, 0x35, 0xec, 0x60, 0x8f, 0x78, 0x90, - 0xc6, 0x4f, 0x28, 0x48, 0x92, 0xb1, 0x91, 0x3f, 0xba, 0x28, 0xce, 0xf7, 0x27, 0x14, 0x50, 0x66, - 0x11, 0x4a, 0x9e, 0x4c, 0x44, 0x50, 0x30, 0x5f, 0x4b, 0xbe, 0x0e, 0x29, 0x4c, 0xc2, 0x5f, 0xed, - 0xc3, 0x29, 0x1c, 0xf1, 0x44, 0x9f, 0x71, 0xa8, 0x97, 0x70, 0xd4, 0x22, 0x29, 0xc4, 0x47, 0x95, - 0x56, 0xe1, 0x5d, 0xfe, 0xc9, 0x06, 0x26, 0x5e, 0xc9, 0x8b, 0x83, 0xa5, 0x67, 0x8f, 0x47, 0x72, - 0x6c, 0x2e, 0x57, 0x3d, 0x8b, 0x48, 0x26, 0xc9, 0x78, 0x84, 0x84, 0xdd, 0xa6, 0xc9, 0x7b, 0x0a, - 0x64, 0xb8, 0x17, 0x4a, 0xfa, 0x3e, 0xd9, 0x8d, 0xa4, 0x7e, 0x6d, 0x00, 0x4a, 0x31, 0xec, 0x67, - 0x70, 0xd8, 0x0b, 0xe4, 0xbc, 0x34, 0x2c, 0x23, 0x90, 0x24, 0xe0, 0x43, 0x86, 0xbf, 0xc6, 0x4c, - 0x44, 0x10, 0x7b, 0xb0, 0x59, 0x94, 0xdf, 0xf0, 0x88, 0xaf, 0x48, 0x99, 0x93, 0x23, 0xa4, 0xde, - 0x3d, 0xa8, 0xf8, 0xe0, 0xb4, 0x3d, 0xe8, 0xef, 0x2b, 0x30, 0x2a, 0x3d, 0x44, 0x24, 0x37, 0x06, - 0x7b, 0xb0, 0x18, 0x8e, 0x5f, 0x1e, 0x94, 0x5c, 0x88, 0xe1, 0x2a, 0x22, 0xba, 0x44, 0xe6, 0x22, - 0x44, 0x3c, 0xda, 0x8d, 0x56, 0x45, 0x82, 0xf5, 0x5d, 0x05, 0x72, 0xd1, 0x4b, 0xb1, 0x44, 0x75, - 0xe8, 0x7c, 0x1f, 0x97, 0xa8, 0x0e, 0x5d, 0x8f, 0xd7, 0xd4, 0x6b, 0x08, 0xe8, 0x32, 0xf9, 0x4c, - 0x04, 0xc8, 0x08, 0x69, 0x50, 0x45, 0x25, 0x4c, 0xdf, 0x57, 0x60, 0x22, 0xfe, 0x92, 0x90, 0x7c, - 0x76, 0xa0, 0xb1, 0xa4, 0x2b, 0x4b, 0xf1, 0xe5, 0x13, 0xf4, 0x10, 0x10, 0x5f, 0x44, 0x88, 0xcf, - 0x93, 0xcb, 0x3d, 0x20, 0xa2, 0x12, 0x55, 0xde, 0x09, 0x2f, 0x1f, 0xef, 0x92, 0x6f, 0x29, 0x30, - 0x26, 0xa7, 0xc1, 0x12, 0xed, 0x6c, 0x8f, 0x54, 0x76, 0xa2, 0x9d, 0xed, 0x95, 0xe6, 0x53, 0xcf, - 0x23, 0xbc, 0x69, 0x32, 0x15, 0xc1, 0x8b, 0x72, 0x77, 0x7f, 0x20, 0xd2, 0x94, 0xf8, 0x5c, 0xfc, - 0xd3, 0x43, 0x54, 0x42, 0x44, 0xe7, 0xc9, 0xb9, 0x08, 0x11, 0x3e, 0x7c, 0xd7, 0x65, 0x5c, 0xa3, - 0x52, 0x56, 0x2e, 0x51, 0xe9, 0xbb, 0x13, 0x86, 0x89, 0x4a, 0xdf, 0x23, 0xd9, 0xd7, 0xeb, 0x24, - 0x42, 0x2a, 0x9e, 0x44, 0x96, 0x34, 0xec, 0x8f, 0x15, 0x18, 0x8f, 0x65, 0xda, 0x48, 0xa5, 0xef, - 0x50, 0xf1, 0x74, 0x60, 0xf1, 0xb3, 0x83, 0x77, 0x38, 0x76, 0x07, 0x08, 0x74, 0x42, 0x5c, 0x12, - 0xbe, 0xf7, 0x14, 0xc8, 0x45, 0xf9, 0xad, 0xc4, 0x5d, 0xd9, 0x99, 0xe3, 0x4b, 0xdc, 0x95, 0x5d, - 0x29, 0x33, 0xb5, 0x80, 0x98, 0x88, 0xda, 0x36, 0xd2, 0x7e, 0xc3, 0x70, 0x6e, 0x2b, 0xd7, 0xc9, - 0xd7, 0xd1, 0xa3, 0xa8, 0xee, 0x27, 0x9b, 0xe9, 0xd8, 0x6b, 0xc3, 0x62, 0xd2, 0x29, 0x2a, 0x3f, - 0x39, 0xed, 0x61, 0x2f, 0x7d, 0x64, 0x24, 0x89, 0xe0, 0x57, 0x14, 0x18, 0x11, 0x0f, 0xe2, 0x12, - 0x9d, 0x85, 0xf8, 0xa3, 0xb9, 0xc1, 0x21, 0xa8, 0x08, 0xe1, 0xa2, 0xe4, 0x29, 0x34, 0x38, 0xa7, - 0x0e, 0x0c, 0xe2, 0x95, 0x5d, 0x22, 0x86, 0xf8, 0x4b, 0xbc, 0xd3, 0x60, 0xa8, 0x73, 0x4e, 0x12, - 0x86, 0x6f, 0x2a, 0x90, 0x0d, 0x5f, 0x2d, 0x92, 0x24, 0x57, 0xa8, 0xe3, 0xe1, 0x65, 0xf1, 0xc5, - 0x81, 0x68, 0x05, 0x92, 0x6e, 0xb7, 0x01, 0xaf, 0x79, 0xf1, 0xf3, 0x6b, 0x4c, 0x7e, 0xec, 0x9a, - 0x6c, 0x5d, 0xba, 0x5f, 0xd1, 0x26, 0x5b, 0x97, 0x1e, 0xaf, 0x68, 0xd5, 0xcb, 0x88, 0xe9, 0x39, - 0x72, 0x41, 0xb2, 0x2e, 0xb5, 0x4e, 0x58, 0xcc, 0xa7, 0x14, 0xbd, 0x13, 0x97, 0x28, 0xfe, 0xaa, - 0xb6, 0x78, 0x23, 0x99, 0xb4, 0xe3, 0x4d, 0xb1, 0x7a, 0x1d, 0xa1, 0x5c, 0x21, 0x6a, 0x02, 0x94, - 0xca, 0x3b, 0xac, 0xe2, 0x5d, 0xe6, 0xdf, 0xad, 0xb9, 0x35, 0x3f, 0xd1, 0xbf, 0x93, 0x9e, 0x56, - 0x9f, 0x14, 0x4a, 0x2f, 0x9b, 0x5b, 0x93, 0x25, 0xf2, 0x81, 0x82, 0x5f, 0x73, 0xb6, 0x23, 0xf7, - 0x89, 0xb6, 0xad, 0x57, 0x12, 0x3a, 0xd1, 0xb6, 0xf5, 0x4c, 0x0a, 0xa8, 0x73, 0x88, 0xaa, 0x40, - 0x66, 0xe5, 0xdd, 0xc4, 0xe8, 0xc4, 0x33, 0xbc, 0xf7, 0x15, 0xc8, 0x45, 0xe1, 0xc7, 0x44, 0x83, - 0xd6, 0x99, 0x3d, 0x48, 0x34, 0x68, 0x5d, 0x11, 0x4d, 0xb5, 0x88, 0x40, 0x66, 0x08, 0x89, 0x80, - 0xec, 0xb9, 0x81, 0x00, 0xf1, 0x2e, 0xa4, 0xb9, 0x37, 0xf1, 0x42, 0xff, 0x88, 0x52, 0x7f, 0x6f, - 0x3f, 0xee, 0x3b, 0x1c, 0xe3, 0x76, 0xca, 0x1e, 0xc3, 0x1f, 0x2a, 0x30, 0x2a, 0x05, 0xa0, 0x12, - 0x0f, 0xc3, 0xee, 0x40, 0x55, 0xaf, 0x45, 0x89, 0xfd, 0xa3, 0x23, 0x52, 0x1f, 0x8d, 0x36, 0x5c, - 0x2f, 0xe8, 0xe1, 0x03, 0x4a, 0x1d, 0xe2, 0xa7, 0x4d, 0x86, 0x07, 0x63, 0xfa, 0xd8, 0x7a, 0x29, - 0x1a, 0x96, 0xe8, 0x92, 0xc7, 0x23, 0x3b, 0x3d, 0xad, 0x3d, 0x23, 0x90, 0x20, 0xfc, 0x9a, 0x02, - 0xd0, 0xbe, 0x67, 0x93, 0x97, 0x06, 0xbc, 0x8e, 0xf7, 0xdf, 0x41, 0xdd, 0x97, 0x77, 0xf5, 0x02, - 0xc2, 0x39, 0x4b, 0xa6, 0xe5, 0xc3, 0x47, 0x10, 0x2d, 0x5e, 0xff, 0xf0, 0x3f, 0xe7, 0xce, 0x7c, - 0x78, 0x34, 0xa7, 0xfc, 0xe8, 0x68, 0x4e, 0xf9, 0xf1, 0xd1, 0x9c, 0xf2, 0x93, 0xa3, 0x39, 0xe5, - 0x3b, 0x1f, 0xcf, 0x9d, 0xf9, 0xd1, 0xc7, 0x73, 0x67, 0x7e, 0xfc, 0xf1, 0xdc, 0x99, 0x47, 0xd9, - 0x90, 0xf7, 0x4e, 0x06, 0x63, 0x31, 0x9f, 0xfb, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x26, 0x9b, - 0x5a, 0xf9, 0xa9, 0x46, 0x00, 0x00, + 0x14, 0xbd, 0xa4, 0x9a, 0x54, 0x68, 0xb3, 0x5d, 0xde, 0x0e, 0x8f, 0x1b, 0xee, 0xed, 0x1e, 0x77, + 0xf7, 0x58, 0x5d, 0x0c, 0x27, 0xae, 0x8b, 0xf4, 0x4f, 0x9a, 0xa6, 0x89, 0xfb, 0x07, 0x79, 0x68, + 0x81, 0x22, 0x0f, 0x6d, 0x5f, 0x5a, 0xa4, 0xe8, 0x53, 0x9f, 0x0a, 0x14, 0x45, 0x63, 0xa0, 0x40, + 0x91, 0xa2, 0x7d, 0x08, 0x5a, 0x80, 0x4e, 0xe9, 0x3e, 0xf4, 0xb9, 0x8f, 0x01, 0x0a, 0x14, 0xf3, + 0xcd, 0xec, 0xde, 0xec, 0xdd, 0x71, 0xef, 0x28, 0x5a, 0x46, 0x1f, 0x6c, 0xde, 0xcc, 0x7c, 0xf3, + 0xcd, 0x6f, 0xbe, 0xf9, 0xe6, 0x9b, 0x6f, 0xbe, 0x6f, 0x56, 0x70, 0xd1, 0xa7, 0xde, 0x01, 0xf5, + 0x2a, 0xfc, 0x4f, 0x63, 0xbb, 0xe2, 0x07, 0x46, 0xd0, 0xf4, 0xcb, 0x0d, 0xcf, 0x0d, 0x5c, 0x72, + 0xbe, 0xea, 0x56, 0xf7, 0x3c, 0xd7, 0xa8, 0xee, 0x96, 0x39, 0x41, 0x39, 0xa4, 0x2b, 0xe6, 0xb7, + 0x9b, 0x96, 0x6d, 0x56, 0x2c, 0x67, 0xc7, 0xe5, 0xc4, 0xc5, 0xe9, 0x9a, 0xeb, 0xfb, 0x56, 0xa3, + 0xc2, 0xff, 0x88, 0xca, 0x73, 0xd8, 0xbb, 0xb1, 0x5d, 0x31, 0x1a, 0x0d, 0x9d, 0xf1, 0x16, 0xac, + 0x8b, 0x24, 0x6c, 0x30, 0x8d, 0xc0, 0x10, 0x75, 0xb3, 0x61, 0x5d, 0x9d, 0x06, 0x86, 0x54, 0x7f, + 0x55, 0x80, 0x34, 0x2d, 0xa3, 0xe6, 0xb8, 0x7e, 0x60, 0x55, 0x7d, 0xd6, 0xb1, 0x5d, 0x12, 0x74, + 0x97, 0xc3, 0xc9, 0xe0, 0x1c, 0xc4, 0x9f, 0x8e, 0x39, 0x15, 0x55, 0x3f, 0x70, 0x3d, 0xa3, 0x46, + 0x2b, 0xd4, 0xa9, 0x59, 0x4e, 0xf8, 0x87, 0x0d, 0x7a, 0x50, 0xad, 0x0a, 0x9a, 0xe7, 0x8f, 0xa3, + 0xf1, 0xdc, 0xea, 0x9e, 0x6f, 0x6e, 0x0b, 0xb2, 0x2b, 0x21, 0x99, 0xf8, 0xdb, 0xd8, 0xae, 0xd8, + 0xd4, 0xf0, 0xa9, 0x1e, 0x1b, 0xf0, 0xb9, 0x6e, 0x2a, 0xd6, 0x4e, 0x43, 0x41, 0x34, 0x03, 0xcb, + 0xae, 0xd8, 0x6e, 0x8d, 0xfd, 0x27, 0xea, 0x8a, 0x58, 0xd7, 0x74, 0x3c, 0xea, 0xbb, 0xf6, 0x01, + 0x35, 0x75, 0xc3, 0x34, 0x3d, 0xd1, 0x76, 0x81, 0x06, 0x55, 0xb3, 0xe2, 0x19, 0x3b, 0x01, 0xfe, + 0x8f, 0x81, 0x32, 0x76, 0x02, 0xd1, 0x38, 0x53, 0x73, 0x6b, 0x2e, 0xfe, 0xac, 0xb0, 0x5f, 0xa2, + 0xf6, 0x62, 0xcd, 0x75, 0x6b, 0x36, 0xad, 0x18, 0x0d, 0xab, 0x62, 0x38, 0x8e, 0x1b, 0x18, 0x81, + 0xe5, 0x3a, 0x21, 0xbe, 0x92, 0x68, 0xc5, 0xd2, 0x76, 0x73, 0xa7, 0x12, 0x58, 0x75, 0xea, 0x07, + 0x46, 0x5d, 0xac, 0xa1, 0x5a, 0x86, 0xe9, 0x25, 0xea, 0x05, 0xd6, 0x8e, 0x55, 0x35, 0x02, 0xea, + 0x6b, 0x74, 0xbf, 0x49, 0xfd, 0x80, 0x9c, 0x83, 0x11, 0xc7, 0x35, 0xa9, 0x6e, 0x99, 0x05, 0xe5, + 0x92, 0x32, 0x9f, 0xd3, 0x32, 0xac, 0xb8, 0x6a, 0xaa, 0xff, 0x9b, 0x02, 0x22, 0x75, 0x58, 0xa6, + 0x81, 0x61, 0xd9, 0x3e, 0x79, 0x1b, 0x52, 0x41, 0xab, 0x41, 0x91, 0x78, 0xe2, 0xe6, 0xeb, 0xe5, + 0x63, 0x75, 0xab, 0xdc, 0xdd, 0x59, 0xae, 0xda, 0x6a, 0x35, 0xa8, 0x86, 0xac, 0xc8, 0x65, 0x18, + 0xa7, 0x9e, 0xe7, 0x7a, 0x7a, 0x9d, 0xfa, 0xbe, 0x51, 0xa3, 0x85, 0x21, 0x04, 0x32, 0x86, 0x95, + 0x6f, 0xf1, 0x3a, 0x42, 0x20, 0xc5, 0x74, 0xa9, 0x30, 0x7c, 0x49, 0x99, 0x1f, 0xd3, 0xf0, 0x37, + 0xd1, 0x20, 0xb3, 0x63, 0x51, 0xdb, 0xf4, 0x0b, 0xa9, 0x4b, 0xc3, 0xf3, 0xa3, 0x37, 0x5f, 0x39, + 0x19, 0x9a, 0x3b, 0xd8, 0x77, 0x31, 0xf5, 0xe1, 0x61, 0xe9, 0x8c, 0x26, 0x38, 0x15, 0xff, 0x66, + 0x08, 0x32, 0xbc, 0x81, 0xcc, 0x42, 0xc6, 0xf2, 0xfd, 0x26, 0xf5, 0x42, 0xc9, 0xf0, 0x12, 0x29, + 0xc0, 0x88, 0xdf, 0xdc, 0xfe, 0x2a, 0xad, 0x06, 0x02, 0x69, 0x58, 0x24, 0xcf, 0x01, 0x1c, 0x18, + 0xb6, 0x65, 0xea, 0x3b, 0x9e, 0x5b, 0x47, 0xa8, 0xc3, 0x5a, 0x0e, 0x6b, 0xee, 0x78, 0x6e, 0x9d, + 0x94, 0x60, 0x94, 0x37, 0x37, 0x9d, 0xc0, 0xb2, 0x0b, 0x29, 0x6c, 0xe7, 0x3d, 0x1e, 0xb1, 0x1a, + 0x72, 0x11, 0x72, 0x4c, 0x47, 0xa8, 0xef, 0x53, 0xbf, 0x90, 0xbe, 0x34, 0x3c, 0x9f, 0xd3, 0xda, + 0x15, 0xa4, 0x02, 0xd3, 0xbe, 0x55, 0x73, 0x8c, 0xa0, 0xe9, 0x51, 0xdd, 0xb0, 0x6b, 0xae, 0x67, + 0x05, 0xbb, 0xf5, 0x42, 0x06, 0x31, 0x90, 0xa8, 0x69, 0x21, 0x6c, 0x61, 0x70, 0x1a, 0xcd, 0x6d, + 0xdb, 0xaa, 0xea, 0x7b, 0xb4, 0x55, 0x18, 0x41, 0xba, 0x1c, 0xaf, 0x79, 0x40, 0x5b, 0xe4, 0x02, + 0xe4, 0xf6, 0x68, 0x4b, 0x6f, 0xa2, 0xcc, 0xb3, 0x38, 0x5a, 0x76, 0x8f, 0xb6, 0x1e, 0xa1, 0xbc, + 0x5f, 0x02, 0x42, 0x9f, 0x04, 0xd4, 0x31, 0xa9, 0xa9, 0xb7, 0xa9, 0x72, 0x48, 0x95, 0x0f, 0x5b, + 0x1e, 0x08, 0x6a, 0xf5, 0x6d, 0x98, 0xec, 0x58, 0x5b, 0x92, 0x81, 0xa1, 0xa5, 0x85, 0xfc, 0x19, + 0x92, 0x85, 0xd4, 0xfa, 0xc3, 0xe5, 0x95, 0xbc, 0x42, 0xc6, 0x21, 0xb7, 0xb4, 0xb6, 0xba, 0xb2, + 0xbe, 0xa5, 0x2f, 0x2d, 0xe4, 0x87, 0x08, 0x40, 0x86, 0x17, 0xf3, 0xc3, 0x24, 0x07, 0xe9, 0x47, + 0xab, 0xac, 0x3a, 0xc5, 0xfa, 0x3d, 0x5a, 0xcd, 0xa7, 0x55, 0x17, 0x66, 0xe2, 0xfa, 0xea, 0x37, + 0x5c, 0xc7, 0xa7, 0xe4, 0x4b, 0x30, 0x56, 0x95, 0xea, 0x0b, 0x0a, 0x2e, 0xfd, 0x8d, 0x13, 0x2d, + 0xbd, 0x58, 0xf3, 0x18, 0x23, 0xf5, 0x0d, 0x98, 0x10, 0xcd, 0xfd, 0xf6, 0x06, 0x99, 0x81, 0xb4, + 0x47, 0x0d, 0xb3, 0x85, 0xeb, 0x9f, 0xd5, 0x78, 0x41, 0x5d, 0x07, 0xd8, 0x6c, 0xf9, 0x01, 0xad, + 0xaf, 0x3a, 0x3b, 0x2e, 0x5b, 0x6c, 0x1f, 0x4b, 0x3a, 0xb3, 0xae, 0x82, 0x01, 0xf8, 0x31, 0x82, + 0x3d, 0xea, 0x39, 0xd4, 0xe6, 0x04, 0x5c, 0x95, 0x80, 0x57, 0x31, 0x02, 0xf5, 0xdb, 0xc3, 0x30, + 0x19, 0x21, 0x12, 0xb3, 0x7f, 0x1c, 0x87, 0x94, 0x5e, 0x5c, 0x38, 0x3a, 0x2c, 0x65, 0xd6, 0x19, + 0xac, 0xe5, 0x9f, 0x1d, 0x96, 0x3e, 0x57, 0xb3, 0x82, 0xdd, 0xe6, 0x76, 0xb9, 0xea, 0xd6, 0x2b, + 0x91, 0x40, 0xcc, 0xed, 0xf6, 0xef, 0x4a, 0x63, 0xaf, 0x56, 0x11, 0x06, 0xba, 0xcc, 0xbb, 0x45, + 0xb3, 0xfa, 0x22, 0x8c, 0x08, 0x65, 0x43, 0x30, 0xa3, 0x37, 0xe7, 0x24, 0xa1, 0x32, 0x5b, 0x56, + 0x7e, 0x14, 0xd9, 0xb2, 0x05, 0xd3, 0xf4, 0x84, 0x14, 0xc3, 0x4e, 0xe4, 0x36, 0x00, 0x1e, 0x27, + 0x7c, 0x3e, 0xc3, 0xc8, 0xe2, 0xac, 0xc4, 0x02, 0x1b, 0xcb, 0x6c, 0x6a, 0xa2, 0x67, 0x0e, 0x6b, + 0x50, 0x18, 0x6b, 0x71, 0x69, 0xa5, 0xb0, 0xf3, 0xf3, 0x09, 0x8b, 0xda, 0x96, 0xb4, 0x60, 0x26, + 0x8b, 0x76, 0x13, 0x46, 0xfd, 0x7d, 0x5b, 0x0f, 0x67, 0x93, 0x1e, 0x68, 0x36, 0x84, 0xb1, 0x39, + 0x3a, 0x2c, 0xc1, 0xe6, 0xdb, 0x6b, 0x0b, 0xbc, 0xa7, 0x06, 0xfe, 0xbe, 0x2d, 0x7e, 0xab, 0x13, + 0x30, 0xc6, 0x04, 0x16, 0x6a, 0x87, 0xfa, 0x8b, 0x30, 0x2e, 0xca, 0x62, 0x6d, 0xee, 0x41, 0x9a, + 0x49, 0x32, 0x54, 0xc9, 0x97, 0x7a, 0xa0, 0xe7, 0x27, 0x4a, 0x78, 0xa4, 0xe1, 0x02, 0x6c, 0x62, + 0x41, 0x4c, 0x82, 0x33, 0x50, 0xaf, 0xc2, 0x28, 0x6b, 0xea, 0x6b, 0xa3, 0x7f, 0x98, 0x82, 0x9c, + 0x66, 0xec, 0x04, 0x8c, 0x07, 0xdb, 0xb2, 0xe0, 0xd1, 0x86, 0x6d, 0x55, 0x8d, 0x90, 0x32, 0xb5, + 0x38, 0x7e, 0x74, 0x58, 0xca, 0x69, 0xbc, 0x76, 0x75, 0x59, 0xcb, 0x09, 0x82, 0x55, 0x93, 0xfc, + 0x1c, 0xc0, 0xae, 0xe1, 0x99, 0x78, 0xca, 0x51, 0xb1, 0xe0, 0x53, 0x65, 0x7e, 0x18, 0x95, 0xef, + 0x19, 0x9e, 0x89, 0x4c, 0xc3, 0x95, 0xda, 0x0d, 0x2b, 0x98, 0x21, 0xb6, 0xa9, 0x61, 0xe2, 0xfa, + 0xa6, 0x34, 0xfc, 0xcd, 0xf6, 0x03, 0x67, 0x93, 0x42, 0x78, 0xbc, 0xc0, 0xec, 0xa4, 0xd1, 0x68, + 0xd8, 0x16, 0x35, 0x71, 0x05, 0x52, 0x5a, 0x58, 0x24, 0x5b, 0x90, 0x6d, 0x78, 0x6e, 0x0d, 0x17, + 0x27, 0x83, 0xc2, 0xba, 0x99, 0xb0, 0xd4, 0xd1, 0x0c, 0xcb, 0x1b, 0xa2, 0xd3, 0x8a, 0x13, 0x78, + 0x2d, 0x01, 0x2d, 0xe2, 0x44, 0x5e, 0x80, 0x49, 0x86, 0x46, 0x0f, 0x3c, 0xc3, 0xf1, 0x77, 0xa8, + 0x47, 0x29, 0xda, 0xbc, 0x94, 0x36, 0xc1, 0xaa, 0xb7, 0xa2, 0xda, 0xe2, 0xef, 0x2a, 0x90, 0x0d, + 0x59, 0x31, 0xec, 0x75, 0x23, 0xa8, 0xee, 0x72, 0x81, 0x69, 0xbc, 0xc0, 0x66, 0xe9, 0xd0, 0x27, + 0xdc, 0xc0, 0xa7, 0x34, 0xfc, 0xdd, 0x9e, 0xe5, 0xb0, 0x3c, 0xcb, 0x59, 0xc8, 0x34, 0x8c, 0xa6, + 0x4f, 0x4d, 0x9c, 0x7c, 0x56, 0x13, 0x25, 0x72, 0x0d, 0xf2, 0x0d, 0xea, 0x98, 0x96, 0x53, 0xd3, + 0x7d, 0xc7, 0x68, 0xf8, 0xbb, 0x6e, 0x20, 0xc4, 0x30, 0x29, 0xea, 0x37, 0x45, 0x75, 0xf1, 0xab, + 0x30, 0x1e, 0x9b, 0x19, 0xc9, 0xc3, 0x30, 0xb3, 0xd8, 0x1c, 0x11, 0xfb, 0x49, 0x96, 0x20, 0x7d, + 0x60, 0xd8, 0xcd, 0x70, 0xa1, 0x6e, 0x9c, 0x48, 0x5c, 0x1a, 0xef, 0x7b, 0x7b, 0xe8, 0x96, 0xa2, + 0x1e, 0x0d, 0xc1, 0xb8, 0x66, 0x38, 0x35, 0xba, 0xe1, 0xb9, 0xdb, 0x36, 0xad, 0xfb, 0xe4, 0x12, + 0x8c, 0x36, 0x1d, 0xe3, 0xc0, 0xb0, 0x6c, 0x63, 0xdb, 0xe6, 0x07, 0x7b, 0x56, 0x93, 0xab, 0xc8, + 0xab, 0x70, 0x8e, 0x49, 0x90, 0x7a, 0xba, 0xe3, 0x06, 0x3a, 0x77, 0x8e, 0x76, 0x5d, 0xdb, 0xa4, + 0x9e, 0x30, 0x80, 0x33, 0xbc, 0x79, 0xdd, 0x0d, 0xd6, 0x58, 0xe3, 0x3d, 0x6c, 0x23, 0x57, 0x60, + 0xc2, 0x71, 0x75, 0xa6, 0x51, 0x3a, 0x6f, 0x47, 0xc1, 0x65, 0xb5, 0x31, 0xc7, 0x65, 0x18, 0xd7, + 0xb0, 0x8e, 0xcc, 0xc3, 0x64, 0xd3, 0x31, 0xa9, 0x27, 0x34, 0x33, 0x88, 0x04, 0xd9, 0x59, 0x4d, + 0xce, 0x43, 0xd6, 0x71, 0xf9, 0xf0, 0x28, 0xc9, 0xac, 0x36, 0xe2, 0xb8, 0x38, 0x20, 0xb9, 0x05, + 0x85, 0xfd, 0xa6, 0x45, 0xfd, 0x2a, 0x75, 0x02, 0x9d, 0xee, 0x37, 0x0d, 0xdb, 0xd7, 0x03, 0xab, + 0xba, 0x67, 0x39, 0x35, 0x3c, 0x1f, 0xb3, 0xda, 0x6c, 0xd4, 0xbe, 0x82, 0xcd, 0x5b, 0xbc, 0x95, + 0xbc, 0x08, 0x84, 0x23, 0x74, 0x6b, 0x7a, 0xe0, 0xba, 0xba, 0x6d, 0x78, 0x35, 0xae, 0x37, 0x59, + 0x6d, 0x92, 0xb5, 0xac, 0xb9, 0xb5, 0x2d, 0xd7, 0x5d, 0x63, 0xd5, 0xe4, 0x2a, 0x4c, 0xb8, 0x07, + 0x31, 0xa8, 0x59, 0x24, 0xec, 0xa8, 0x55, 0xf7, 0x60, 0x12, 0x65, 0xcc, 0x96, 0xc1, 0x42, 0xdf, + 0x96, 0x9d, 0xa7, 0xfb, 0x4d, 0xea, 0x59, 0xd4, 0xd7, 0x1b, 0xd4, 0xd3, 0x7d, 0x5a, 0x75, 0x1d, + 0xbe, 0x49, 0x15, 0x2d, 0x2f, 0x5a, 0x36, 0xa8, 0xb7, 0x89, 0xf5, 0xe4, 0x3a, 0x4c, 0xfd, 0xaa, + 0x67, 0x05, 0x71, 0xe2, 0x21, 0x24, 0x9e, 0xe4, 0x0d, 0x11, 0xad, 0x7a, 0x0f, 0x60, 0xc3, 0xa3, + 0x41, 0xd0, 0xda, 0x6c, 0x18, 0x0e, 0x3b, 0xd4, 0xfd, 0xc0, 0xf0, 0x02, 0x3d, 0x54, 0xa0, 0x9c, + 0x96, 0xc5, 0x0a, 0x76, 0xe2, 0x9f, 0x83, 0x11, 0xea, 0xe0, 0x79, 0x2e, 0x8e, 0x9b, 0x0c, 0x75, + 0xd8, 0x21, 0x7e, 0x3b, 0xf5, 0xdf, 0x7f, 0x5a, 0x52, 0xd4, 0xff, 0x19, 0x61, 0xe6, 0xc4, 0xa9, + 0x51, 0x34, 0xa2, 0x6f, 0x40, 0xca, 0x6f, 0x18, 0x0e, 0x32, 0x49, 0xb6, 0xc5, 0xed, 0xe1, 0xc5, + 0x9e, 0xc4, 0x8e, 0x64, 0x15, 0x00, 0x45, 0x2b, 0x5b, 0x98, 0x2b, 0x83, 0x28, 0x6e, 0x68, 0x74, + 0xbc, 0xc8, 0xb4, 0x2d, 0xca, 0x06, 0x66, 0xf4, 0xe6, 0x55, 0x99, 0x0b, 0xf7, 0xc7, 0xcb, 0x91, + 0x5f, 0x5e, 0x8e, 0xa6, 0x10, 0x1a, 0x55, 0xbe, 0x51, 0xeb, 0x30, 0xe1, 0xbb, 0x4d, 0xaf, 0x4a, + 0xf5, 0xd0, 0x98, 0xa6, 0xf1, 0x04, 0xbd, 0x7b, 0x74, 0x58, 0x1a, 0xdb, 0xc4, 0x96, 0xd3, 0x9d, + 0xa3, 0x63, 0x7e, 0x9b, 0x89, 0x49, 0xf6, 0x61, 0x52, 0x0c, 0xc7, 0x90, 0xe1, 0x78, 0x19, 0x1c, + 0x6f, 0xf5, 0xe8, 0xb0, 0x34, 0xce, 0xc7, 0xdb, 0x64, 0x2d, 0x38, 0xe0, 0x2b, 0x27, 0x1a, 0x50, + 0xf4, 0xd3, 0xc6, 0x7d, 0x89, 0x8d, 0xd9, 0xed, 0x48, 0x8f, 0xf4, 0x70, 0xa4, 0x97, 0x60, 0x5c, + 0xec, 0x60, 0x8b, 0x01, 0x6b, 0xa1, 0xe7, 0x37, 0x7a, 0xb3, 0x20, 0x89, 0x34, 0x1c, 0x06, 0xf7, + 0x56, 0xe8, 0x2b, 0x61, 0xa7, 0x7b, 0xbc, 0x0f, 0xb9, 0x8f, 0x06, 0x1c, 0xed, 0x47, 0x21, 0x87, + 0x4b, 0x32, 0x9f, 0xb8, 0xb0, 0x92, 0xbd, 0x91, 0xcc, 0x36, 0xb7, 0x3f, 0x77, 0xf8, 0xda, 0xfa, + 0x05, 0x40, 0x46, 0xd7, 0xfb, 0x31, 0x6a, 0x6f, 0x2a, 0x79, 0x7d, 0x7d, 0xf2, 0x65, 0x18, 0xb7, + 0x99, 0xed, 0xa6, 0xbe, 0x6e, 0xbb, 0x55, 0xc3, 0x2e, 0x8c, 0x76, 0x9b, 0xca, 0x2e, 0x5d, 0x59, + 0x63, 0x3d, 0xde, 0x32, 0x1c, 0xa3, 0x46, 0x3d, 0x49, 0x65, 0xc6, 0x04, 0xa7, 0x35, 0xc6, 0x88, + 0x3c, 0x86, 0x89, 0x90, 0x73, 0xcd, 0x76, 0xb7, 0x0d, 0xbb, 0x30, 0xf6, 0xf4, 0xac, 0x43, 0x90, + 0x77, 0x91, 0x13, 0xb9, 0x0b, 0x63, 0xf2, 0x6d, 0xb3, 0x30, 0xde, 0xe5, 0xab, 0x84, 0x9c, 0x71, + 0x35, 0x62, 0xde, 0xc2, 0xa8, 0xdd, 0xae, 0x62, 0x77, 0x87, 0xc8, 0xc4, 0x15, 0x26, 0xd0, 0x2c, + 0xb5, 0x2b, 0xd8, 0x59, 0x1c, 0xda, 0xc3, 0x49, 0x6e, 0x3a, 0x45, 0x51, 0xfd, 0x1d, 0x45, 0x1c, + 0x08, 0xfd, 0xdd, 0x5e, 0x03, 0x72, 0x1e, 0xa3, 0xd4, 0x2d, 0x93, 0xb9, 0x88, 0xc3, 0xf3, 0xc3, + 0x8b, 0xcb, 0x47, 0x87, 0xa5, 0x2c, 0xdf, 0x70, 0xcb, 0xfe, 0x89, 0xf5, 0x58, 0x74, 0xd4, 0xb2, + 0xc8, 0x76, 0xd5, 0xf4, 0xd5, 0x2d, 0x98, 0x08, 0xc1, 0x08, 0xaf, 0x6a, 0x11, 0x32, 0xd8, 0x1a, + 0xba, 0x55, 0x57, 0xfa, 0xe9, 0x87, 0x24, 0x6b, 0xd1, 0x53, 0x9d, 0x87, 0xf1, 0xbb, 0x18, 0xcf, + 0xe8, 0xeb, 0x51, 0xfd, 0x54, 0x81, 0xc9, 0x15, 0x8c, 0x13, 0x30, 0xb1, 0xfa, 0x68, 0x08, 0xbf, + 0x02, 0xd9, 0x68, 0x0b, 0x73, 0xa7, 0x7b, 0xe9, 0xe8, 0xb0, 0x34, 0x72, 0xda, 0xcd, 0x3b, 0xe2, + 0x8b, 0x6d, 0x5b, 0x87, 0x59, 0xb6, 0x18, 0xd4, 0xf3, 0x75, 0xc3, 0x31, 0xf9, 0xbe, 0xac, 0x79, + 0x46, 0x3d, 0x74, 0xc3, 0x5f, 0xeb, 0xa1, 0x0c, 0x3c, 0x96, 0x51, 0x0e, 0x43, 0x1a, 0xe5, 0x2d, + 0xce, 0x60, 0xc1, 0x31, 0xef, 0x45, 0xdd, 0xb5, 0x99, 0xa0, 0x47, 0xad, 0x7a, 0x03, 0x88, 0x34, + 0xc3, 0xbe, 0x12, 0xf9, 0x65, 0x98, 0x8e, 0x91, 0x8b, 0x65, 0x89, 0x76, 0x2d, 0x5f, 0x95, 0xa4, + 0x5d, 0xdb, 0x21, 0xcf, 0xd8, 0xae, 0x55, 0x7f, 0x05, 0x60, 0xcb, 0x33, 0xaa, 0x74, 0xe5, 0x80, + 0xa9, 0xe9, 0x2d, 0x48, 0x05, 0x56, 0x9d, 0x8a, 0x33, 0xa7, 0x58, 0xe6, 0x41, 0x8d, 0x72, 0x18, + 0xd4, 0x28, 0x6f, 0x85, 0x41, 0x8d, 0xc5, 0x2c, 0x63, 0xf2, 0xdd, 0x8f, 0x4a, 0x8a, 0x86, 0x3d, + 0x98, 0x82, 0xc7, 0xc3, 0x07, 0x61, 0x51, 0xfd, 0xa1, 0x02, 0x93, 0x0b, 0x36, 0x33, 0x09, 0x81, + 0xeb, 0x2d, 0x7b, 0x2d, 0xad, 0xe9, 0xb0, 0x25, 0x0d, 0x35, 0x19, 0xc7, 0x1a, 0xe6, 0x4b, 0x2a, + 0xf4, 0xf1, 0xa9, 0xf5, 0x78, 0x44, 0xe8, 0x31, 0x79, 0x1d, 0x32, 0x94, 0x4d, 0x88, 0x6f, 0x93, + 0xe4, 0xd3, 0xb3, 0x3d, 0x7d, 0x4d, 0x74, 0x52, 0x6f, 0xc2, 0xd9, 0x08, 0x31, 0xf2, 0x0e, 0x57, + 0xe9, 0x7c, 0x27, 0xee, 0x68, 0x48, 0xf5, 0x6f, 0x15, 0x98, 0xed, 0xec, 0xd4, 0xfb, 0xd2, 0x38, + 0xfc, 0x49, 0x5e, 0x1a, 0x97, 0x60, 0xc4, 0xf4, 0x5a, 0xba, 0xd7, 0x74, 0x84, 0xb6, 0x26, 0x69, + 0x42, 0xc7, 0x32, 0x68, 0x19, 0x13, 0xff, 0xaa, 0xdf, 0x51, 0x20, 0xdf, 0xc6, 0xfe, 0xff, 0xc0, + 0x0c, 0x3d, 0x86, 0x29, 0x09, 0x8f, 0x10, 0xe3, 0x0a, 0x64, 0xc5, 0x54, 0x07, 0xd1, 0xfa, 0xce, + 0xb9, 0x8e, 0xf0, 0xb9, 0xfa, 0xaa, 0x0a, 0x63, 0xf7, 0x37, 0x1f, 0xae, 0x47, 0x6c, 0xc3, 0xc8, + 0x96, 0xd2, 0x8e, 0x6c, 0xa9, 0x3f, 0x50, 0x60, 0x74, 0xcd, 0xad, 0x0d, 0x14, 0x89, 0xb0, 0xe9, + 0x01, 0xb5, 0x85, 0xd2, 0xf3, 0x02, 0x79, 0x0e, 0x80, 0x3b, 0x81, 0xb8, 0x99, 0xf8, 0x75, 0x85, + 0xbb, 0x85, 0x6c, 0x03, 0x31, 0x2d, 0x62, 0x6e, 0x20, 0x36, 0xf2, 0x1b, 0x1b, 0x73, 0x0b, 0xb1, + 0x29, 0x0f, 0xc3, 0x75, 0xe3, 0x09, 0x7a, 0x46, 0x39, 0x8d, 0xfd, 0x64, 0x1b, 0xab, 0x61, 0x04, + 0x01, 0xf5, 0x1c, 0x11, 0x69, 0x0a, 0x8b, 0xea, 0x43, 0x20, 0x6b, 0x6e, 0x8d, 0xdd, 0x58, 0x2c, + 0xc9, 0x5e, 0x7f, 0x9e, 0xf9, 0x98, 0x58, 0x25, 0x84, 0x74, 0xbe, 0xf3, 0xde, 0x6d, 0xbb, 0xb5, + 0xb2, 0x7c, 0x83, 0x0b, 0xe9, 0xd5, 0x32, 0x4c, 0xaf, 0xb9, 0xb5, 0x3b, 0x96, 0x4d, 0xfd, 0x35, + 0xcb, 0x0f, 0xfa, 0x9a, 0xa6, 0x0d, 0x98, 0x89, 0xd3, 0x0b, 0x08, 0xb7, 0x20, 0xbd, 0xc3, 0x2a, + 0x05, 0x80, 0x8b, 0xbd, 0x00, 0xb0, 0x5e, 0xb2, 0x35, 0xc2, 0x0e, 0xea, 0xeb, 0x30, 0x21, 0x38, + 0xf6, 0x95, 0x3c, 0x81, 0x14, 0xeb, 0x23, 0x04, 0x8f, 0xbf, 0xd9, 0x39, 0xb3, 0x19, 0x18, 0xd5, + 0xbd, 0xfe, 0x56, 0x75, 0x13, 0x52, 0x6c, 0x14, 0xbc, 0x67, 0x1a, 0xc2, 0xe0, 0xe5, 0x34, 0xfc, + 0xcd, 0x5c, 0x78, 0xc6, 0x4d, 0xf7, 0xad, 0xaf, 0x71, 0xf6, 0xc3, 0x5a, 0x96, 0x55, 0x6c, 0x5a, + 0x5f, 0xa3, 0xa4, 0x08, 0xd9, 0xaa, 0xeb, 0x04, 0x68, 0x5b, 0x78, 0x2c, 0x34, 0x2a, 0xab, 0x7f, + 0xac, 0xc0, 0xe4, 0x5d, 0x1a, 0xa0, 0x40, 0xfa, 0xe2, 0xbf, 0x00, 0x39, 0xdb, 0xf2, 0x03, 0xdd, + 0x75, 0xec, 0x30, 0x8e, 0x95, 0x65, 0x15, 0x0f, 0x1d, 0xbb, 0x45, 0x5e, 0x13, 0x51, 0xde, 0x34, + 0x46, 0x79, 0x2f, 0x27, 0xa8, 0x39, 0x1b, 0x4c, 0x8a, 0xe5, 0x16, 0x21, 0x2b, 0xd4, 0x83, 0xdf, + 0xec, 0x73, 0x5a, 0x54, 0x56, 0x57, 0x21, 0xdf, 0x46, 0x27, 0x96, 0xea, 0xd5, 0xf8, 0x52, 0x95, + 0xfa, 0x8c, 0x14, 0xae, 0xd3, 0x37, 0x60, 0x62, 0xc3, 0x73, 0x77, 0x06, 0x59, 0xa7, 0xc5, 0xd8, + 0x54, 0xca, 0x89, 0xd7, 0x18, 0x99, 0x63, 0xb9, 0x3d, 0x2b, 0x35, 0x0f, 0x29, 0x8c, 0x69, 0x66, + 0x21, 0x75, 0x6f, 0x65, 0x61, 0x23, 0x7f, 0x46, 0xbd, 0x06, 0x13, 0x6f, 0xd1, 0xc0, 0xb3, 0xaa, + 0xfd, 0x97, 0xfa, 0x2f, 0xd1, 0xc1, 0xda, 0x09, 0xd0, 0xca, 0x30, 0xeb, 0xf9, 0x4c, 0x83, 0x78, + 0x6f, 0x42, 0x1a, 0xad, 0xd8, 0x40, 0xf7, 0xad, 0x8e, 0x7b, 0x12, 0x76, 0x54, 0xaf, 0x33, 0x17, + 0x4c, 0xc0, 0x5d, 0x61, 0x37, 0x07, 0xf9, 0x6c, 0x55, 0xe2, 0x67, 0xeb, 0x7b, 0x43, 0xec, 0xa6, + 0x2b, 0x88, 0x85, 0x23, 0xfa, 0xac, 0xcf, 0xd6, 0xbb, 0x90, 0xc1, 0x0b, 0x4d, 0x78, 0xb6, 0x5e, + 0xeb, 0x73, 0xa5, 0x6c, 0x4f, 0x24, 0xf4, 0x0a, 0x79, 0x77, 0xb2, 0x1c, 0xc6, 0xeb, 0x86, 0x91, + 0xcf, 0xfc, 0x20, 0x7c, 0x98, 0xb4, 0xe3, 0xb1, 0xba, 0x26, 0xe4, 0x59, 0xeb, 0x32, 0xdd, 0x6e, + 0xd6, 0x42, 0x5d, 0x88, 0x9d, 0x50, 0xca, 0x33, 0x39, 0xa1, 0xfe, 0x6d, 0x08, 0xa6, 0xa4, 0x71, + 0xc5, 0x76, 0xfa, 0x8e, 0xd2, 0xe1, 0x2d, 0xdf, 0xea, 0x33, 0xa9, 0x58, 0x77, 0x3e, 0x8c, 0x88, + 0xae, 0x7d, 0x81, 0x4d, 0xf2, 0xfd, 0x8f, 0x9e, 0x12, 0xa8, 0x40, 0xf1, 0x89, 0x2d, 0x56, 0x91, + 0xc2, 0xa8, 0x84, 0x4e, 0x8e, 0x90, 0x0d, 0xf3, 0x08, 0xd9, 0x9b, 0xf1, 0x08, 0xd9, 0xf5, 0x41, + 0x06, 0xe2, 0x1a, 0x2b, 0x87, 0xc7, 0xbe, 0x39, 0x04, 0xa3, 0x0b, 0xd5, 0xc0, 0x3a, 0xa0, 0x6f, + 0x37, 0xa9, 0xd7, 0x22, 0xb3, 0x30, 0x14, 0x6e, 0xe8, 0xc5, 0xcc, 0xd1, 0x61, 0x69, 0x68, 0x75, + 0x59, 0x1b, 0xb2, 0x4c, 0x36, 0xbe, 0xbf, 0x1f, 0x9e, 0xba, 0xec, 0x27, 0xb9, 0x8d, 0x0e, 0xb1, + 0x17, 0x88, 0xc0, 0xf7, 0x60, 0xbe, 0x2b, 0xef, 0x42, 0x9e, 0x87, 0x09, 0xcb, 0xd7, 0x4d, 0xcb, + 0x0f, 0x3c, 0x6b, 0xbb, 0xd9, 0x0e, 0x81, 0x8d, 0x5b, 0xfe, 0x72, 0xbb, 0x92, 0x2c, 0x42, 0xba, + 0xb1, 0x1b, 0x46, 0xbf, 0x26, 0x7a, 0x06, 0x98, 0x23, 0xef, 0xa3, 0x3d, 0x87, 0xf2, 0x06, 0xeb, + 0xa3, 0xf1, 0xae, 0xea, 0xf3, 0x90, 0xc6, 0x32, 0x19, 0x87, 0xdc, 0x86, 0xb6, 0xb2, 0xb1, 0xa0, + 0xad, 0xae, 0xdf, 0xcd, 0x9f, 0x61, 0xc5, 0x95, 0x2f, 0xaf, 0x2c, 0x3d, 0xda, 0x62, 0x45, 0x45, + 0x7d, 0x19, 0xa6, 0xd9, 0x91, 0xba, 0x49, 0x7d, 0xdf, 0x72, 0x9d, 0xc8, 0xc8, 0x15, 0x21, 0xdb, + 0xf4, 0xa9, 0x27, 0x1d, 0x59, 0x51, 0x59, 0xfd, 0x97, 0x14, 0x8c, 0x08, 0xfa, 0x67, 0x6a, 0xe1, + 0x64, 0x0c, 0x43, 0x71, 0x0c, 0x4c, 0x90, 0x55, 0xdb, 0xa2, 0x4e, 0x10, 0xc5, 0xfe, 0xb9, 0xf3, + 0x33, 0xce, 0x6b, 0x45, 0x28, 0x9f, 0x5c, 0x83, 0x3c, 0x86, 0xa2, 0xab, 0x98, 0x42, 0xd5, 0x91, + 0x15, 0x77, 0x84, 0x26, 0xa5, 0xfa, 0x75, 0xc6, 0x71, 0x13, 0x26, 0x0c, 0x94, 0xa5, 0x2e, 0x82, + 0x74, 0x98, 0x97, 0xeb, 0x08, 0x41, 0x1d, 0x2f, 0xfc, 0xf0, 0xd2, 0x6f, 0x44, 0x55, 0x16, 0xf5, + 0xdb, 0xba, 0x92, 0x39, 0xb9, 0xae, 0x7c, 0x05, 0x72, 0x7b, 0x07, 0x7a, 0xf0, 0xc4, 0x61, 0xc2, + 0x1d, 0x61, 0x1e, 0xc0, 0xe2, 0xe2, 0xbf, 0x0f, 0x2a, 0x52, 0x9e, 0x91, 0x6e, 0x5a, 0x66, 0xf9, + 0xd1, 0xa3, 0x55, 0x66, 0x92, 0x46, 0x1e, 0x1c, 0x6c, 0x3d, 0x71, 0x98, 0x79, 0xdd, 0xc3, 0x1f, + 0x18, 0x7a, 0xb4, 0x0d, 0x3f, 0xd0, 0xa5, 0x59, 0xb7, 0x30, 0xcc, 0x99, 0xd3, 0x26, 0x59, 0x43, + 0xf7, 0xee, 0xc8, 0x21, 0x08, 0x79, 0x77, 0x94, 0x60, 0xd4, 0x60, 0xee, 0xaf, 0xbe, 0xdd, 0x0a, + 0x28, 0x0f, 0xec, 0x0c, 0x6b, 0x80, 0x55, 0x8b, 0xac, 0x86, 0x5c, 0x85, 0xc9, 0xba, 0xf1, 0x44, + 0x97, 0x89, 0x46, 0x91, 0x68, 0xbc, 0x6e, 0x3c, 0x59, 0x88, 0xe8, 0xd4, 0xdf, 0x56, 0x60, 0x4a, + 0xd6, 0x43, 0x7e, 0x1e, 0x3d, 0x4b, 0xed, 0x3a, 0xfe, 0x1e, 0xf9, 0x17, 0x0a, 0xcc, 0xc4, 0xf7, + 0x84, 0x30, 0xba, 0xcb, 0x90, 0xf5, 0x45, 0x9d, 0xb0, 0xba, 0x6a, 0x52, 0xe2, 0x8a, 0x93, 0x86, + 0x61, 0xb0, 0xb0, 0x27, 0xb9, 0xdf, 0x61, 0x29, 0x93, 0x76, 0x77, 0x97, 0x48, 0xe2, 0xc6, 0x52, + 0xdd, 0x07, 0xb2, 0x64, 0x38, 0x55, 0x6a, 0xe3, 0x32, 0xf5, 0x75, 0x91, 0xae, 0x42, 0x16, 0x97, + 0x99, 0xb5, 0xe0, 0xa4, 0x17, 0x47, 0x99, 0x6a, 0x60, 0x67, 0xa6, 0x1a, 0xd8, 0xd8, 0xb1, 0xf3, + 0x86, 0x3b, 0x76, 0xff, 0x5d, 0x98, 0x8e, 0x0d, 0x29, 0x64, 0xc3, 0xdc, 0x55, 0xac, 0xa6, 0xa6, + 0xc8, 0x2c, 0x44, 0x65, 0x76, 0x77, 0x41, 0xbc, 0xe1, 0xdd, 0x05, 0x0b, 0x6a, 0x0b, 0x66, 0x38, + 0x23, 0x31, 0xc1, 0xbe, 0xe8, 0x5f, 0x02, 0x10, 0x42, 0x0c, 0xf1, 0x8f, 0xf1, 0xb4, 0x97, 0x60, + 0xb0, 0xba, 0xac, 0xe5, 0x04, 0x41, 0x9f, 0x39, 0xac, 0xc2, 0xd9, 0x8e, 0xa1, 0x9f, 0x7a, 0x16, + 0xff, 0xa1, 0x40, 0x7e, 0xb3, 0x61, 0x38, 0xb1, 0x18, 0xcb, 0xe5, 0x8e, 0x29, 0x2c, 0x42, 0x5b, + 0x6f, 0xa3, 0xe9, 0x68, 0x72, 0x00, 0x9f, 0xcf, 0xe6, 0xd5, 0x9f, 0x1d, 0x96, 0x5e, 0x3e, 0xd9, + 0x31, 0xfc, 0x80, 0xb6, 0xa4, 0xb8, 0xff, 0x7a, 0x3b, 0xee, 0x3f, 0x7c, 0x1a, 0x8e, 0x22, 0x5d, + 0xa0, 0xfe, 0x9d, 0x02, 0x53, 0xd2, 0xec, 0x84, 0x94, 0x36, 0x61, 0x34, 0x70, 0x03, 0xc3, 0xd6, + 0xc3, 0xc0, 0x90, 0xd2, 0xa9, 0xc6, 0xc7, 0x04, 0xaf, 0xde, 0xfa, 0x85, 0xa5, 0x25, 0x64, 0x15, + 0xa6, 0x72, 0x91, 0x0d, 0xd6, 0x30, 0x53, 0xc2, 0x5d, 0xa9, 0xaa, 0xdb, 0x74, 0x78, 0x3e, 0x2e, + 0xad, 0x01, 0x56, 0x2d, 0xb1, 0x1a, 0xf2, 0x0a, 0xcc, 0x1a, 0x8d, 0x86, 0xe7, 0x3e, 0xb1, 0xea, + 0x46, 0x40, 0xd9, 0x21, 0xba, 0x27, 0x2c, 0x0a, 0xcf, 0x50, 0xce, 0x48, 0xad, 0xcb, 0x96, 0xbf, + 0xc7, 0x0d, 0xcb, 0xcf, 0xc3, 0x8c, 0x08, 0x48, 0xc7, 0x63, 0x9f, 0x83, 0x2c, 0x91, 0xfa, 0xfd, + 0x71, 0x38, 0xdb, 0xd1, 0xbb, 0x3b, 0xd2, 0x92, 0xfd, 0xa4, 0x2d, 0xd3, 0x3f, 0x2a, 0x30, 0x1d, + 0x06, 0xcd, 0xf5, 0xed, 0x56, 0x94, 0xc5, 0xc8, 0xa1, 0xb9, 0xb8, 0x93, 0x7c, 0xb1, 0xe9, 0xc6, + 0x5a, 0x8e, 0x02, 0xf2, 0x2d, 0x9e, 0xb1, 0xe0, 0x6e, 0xdf, 0x43, 0x91, 0x05, 0xcf, 0x77, 0x34, + 0x2f, 0xbf, 0xff, 0xd1, 0xd3, 0xc1, 0xcf, 0x37, 0x3a, 0xc6, 0x29, 0xfe, 0x73, 0x8e, 0x67, 0xd2, + 0xa3, 0x0c, 0x64, 0x57, 0xde, 0x42, 0xe9, 0x91, 0xb7, 0xf8, 0x75, 0x05, 0xce, 0x4a, 0x49, 0x49, + 0xbd, 0x33, 0x04, 0xf4, 0xf0, 0xe8, 0xb0, 0x34, 0xfd, 0xa8, 0x4d, 0x70, 0x6a, 0x5f, 0x7b, 0xba, + 0xd9, 0xc9, 0xcc, 0xf4, 0xc9, 0x5f, 0x29, 0x70, 0x55, 0xca, 0x68, 0x76, 0x25, 0x44, 0x25, 0x58, + 0xc3, 0x08, 0xeb, 0x97, 0x8e, 0x0e, 0x4b, 0x97, 0xda, 0xe9, 0xce, 0x78, 0x8a, 0xf4, 0xd4, 0x18, + 0x2f, 0x79, 0x89, 0x9c, 0x4d, 0x9f, 0xfc, 0x96, 0x02, 0x85, 0x78, 0x16, 0x56, 0x82, 0x98, 0x42, + 0x88, 0x1b, 0x47, 0x87, 0xa5, 0x99, 0x75, 0x29, 0x27, 0x7b, 0x6a, 0x58, 0x33, 0x4e, 0x17, 0x37, + 0xd3, 0x27, 0x4f, 0x80, 0x84, 0xf9, 0x5b, 0x09, 0x43, 0x1a, 0x31, 0x3c, 0x38, 0x3a, 0x2c, 0x4d, + 0xae, 0xf3, 0x6c, 0xee, 0xa9, 0x87, 0x9f, 0x74, 0x64, 0x46, 0xa6, 0x4f, 0x7e, 0x4f, 0x81, 0xf3, + 0x1d, 0xd9, 0x64, 0x09, 0x41, 0x06, 0x11, 0x6c, 0x1e, 0x1d, 0x96, 0xce, 0x3d, 0x8a, 0x13, 0x9d, + 0x1a, 0xc9, 0xb9, 0x66, 0x2f, 0x86, 0xa6, 0x4f, 0xfe, 0x4c, 0x01, 0xf5, 0xb8, 0x8c, 0xb5, 0x04, + 0x6d, 0x04, 0xa1, 0x3d, 0x3e, 0x3a, 0x2c, 0xcd, 0xbd, 0xdd, 0x33, 0x7f, 0x7d, 0x6a, 0x84, 0x73, + 0xfb, 0x09, 0x7c, 0x4d, 0x9f, 0x7c, 0xa0, 0xc0, 0xc5, 0xee, 0x04, 0xb9, 0x04, 0x31, 0xdb, 0x96, + 0x9e, 0x16, 0x4f, 0x97, 0x9f, 0x5e, 0x7a, 0x5e, 0x2f, 0x86, 0xa6, 0x4f, 0xbe, 0xad, 0x40, 0x21, + 0x9e, 0x72, 0x97, 0x00, 0xe5, 0x10, 0x90, 0x76, 0x74, 0x58, 0x9a, 0x7d, 0x78, 0xf0, 0x89, 0xae, + 0xe6, 0xac, 0x7b, 0xd0, 0x6b, 0x31, 0x8b, 0xef, 0x2b, 0xd1, 0x79, 0x10, 0xb7, 0xa6, 0xf2, 0x35, + 0x35, 0xcd, 0xaf, 0xa9, 0x9b, 0xf1, 0x6b, 0xea, 0xeb, 0x27, 0x36, 0xdb, 0xb2, 0xe5, 0x94, 0x6e, + 0xae, 0xf7, 0x53, 0x59, 0x25, 0x9f, 0x55, 0x5f, 0x83, 0xfc, 0x3d, 0x37, 0x78, 0x8a, 0x33, 0xed, + 0x5b, 0x23, 0x30, 0x25, 0xf5, 0xfc, 0x14, 0x9e, 0x9b, 0xfd, 0x48, 0x81, 0xb3, 0xbb, 0x6e, 0xc0, + 0x57, 0x2e, 0x76, 0xa2, 0x71, 0x07, 0x78, 0x29, 0x41, 0x34, 0x5d, 0x48, 0xdb, 0x35, 0xf1, 0xe3, + 0x6c, 0x43, 0x1c, 0x67, 0x53, 0x9d, 0xed, 0x4f, 0x7d, 0x9e, 0x4d, 0xed, 0x76, 0x8e, 0x54, 0x3c, + 0x80, 0x6c, 0xc8, 0x9e, 0x7c, 0x01, 0x52, 0x26, 0xf5, 0xab, 0xc2, 0xfb, 0x51, 0x7b, 0x64, 0xd5, + 0x91, 0x6e, 0x99, 0xfa, 0x55, 0xcf, 0x6a, 0x04, 0x91, 0xeb, 0x8e, 0xbd, 0x8e, 0x79, 0x25, 0x32, + 0xd4, 0xfb, 0x95, 0x48, 0xf1, 0x9f, 0x14, 0x18, 0xc7, 0x6c, 0x62, 0xb4, 0x5e, 0xcf, 0x3a, 0x55, + 0xf9, 0x18, 0xa0, 0xbd, 0x64, 0x62, 0x9d, 0x5e, 0x7d, 0xaa, 0x75, 0x8a, 0x1e, 0x96, 0x85, 0x14, + 0xc5, 0xdf, 0x54, 0xb8, 0x5b, 0x10, 0x4d, 0x66, 0x20, 0xb7, 0x40, 0x83, 0x0c, 0x82, 0x0b, 0xd1, + 0xdc, 0x3e, 0x11, 0x9a, 0x98, 0xf4, 0x34, 0xc1, 0xa9, 0xf8, 0x0d, 0x98, 0xed, 0xad, 0x4e, 0x3d, + 0xf6, 0xf3, 0xc3, 0xf8, 0x7e, 0xfe, 0xfc, 0x89, 0x86, 0x97, 0xa7, 0x2b, 0x47, 0xa1, 0xae, 0xc1, + 0xd8, 0xa0, 0x69, 0xbf, 0x3f, 0x4f, 0x8b, 0xf4, 0xfd, 0xa7, 0xb2, 0x67, 0xe5, 0xd8, 0xee, 0xd0, + 0x33, 0x88, 0xed, 0xfe, 0xbd, 0x02, 0x33, 0x9e, 0x98, 0x48, 0xcc, 0x24, 0xf0, 0x10, 0xed, 0x1b, + 0xfd, 0xa2, 0xd9, 0xed, 0x48, 0x66, 0xc8, 0xe4, 0x18, 0x73, 0xd0, 0xd9, 0xfe, 0xf4, 0xe6, 0xc0, + 0xeb, 0x1c, 0xa9, 0xf8, 0xbd, 0x4e, 0x45, 0x2e, 0x42, 0x36, 0xa4, 0x0a, 0xaf, 0x8f, 0xde, 0xb1, + 0x4a, 0xde, 0xeb, 0xf1, 0xfb, 0x9b, 0x90, 0xb6, 0x9c, 0x1d, 0x37, 0x8c, 0x54, 0x9f, 0x28, 0xa8, + 0x8f, 0x1d, 0x8b, 0xef, 0xc0, 0x6c, 0x6f, 0x91, 0xf4, 0x50, 0xe9, 0x07, 0x71, 0x95, 0x7e, 0x75, + 0x60, 0xa1, 0x1f, 0xa3, 0xce, 0xf7, 0x53, 0xd9, 0x54, 0x3e, 0xad, 0xde, 0x00, 0xb2, 0xdc, 0xfe, + 0xd8, 0xa3, 0x6f, 0xda, 0x64, 0x5e, 0xd8, 0xb6, 0xfe, 0x94, 0x7f, 0x3d, 0x04, 0x63, 0x48, 0x1a, + 0x7e, 0xa3, 0xf0, 0xac, 0xad, 0xe0, 0x8b, 0x30, 0x45, 0x9d, 0xaa, 0xd7, 0x6a, 0x60, 0xf4, 0x50, + 0x3c, 0xdc, 0xc1, 0xab, 0xba, 0x96, 0x6f, 0x37, 0x88, 0x74, 0x48, 0x29, 0xbc, 0x15, 0xf3, 0x3c, + 0x17, 0xbf, 0x94, 0xf2, 0x1b, 0x2e, 0xa6, 0xc2, 0xda, 0x04, 0xfc, 0xd6, 0x9a, 0x92, 0x08, 0x78, + 0xb0, 0x6c, 0x1e, 0xf2, 0x22, 0x18, 0xb7, 0x47, 0x5b, 0x82, 0x0d, 0x7f, 0x49, 0x2a, 0x42, 0x93, + 0x0f, 0x68, 0x8b, 0xb3, 0x8a, 0x53, 0x72, 0x7e, 0x99, 0x0e, 0x4a, 0x7e, 0xff, 0xfd, 0x12, 0x4c, + 0x84, 0xd2, 0x8d, 0xb2, 0xdb, 0xa1, 0x21, 0xe5, 0x31, 0xac, 0x17, 0x92, 0x62, 0x58, 0x92, 0xb4, + 0xc3, 0xd0, 0x13, 0xef, 0xac, 0xde, 0x82, 0x29, 0x7c, 0xb2, 0x57, 0xa7, 0xce, 0xc9, 0x02, 0x1f, + 0xea, 0x07, 0x69, 0x20, 0x72, 0x57, 0x81, 0xab, 0x81, 0xb9, 0x6c, 0x51, 0x2b, 0xb0, 0xdd, 0x4f, + 0xc4, 0xd6, 0xc9, 0xa2, 0xbc, 0xe4, 0xda, 0x36, 0xad, 0x06, 0xd4, 0x8c, 0xda, 0xba, 0xde, 0x90, + 0x49, 0x63, 0x90, 0x25, 0x00, 0x8c, 0x80, 0x7a, 0xd4, 0xa7, 0x27, 0x0b, 0xe7, 0xe7, 0x58, 0x3f, + 0x8d, 0x75, 0x23, 0xaf, 0x41, 0xc1, 0x72, 0x02, 0xea, 0x39, 0x86, 0xad, 0x1b, 0x8d, 0x06, 0xc6, + 0x98, 0xf5, 0x86, 0x47, 0x77, 0xac, 0x27, 0x22, 0xd4, 0x7c, 0x36, 0x6c, 0x5f, 0x68, 0x34, 0xd6, + 0x8d, 0x3a, 0xdd, 0xc0, 0xc6, 0xe2, 0x3f, 0x28, 0x30, 0xb7, 0x22, 0xbe, 0xaf, 0xe8, 0x81, 0xf7, + 0x01, 0x6d, 0x91, 0x3b, 0x90, 0x65, 0xeb, 0x1b, 0xbd, 0x1a, 0xe8, 0x78, 0x5f, 0xb2, 0x6f, 0x97, + 0x7b, 0x77, 0x0c, 0xf3, 0xed, 0x7b, 0xb4, 0xb5, 0x6c, 0x04, 0x86, 0x7c, 0x52, 0x0c, 0x7d, 0xc2, + 0x27, 0x05, 0x9b, 0xc6, 0xc5, 0x24, 0xb9, 0x13, 0xb3, 0x6d, 0x77, 0x46, 0x6f, 0xae, 0x9d, 0x6c, + 0x41, 0x93, 0xe5, 0x23, 0xa6, 0x89, 0xb6, 0xec, 0x8b, 0xe1, 0x33, 0xa5, 0xa1, 0x2e, 0x7f, 0xec, + 0x18, 0x39, 0xc5, 0x9e, 0x27, 0x5d, 0xbf, 0x02, 0xd9, 0x30, 0xc3, 0xdd, 0xce, 0xfe, 0x92, 0x09, + 0x80, 0xbb, 0x0f, 0xb5, 0x87, 0x8f, 0xb6, 0x56, 0xd7, 0x57, 0x36, 0xf3, 0xca, 0xcd, 0x1f, 0xcd, + 0x41, 0x46, 0x6c, 0xf7, 0xef, 0x2b, 0x30, 0x26, 0x7f, 0xb7, 0x42, 0xca, 0x83, 0x7d, 0x99, 0x12, + 0xee, 0x95, 0x62, 0x65, 0x60, 0x7a, 0x2e, 0x0c, 0xf5, 0x85, 0xf7, 0xff, 0xf5, 0xbf, 0x7e, 0x7f, + 0xe8, 0x33, 0xa4, 0x54, 0x11, 0xa6, 0xa8, 0x22, 0x7f, 0xd6, 0x52, 0x79, 0x47, 0x2c, 0xf1, 0xbb, + 0xec, 0x16, 0x3c, 0x12, 0x9a, 0xc8, 0xa4, 0x3c, 0x5c, 0xfc, 0x2b, 0x98, 0xe2, 0xf5, 0x41, 0x48, + 0x05, 0x96, 0x1b, 0x88, 0xe5, 0x05, 0x52, 0x8c, 0xb0, 0x98, 0x9c, 0xa2, 0x0d, 0xe3, 0x71, 0x8e, + 0x8c, 0x54, 0x76, 0xa9, 0x61, 0x07, 0xbb, 0xc4, 0x83, 0x34, 0x7e, 0x42, 0x41, 0x92, 0x8c, 0x8d, + 0xfc, 0xd1, 0x45, 0x71, 0xbe, 0x3f, 0xa1, 0x80, 0x32, 0x8b, 0x50, 0xf2, 0x64, 0x22, 0x82, 0x82, + 0xf9, 0x5a, 0xf2, 0x75, 0x48, 0x61, 0x12, 0xfe, 0x6a, 0x1f, 0x4e, 0xe1, 0x88, 0x27, 0xfa, 0x8c, + 0x43, 0xbd, 0x84, 0xa3, 0x16, 0x49, 0x21, 0x3e, 0xaa, 0xb4, 0x0a, 0xef, 0xf2, 0x4f, 0x36, 0x30, + 0xf1, 0x4a, 0x5e, 0x1c, 0x2c, 0x3d, 0x7b, 0x3c, 0x92, 0x63, 0x73, 0xb9, 0xea, 0x59, 0x44, 0x32, + 0x49, 0xc6, 0x23, 0x24, 0xec, 0x36, 0x4d, 0xde, 0x53, 0x20, 0xc3, 0xbd, 0x50, 0xd2, 0xf7, 0xc9, + 0x6e, 0x24, 0xf5, 0x6b, 0x03, 0x50, 0x8a, 0x61, 0x3f, 0x83, 0xc3, 0x5e, 0x20, 0xe7, 0xa5, 0x61, + 0x19, 0x81, 0x24, 0x01, 0x1f, 0x32, 0xfc, 0x35, 0x66, 0x22, 0x82, 0xd8, 0x83, 0xcd, 0xa2, 0xfc, + 0x86, 0x47, 0x7c, 0x9a, 0xca, 0x9c, 0x1c, 0x21, 0xf5, 0xee, 0x41, 0xc5, 0x57, 0xac, 0xed, 0x41, + 0xff, 0x40, 0x81, 0x51, 0xe9, 0x21, 0x22, 0xb9, 0x31, 0xd8, 0x83, 0xc5, 0x70, 0xfc, 0xf2, 0xa0, + 0xe4, 0x42, 0x0c, 0x57, 0x11, 0xd1, 0x25, 0x32, 0x17, 0x21, 0xe2, 0xd1, 0x6e, 0xb4, 0x2a, 0x12, + 0xac, 0xef, 0x29, 0x90, 0x8b, 0x5e, 0x8a, 0x25, 0xaa, 0x43, 0xe7, 0xfb, 0xb8, 0x44, 0x75, 0xe8, + 0x7a, 0xbc, 0xa6, 0x5e, 0x43, 0x40, 0x97, 0xc9, 0x67, 0x22, 0x40, 0x46, 0x48, 0x83, 0x2a, 0x2a, + 0x61, 0xfa, 0x81, 0x02, 0x13, 0xf1, 0x97, 0x84, 0xe4, 0xb3, 0x03, 0x8d, 0x25, 0x5d, 0x59, 0x8a, + 0x2f, 0x9f, 0xa0, 0x87, 0x80, 0xf8, 0x22, 0x42, 0x7c, 0x9e, 0x5c, 0xee, 0x01, 0x11, 0x95, 0xa8, + 0xf2, 0x4e, 0x78, 0xf9, 0x78, 0x97, 0x7c, 0x4b, 0x81, 0x31, 0x39, 0x0d, 0x96, 0x68, 0x67, 0x7b, + 0xa4, 0xb2, 0x13, 0xed, 0x6c, 0xaf, 0x34, 0x9f, 0x7a, 0x1e, 0xe1, 0x4d, 0x93, 0xa9, 0x08, 0x5e, + 0x94, 0xbb, 0xfb, 0x43, 0x91, 0xa6, 0xc4, 0xe7, 0xe2, 0x9f, 0x1e, 0xa2, 0x12, 0x22, 0x3a, 0x4f, + 0xce, 0x45, 0x88, 0xf0, 0xe1, 0xbb, 0x2e, 0xe3, 0x1a, 0x95, 0xb2, 0x72, 0x89, 0x4a, 0xdf, 0x9d, + 0x30, 0x4c, 0x54, 0xfa, 0x1e, 0xc9, 0xbe, 0x5e, 0x27, 0x11, 0x52, 0xf1, 0x24, 0xb2, 0xa4, 0x61, + 0x7f, 0xa2, 0xc0, 0x78, 0x2c, 0xd3, 0x46, 0x2a, 0x7d, 0x87, 0x8a, 0xa7, 0x03, 0x8b, 0x9f, 0x1d, + 0xbc, 0xc3, 0xb1, 0x3b, 0x40, 0xa0, 0x13, 0xe2, 0x92, 0xf0, 0xbd, 0xa7, 0x40, 0x2e, 0xca, 0x6f, + 0x25, 0xee, 0xca, 0xce, 0x1c, 0x5f, 0xe2, 0xae, 0xec, 0x4a, 0x99, 0xa9, 0x05, 0xc4, 0x44, 0xd4, + 0xb6, 0x91, 0xf6, 0x1b, 0x86, 0x73, 0x5b, 0xb9, 0x4e, 0xbe, 0x8e, 0x1e, 0x45, 0x75, 0x2f, 0xd9, + 0x4c, 0xc7, 0x5e, 0x1b, 0x16, 0x93, 0x4e, 0x51, 0xf9, 0xc9, 0x69, 0x0f, 0x7b, 0xe9, 0x23, 0x23, + 0x49, 0x04, 0xbf, 0xa6, 0xc0, 0x88, 0x78, 0x10, 0x97, 0xe8, 0x2c, 0xc4, 0x1f, 0xcd, 0x0d, 0x0e, + 0x41, 0x45, 0x08, 0x17, 0x25, 0x4f, 0xa1, 0xc1, 0x39, 0x75, 0x60, 0x10, 0xaf, 0xec, 0x12, 0x31, + 0xc4, 0x5f, 0xe2, 0x9d, 0x06, 0x43, 0x9d, 0x73, 0x92, 0x30, 0x7c, 0x53, 0x81, 0x6c, 0xf8, 0x6a, + 0x91, 0x24, 0xb9, 0x42, 0x1d, 0x0f, 0x2f, 0x8b, 0x2f, 0x0e, 0x44, 0x2b, 0x90, 0x74, 0xbb, 0x0d, + 0x78, 0xcd, 0x8b, 0x9f, 0x5f, 0x63, 0xf2, 0x63, 0xd7, 0x64, 0xeb, 0xd2, 0xfd, 0x8a, 0x36, 0xd9, + 0xba, 0xf4, 0x78, 0x45, 0xab, 0x5e, 0x46, 0x4c, 0xcf, 0x91, 0x0b, 0x92, 0x75, 0xa9, 0x75, 0xc2, + 0x62, 0x3e, 0xa5, 0xe8, 0x9d, 0xb8, 0x44, 0xf1, 0x57, 0xb5, 0xc5, 0x1b, 0xc9, 0xa4, 0x1d, 0x6f, + 0x8a, 0xd5, 0xeb, 0x08, 0xe5, 0x0a, 0x51, 0x13, 0xa0, 0x54, 0xde, 0x61, 0x15, 0xef, 0x32, 0xff, + 0x6e, 0xcd, 0xad, 0xf9, 0x89, 0xfe, 0x9d, 0xf4, 0xb4, 0xfa, 0xa4, 0x50, 0x7a, 0xd9, 0xdc, 0x9a, + 0x2c, 0x91, 0x0f, 0x14, 0xfc, 0x9a, 0xb3, 0x1d, 0xb9, 0x4f, 0xb4, 0x6d, 0xbd, 0x92, 0xd0, 0x89, + 0xb6, 0xad, 0x67, 0x52, 0x40, 0x9d, 0x43, 0x54, 0x05, 0x32, 0x2b, 0xef, 0x26, 0x46, 0x27, 0x9e, + 0xe1, 0xbd, 0xaf, 0x40, 0x2e, 0x0a, 0x3f, 0x26, 0x1a, 0xb4, 0xce, 0xec, 0x41, 0xa2, 0x41, 0xeb, + 0x8a, 0x68, 0xaa, 0x45, 0x04, 0x32, 0x43, 0x48, 0x04, 0x64, 0xd7, 0x0d, 0x04, 0x88, 0x77, 0x21, + 0xcd, 0xbd, 0x89, 0x17, 0xfa, 0x47, 0x94, 0xfa, 0x7b, 0xfb, 0x71, 0xdf, 0xe1, 0x18, 0xb7, 0x53, + 0xf6, 0x18, 0xfe, 0x48, 0x81, 0x51, 0x29, 0x00, 0x95, 0x78, 0x18, 0x76, 0x07, 0xaa, 0x7a, 0x2d, + 0x4a, 0xec, 0x5f, 0x32, 0x91, 0xfa, 0x68, 0xb4, 0xe1, 0x7a, 0x41, 0x0f, 0x1f, 0x50, 0xea, 0x10, + 0x3f, 0x6d, 0x32, 0x3c, 0x18, 0xd3, 0xc7, 0xd6, 0x4b, 0xd1, 0xb0, 0x44, 0x97, 0x3c, 0x1e, 0xd9, + 0xe9, 0x69, 0xed, 0x19, 0x81, 0x04, 0xe1, 0x37, 0x14, 0x80, 0xf6, 0x3d, 0x9b, 0xbc, 0x34, 0xe0, + 0x75, 0xbc, 0xff, 0x0e, 0xea, 0xbe, 0xbc, 0xab, 0x17, 0x10, 0xce, 0x59, 0x32, 0x2d, 0x1f, 0x3e, + 0x82, 0x68, 0xf1, 0xfa, 0x87, 0xff, 0x39, 0x77, 0xe6, 0xc3, 0xa3, 0x39, 0xe5, 0xc7, 0x47, 0x73, + 0xca, 0x4f, 0x8e, 0xe6, 0x94, 0x9f, 0x1e, 0xcd, 0x29, 0xdf, 0xfd, 0x78, 0xee, 0xcc, 0x8f, 0x3f, + 0x9e, 0x3b, 0xf3, 0x93, 0x8f, 0xe7, 0xce, 0x3c, 0xce, 0x86, 0xbc, 0xb7, 0x33, 0x18, 0x8b, 0xf9, + 0xdc, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xad, 0x44, 0xb4, 0xff, 0xfe, 0x46, 0x00, 0x00, } diff --git a/pkg/server/serverpb/status.proto b/pkg/server/serverpb/status.proto index e5ddeed193dd..67456648a144 100644 --- a/pkg/server/serverpb/status.proto +++ b/pkg/server/serverpb/status.proto @@ -103,6 +103,7 @@ message DetailsResponse { util.UnresolvedAddr address = 2 [ (gogoproto.nullable) = false ]; build.Info build_info = 3 [ (gogoproto.nullable) = false ]; SystemInfo system_info = 4 [ (gogoproto.nullable) = false ]; + util.UnresolvedAddr sql_address = 5 [ (gogoproto.nullable) = false, (gogoproto.customname) = "SQLAddress" ]; } message NodesRequest {} diff --git a/pkg/server/settingsworker_test.go b/pkg/server/settingsworker_test.go index bc2767c31e53..7eda47acae20 100644 --- a/pkg/server/settingsworker_test.go +++ b/pkg/server/settingsworker_test.go @@ -257,7 +257,7 @@ func TestSettingsSetAndShow(t *testing.T) { db.ExpectErr(t, `invalid integer value '7' for enum setting`, fmt.Sprintf(setQ, enumKey, "7")) db.Exec(t, `CREATE USER testuser`) - pgURL, cleanupFunc := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User("testuser")) + pgURL, cleanupFunc := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User("testuser")) defer cleanupFunc() testuser, err := gosql.Open("postgres", pgURL.String()) if err != nil { diff --git a/pkg/server/status.go b/pkg/server/status.go index aa57b886dcd9..7199375ac4c6 100644 --- a/pkg/server/status.go +++ b/pkg/server/status.go @@ -615,14 +615,18 @@ func (s *statusServer) Details( return status.Details(ctx, req) } + remoteNodeID := s.gossip.NodeID.Get() resp := &serverpb.DetailsResponse{ - NodeID: s.gossip.NodeID.Get(), + NodeID: remoteNodeID, BuildInfo: build.GetInfo(), SystemInfo: s.si.systemInfo(ctx), } - if addr, err := s.gossip.GetNodeIDAddress(s.gossip.NodeID.Get()); err == nil { + if addr, err := s.gossip.GetNodeIDAddress(remoteNodeID); err == nil { resp.Address = *addr } + if addr, err := s.gossip.GetNodeIDSQLAddress(remoteNodeID); err == nil { + resp.SQLAddress = *addr + } // If Ready is not set, the client doesn't want to know whether this node is // ready to receive client traffic. diff --git a/pkg/server/status/recorder.go b/pkg/server/status/recorder.go index 5ef38f415910..73184764c230 100644 --- a/pkg/server/status/recorder.go +++ b/pkg/server/status/recorder.go @@ -58,6 +58,7 @@ const ( advertiseAddrLabelKey = "advertise-addr" httpAddrLabelKey = "http-addr" + sqlAddrLabelKey = "sql-addr" ) type quantile struct { @@ -170,7 +171,7 @@ func (mr *MetricsRecorder) AddNode( reg *metric.Registry, desc roachpb.NodeDescriptor, startedAt int64, - advertiseAddr, httpAddr string, + advertiseAddr, httpAddr, sqlAddr string, ) { mr.mu.Lock() defer mr.mu.Unlock() @@ -188,6 +189,7 @@ func (mr *MetricsRecorder) AddNode( metadata.AddLabel(advertiseAddrLabelKey, advertiseAddr) metadata.AddLabel(httpAddrLabelKey, httpAddr) + metadata.AddLabel(sqlAddrLabelKey, sqlAddr) nodeIDGauge := metric.NewGauge(metadata) nodeIDGauge.Update(int64(desc.NodeID)) reg.AddMetric(nodeIDGauge) diff --git a/pkg/server/status/recorder_test.go b/pkg/server/status/recorder_test.go index 2f4c2ae9eb3c..ba285e4c1c96 100644 --- a/pkg/server/status/recorder_test.go +++ b/pkg/server/status/recorder_test.go @@ -151,7 +151,7 @@ func TestMetricsRecorder(t *testing.T) { recorder := NewMetricsRecorder(hlc.NewClock(manual.UnixNano, time.Nanosecond), nil, nil, nil, st) recorder.AddStore(store1) recorder.AddStore(store2) - recorder.AddNode(reg1, nodeDesc, 50, "foo:26257", "foo:26258") + recorder.AddNode(reg1, nodeDesc, 50, "foo:26257", "foo:26258", "foo:5432") // Ensure the metric system's view of time does not advance during this test // as the test expects time to not advance too far which would age the actual diff --git a/pkg/server/status_test.go b/pkg/server/status_test.go index 98339863dd3d..beda1b212709 100644 --- a/pkg/server/status_test.go +++ b/pkg/server/status_test.go @@ -96,6 +96,10 @@ func TestStatusJson(t *testing.T) { if err != nil { t.Fatal(err) } + sqlAddr, err := ts.Gossip().GetNodeIDSQLAddress(nodeID) + if err != nil { + t.Fatal(err) + } var nodes serverpb.NodesResponse testutils.SucceedsSoon(t, func() error { @@ -124,6 +128,9 @@ func TestStatusJson(t *testing.T) { if a, e := details.Address, *addr; a != e { t.Errorf("expected: %v, got: %v", e, a) } + if a, e := details.SQLAddress, *sqlAddr; a != e { + t.Errorf("expected: %v, got: %v", e, a) + } if a, e := details.BuildInfo, build.GetInfo(); a != e { t.Errorf("expected: %v, got: %v", e, a) } @@ -275,7 +282,7 @@ func TestStatusGetFiles(t *testing.T) { rootConfig := testutils.NewTestBaseContext(security.RootUser) rpcContext := newRPCTestContext(ts, rootConfig) - url := ts.ServingAddr() + url := ts.ServingRPCAddr() nodeID := ts.NodeID() conn, err := rpcContext.GRPCDialNode(url, nodeID).Connect(context.Background()) if err != nil { @@ -943,7 +950,7 @@ func TestSpanStatsGRPCResponse(t *testing.T) { EndKey: []byte(roachpb.RKeyMax), } - url := ts.ServingAddr() + url := ts.ServingRPCAddr() nodeID := ts.NodeID() conn, err := rpcContext.GRPCDialNode(url, nodeID).Connect(ctx) if err != nil { @@ -973,7 +980,7 @@ func TestNodesGRPCResponse(t *testing.T) { rpcContext := newRPCTestContext(ts, rootConfig) var request serverpb.NodesRequest - url := ts.ServingAddr() + url := ts.ServingRPCAddr() nodeID := ts.NodeID() conn, err := rpcContext.GRPCDialNode(url, nodeID).Connect(context.Background()) if err != nil { @@ -1174,7 +1181,7 @@ func TestRemoteDebugModeSetting(t *testing.T) { // interpreting said metadata). rootConfig := testutils.NewTestBaseContext(security.RootUser) rpcContext := newRPCTestContext(ts, rootConfig) - url := ts.ServingAddr() + url := ts.ServingRPCAddr() nodeID := ts.NodeID() conn, err := rpcContext.GRPCDialNode(url, nodeID).Connect(context.Background()) if err != nil { @@ -1374,7 +1381,7 @@ func TestListSessionsSecurity(t *testing.T) { // gRPC requests behave as root and thus are always allowed. rootConfig := testutils.NewTestBaseContext(security.RootUser) rpcContext := newRPCTestContext(ts, rootConfig) - url := ts.ServingAddr() + url := ts.ServingRPCAddr() nodeID := ts.NodeID() conn, err := rpcContext.GRPCDialNode(url, nodeID).Connect(context.Background()) if err != nil { diff --git a/pkg/server/testserver.go b/pkg/server/testserver.go index f22edda34f82..b52f2f556915 100644 --- a/pkg/server/testserver.go +++ b/pkg/server/testserver.go @@ -76,10 +76,13 @@ func makeTestConfig(st *cluster.Settings) Config { // Addr defaults to localhost with port set at time of call to // Start() to an available port. May be overridden later (as in - // makeTestConfigFromParams). Call TestServer.ServingAddr() for the - // full address (including bound port). + // makeTestConfigFromParams). Call TestServer.ServingRPCAddr() and + // .ServingSQLAddr() for the full address (including bound port). cfg.Addr = util.TestAddr.String() + cfg.SQLAddr = util.TestAddr.String() cfg.AdvertiseAddr = util.TestAddr.String() + cfg.SQLAdvertiseAddr = util.TestAddr.String() + cfg.SplitListenSQL = true cfg.HTTPAddr = util.TestAddr.String() // Set standard user for intra-cluster traffic. cfg.User = security.NodeUser @@ -162,16 +165,24 @@ func makeTestConfigFromParams(params base.TestServerArgs) Config { // stress. cfg.Addr = util.IsolatedTestAddr.String() cfg.AdvertiseAddr = util.IsolatedTestAddr.String() + cfg.SQLAddr = util.IsolatedTestAddr.String() + cfg.SQLAdvertiseAddr = util.IsolatedTestAddr.String() cfg.HTTPAddr = util.IsolatedTestAddr.String() } else { cfg.Addr = util.TestAddr.String() cfg.AdvertiseAddr = util.TestAddr.String() + cfg.SQLAddr = util.TestAddr.String() + cfg.SQLAdvertiseAddr = util.TestAddr.String() cfg.HTTPAddr = util.TestAddr.String() } if params.Addr != "" { cfg.Addr = params.Addr cfg.AdvertiseAddr = params.Addr } + if params.SQLAddr != "" { + cfg.SQLAddr = params.SQLAddr + cfg.SQLAdvertiseAddr = params.SQLAddr + } if params.HTTPAddr != "" { cfg.HTTPAddr = params.HTTPAddr } @@ -310,7 +321,7 @@ func (ts *TestServer) PGServer() *pgwire.Server { // Start starts the TestServer by bootstrapping an in-memory store // (defaults to maximum of 100M). The server is started, launching the // node RPC server and all HTTP endpoints. Use the value of -// TestServer.ServingAddr() after Start() for client connections. +// TestServer.ServingRPCAddr() after Start() for client connections. // Use TestServer.Stopper().Stop() to shutdown the server after the test // completes. func (ts *TestServer) Start(params base.TestServerArgs) error { @@ -405,21 +416,33 @@ func (ts *TestServer) Engines() []engine.Engine { return ts.engines } -// ServingAddr returns the server's address. Should be used by clients. -func (ts *TestServer) ServingAddr() string { +// ServingRPCAddr returns the server's RPC address. Should be used by clients. +func (ts *TestServer) ServingRPCAddr() string { return ts.cfg.AdvertiseAddr } +// ServingSQLAddr returns the server's SQL address. Should be used by clients. +func (ts *TestServer) ServingSQLAddr() string { + return ts.cfg.SQLAdvertiseAddr +} + // HTTPAddr returns the server's HTTP address. Should be used by clients. func (ts *TestServer) HTTPAddr() string { return ts.cfg.HTTPAddr } -// Addr returns the server's listening address. -func (ts *TestServer) Addr() string { +// RPCAddr returns the server's listening RPC address. +// Note: use ServingRPCAddr() instead unless there is a specific reason not to. +func (ts *TestServer) RPCAddr() string { return ts.cfg.Addr } +// SQLAddr returns the server's listening SQL address. +// Note: use ServingSQLAddr() instead unless there is a specific reason not to. +func (ts *TestServer) SQLAddr() string { + return ts.cfg.SQLAddr +} + // WriteSummaries implements TestServerInterface. func (ts *TestServer) WriteSummaries() error { return ts.node.writeNodeStatus(context.TODO(), time.Hour) diff --git a/pkg/sql/conn_executor_test.go b/pkg/sql/conn_executor_test.go index 75267e5f2427..a0bc16c7f86d 100644 --- a/pkg/sql/conn_executor_test.go +++ b/pkg/sql/conn_executor_test.go @@ -94,7 +94,7 @@ func TestSessionFinishRollsBackTxn(t *testing.T) { defer s.Stopper().Stop(context.TODO()) { pgURL, cleanup := sqlutils.PGUrl( - t, s.ServingAddr(), "TestSessionFinishRollsBackTxn", url.User(security.RootUser)) + t, s.ServingSQLAddr(), "TestSessionFinishRollsBackTxn", url.User(security.RootUser)) defer cleanup() if err := aborter.Init(pgURL); err != nil { t.Fatal(err) @@ -119,7 +119,7 @@ CREATE TABLE t.test (k INT PRIMARY KEY, v TEXT); t.Run(state, func(t *testing.T) { // Create a low-level lib/pq connection so we can close it at will. pgURL, cleanupDB := sqlutils.PGUrl( - t, s.ServingAddr(), state, url.User(security.RootUser)) + t, s.ServingSQLAddr(), state, url.User(security.RootUser)) defer cleanupDB() c, err := pq.Open(pgURL.String()) if err != nil { @@ -361,7 +361,7 @@ func TestAppNameStatisticsInitialization(t *testing.T) { pgURL := url.URL{ Scheme: "postgres", User: url.User(security.RootUser), - Host: s.ServingAddr(), + Host: s.ServingSQLAddr(), RawQuery: "sslmode=disable&application_name=mytest", } rawSQL, err := gosql.Open("postgres", pgURL.String()) diff --git a/pkg/sql/crdb_internal.go b/pkg/sql/crdb_internal.go index 1794969181b4..bf176b5657ee 100644 --- a/pkg/sql/crdb_internal.go +++ b/pkg/sql/crdb_internal.go @@ -1968,19 +1968,22 @@ var crdbInternalGossipNodesTable = virtualSchemaTable{ comment: "locally known gossiped node details (RAM; local node only)", schema: ` CREATE TABLE crdb_internal.gossip_nodes ( - node_id INT NOT NULL, - network STRING NOT NULL, - address STRING NOT NULL, - advertise_address STRING NOT NULL, - attrs JSON NOT NULL, - locality STRING NOT NULL, - cluster_name STRING NOT NULL, - server_version STRING NOT NULL, - build_tag STRING NOT NULL, - started_at TIMESTAMP NOT NULL, - is_live BOOL NOT NULL, - ranges INT NOT NULL, - leases INT NOT NULL + node_id INT NOT NULL, + network STRING NOT NULL, + address STRING NOT NULL, + advertise_address STRING NOT NULL, + sql_network STRING NOT NULL, + sql_address STRING NOT NULL, + advertise_sql_address STRING NOT NULL, + attrs JSON NOT NULL, + locality STRING NOT NULL, + cluster_name STRING NOT NULL, + server_version STRING NOT NULL, + build_tag STRING NOT NULL, + started_at TIMESTAMP NOT NULL, + is_live BOOL NOT NULL, + ranges INT NOT NULL, + leases INT NOT NULL ) `, populate: func(ctx context.Context, p *planner, _ *DatabaseDescriptor, addRow func(...tree.Datum) error) error { @@ -2058,16 +2061,30 @@ CREATE TABLE crdb_internal.gossip_nodes ( attrs.Add(json.FromString(a)) } - addr, err := g.GetNodeIDAddress(d.NodeID) + listenAddrRPC := d.Address + listenAddrSQL := d.SQLAddress + if listenAddrSQL.IsEmpty() { + // Pre-19.2 node or same address for both. + listenAddrSQL = listenAddrRPC + } + + advAddrRPC, err := g.GetNodeIDAddress(d.NodeID) + if err != nil { + return err + } + advAddrSQL, err := g.GetNodeIDSQLAddress(d.NodeID) if err != nil { return err } if err := addRow( tree.NewDInt(tree.DInt(d.NodeID)), - tree.NewDString(d.Address.NetworkField), - tree.NewDString(d.Address.AddressField), - tree.NewDString(addr.String()), + tree.NewDString(listenAddrRPC.NetworkField), + tree.NewDString(listenAddrRPC.AddressField), + tree.NewDString(advAddrRPC.String()), + tree.NewDString(listenAddrSQL.NetworkField), + tree.NewDString(listenAddrSQL.AddressField), + tree.NewDString(advAddrSQL.String()), tree.NewDJSON(attrs.Build()), tree.NewDString(d.Locality.String()), tree.NewDString(d.ClusterName), diff --git a/pkg/sql/create_stats_test.go b/pkg/sql/create_stats_test.go index 01071a203d8c..dd1ba6f9ff32 100644 --- a/pkg/sql/create_stats_test.go +++ b/pkg/sql/create_stats_test.go @@ -54,7 +54,7 @@ func TestStatsWithLowTTL(t *testing.T) { r.Exec(t, `INSERT INTO t SELECT k, 2*k, 3*k FROM generate_series(0, $1) AS g(k)`, numRows-1) pgURL, cleanupFunc := sqlutils.PGUrl(t, - s.ServingAddr(), + s.ServingSQLAddr(), "TestStatsWithLowTTL", url.User(security.RootUser), ) diff --git a/pkg/sql/create_test.go b/pkg/sql/create_test.go index 28cfad6fe069..93044c2811f6 100644 --- a/pkg/sql/create_test.go +++ b/pkg/sql/create_test.go @@ -440,7 +440,7 @@ func TestCreateStatementType(t *testing.T) { ctx := context.TODO() defer s.Stopper().Stop(ctx) - pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() pgxConfig, err := pgx.ParseConnectionString(pgURL.String()) if err != nil { diff --git a/pkg/sql/distsql_physical_planner_test.go b/pkg/sql/distsql_physical_planner_test.go index a53b2dedf6dc..77db8e936b5d 100644 --- a/pkg/sql/distsql_physical_planner_test.go +++ b/pkg/sql/distsql_physical_planner_test.go @@ -155,7 +155,7 @@ func TestPlanningDuringSplitsAndMerges(t *testing.T) { // Create a gosql.DB for this worker. pgURL, cleanupGoDB := sqlutils.PGUrl( - t, tc.Server(0).ServingAddr(), fmt.Sprintf("%d", idx), url.User(security.RootUser), + t, tc.Server(0).ServingSQLAddr(), fmt.Sprintf("%d", idx), url.User(security.RootUser), ) defer cleanupGoDB() diff --git a/pkg/sql/distsqlrun/cluster_test.go b/pkg/sql/distsqlrun/cluster_test.go index 2f9080d00c73..9c291cf41215 100644 --- a/pkg/sql/distsqlrun/cluster_test.go +++ b/pkg/sql/distsqlrun/cluster_test.go @@ -204,7 +204,7 @@ func TestClusterFlow(t *testing.T) { var clients []distsqlpb.DistSQLClient for i := 0; i < 3; i++ { s := tc.Server(i) - conn, err := s.RPCContext().GRPCDialNode(s.ServingAddr(), s.NodeID()).Connect(ctx) + conn, err := s.RPCContext().GRPCDialNode(s.ServingRPCAddr(), s.NodeID()).Connect(ctx) if err != nil { t.Fatal(err) } @@ -486,7 +486,7 @@ func TestLimitedBufferingDeadlock(t *testing.T) { }, } s := tc.Server(0) - conn, err := s.RPCContext().GRPCDialNode(s.ServingAddr(), s.NodeID()).Connect(context.Background()) + conn, err := s.RPCContext().GRPCDialNode(s.ServingRPCAddr(), s.NodeID()).Connect(context.Background()) if err != nil { t.Fatal(err) } @@ -715,7 +715,7 @@ func BenchmarkInfrastructure(b *testing.B) { var clients []distsqlpb.DistSQLClient for i := 0; i < numNodes; i++ { s := tc.Server(i) - conn, err := s.RPCContext().GRPCDialNode(s.ServingAddr(), s.NodeID()).Connect(context.Background()) + conn, err := s.RPCContext().GRPCDialNode(s.ServingRPCAddr(), s.NodeID()).Connect(context.Background()) if err != nil { b.Fatal(err) } diff --git a/pkg/sql/distsqlrun/processors_test.go b/pkg/sql/distsqlrun/processors_test.go index 9fe28630caa5..b2f2b4f52a35 100644 --- a/pkg/sql/distsqlrun/processors_test.go +++ b/pkg/sql/distsqlrun/processors_test.go @@ -573,7 +573,7 @@ func TestDrainingProcessorSwallowsUncertaintyError(t *testing.T) { } pgURL, cleanup := sqlutils.PGUrl( - t, tc.Server(0).ServingAddr(), t.Name(), url.User(security.RootUser)) + t, tc.Server(0).ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() pgURL.Path = `test` pgxConfig, err := pgx.ParseConnectionString(pgURL.String()) diff --git a/pkg/sql/distsqlrun/server_test.go b/pkg/sql/distsqlrun/server_test.go index 27bcd96e35d9..ddede5f35805 100644 --- a/pkg/sql/distsqlrun/server_test.go +++ b/pkg/sql/distsqlrun/server_test.go @@ -33,7 +33,7 @@ func TestServer(t *testing.T) { ctx := context.Background() s, sqlDB, kvDB := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(ctx) - conn, err := s.RPCContext().GRPCDialNode(s.ServingAddr(), s.NodeID()).Connect(ctx) + conn, err := s.RPCContext().GRPCDialNode(s.ServingRPCAddr(), s.NodeID()).Connect(ctx) if err != nil { t.Fatal(err) } diff --git a/pkg/sql/logictest/logic.go b/pkg/sql/logictest/logic.go index fe7138579483..badd573db698 100644 --- a/pkg/sql/logictest/logic.go +++ b/pkg/sql/logictest/logic.go @@ -916,7 +916,7 @@ func (t *logicTest) setUser(user string) func() { return func() {} } - addr := t.cluster.Server(t.nodeIdx).ServingAddr() + addr := t.cluster.Server(t.nodeIdx).ServingSQLAddr() pgURL, cleanupFunc := sqlutils.PGUrl(t.t, addr, "TestLogic", url.User(user)) pgURL.Path = "test" db, err := gosql.Open("postgres", pgURL.String()) diff --git a/pkg/sql/logictest/parallel_test.go b/pkg/sql/logictest/parallel_test.go index 9fe29dce6bbd..3634fdcb710e 100644 --- a/pkg/sql/logictest/parallel_test.go +++ b/pkg/sql/logictest/parallel_test.go @@ -86,7 +86,7 @@ func (t *parallelTest) getClient(nodeIdx, clientIdx int) *gosql.DB { for len(t.clients[nodeIdx]) <= clientIdx { // Add a client. pgURL, cleanupFunc := sqlutils.PGUrl(t.T, - t.cluster.Server(nodeIdx).ServingAddr(), + t.cluster.Server(nodeIdx).ServingSQLAddr(), "TestParallel", url.User(security.RootUser)) db, err := gosql.Open("postgres", pgURL.String()) diff --git a/pkg/sql/pgwire/conn_test.go b/pkg/sql/pgwire/conn_test.go index 20dad7d21286..3c0449c824d8 100644 --- a/pkg/sql/pgwire/conn_test.go +++ b/pkg/sql/pgwire/conn_test.go @@ -81,6 +81,7 @@ func TestConn(t *testing.T) { t.Fatal(err) } serverAddr := ln.Addr() + log.Infof(context.TODO(), "started listener on %s", serverAddr) var g errgroup.Group ctx := context.TODO() @@ -659,7 +660,7 @@ func TestConnClose(t *testing.T) { t.Fatal(err) } pgURL, cleanupFunc := sqlutils.PGUrl( - t, s.ServingAddr(), "testConnClose" /* prefix */, url.User(security.RootUser), + t, s.ServingSQLAddr(), "testConnClose" /* prefix */, url.User(security.RootUser), ) defer cleanupFunc() noBufferDB, err := gosql.Open("postgres", pgURL.String()) @@ -796,6 +797,7 @@ func TestReadTimeoutConnExits(t *testing.T) { if err != nil { t.Fatal(err) } + log.Infof(context.TODO(), "started listener on %s", ln.Addr()) defer func() { if err := ln.Close(); err != nil { t.Fatal(err) @@ -867,7 +869,7 @@ func TestConnResultsBufferSize(t *testing.T) { require.Equal(t, `16384`, size) } - pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanup() q := pgURL.Query() @@ -950,7 +952,7 @@ func TestConnCloseCancelsAuth(t *testing.T) { // We're going to open a client connection and do the minimum so that the // server gets to the authentication phase, where it will block. - conn, err := net.Dial("tcp", s.ServingAddr()) + conn, err := net.Dial("tcp", s.ServingSQLAddr()) if err != nil { t.Fatal(err) } diff --git a/pkg/sql/pgwire/pgtest_test.go b/pkg/sql/pgwire/pgtest_test.go index 85d1da281d72..52aa1e3464bf 100644 --- a/pkg/sql/pgwire/pgtest_test.go +++ b/pkg/sql/pgwire/pgtest_test.go @@ -39,7 +39,7 @@ func TestPGTest(t *testing.T) { }) defer s.Stopper().Stop(ctx) - addr = s.Addr() + addr = s.ServingSQLAddr() user = security.RootUser } diff --git a/pkg/sql/pgwire/pgwire_test.go b/pkg/sql/pgwire/pgwire_test.go index 074abde3813d..964427f46aad 100644 --- a/pkg/sql/pgwire/pgwire_test.go +++ b/pkg/sql/pgwire/pgwire_test.go @@ -90,7 +90,7 @@ func TestPGWire(t *testing.T) { for _, insecure := range [...]bool{true, false} { params := base.TestServerArgs{Insecure: insecure} s, _, _ := serverutils.StartServer(t, params) - host, port, err := net.SplitHostPort(s.ServingAddr()) + host, port, err := net.SplitHostPort(s.ServingSQLAddr()) if err != nil { t.Fatal(err) } @@ -191,11 +191,11 @@ func TestPGWireNonexistentUser(t *testing.T) { pgURL = url.URL{ Scheme: "postgres", User: url.User(server.TestUser), - Host: s.ServingAddr(), + Host: s.ServingSQLAddr(), RawQuery: "sslmode=disable", } } else { - pgURL, _ = sqlutils.PGUrl(t, s.ServingAddr(), "StartServer", url.User(server.TestUser)) + pgURL, _ = sqlutils.PGUrl(t, s.ServingSQLAddr(), "StartServer", url.User(server.TestUser)) } err := trivialQuery(pgURL) @@ -215,7 +215,7 @@ func TestPGWireDrainClient(t *testing.T) { ctx := context.TODO() defer s.Stopper().Stop(ctx) - host, port, err := net.SplitHostPort(s.ServingAddr()) + host, port, err := net.SplitHostPort(s.ServingSQLAddr()) if err != nil { t.Fatal(err) } @@ -288,7 +288,7 @@ func TestPGWireDrainOngoingTxns(t *testing.T) { s, _, _ := serverutils.StartServer(t, params) defer s.Stopper().Stop(context.TODO()) - host, port, err := net.SplitHostPort(s.ServingAddr()) + host, port, err := net.SplitHostPort(s.ServingSQLAddr()) if err != nil { t.Fatal(err) } @@ -386,7 +386,7 @@ func TestPGWireDBName(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) pgURL.Path = "foo" defer cleanupFn() { @@ -423,7 +423,7 @@ func TestPGUnwrapError(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -450,7 +450,7 @@ func TestPGPrepareFail(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -501,7 +501,7 @@ func TestPGPrepareWithCreateDropInTxn(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -979,7 +979,7 @@ func TestPGPreparedQuery(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -1456,7 +1456,7 @@ func TestPGPrepareNameQual(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -1507,7 +1507,7 @@ func TestPGPrepareInvalidate(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -1573,7 +1573,7 @@ func TestCmdCompleteVsEmptyStatements(t *testing.T) { defer s.Stopper().Stop(context.TODO()) pgURL, cleanupFn := sqlutils.PGUrl( - t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -1616,7 +1616,7 @@ func TestPGCommandTags(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -1739,7 +1739,7 @@ func TestSQLNetworkMetrics(t *testing.T) { // Setup pgwire client. pgURL, cleanupFn := sqlutils.PGUrl( - t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() const minbytes = 20 @@ -1857,7 +1857,7 @@ func TestPGWireAuth(t *testing.T) { t.Run("RootUserAuth", func(t *testing.T) { // Authenticate as root with certificate and expect success. rootPgURL, cleanupFn := sqlutils.PGUrl( - t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() if err := trivialQuery(rootPgURL); err != nil { t.Fatal(err) @@ -1883,7 +1883,7 @@ func TestPGWireAuth(t *testing.T) { t.Run("UnicodeUserAuth", func(t *testing.T) { // Try to perform authentication with unicodeUser and no password. // This case is equivalent to supplying a wrong password. - host, port, err := net.SplitHostPort(s.ServingAddr()) + host, port, err := net.SplitHostPort(s.ServingSQLAddr()) if err != nil { t.Fatal(err) } @@ -1907,7 +1907,7 @@ func TestPGWireAuth(t *testing.T) { t.Run("TestUserAuth", func(t *testing.T) { testUserPgURL, cleanupFn := sqlutils.PGUrl( - t, s.ServingAddr(), t.Name(), url.User(server.TestUser)) + t, s.ServingSQLAddr(), t.Name(), url.User(server.TestUser)) defer cleanupFn() // No password supplied but valid certificate should result in // successful authentication. @@ -2058,7 +2058,7 @@ func TestHBA(t *testing.T) { t.Run("root", func(t *testing.T) { // Authenticate as root with certificate and expect success. rootPgURL, cleanupFn := sqlutils.PGUrl( - t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() if err := trivialQuery(rootPgURL); err != nil { t.Fatalf("could not auth as root: %v", err) @@ -2067,7 +2067,7 @@ func TestHBA(t *testing.T) { t.Run("cert", func(t *testing.T) { testUserPgURL, cleanupFn := sqlutils.PGUrl( - t, s.ServingAddr(), t.Name(), url.User(server.TestUser)) + t, s.ServingSQLAddr(), t.Name(), url.User(server.TestUser)) defer cleanupFn() err := trivialQuery(testUserPgURL) if !testutils.IsError(err, tc.certErr) { @@ -2076,7 +2076,7 @@ func TestHBA(t *testing.T) { }) t.Run("password", func(t *testing.T) { - host, port, err := net.SplitHostPort(s.ServingAddr()) + host, port, err := net.SplitHostPort(s.ServingSQLAddr()) if err != nil { t.Fatal(err) } @@ -2100,7 +2100,7 @@ func TestPGWireResultChange(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) @@ -2167,7 +2167,7 @@ func TestSessionParameters(t *testing.T) { ctx := context.TODO() defer s.Stopper().Stop(ctx) - host, ports, _ := net.SplitHostPort(s.ServingAddr()) + host, ports, _ := net.SplitHostPort(s.ServingSQLAddr()) port, _ := strconv.Atoi(ports) connCfg := pgx.ConnConfig{ @@ -2286,7 +2286,7 @@ func TestCancelRequest(t *testing.T) { defer s.Stopper().Stop(ctx) var d net.Dialer - conn, err := d.DialContext(ctx, "tcp", s.Addr()) + conn, err := d.DialContext(ctx, "tcp", s.ServingSQLAddr()) if err != nil { t.Fatal(err) } @@ -2314,7 +2314,7 @@ func TestFailPrepareFailsTxn(t *testing.T) { s, _, _ := serverutils.StartServer(t, base.TestServerArgs{}) defer s.Stopper().Stop(context.TODO()) - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), t.Name(), url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), t.Name(), url.User(security.RootUser)) defer cleanupFn() db, err := gosql.Open("postgres", pgURL.String()) diff --git a/pkg/sql/pgwire_internal_test.go b/pkg/sql/pgwire_internal_test.go index 66cf6d6729c5..c4498b307777 100644 --- a/pkg/sql/pgwire_internal_test.go +++ b/pkg/sql/pgwire_internal_test.go @@ -36,7 +36,7 @@ func TestPGWireConnectionCloseReleasesLeases(t *testing.T) { s, _, kvDB := serverutils.StartServer(t, base.TestServerArgs{}) ctx := context.TODO() defer s.Stopper().Stop(ctx) - url, cleanupConn := sqlutils.PGUrl(t, s.ServingAddr(), "SetupServer", url.User(security.RootUser)) + url, cleanupConn := sqlutils.PGUrl(t, s.ServingSQLAddr(), "SetupServer", url.User(security.RootUser)) defer cleanupConn() conn, err := pq.Open(url.String()) if err != nil { diff --git a/pkg/sql/show_test.go b/pkg/sql/show_test.go index 54fa84eff3b4..51c65bea4620 100644 --- a/pkg/sql/show_test.go +++ b/pkg/sql/show_test.go @@ -787,7 +787,7 @@ func TestShowSessionPrivileges(t *testing.T) { pgURL := url.URL{ Scheme: "postgres", User: url.User("nonroot"), - Host: s.ServingAddr(), + Host: s.ServingSQLAddr(), RawQuery: "sslmode=disable", } rawSQLDBnonroot, err := gosql.Open("postgres", pgURL.String()) diff --git a/pkg/sql/trace_test.go b/pkg/sql/trace_test.go index 5a3abbab621c..b126b9408c6a 100644 --- a/pkg/sql/trace_test.go +++ b/pkg/sql/trace_test.go @@ -305,7 +305,7 @@ func TestTrace(t *testing.T) { // TODO(andrei): Pull the check for an empty session_trace out of // the sub-tests so we can use cluster.ServerConn(i) here. pgURL, cleanup := sqlutils.PGUrl( - t, cluster.Server(i).ServingAddr(), "TestTrace", url.User(security.RootUser)) + t, cluster.Server(i).ServingSQLAddr(), "TestTrace", url.User(security.RootUser)) defer cleanup() sqlDB, err := gosql.Open("postgres", pgURL.String()) if err != nil { diff --git a/pkg/sql/txn_restart_test.go b/pkg/sql/txn_restart_test.go index 03b9a2631b8b..c66e8f4f0b86 100644 --- a/pkg/sql/txn_restart_test.go +++ b/pkg/sql/txn_restart_test.go @@ -212,7 +212,7 @@ func checkRestarts(t *testing.T, magicVals *filterVals) { // s, sqlDB, _ := serverutils.StartServer(t, params) // defer s.Stopper().Stop(context.TODO()) // { -// pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestTxnAutoRetry", url.User(security.RootUser) +// pgURL, cleanup := sqlutils.PGUrl(t, s.ServingRPCAddr(), "TestTxnAutoRetry", url.User(security.RootUser) // defer cleanup() // if err := aborter.Init(pgURL); err != nil { // t.Fatal(err) @@ -450,7 +450,7 @@ func TestTxnAutoRetry(t *testing.T) { s, sqlDB, _ := serverutils.StartServer(t, params) defer s.Stopper().Stop(context.TODO()) { - pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestTxnAutoRetry", url.User(security.RootUser)) + pgURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), "TestTxnAutoRetry", url.User(security.RootUser)) defer cleanup() if err := aborter.Init(pgURL); err != nil { t.Fatal(err) @@ -630,7 +630,7 @@ func TestAbortedTxnOnlyRetriedOnce(t *testing.T) { s, sqlDB, _ := serverutils.StartServer(t, params) defer s.Stopper().Stop(context.TODO()) { - pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestAbortedTxnOnlyRetriedOnce", url.User(security.RootUser)) + pgURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), "TestAbortedTxnOnlyRetriedOnce", url.User(security.RootUser)) defer cleanup() if err := aborter.Init(pgURL); err != nil { t.Fatal(err) @@ -785,7 +785,7 @@ func TestTxnUserRestart(t *testing.T) { s, sqlDB, _ := serverutils.StartServer(t, params) defer s.Stopper().Stop(context.TODO()) { - pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestTxnUserRestart", url.User(security.RootUser)) + pgURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), "TestTxnUserRestart", url.User(security.RootUser)) defer cleanup() if err := aborter.Init(pgURL); err != nil { t.Fatal(err) @@ -899,7 +899,7 @@ func TestErrorOnCommitFinalizesTxn(t *testing.T) { s, sqlDB, _ := serverutils.StartServer(t, params) defer s.Stopper().Stop(context.TODO()) { - pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestErrorOnCommitFinalizesTxn", url.User(security.RootUser)) + pgURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), "TestErrorOnCommitFinalizesTxn", url.User(security.RootUser)) defer cleanup() if err := aborter.Init(pgURL); err != nil { t.Fatal(err) @@ -985,7 +985,7 @@ func TestRollbackInRestartWait(t *testing.T) { s, sqlDB, _ := serverutils.StartServer(t, params) defer s.Stopper().Stop(context.TODO()) { - pgURL, cleanup := sqlutils.PGUrl(t, s.ServingAddr(), "TestRollbackInRestartWait", url.User(security.RootUser)) + pgURL, cleanup := sqlutils.PGUrl(t, s.ServingSQLAddr(), "TestRollbackInRestartWait", url.User(security.RootUser)) defer cleanup() if err := aborter.Init(pgURL); err != nil { t.Fatal(err) diff --git a/pkg/storage/gossip_test.go b/pkg/storage/gossip_test.go index c3b21d43f94f..1355fb042577 100644 --- a/pkg/storage/gossip_test.go +++ b/pkg/storage/gossip_test.go @@ -168,9 +168,10 @@ func TestGossipHandlesReplacedNode(t *testing.T) { // Take down the first node and replace it with a new one. oldNodeIdx := 0 newServerArgs := serverArgs - newServerArgs.Addr = tc.Servers[oldNodeIdx].ServingAddr() + newServerArgs.Addr = tc.Servers[oldNodeIdx].ServingRPCAddr() + newServerArgs.SQLAddr = tc.Servers[oldNodeIdx].ServingSQLAddr() newServerArgs.PartOfCluster = true - newServerArgs.JoinAddr = tc.Servers[1].ServingAddr() + newServerArgs.JoinAddr = tc.Servers[1].ServingRPCAddr() log.Infof(ctx, "stopping server %d", oldNodeIdx) tc.StopServer(oldNodeIdx) tc.AddServer(t, newServerArgs) diff --git a/pkg/storage/log_test.go b/pkg/storage/log_test.go index e87ecfc82184..16a58acf9493 100644 --- a/pkg/storage/log_test.go +++ b/pkg/storage/log_test.go @@ -280,7 +280,7 @@ func TestLogRebalances(t *testing.T) { checkMetrics(2 /*adds*/, 1 /*remove*/) // Open a SQL connection to verify that the events have been logged. - pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingAddr(), "TestLogRebalances", url.User(security.RootUser)) + pgURL, cleanupFn := sqlutils.PGUrl(t, s.ServingSQLAddr(), "TestLogRebalances", url.User(security.RootUser)) defer cleanupFn() sqlDB, err := gosql.Open("postgres", pgURL.String()) diff --git a/pkg/testutils/distsqlutils/fake_resolver.go b/pkg/testutils/distsqlutils/fake_resolver.go index df75373d0971..11d567658845 100644 --- a/pkg/testutils/distsqlutils/fake_resolver.go +++ b/pkg/testutils/distsqlutils/fake_resolver.go @@ -25,7 +25,7 @@ func FakeResolverForTestCluster(tc serverutils.TestClusterInterface) distsqlplan s := tc.Server(i) nodeDescs[i] = &roachpb.NodeDescriptor{ NodeID: s.NodeID(), - Address: util.UnresolvedAddr{AddressField: s.ServingAddr()}, + Address: util.UnresolvedAddr{AddressField: s.ServingRPCAddr()}, } } diff --git a/pkg/testutils/reduce/reducesql/reducesql_test.go b/pkg/testutils/reduce/reducesql/reducesql_test.go index dfc962ba2346..6e1e518803b4 100644 --- a/pkg/testutils/reduce/reducesql/reducesql_test.go +++ b/pkg/testutils/reduce/reducesql/reducesql_test.go @@ -52,7 +52,7 @@ func isInterestingSQL(contains string) reduce.InterestingFn { url := url.URL{ Scheme: "postgres", User: url.User(security.RootUser), - Host: server.ServingAddr(), + Host: server.ServingSQLAddr(), RawQuery: options.Encode(), } diff --git a/pkg/testutils/serverutils/test_server_shim.go b/pkg/testutils/serverutils/test_server_shim.go index 44f1782b728a..9e05998ad0a5 100644 --- a/pkg/testutils/serverutils/test_server_shim.go +++ b/pkg/testutils/serverutils/test_server_shim.go @@ -50,14 +50,22 @@ type TestServerInterface interface { // NodeID returns the ID of this node within its cluster. NodeID() roachpb.NodeID - // ServingAddr returns the server's advertised address. - ServingAddr() string + // ServingRPCAddr returns the server's advertised address. + ServingRPCAddr() string + + // ServingSQLAddr returns the server's advertised SQL address. + ServingSQLAddr() string // HTTPAddr returns the server's http address. HTTPAddr() string - // Addr returns the server's address. - Addr() string + // RPCAddr returns the server's RPC address. + // Note: use ServingRPCAddr() instead unless specific reason not to. + RPCAddr() string + + // SQLAddr returns the server's SQL address. + // Note: use ServingSQLAddr() instead unless specific reason not to. + SQLAddr() string // DB returns a *client.DB instance for talking to this KV server. DB() *client.DB @@ -179,7 +187,7 @@ func StartServer( } pgURL, cleanupGoDB := sqlutils.PGUrl( - t, server.ServingAddr(), "StartServer" /* prefix */, url.User(security.RootUser)) + t, server.ServingSQLAddr(), "StartServer" /* prefix */, url.User(security.RootUser)) pgURL.Path = params.UseDatabase if params.Insecure { pgURL.RawQuery = "sslmode=disable" diff --git a/pkg/testutils/testcluster/testcluster.go b/pkg/testutils/testcluster/testcluster.go index f5a5ba779de9..7a3e75733473 100644 --- a/pkg/testutils/testcluster/testcluster.go +++ b/pkg/testutils/testcluster/testcluster.go @@ -161,7 +161,7 @@ func StartTestCluster(t testing.TB, nodes int, args base.TestClusterArgs) *TestC } if i > 0 { - serverArgs.JoinAddr = tc.Servers[0].ServingAddr() + serverArgs.JoinAddr = tc.Servers[0].ServingRPCAddr() } if err := tc.doAddServer(t, serverArgs); err != nil { t.Fatal(err) @@ -228,7 +228,7 @@ func checkServerArgsForCluster( // cluster's ReplicationMode. func (tc *TestCluster) AddServer(t testing.TB, serverArgs base.TestServerArgs) { if serverArgs.JoinAddr == "" && len(tc.Servers) > 0 { - serverArgs.JoinAddr = tc.Servers[0].ServingAddr() + serverArgs.JoinAddr = tc.Servers[0].ServingRPCAddr() } if err := tc.doAddServer(t, serverArgs); err != nil { t.Fatal(err) @@ -665,7 +665,7 @@ func (tc *TestCluster) WaitForFullReplication() error { // store in the cluster. func (tc *TestCluster) WaitForNodeStatuses(t testing.TB) { testutils.SucceedsSoon(t, func() error { - url := tc.Server(0).ServingAddr() + url := tc.Server(0).ServingRPCAddr() nodeID := tc.Server(0).NodeID() conn, err := tc.Server(0).RPCContext().GRPCDialNode(url, nodeID).Connect(context.Background()) if err != nil { diff --git a/pkg/testutils/testcluster/testcluster_test.go b/pkg/testutils/testcluster/testcluster_test.go index 9ed4aac2fb54..5a9a812f78e4 100644 --- a/pkg/testutils/testcluster/testcluster_test.go +++ b/pkg/testutils/testcluster/testcluster_test.go @@ -207,7 +207,7 @@ func TestStopServer(t *testing.T) { tc.Server(1).RPCContext().Config, tc.Server(1).Clock(), tc.Stopper(), &tc.Server(1).ClusterSettings().Version, ) - conn, err := rpcContext.GRPCDialNode(server1.ServingAddr(), server1.NodeID()).Connect(context.Background()) + conn, err := rpcContext.GRPCDialNode(server1.ServingRPCAddr(), server1.NodeID()).Connect(context.Background()) if err != nil { t.Fatal(err) }