Skip to content

Commit

Permalink
lazy friendly name generation
Browse files Browse the repository at this point in the history
Signed-off-by: Dan Zhang <danzh@google.com>
  • Loading branch information
danzh1989 committed Apr 30, 2024
1 parent 81c6142 commit 6d9ba75
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 15 deletions.
19 changes: 11 additions & 8 deletions source/common/network/address_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -233,14 +233,15 @@ absl::Status Ipv4Instance::validateProtocolSupported() {
void Ipv4Instance::initHelper(const sockaddr_in* address) {
memset(&ip_.ipv4_.address_, 0, sizeof(ip_.ipv4_.address_));
ip_.ipv4_.address_ = *address;
ip_.friendly_address_ = sockaddrToString(*address);
}

void Ipv4Instance::populateAddressPortString() {
// Based on benchmark testing, this reserve+append implementation runs faster than absl::StrCat.
fmt::format_int port(ntohs(address->sin_port));
friendly_name_.reserve(ip_.friendly_address_.size() + 1 + port.size());
friendly_name_.append(ip_.friendly_address_);
friendly_name_.push_back(':');
friendly_name_.append(port.data(), port.size());
fmt::format_int port(ntohs(ip_.ipv4_.sin_port));
address_port_string_.reserve(ip_.addressAsString().size() + 1 + port.size());
address_port_string_.append(ip_.addressAsString());
address_port_string_.push_back(':');
address_port_string_.append(port.data(), port.size());
}

absl::uint128 Ipv6Instance::Ipv6Helper::address() const {
Expand Down Expand Up @@ -354,9 +355,11 @@ absl::Status Ipv6Instance::validateProtocolSupported() {

void Ipv6Instance::initHelper(const sockaddr_in6& address, bool v6only) {
ip_.ipv6_.address_ = address;
ip_.friendly_address_ = ip_.ipv6_.makeFriendlyAddress();
ip_.ipv6_.v6only_ = v6only;
friendly_name_ = fmt::format("[{}]:{}", ip_.friendly_address_, ip_.port());
}

void Ipv6Instance::populateAddressPortString() {
address_port_string_ = fmt::format("[{}]:{}", ip_.addressAsString(), ip_.port());
}

PipeInstance::PipeInstance(const sockaddr_un* address, socklen_t ss_len, mode_t mode,
Expand Down
38 changes: 31 additions & 7 deletions source/common/network/address_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,13 @@ InstanceConstSharedPtr addressFromSockAddrOrDie(const sockaddr_storage& ss, sock
class InstanceBase : public Instance {
public:
// Network::Address::Instance
const std::string& asString() const override { return friendly_name_; }
absl::string_view asStringView() const override { return friendly_name_; }
const std::string& asString() const override {
if (address_port_string_.empty()) {
populateAddressPortString();
}
return address_port_string_;
}
absl::string_view asStringView() const override { return asString(); }
// Default logical name is the human-readable name.
const std::string& logicalName() const override { return asString(); }
Type type() const override { return type_; }
Expand All @@ -73,7 +78,9 @@ class InstanceBase : public Instance {
InstanceBase(Type type, const SocketInterface* sock_interface)
: socket_interface_(*sock_interface), type_(type) {}

std::string friendly_name_;
virtual void populateAddressPortString() PURE;

std::string address_port_string_;
const SocketInterface& socket_interface_;

private:
Expand Down Expand Up @@ -154,6 +161,9 @@ class Ipv4Instance : public InstanceBase {
*/
static Envoy::Cleanup forceProtocolUnsupportedForTest(bool new_val);

protected:
void populateAddressPortString() override;

private:
/**
* Construct from an existing unix IPv4 socket address (IP v4 address and port).
Expand All @@ -171,7 +181,12 @@ class Ipv4Instance : public InstanceBase {
};

struct IpHelper : public Ip {
const std::string& addressAsString() const override { return friendly_address_; }
const std::string& addressAsString() const override {
if (address_string_.empty()) {
address_string_ = sockaddrToString(ipv4_.address_);
}
return address_string_;
}
bool isAnyAddress() const override { return ipv4_.address_.sin_addr.s_addr == INADDR_ANY; }
bool isUnicastAddress() const override {
return !isAnyAddress() && (ipv4_.address_.sin_addr.s_addr != INADDR_BROADCAST) &&
Expand All @@ -184,7 +199,7 @@ class Ipv4Instance : public InstanceBase {
IpVersion version() const override { return IpVersion::v4; }

Ipv4Helper ipv4_;
std::string friendly_address_;
std::string address_string_;
};

void initHelper(const sockaddr_in* address);
Expand Down Expand Up @@ -242,6 +257,9 @@ class Ipv6Instance : public InstanceBase {
*/
static Envoy::Cleanup forceProtocolUnsupportedForTest(bool new_val);

protected:
void populateAddressPortString() override;

private:
/**
* Construct from an existing unix IPv6 socket address (IP v6 address and port).
Expand Down Expand Up @@ -271,7 +289,13 @@ class Ipv6Instance : public InstanceBase {
};

struct IpHelper : public Ip {
const std::string& addressAsString() const override { return friendly_address_; }
const std::string& addressAsString() const override {
if (address_string_.empty()) {
address_string_ = ipv6_.makeFriendlyAddress();
}
return address_string_;
}

bool isAnyAddress() const override {
return 0 == memcmp(&ipv6_.address_.sin6_addr, &in6addr_any, sizeof(struct in6_addr));
}
Expand All @@ -284,7 +308,7 @@ class Ipv6Instance : public InstanceBase {
IpVersion version() const override { return IpVersion::v6; }

Ipv6Helper ipv6_;
std::string friendly_address_;
std::string address_string_;
};

void initHelper(const sockaddr_in6& address, bool v6only);
Expand Down

0 comments on commit 6d9ba75

Please sign in to comment.