From 074ee40e3b80010a6f77765423ff153be79b10a2 Mon Sep 17 00:00:00 2001 From: Duc Canh Le Date: Wed, 20 Sep 2023 06:55:39 +0000 Subject: [PATCH] avoid excessive calls to getifaddrs Signed-off-by: Duc Canh Le --- src/Common/isLocalAddress.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/Common/isLocalAddress.cpp b/src/Common/isLocalAddress.cpp index 7569c6fc14e..8089a713eb8 100644 --- a/src/Common/isLocalAddress.cpp +++ b/src/Common/isLocalAddress.cpp @@ -2,6 +2,9 @@ #include #include +#include +#include +#include #include #include #include @@ -74,6 +77,29 @@ struct NetworkInterfaces { freeifaddrs(ifaddr); } + + static NetworkInterfaces & instance() + { + static constexpr int NET_INTERFACE_VALID_PERIOD_SECONDS = 30; + static std::unique_ptr nf = std::make_unique(); + static time_t last_updated_time = time(nullptr); + static std::shared_mutex nf_mtx; + + time_t now = time(nullptr); + + if (now - last_updated_time > NET_INTERFACE_VALID_PERIOD_SECONDS) + { + std::unique_lock lock(nf_mtx); + nf = std::make_unique(); + last_updated_time = now; + return *nf; + } + else + { + std::shared_lock lock(nf_mtx); + return *nf; + } + } }; } @@ -111,8 +137,7 @@ bool isLocalAddress(const Poco::Net::IPAddress & address) } } - NetworkInterfaces interfaces; - return interfaces.hasAddress(address); + return NetworkInterfaces::instance().hasAddress(address); }