Loading DnsTlsDispatcher.cpp +9 −3 Original line number Diff line number Diff line Loading @@ -101,14 +101,17 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const std::list<DnsTlsServer>& for (const auto& server : orderedServers) { DnsQueryEvent* dnsQueryEvent = statp->event->mutable_dns_query_events()->add_dns_query_event(); bool connectTriggered = false; Stopwatch queryStopwatch; code = this->query(server, statp->_mark, query, ans, resplen); code = this->query(server, statp->_mark, query, ans, resplen, &connectTriggered); dnsQueryEvent->set_latency_micros(saturate_cast<int32_t>(queryStopwatch.timeTakenUs())); dnsQueryEvent->set_dns_server_index(serverCount++); dnsQueryEvent->set_ip_version(ipFamilyToIPVersion(server.ss.ss_family)); dnsQueryEvent->set_protocol(PROTO_DOT); dnsQueryEvent->set_type(getQueryType(query.base(), query.size())); dnsQueryEvent->set_connected(connectTriggered); switch (code) { // These response codes are valid responses and not expected to Loading Loading @@ -141,8 +144,9 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const std::list<DnsTlsServer>& } DnsTlsTransport::Response DnsTlsDispatcher::query(const DnsTlsServer& server, unsigned mark, const Slice query, const Slice ans, int *resplen) { const Slice query, const Slice ans, int* resplen, bool* connectTriggered) { uint32_t connectCounter; const Key key = std::make_pair(mark, server); Transport* xport; { Loading @@ -155,6 +159,7 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const DnsTlsServer& server, un xport = it->second.get(); } ++xport->useCount; connectCounter = xport->transport.getConnectCounter(); } LOG(DEBUG) << "Sending query of length " << query.size(); Loading @@ -178,6 +183,7 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const DnsTlsServer& server, un auto now = std::chrono::steady_clock::now(); { std::lock_guard guard(sLock); *connectTriggered = (xport->transport.getConnectCounter() > connectCounter); --xport->useCount; xport->lastUsed = now; cleanup(now); Loading DnsTlsDispatcher.h +4 −3 Original line number Diff line number Diff line Loading @@ -54,11 +54,12 @@ class DnsTlsDispatcher { const netdutils::Slice ans, int* _Nonnull resplen); // Given a |query|, sends it to the server on the network indicated by |mark|, // and writes the response into |ans|, and indicates // the number of bytes written in |resplen|. Returns a success or error code. // and writes the response into |ans|, and indicates the number of bytes written in |resplen|. // If the whole procedure above triggers (or experiences) any new connection, |connectTriggered| // is set. Returns a success or error code. DnsTlsTransport::Response query(const DnsTlsServer& server, unsigned mark, const netdutils::Slice query, const netdutils::Slice ans, int* _Nonnull resplen); int* _Nonnull resplen, bool* _Nonnull connectTriggered); private: // This lock is static so that it can be used to annotate the Transport struct. Loading DnsTlsQueryMap.h +3 −3 Original line number Diff line number Diff line Loading @@ -74,6 +74,9 @@ class DnsTlsQueryMap { // Returns true if there are no pending queries. bool empty(); // The maximum number of times we will send a query before abandoning it. static constexpr int kMaxTries = 3; private: std::mutex mLock; Loading @@ -87,9 +90,6 @@ class DnsTlsQueryMap { std::promise<Result> result; }; // The maximum number of times we will send a query before abandoning it. static constexpr int kMaxTries = 3; // Outstanding queries by newId. std::map<uint16_t, QueryPromise> mQueries GUARDED_BY(mLock); Loading DnsTlsTransport.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,11 @@ std::future<DnsTlsTransport::Result> DnsTlsTransport::query(const netdutils::Sli return std::move(record->result); } uint32_t DnsTlsTransport::getConnectCounter() const { std::lock_guard guard(mLock); return mConnectCounter; } bool DnsTlsTransport::sendQuery(const DnsTlsQueryMap::Query q) { // Strip off the ID number and send the new ID instead. bool sent = mSocket->query(q.newId, netdutils::drop(q.query, 2)); Loading @@ -63,6 +68,7 @@ bool DnsTlsTransport::sendQuery(const DnsTlsQueryMap::Query q) { void DnsTlsTransport::doConnect() { LOG(DEBUG) << "Constructing new socket"; mSocket = mFactory->createDnsTlsSocket(mServer, mMark, this, &mCache); mConnectCounter++; if (mSocket) { auto queries = mQueries.getAll(); Loading DnsTlsTransport.h +6 −1 Original line number Diff line number Diff line Loading @@ -57,12 +57,14 @@ class DnsTlsTransport : public IDnsTlsSocketObserver { // on networks where it doesn't actually work. static bool validate(const DnsTlsServer& server, unsigned netid, uint32_t mark); uint32_t getConnectCounter() const EXCLUDES(mLock); // Implement IDnsTlsSocketObserver void onResponse(std::vector<uint8_t> response) override; void onClosed() override EXCLUDES(mLock); private: std::mutex mLock; mutable std::mutex mLock; DnsTlsSessionCache mCache; DnsTlsQueryMap mQueries; Loading @@ -85,6 +87,9 @@ class DnsTlsTransport : public IDnsTlsSocketObserver { // Send a query to the socket. bool sendQuery(const DnsTlsQueryMap::Query q) REQUIRES(mLock); // The number of times an attempt to connect the nameserver. uint32_t mConnectCounter GUARDED_BY(mLock) = 0; }; } // end of namespace net Loading Loading
DnsTlsDispatcher.cpp +9 −3 Original line number Diff line number Diff line Loading @@ -101,14 +101,17 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const std::list<DnsTlsServer>& for (const auto& server : orderedServers) { DnsQueryEvent* dnsQueryEvent = statp->event->mutable_dns_query_events()->add_dns_query_event(); bool connectTriggered = false; Stopwatch queryStopwatch; code = this->query(server, statp->_mark, query, ans, resplen); code = this->query(server, statp->_mark, query, ans, resplen, &connectTriggered); dnsQueryEvent->set_latency_micros(saturate_cast<int32_t>(queryStopwatch.timeTakenUs())); dnsQueryEvent->set_dns_server_index(serverCount++); dnsQueryEvent->set_ip_version(ipFamilyToIPVersion(server.ss.ss_family)); dnsQueryEvent->set_protocol(PROTO_DOT); dnsQueryEvent->set_type(getQueryType(query.base(), query.size())); dnsQueryEvent->set_connected(connectTriggered); switch (code) { // These response codes are valid responses and not expected to Loading Loading @@ -141,8 +144,9 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const std::list<DnsTlsServer>& } DnsTlsTransport::Response DnsTlsDispatcher::query(const DnsTlsServer& server, unsigned mark, const Slice query, const Slice ans, int *resplen) { const Slice query, const Slice ans, int* resplen, bool* connectTriggered) { uint32_t connectCounter; const Key key = std::make_pair(mark, server); Transport* xport; { Loading @@ -155,6 +159,7 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const DnsTlsServer& server, un xport = it->second.get(); } ++xport->useCount; connectCounter = xport->transport.getConnectCounter(); } LOG(DEBUG) << "Sending query of length " << query.size(); Loading @@ -178,6 +183,7 @@ DnsTlsTransport::Response DnsTlsDispatcher::query(const DnsTlsServer& server, un auto now = std::chrono::steady_clock::now(); { std::lock_guard guard(sLock); *connectTriggered = (xport->transport.getConnectCounter() > connectCounter); --xport->useCount; xport->lastUsed = now; cleanup(now); Loading
DnsTlsDispatcher.h +4 −3 Original line number Diff line number Diff line Loading @@ -54,11 +54,12 @@ class DnsTlsDispatcher { const netdutils::Slice ans, int* _Nonnull resplen); // Given a |query|, sends it to the server on the network indicated by |mark|, // and writes the response into |ans|, and indicates // the number of bytes written in |resplen|. Returns a success or error code. // and writes the response into |ans|, and indicates the number of bytes written in |resplen|. // If the whole procedure above triggers (or experiences) any new connection, |connectTriggered| // is set. Returns a success or error code. DnsTlsTransport::Response query(const DnsTlsServer& server, unsigned mark, const netdutils::Slice query, const netdutils::Slice ans, int* _Nonnull resplen); int* _Nonnull resplen, bool* _Nonnull connectTriggered); private: // This lock is static so that it can be used to annotate the Transport struct. Loading
DnsTlsQueryMap.h +3 −3 Original line number Diff line number Diff line Loading @@ -74,6 +74,9 @@ class DnsTlsQueryMap { // Returns true if there are no pending queries. bool empty(); // The maximum number of times we will send a query before abandoning it. static constexpr int kMaxTries = 3; private: std::mutex mLock; Loading @@ -87,9 +90,6 @@ class DnsTlsQueryMap { std::promise<Result> result; }; // The maximum number of times we will send a query before abandoning it. static constexpr int kMaxTries = 3; // Outstanding queries by newId. std::map<uint16_t, QueryPromise> mQueries GUARDED_BY(mLock); Loading
DnsTlsTransport.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,11 @@ std::future<DnsTlsTransport::Result> DnsTlsTransport::query(const netdutils::Sli return std::move(record->result); } uint32_t DnsTlsTransport::getConnectCounter() const { std::lock_guard guard(mLock); return mConnectCounter; } bool DnsTlsTransport::sendQuery(const DnsTlsQueryMap::Query q) { // Strip off the ID number and send the new ID instead. bool sent = mSocket->query(q.newId, netdutils::drop(q.query, 2)); Loading @@ -63,6 +68,7 @@ bool DnsTlsTransport::sendQuery(const DnsTlsQueryMap::Query q) { void DnsTlsTransport::doConnect() { LOG(DEBUG) << "Constructing new socket"; mSocket = mFactory->createDnsTlsSocket(mServer, mMark, this, &mCache); mConnectCounter++; if (mSocket) { auto queries = mQueries.getAll(); Loading
DnsTlsTransport.h +6 −1 Original line number Diff line number Diff line Loading @@ -57,12 +57,14 @@ class DnsTlsTransport : public IDnsTlsSocketObserver { // on networks where it doesn't actually work. static bool validate(const DnsTlsServer& server, unsigned netid, uint32_t mark); uint32_t getConnectCounter() const EXCLUDES(mLock); // Implement IDnsTlsSocketObserver void onResponse(std::vector<uint8_t> response) override; void onClosed() override EXCLUDES(mLock); private: std::mutex mLock; mutable std::mutex mLock; DnsTlsSessionCache mCache; DnsTlsQueryMap mQueries; Loading @@ -85,6 +87,9 @@ class DnsTlsTransport : public IDnsTlsSocketObserver { // Send a query to the socket. bool sendQuery(const DnsTlsQueryMap::Query q) REQUIRES(mLock); // The number of times an attempt to connect the nameserver. uint32_t mConnectCounter GUARDED_BY(mLock) = 0; }; } // end of namespace net Loading