From 86e3d0d816e7a166c14556c742c8d44f30a1fb54 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Tue, 28 Jan 2020 13:53:06 +0800 Subject: [PATCH] Improve ReverseResolution class * Use QHostAddress type for IP * Avoid double lookup * Use larger cache size --- src/base/net/reverseresolution.cpp | 51 ++++++++++++++------------- src/base/net/reverseresolution.h | 9 ++--- src/gui/properties/peerlistwidget.cpp | 7 ++-- src/gui/properties/peerlistwidget.h | 3 +- 4 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/base/net/reverseresolution.cpp b/src/base/net/reverseresolution.cpp index 89ebf1c6f..1ce8dff72 100644 --- a/src/base/net/reverseresolution.cpp +++ b/src/base/net/reverseresolution.cpp @@ -28,19 +28,19 @@ #include "reverseresolution.h" -#include +#include #include #include -const int CACHE_SIZE = 500; +const int CACHE_SIZE = 2048; using namespace Net; namespace { - bool isUsefulHostName(const QString &hostname, const QString &ip) + bool isUsefulHostName(const QString &hostname, const QHostAddress &ip) { - return (!hostname.isEmpty() && (hostname != ip)); + return (!hostname.isEmpty() && (hostname != ip.toString())); } } @@ -52,37 +52,40 @@ ReverseResolution::ReverseResolution(QObject *parent) ReverseResolution::~ReverseResolution() { - qDebug("Deleting host name resolver..."); } -void ReverseResolution::resolve(const QString &ip) +void ReverseResolution::resolve(const QHostAddress &ip) { - if (m_cache.contains(ip)) { - const QString &hostname = *m_cache.object(ip); - qDebug() << "Resolved host name using cache: " << ip << " -> " << hostname; - if (isUsefulHostName(hostname, ip)) - emit ipResolved(ip, hostname); - } - else { - // Actually resolve the ip - m_lookups.insert(QHostInfo::lookupHost(ip, this, &ReverseResolution::hostResolved), ip); + if (ip.isNull()) + return; + + const QString *hostname = m_cache.object(ip); + if (hostname) { + if (hostname->isEmpty()) + ; // resolution didn't get meaningful results, so do nothing + else + emit ipResolved(ip, *hostname); + return; } + + // do reverse lookup: IP -> hostname + const int lookupId = QHostInfo::lookupHost(ip.toString(), this, &ReverseResolution::hostResolved); + m_lookups.insert(lookupId, ip); } void ReverseResolution::hostResolved(const QHostInfo &host) { - const QString ip = m_lookups.take(host.lookupId()); - Q_ASSERT(!ip.isNull()); + const QHostAddress ip = m_lookups.take(host.lookupId()); - if (host.error() != QHostInfo::NoError) { - qDebug() << "DNS Reverse resolution error: " << host.errorString(); + if (host.error() != QHostInfo::NoError) return; - } const QString hostname = host.hostName(); - - qDebug() << Q_FUNC_INFO << ip << QString("->") << hostname; - m_cache.insert(ip, new QString(hostname)); - if (isUsefulHostName(hostname, ip)) + if (isUsefulHostName(hostname, ip)) { + m_cache.insert(ip, new QString(hostname)); emit ipResolved(ip, hostname); + } + else { + m_cache.insert(ip, new QString()); + } } diff --git a/src/base/net/reverseresolution.h b/src/base/net/reverseresolution.h index 30ffbe14b..875cc2b56 100644 --- a/src/base/net/reverseresolution.h +++ b/src/base/net/reverseresolution.h @@ -32,6 +32,7 @@ #include #include +class QHostAddress; class QHostInfo; class QString; @@ -46,17 +47,17 @@ namespace Net explicit ReverseResolution(QObject *parent = nullptr); ~ReverseResolution(); - void resolve(const QString &ip); + void resolve(const QHostAddress &ip); signals: - void ipResolved(const QString &ip, const QString &hostname); + void ipResolved(const QHostAddress &ip, const QString &hostname); private slots: void hostResolved(const QHostInfo &host); private: - QHash m_lookups; - QCache m_cache; + QHash m_lookups; // + QCache m_cache; // }; } diff --git a/src/gui/properties/peerlistwidget.cpp b/src/gui/properties/peerlistwidget.cpp index fbb70638c..e4d764e65 100644 --- a/src/gui/properties/peerlistwidget.cpp +++ b/src/gui/properties/peerlistwidget.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -405,7 +406,7 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join('\n'), Qt::ToolTipRole); if (m_resolver) - m_resolver->resolve(peerIp); + m_resolver->resolve(peerEndpoint.address.ip); if (m_resolveCountries) { const QIcon icon = UIThemeManager::instance()->getFlagIcon(peer.country()); @@ -417,10 +418,10 @@ void PeerListWidget::updatePeer(const BitTorrent::TorrentHandle *torrent, const } } -void PeerListWidget::handleResolved(const QString &ip, const QString &hostname) +void PeerListWidget::handleResolved(const QHostAddress &ip, const QString &hostname) const { for (auto iter = m_peerItems.cbegin(); iter != m_peerItems.cend(); ++iter) { - if (iter.key().address.ip.toString() == ip) { + if (iter.key().address.ip == ip) { QStandardItem *item {iter.value()}; item->setData(hostname, Qt::DisplayRole); break; diff --git a/src/gui/properties/peerlistwidget.h b/src/gui/properties/peerlistwidget.h index 314938c75..f57d807e5 100644 --- a/src/gui/properties/peerlistwidget.h +++ b/src/gui/properties/peerlistwidget.h @@ -32,6 +32,7 @@ #include #include +class QHostAddress; class QStandardItem; class QStandardItemModel; @@ -72,7 +73,7 @@ private slots: void banSelectedPeers(); void copySelectedPeers(); void handleSortColumnChanged(int col); - void handleResolved(const QString &ip, const QString &hostname); + void handleResolved(const QHostAddress &ip, const QString &hostname) const; private: void updatePeer(const BitTorrent::TorrentHandle *torrent, const BitTorrent::PeerInfo &peer, bool &isNewPeer);