From 98c5c49087207662a938251c0804c1e95a403127 Mon Sep 17 00:00:00 2001 From: Mathieu Pellerin Date: Mon, 2 Sep 2024 08:42:41 +0700 Subject: [PATCH] Address review --- src/app/options/qgsoptions.cpp | 4 ++-- src/core/network/qgsnetworkaccessmanager.cpp | 8 ++----- src/core/network/qgsnetworkdiskcache.cpp | 24 ++++++++++++------- src/core/network/qgsnetworkdiskcache.h | 2 +- src/core/network/qgsrangerequestcache.cpp | 7 ++++++ src/core/qgstiledownloadmanager.cpp | 8 +------ src/server/qgsserver.cpp | 5 ---- src/server/qgsserversettings.cpp | 4 ++-- src/ui/qgsoptionsbase.ui | 3 +++ tests/testdata/qgis_server_settings/conf0.ini | 2 +- tests/testdata/qgis_server_settings/conf1.ini | 2 +- 11 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/app/options/qgsoptions.cpp b/src/app/options/qgsoptions.cpp index 5e1c6dbd9c4a..0d70420ffd8f 100644 --- a/src/app/options/qgsoptions.cpp +++ b/src/app/options/qgsoptions.cpp @@ -487,7 +487,7 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QListsetMinimum( 0 ); mCacheSize->setMaximum( std::numeric_limits::max() ); mCacheSize->setSingleStep( 50 ); - qint64 cacheSize = mSettings->value( QStringLiteral( "cache/size2" ), 0 ).toLongLong(); + qint64 cacheSize = mSettings->value( QStringLiteral( "cache/size_bytes" ), 0 ).toLongLong(); mCacheSize->setValue( static_cast( cacheSize / 1024 / 1024 ) ); mCacheSize->setClearValue( 0 ); connect( mBrowseCacheDirectory, &QAbstractButton::clicked, this, &QgsOptions::browseCacheDirectory ); @@ -1583,7 +1583,7 @@ void QgsOptions::saveOptions() else mSettings->remove( QStringLiteral( "cache/directory" ) ); - mSettings->setValue( QStringLiteral( "cache/size2" ), QVariant::fromValue( mCacheSize->value() * 1024LL * 1024LL ) ); + mSettings->setValue( QStringLiteral( "cache/size_bytes" ), QVariant::fromValue( mCacheSize->value() * 1024LL * 1024LL ) ); //url with no proxy at all QStringList noProxyUrls; diff --git a/src/core/network/qgsnetworkaccessmanager.cpp b/src/core/network/qgsnetworkaccessmanager.cpp index de5a9830decf..261e090d6310 100644 --- a/src/core/network/qgsnetworkaccessmanager.cpp +++ b/src/core/network/qgsnetworkaccessmanager.cpp @@ -753,13 +753,9 @@ void QgsNetworkAccessManager::setupDefaultProxyAndCache( Qt::ConnectionType conn if ( cacheDirectory.isEmpty() ) cacheDirectory = QStandardPaths::writableLocation( QStandardPaths::CacheLocation ); newcache->setCacheDirectory( cacheDirectory ); - qint64 cacheSize = settings.value( QStringLiteral( "cache/size2" ), 0 ).toLongLong(); - if ( cacheSize == 0 ) - { - // Calculatre maximum cache size based on available free space - cacheSize = QgsNetworkDiskCache::smartCacheSize( cacheDirectory ); - } + qint64 cacheSize = settings.value( QStringLiteral( "cache/size_bytes" ), 0 ).toLongLong(); newcache->setMaximumCacheSize( cacheSize ); + QgsDebugMsgLevel( QStringLiteral( "cacheDirectory: %1" ).arg( newcache->cacheDirectory() ), 4 ); QgsDebugMsgLevel( QStringLiteral( "maximumCacheSize: %1" ).arg( newcache->maximumCacheSize() ), 4 ); diff --git a/src/core/network/qgsnetworkdiskcache.cpp b/src/core/network/qgsnetworkdiskcache.cpp index c57a322cde67..e391f98805d1 100644 --- a/src/core/network/qgsnetworkdiskcache.cpp +++ b/src/core/network/qgsnetworkdiskcache.cpp @@ -52,6 +52,13 @@ qint64 QgsNetworkDiskCache::maximumCacheSize() const void QgsNetworkDiskCache::setMaximumCacheSize( qint64 size ) { const QMutexLocker lock( &sDiskCacheMutex ); + + if ( size == 0 ) + { + // Calculate maximum cache size based on available free space + size = smartCacheSize( sDiskCache.cacheDirectory() ); + } + sDiskCache.setMaximumCacheSize( size ); } @@ -134,7 +141,7 @@ qint64 QgsNetworkDiskCache::smartCacheSize( const QString &cacheDir ) size += fi.size(); } - const QStringList childDirPaths = dir.entryList( QDir::Dirs | QDir::NoDotAndDotDot | QDir::System | QDir::Hidden ); + const QStringList childDirPaths = dir.entryList( QDir::Dirs | QDir::NoDotAndDotDot | QDir::System | QDir::Hidden | QDir::NoSymLinks ); for ( const QString &childDirPath : childDirPaths ) { size += dirSize( dirPath + QDir::separator() + childDirPath ); @@ -150,23 +157,24 @@ qint64 QgsNetworkDiskCache::smartCacheSize( const QString &cacheDir ) // NOLINTBEGIN(bugprone-narrowing-conversions) // Logic taken from Firefox's smart cache size handling qint64 available10MB = bytesFree / 1024 / ( 1024LL * 10 ); + qint64 cacheSize10MB = 0; if ( available10MB > 2500 ) { // Cap the cache size to 1GB - cacheSize = 100; + cacheSize10MB = 100; } else { if ( available10MB > 700 ) { // Add 2.5% of the free space above 7GB - cacheSize += ( available10MB - 700 ) * 0.025; + cacheSize10MB += ( available10MB - 700 ) * 0.025; available10MB = 700; } if ( available10MB > 50 ) { - // Add 7.5% of free sapce between 500MB to 7GB - cacheSize += ( available10MB - 50 ) * 0.075; + // Add 7.5% of free space between 500MB to 7GB + cacheSize10MB += ( available10MB - 50 ) * 0.075; available10MB = 50; } @@ -174,13 +182,13 @@ qint64 QgsNetworkDiskCache::smartCacheSize( const QString &cacheDir ) // On Android, smaller/older devices may have very little storage // Add 16% of free space up to 500 MB - cacheSize += std::max( 2LL, static_cast( available10MB * 0.16 ) ); + cacheSize10MB += std::max( 2LL, static_cast( available10MB * 0.16 ) ); #else // Add 30% of free space up to 500 MB - cacheSize += std::max( 5LL, static_cast( available10MB * 0.30 ) ); + cacheSize10MB += std::max( 5LL, static_cast( available10MB * 0.30 ) ); #endif } - cacheSize = cacheSize * 10 * 1024 * 1024; + cacheSize = cacheSize10MB * 10 * 1024 * 1024; // NOLINTEND(bugprone-narrowing-conversions) } ); diff --git a/src/core/network/qgsnetworkdiskcache.h b/src/core/network/qgsnetworkdiskcache.h index f802492ccbd7..776d4ddc6dae 100644 --- a/src/core/network/qgsnetworkdiskcache.h +++ b/src/core/network/qgsnetworkdiskcache.h @@ -90,7 +90,7 @@ class CORE_EXPORT QgsNetworkDiskCache : public QNetworkDiskCache QNetworkCacheMetaData fileMetaData( const QString &fileName ) const; /** - * Returns a smart cache size based on available megabytes. + * Returns a smart cache size, in bytes, based on available free space * \since QGIS 3.40 */ static qint64 smartCacheSize( const QString &path ); diff --git a/src/core/network/qgsrangerequestcache.cpp b/src/core/network/qgsrangerequestcache.cpp index b3681b80e43c..216cef14b67d 100644 --- a/src/core/network/qgsrangerequestcache.cpp +++ b/src/core/network/qgsrangerequestcache.cpp @@ -16,6 +16,7 @@ ***************************************************************************/ #include "qgsrangerequestcache.h" +#include "qgsnetworkdiskcache.h" #include #include @@ -75,6 +76,12 @@ bool QgsRangeRequestCache::setCacheDirectory( const QString &path ) void QgsRangeRequestCache::setCacheSize( qint64 cacheSize ) { + if ( cacheSize == 0 ) + { + // Calculate maximum cache size based on available free space + cacheSize = QgsNetworkDiskCache::smartCacheSize( mCacheDir ); + } + mMaxDataSize = cacheSize; expire(); } diff --git a/src/core/qgstiledownloadmanager.cpp b/src/core/qgstiledownloadmanager.cpp index 7336318a605c..31c9fca722c7 100644 --- a/src/core/qgstiledownloadmanager.cpp +++ b/src/core/qgstiledownloadmanager.cpp @@ -19,7 +19,6 @@ #include "qgslogger.h" #include "qgsnetworkaccessmanager.h" -#include "qgsnetworkdiskcache.h" #include "qgsrangerequestcache.h" #include "qgssettings.h" @@ -200,12 +199,7 @@ QgsTileDownloadManager::QgsTileDownloadManager() } cacheDirectory += QLatin1String( "http-ranges" ); mRangesCache->setCacheDirectory( cacheDirectory ); - qint64 cacheSize = settings.value( QStringLiteral( "cache/size2" ), 0 ).toLongLong(); - if ( cacheSize == 0 ) - { - // Calculatre maximum cache size based on available free space - cacheSize = QgsNetworkDiskCache::smartCacheSize( cacheDirectory ); - } + qint64 cacheSize = settings.value( QStringLiteral( "cache/size_bytes" ), 0 ).toLongLong(); mRangesCache->setCacheSize( cacheSize ); } diff --git a/src/server/qgsserver.cpp b/src/server/qgsserver.cpp index 0af2788433c4..05e20c79c89e 100644 --- a/src/server/qgsserver.cpp +++ b/src/server/qgsserver.cpp @@ -92,11 +92,6 @@ void QgsServer::setupNetworkAccessManager() const QString cacheDirectory = sSettings()->cacheDirectory(); cache->setCacheDirectory( cacheDirectory ); qint64 cacheSize = sSettings()->cacheSize(); - if ( cacheSize == 0 ) - { - // Calculatre maximum cache size based on available free space - cacheSize = QgsNetworkDiskCache::smartCacheSize( cacheDirectory ); - } cache->setMaximumCacheSize( cacheSize ); QgsMessageLog::logMessage( QStringLiteral( "cacheDirectory: %1" ).arg( cache->cacheDirectory() ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info ); QgsMessageLog::logMessage( QStringLiteral( "maximumCacheSize: %1" ).arg( cache->maximumCacheSize() ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info ); diff --git a/src/server/qgsserversettings.cpp b/src/server/qgsserversettings.cpp index 2f7d6184b8a9..7b8e695c0644 100644 --- a/src/server/qgsserversettings.cpp +++ b/src/server/qgsserversettings.cpp @@ -123,8 +123,8 @@ void QgsServerSettings::initSettings() // cache size const Setting sCacheSize = { QgsServerSettingsEnv::QGIS_SERVER_CACHE_SIZE, QgsServerSettingsEnv::DEFAULT_VALUE, - QStringLiteral( "Specify the cache size" ), - QStringLiteral( "/cache/size2" ), + QStringLiteral( "Specify the cache size (0 = automatic size)" ), + QStringLiteral( "/cache/size_bytes" ), QMetaType::Type::LongLong, 0, QVariant() diff --git a/src/ui/qgsoptionsbase.ui b/src/ui/qgsoptionsbase.ui index 8de6aaac130d..fa86bbace39e 100644 --- a/src/ui/qgsoptionsbase.ui +++ b/src/ui/qgsoptionsbase.ui @@ -4878,6 +4878,9 @@ The bigger the number, the faster zooming with the mouse wheel will be. + + Specify the cache size in megabytes. Clear the value to enable smart cache size, which sets the maximum cache size based on available space. + MB diff --git a/tests/testdata/qgis_server_settings/conf0.ini b/tests/testdata/qgis_server_settings/conf0.ini index 92c8f8c8a4ea..bae08269774c 100644 --- a/tests/testdata/qgis_server_settings/conf0.ini +++ b/tests/testdata/qgis_server_settings/conf0.ini @@ -1,6 +1,6 @@ [cache] directory= -size2=@Variant(\0\0\0\x81\0\0\0\0\x3 \0\0) +size_bytes=@Variant(\0\0\0\x81\0\0\0\0\x3 \0\0) [qgis] parallel_rendering=true diff --git a/tests/testdata/qgis_server_settings/conf1.ini b/tests/testdata/qgis_server_settings/conf1.ini index b1e77cd27ebb..0a3a2dd0748f 100644 --- a/tests/testdata/qgis_server_settings/conf1.ini +++ b/tests/testdata/qgis_server_settings/conf1.ini @@ -1,6 +1,6 @@ [cache] directory=/tmp/mycache -size2=@Variant(\0\0\0\x81\0\0\0\0\x3 \0\0) +size_bytes=@Variant(\0\0\0\x81\0\0\0\0\x3 \0\0) [qgis] parallel_rendering=false