From 6150e0c56b832597a114fb855ce721db4a69447d Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 11 Aug 2017 15:50:56 +0800 Subject: [PATCH 1/8] Add guided_read_cache knob cleanup header include order --- src/base/bittorrent/session.cpp | 16 ++++++++++++++++ src/base/bittorrent/session.h | 3 +++ src/gui/advancedsettings.cpp | 6 ++++++ src/gui/advancedsettings.h | 9 ++++----- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index a156a45c7..303b48639 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -263,6 +263,7 @@ Session::Session(QObject *parent) , m_diskCacheSize(BITTORRENT_SESSION_KEY("DiskCacheSize"), 0) , m_diskCacheTTL(BITTORRENT_SESSION_KEY("DiskCacheTTL"), 60) , m_useOSCache(BITTORRENT_SESSION_KEY("UseOSCache"), true) + , m_guidedReadCacheEnabled(BITTORRENT_SESSION_KEY("GuidedReadCache"), true) , m_isAnonymousModeEnabled(BITTORRENT_SESSION_KEY("AnonymousModeEnabled"), false) , m_isQueueingEnabled(BITTORRENT_SESSION_KEY("QueueingSystemEnabled"), true) , m_maxActiveDownloads(BITTORRENT_SESSION_KEY("MaxActiveDownloads"), 3, lowerLimited(-1)) @@ -1256,6 +1257,7 @@ void Session::configure(libtorrent::settings_pack &settingsPack) : libt::settings_pack::disable_os_cache; settingsPack.set_int(libt::settings_pack::disk_io_read_mode, mode); settingsPack.set_int(libt::settings_pack::disk_io_write_mode, mode); + settingsPack.set_bool(libt::settings_pack::guided_read_cache, isGuidedReadCacheEnabled()); settingsPack.set_bool(libt::settings_pack::anonymous_mode, isAnonymousModeEnabled()); @@ -1472,6 +1474,7 @@ void Session::configure(libtorrent::session_settings &sessionSettings) : libt::session_settings::disable_os_cache; sessionSettings.disk_io_read_mode = mode; sessionSettings.disk_io_write_mode = mode; + sessionSettings.guided_read_cache = isGuidedReadCacheEnabled(); sessionSettings.anonymous_mode = isAnonymousModeEnabled(); @@ -2844,6 +2847,19 @@ void Session::setUseOSCache(bool use) } } +bool Session::isGuidedReadCacheEnabled() const +{ + return m_guidedReadCacheEnabled; +} + +void Session::setGuidedReadCacheEnabled(bool enabled) +{ + if (enabled == m_guidedReadCacheEnabled) return; + + m_guidedReadCacheEnabled = enabled; + configureDeferred(); +} + bool Session::isAnonymousModeEnabled() const { return m_isAnonymousModeEnabled; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 8a982e248..1697f07e4 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -333,6 +333,8 @@ namespace BitTorrent void setDiskCacheTTL(int ttl); bool useOSCache() const; void setUseOSCache(bool use); + bool isGuidedReadCacheEnabled() const; + void setGuidedReadCacheEnabled(bool enabled); bool isAnonymousModeEnabled() const; void setAnonymousModeEnabled(bool enabled); bool isQueueingSystemEnabled() const; @@ -575,6 +577,7 @@ namespace BitTorrent CachedSettingValue m_diskCacheSize; CachedSettingValue m_diskCacheTTL; CachedSettingValue m_useOSCache; + CachedSettingValue m_guidedReadCacheEnabled; CachedSettingValue m_isAnonymousModeEnabled; CachedSettingValue m_isQueueingEnabled; CachedSettingValue m_maxActiveDownloads; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index 09bc9d062..cad8c5eca 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -78,6 +78,7 @@ enum AdvSettingsRows DISK_CACHE, DISK_CACHE_TTL, OS_CACHE, + GUIDED_READ_CACHE, // ports MAX_HALF_OPEN, OUTGOING_PORT_MIN, @@ -127,6 +128,8 @@ void AdvancedSettings::saveAdvancedSettings() session->setDiskCacheTTL(spin_cache_ttl.value()); // Enable OS cache session->setUseOSCache(cb_os_cache.isChecked()); + // Guided read cache + session->setGuidedReadCacheEnabled(cbGuidedReadCache.isChecked()); // Save resume data interval session->setSaveResumeDataInterval(spin_save_resume_data_interval.value()); // Outgoing ports @@ -278,6 +281,9 @@ void AdvancedSettings::loadAdvancedSettings() // Enable OS cache cb_os_cache.setChecked(session->useOSCache()); addRow(OS_CACHE, tr("Enable OS cache"), &cb_os_cache); + // Guided read cache + cbGuidedReadCache.setChecked(session->isGuidedReadCacheEnabled()); + addRow(GUIDED_READ_CACHE, tr("Guided read cache"), &cbGuidedReadCache); // Save resume data interval spin_save_resume_data_interval.setMinimum(1); spin_save_resume_data_interval.setMaximum(1440); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 57ae1b643..069817c33 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -29,15 +29,14 @@ #ifndef ADVANCEDSETTINGS_H #define ADVANCEDSETTINGS_H +#include +#include #include #include -#include -#include #include -#include +#include #include - class WheelEventEater: public QObject { Q_OBJECT @@ -79,7 +78,7 @@ private: QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl; QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, - cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers; + cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache; QComboBox combo_iface, combo_iface_address; QLineEdit txtAnnounceIP; From 4185209036d7b233ccb5fec50ba56ff1718cfacb Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 11 Aug 2017 16:28:52 +0800 Subject: [PATCH 2/8] Add mixed_mode_algorithm knob --- src/base/bittorrent/session.cpp | 38 +++++++++++++++++++++++++++------ src/base/bittorrent/session.h | 3 +++ src/gui/advancedsettings.cpp | 7 ++++++ src/gui/advancedsettings.h | 2 +- 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 303b48639..2f464635f 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -283,6 +283,7 @@ Session::Session(QObject *parent) , m_maxUploadsPerTorrent(BITTORRENT_SESSION_KEY("MaxUploadsPerTorrent"), -1, lowerLimited(0, -1)) , m_isUTPEnabled(BITTORRENT_SESSION_KEY("uTPEnabled"), true) , m_isUTPRateLimited(BITTORRENT_SESSION_KEY("uTPRateLimited"), true) + , m_utpMixedMode(BITTORRENT_SESSION_KEY("uTPMixedMode"), m_isUTPEnabled) , m_isAddTrackersEnabled(BITTORRENT_SESSION_KEY("AddTrackersEnabled"), false) , m_additionalTrackers(BITTORRENT_SESSION_KEY("AdditionalTrackers")) , m_globalMaxRatio(BITTORRENT_SESSION_KEY("GlobalMaxRatio"), -1, [](qreal r) { return r < 0 ? -1. : r;}) @@ -1299,9 +1300,15 @@ void Session::configure(libtorrent::settings_pack &settingsPack) // uTP settingsPack.set_bool(libt::settings_pack::enable_incoming_utp, isUTPEnabled()); settingsPack.set_bool(libt::settings_pack::enable_outgoing_utp, isUTPEnabled()); - settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, isUTPRateLimited() - ? libt::settings_pack::prefer_tcp - : libt::settings_pack::peer_proportional); + switch (utpMixedMode()) { + case 0: + default: + settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::prefer_tcp); + break; + case 1: + settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::peer_proportional); + break; + } settingsPack.set_bool(libt::settings_pack::apply_ip_filter_to_trackers, isTrackerFilteringEnabled()); @@ -1521,9 +1528,15 @@ void Session::configure(libtorrent::session_settings &sessionSettings) sessionSettings.enable_outgoing_utp = isUTPEnabled(); // uTP rate limiting sessionSettings.rate_limit_utp = isUTPRateLimited(); - sessionSettings.mixed_mode_algorithm = isUTPRateLimited() - ? libt::session_settings::prefer_tcp - : libt::session_settings::peer_proportional; + switch (utpMixedMode()) { + case 0: + default: + sessionSettings.mixed_mode_algorithm = libt::session_settings::prefer_tcp; + break; + case 1: + sessionSettings.mixed_mode_algorithm = libt::session_settings::peer_proportional; + break; + } sessionSettings.apply_ip_filter_to_trackers = isTrackerFilteringEnabled(); @@ -3090,6 +3103,19 @@ void Session::setUTPRateLimited(bool limited) } } +int Session::utpMixedMode() const +{ + return m_utpMixedMode; +} + +void Session::setUtpMixedMode(int mode) +{ + if (mode == m_utpMixedMode) return; + + m_utpMixedMode = mode; + configureDeferred(); +} + bool Session::isTrackerFilteringEnabled() const { return m_isTrackerFilteringEnabled; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 1697f07e4..b3454a2ee 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -373,6 +373,8 @@ namespace BitTorrent void setUTPEnabled(bool enabled); bool isUTPRateLimited() const; void setUTPRateLimited(bool limited); + int utpMixedMode() const; + void setUtpMixedMode(int mode); bool isTrackerFilteringEnabled() const; void setTrackerFilteringEnabled(bool enabled); QStringList bannedIPs() const; @@ -597,6 +599,7 @@ namespace BitTorrent CachedSettingValue m_maxUploadsPerTorrent; CachedSettingValue m_isUTPEnabled; CachedSettingValue m_isUTPRateLimited; + CachedSettingValue m_utpMixedMode; CachedSettingValue m_isAddTrackersEnabled; CachedSettingValue m_additionalTrackers; CachedSettingValue m_globalMaxRatio; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index cad8c5eca..590c6fe08 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -83,6 +83,7 @@ enum AdvSettingsRows MAX_HALF_OPEN, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, + UTP_MIX_MODE, // embedded tracker TRACKER_STATUS, TRACKER_PORT, @@ -135,6 +136,8 @@ void AdvancedSettings::saveAdvancedSettings() // Outgoing ports session->setOutgoingPortsMin(outgoing_ports_min.value()); session->setOutgoingPortsMax(outgoing_ports_max.value()); + // uTP-TCP mixed mode + session->setUtpMixedMode(comboUtpMixedMode.currentIndex()); // Recheck torrents on completion pref->recheckTorrentsOnCompletion(cb_recheck_completed.isChecked()); // Transfer list refresh interval @@ -300,6 +303,10 @@ void AdvancedSettings::loadAdvancedSettings() outgoing_ports_max.setMaximum(65535); outgoing_ports_max.setValue(session->outgoingPortsMax()); addRow(OUTGOING_PORT_MAX, tr("Outgoing ports (Max) [0: Disabled]"), &outgoing_ports_max); + // uTP-TCP mixed mode + comboUtpMixedMode.addItems({"Prefer TCP", "Peer proportional (throttles TCP)"}); + comboUtpMixedMode.setCurrentIndex(session->utpMixedMode()); + addRow(UTP_MIX_MODE, tr("uTP-TCP mixed mode algorithm"), &comboUtpMixedMode); // Recheck completed torrents cb_recheck_completed.setChecked(pref->recheckTorrentsOnCompletion()); addRow(RECHECK_COMPLETED, tr("Recheck torrents on completion"), &cb_recheck_completed); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 069817c33..1b9ecd0cf 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -79,7 +79,7 @@ private: QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache; - QComboBox combo_iface, combo_iface_address; + QComboBox combo_iface, combo_iface_address, comboUtpMixedMode; QLineEdit txtAnnounceIP; // OS dependent settings From 21ec8fe53fcab773599c77921b149cded12d46e6 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 11 Aug 2017 16:37:32 +0800 Subject: [PATCH 3/8] Add allow_multiple_connections_per_ip knob. Closes #5884. --- src/base/bittorrent/session.cpp | 18 ++++++++++++++++++ src/base/bittorrent/session.h | 3 +++ src/gui/advancedsettings.cpp | 6 ++++++ src/gui/advancedsettings.h | 2 +- 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 2f464635f..450f088dd 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -284,6 +284,7 @@ Session::Session(QObject *parent) , m_isUTPEnabled(BITTORRENT_SESSION_KEY("uTPEnabled"), true) , m_isUTPRateLimited(BITTORRENT_SESSION_KEY("uTPRateLimited"), true) , m_utpMixedMode(BITTORRENT_SESSION_KEY("uTPMixedMode"), m_isUTPEnabled) + , m_multiConnectionsPerIpEnabled(BITTORRENT_SESSION_KEY("MultiConnectionsPerIp"), false) , m_isAddTrackersEnabled(BITTORRENT_SESSION_KEY("AddTrackersEnabled"), false) , m_additionalTrackers(BITTORRENT_SESSION_KEY("AdditionalTrackers")) , m_globalMaxRatio(BITTORRENT_SESSION_KEY("GlobalMaxRatio"), -1, [](qreal r) { return r < 0 ? -1. : r;}) @@ -1310,6 +1311,8 @@ void Session::configure(libtorrent::settings_pack &settingsPack) break; } + settingsPack.set_bool(libt::settings_pack::allow_multiple_connections_per_ip, multiConnectionsPerIpEnabled()); + settingsPack.set_bool(libt::settings_pack::apply_ip_filter_to_trackers, isTrackerFilteringEnabled()); settingsPack.set_bool(libt::settings_pack::enable_dht, isDHTEnabled()); @@ -1538,6 +1541,8 @@ void Session::configure(libtorrent::session_settings &sessionSettings) break; } + sessionSettings.allow_multiple_connections_per_ip = multiConnectionsPerIpEnabled(); + sessionSettings.apply_ip_filter_to_trackers = isTrackerFilteringEnabled(); if (isDHTEnabled()) { @@ -3116,6 +3121,19 @@ void Session::setUtpMixedMode(int mode) configureDeferred(); } +bool Session::multiConnectionsPerIpEnabled() const +{ + return m_multiConnectionsPerIpEnabled; +} + +void Session::setMultiConnectionsPerIpEnabled(bool enabled) +{ + if (enabled == m_multiConnectionsPerIpEnabled) return; + + m_multiConnectionsPerIpEnabled = enabled; + configureDeferred(); +} + bool Session::isTrackerFilteringEnabled() const { return m_isTrackerFilteringEnabled; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index b3454a2ee..2c3b4033d 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -375,6 +375,8 @@ namespace BitTorrent void setUTPRateLimited(bool limited); int utpMixedMode() const; void setUtpMixedMode(int mode); + bool multiConnectionsPerIpEnabled() const; + void setMultiConnectionsPerIpEnabled(bool enabled); bool isTrackerFilteringEnabled() const; void setTrackerFilteringEnabled(bool enabled); QStringList bannedIPs() const; @@ -600,6 +602,7 @@ namespace BitTorrent CachedSettingValue m_isUTPEnabled; CachedSettingValue m_isUTPRateLimited; CachedSettingValue m_utpMixedMode; + CachedSettingValue m_multiConnectionsPerIpEnabled; CachedSettingValue m_isAddTrackersEnabled; CachedSettingValue m_additionalTrackers; CachedSettingValue m_globalMaxRatio; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index 590c6fe08..f97e5c0cd 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -84,6 +84,7 @@ enum AdvSettingsRows OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, UTP_MIX_MODE, + MULTI_CONNECTIONS_PER_IP, // embedded tracker TRACKER_STATUS, TRACKER_PORT, @@ -138,6 +139,8 @@ void AdvancedSettings::saveAdvancedSettings() session->setOutgoingPortsMax(outgoing_ports_max.value()); // uTP-TCP mixed mode session->setUtpMixedMode(comboUtpMixedMode.currentIndex()); + // multiple connections per IP + session->setMultiConnectionsPerIpEnabled(cbMultiConnectionsPerIp.isChecked()); // Recheck torrents on completion pref->recheckTorrentsOnCompletion(cb_recheck_completed.isChecked()); // Transfer list refresh interval @@ -307,6 +310,9 @@ void AdvancedSettings::loadAdvancedSettings() comboUtpMixedMode.addItems({"Prefer TCP", "Peer proportional (throttles TCP)"}); comboUtpMixedMode.setCurrentIndex(session->utpMixedMode()); addRow(UTP_MIX_MODE, tr("uTP-TCP mixed mode algorithm"), &comboUtpMixedMode); + // multiple connections per IP + cbMultiConnectionsPerIp.setChecked(session->multiConnectionsPerIpEnabled()); + addRow(MULTI_CONNECTIONS_PER_IP, tr("Allow multiple connections from the same IP address"), &cbMultiConnectionsPerIp); // Recheck completed torrents cb_recheck_completed.setChecked(pref->recheckTorrentsOnCompletion()); addRow(RECHECK_COMPLETED, tr("Recheck torrents on completion"), &cb_recheck_completed); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 1b9ecd0cf..a9d4c9e3d 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -78,7 +78,7 @@ private: QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl; QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, - cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache; + cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache, cbMultiConnectionsPerIp; QComboBox combo_iface, combo_iface_address, comboUtpMixedMode; QLineEdit txtAnnounceIP; From 6c32f6beffaf3cfc06ff1ab5bc7b63535aa44be5 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 11 Aug 2017 17:06:31 +0800 Subject: [PATCH 4/8] Add choking_algorithm & seed_choking_algorithm knob --- src/base/bittorrent/session.cpp | 52 +++++++++++++++++++++++++++++++-- src/base/bittorrent/session.h | 6 ++++ src/gui/advancedsettings.cpp | 16 ++++++++++ src/gui/advancedsettings.h | 2 +- 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 450f088dd..dd33778b6 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -312,6 +312,8 @@ Session::Session(QObject *parent) , m_encryption(BITTORRENT_SESSION_KEY("Encryption"), 0) , m_isForceProxyEnabled(BITTORRENT_SESSION_KEY("ForceProxy"), true) , m_isProxyPeerConnectionsEnabled(BITTORRENT_SESSION_KEY("ProxyPeerConnections"), false) + , m_chokingAlgorithm(BITTORRENT_SESSION_KEY("ChokingAlgorithm"), 0) + , m_seedChokingAlgorithm(BITTORRENT_SESSION_KEY("SeedChokingAlgorithm"), 1) , m_storedCategories(BITTORRENT_SESSION_KEY("Categories")) , m_storedTags(BITTORRENT_SESSION_KEY("Tags")) , m_maxRatioAction(BITTORRENT_SESSION_KEY("MaxRatioAction"), Pause) @@ -380,7 +382,6 @@ Session::Session(QObject *parent) sessionSettings.auto_scrape_min_interval = 900; // 15 minutes sessionSettings.connection_speed = 20; // default is 10 sessionSettings.no_connect_privileged_ports = false; - sessionSettings.seed_choking_algorithm = libt::session_settings::fastest_upload; // Disk cache pool is rarely tested in libtorrent and doesn't free buffers // Soon to be deprecated there // More info: https://github.com/arvidn/libtorrent/issues/2251 @@ -411,7 +412,6 @@ Session::Session(QObject *parent) pack.set_int(libt::settings_pack::auto_scrape_min_interval, 900); // 15 minutes pack.set_int(libt::settings_pack::connection_speed, 20); // default is 10 pack.set_bool(libt::settings_pack::no_connect_privileged_ports, false); - pack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::fastest_upload); // Disk cache pool is rarely tested in libtorrent and doesn't free buffers // Soon to be deprecated there // More info: https://github.com/arvidn/libtorrent/issues/2251 @@ -1319,6 +1319,17 @@ void Session::configure(libtorrent::settings_pack &settingsPack) if (isDHTEnabled()) settingsPack.set_str(libt::settings_pack::dht_bootstrap_nodes, "dht.libtorrent.org:25401,router.bittorrent.com:6881,router.utorrent.com:6881,dht.transmissionbt.com:6881,dht.aelitis.com:6881"); settingsPack.set_bool(libt::settings_pack::enable_lsd, isLSDEnabled()); + + switch (chokingAlgorithm()) { + case 0: + default: + settingsPack.set_int(libt::settings_pack::choking_algorithm, libt::settings_pack::fixed_slots_choker); + break; + case 1: + settingsPack.set_int(libt::settings_pack::choking_algorithm, libt::settings_pack::rate_based_choker); + break; + } + settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, seedChokingAlgorithm()); } void Session::configurePeerClasses() @@ -1562,6 +1573,17 @@ void Session::configure(libtorrent::session_settings &sessionSettings) m_nativeSession->start_lsd(); else m_nativeSession->stop_lsd(); + + switch (chokingAlgorithm()) { + case 0: + default: + sessionSettings.choking_algorithm = libt::session_settings::fixed_slots_choker; + break; + case 1: + sessionSettings.choking_algorithm = libt::session_settings::rate_based_choker; + break; + } + sessionSettings.seed_choking_algorithm = seedChokingAlgorithm(); } #endif @@ -2663,6 +2685,32 @@ void Session::setProxyPeerConnectionsEnabled(bool enabled) } } +int Session::chokingAlgorithm() const +{ + return m_chokingAlgorithm; +} + +void Session::setChokingAlgorithm(int mode) +{ + if (mode == m_chokingAlgorithm) return; + + m_chokingAlgorithm = mode; + configureDeferred(); +} + +int Session::seedChokingAlgorithm() const +{ + return m_seedChokingAlgorithm; +} + +void Session::setSeedChokingAlgorithm(int mode) +{ + if (mode == m_seedChokingAlgorithm) return; + + m_seedChokingAlgorithm = mode; + configureDeferred(); +} + bool Session::isAddTrackersEnabled() const { return m_isAddTrackersEnabled; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 2c3b4033d..6bbdaa613 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -317,6 +317,10 @@ namespace BitTorrent void setForceProxyEnabled(bool enabled); bool isProxyPeerConnectionsEnabled() const; void setProxyPeerConnectionsEnabled(bool enabled); + int chokingAlgorithm() const; + void setChokingAlgorithm(int mode); + int seedChokingAlgorithm() const; + void setSeedChokingAlgorithm(int mode); bool isAddTrackersEnabled() const; void setAddTrackersEnabled(bool enabled); QString additionalTrackers() const; @@ -630,6 +634,8 @@ namespace BitTorrent CachedSettingValue m_encryption; CachedSettingValue m_isForceProxyEnabled; CachedSettingValue m_isProxyPeerConnectionsEnabled; + CachedSettingValue m_chokingAlgorithm; + CachedSettingValue m_seedChokingAlgorithm; CachedSettingValue m_storedCategories; CachedSettingValue m_storedTags; CachedSettingValue m_maxRatioAction; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index f97e5c0cd..6afd8f8b8 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -89,6 +89,8 @@ enum AdvSettingsRows TRACKER_STATUS, TRACKER_PORT, // seeding + CHOKING_ALGORITHM, + SEED_CHOKING_ALGORITHM, SUPER_SEEDING, // tracker ANNOUNCE_ALL_TRACKERS, @@ -187,6 +189,11 @@ void AdvancedSettings::saveAdvancedSettings() // Tracker session->setTrackerEnabled(cb_tracker_status.isChecked()); pref->setTrackerPort(spin_tracker_port.value()); + // Choking algorithm + session->setChokingAlgorithm(comboChokingAlgorithm.currentIndex()); + // Seed choking algorithm + session->setSeedChokingAlgorithm(comboSeedChokingAlgorithm.currentIndex()); + #if defined(Q_OS_WIN) || defined(Q_OS_MAC) pref->setUpdateCheckEnabled(cb_update_check.isChecked()); #endif @@ -391,6 +398,15 @@ void AdvancedSettings::loadAdvancedSettings() spin_tracker_port.setMaximum(65535); spin_tracker_port.setValue(pref->getTrackerPort()); addRow(TRACKER_PORT, tr("Embedded tracker port"), &spin_tracker_port); + // Choking algorithm + comboChokingAlgorithm.addItems({"Fixed slots", "Upload rate based"}); + comboChokingAlgorithm.setCurrentIndex(session->chokingAlgorithm()); + addRow(CHOKING_ALGORITHM, tr("Upload slots behavior"), &comboChokingAlgorithm); + // Seed choking algorithm + comboSeedChokingAlgorithm.addItems({"Round-robin", "Fastest upload", "Anti-leech"}); + comboSeedChokingAlgorithm.setCurrentIndex(session->seedChokingAlgorithm()); + addRow(SEED_CHOKING_ALGORITHM, tr("Upload choking algorithm"), &comboSeedChokingAlgorithm); + #if defined(Q_OS_WIN) || defined(Q_OS_MAC) cb_update_check.setChecked(pref->isUpdateCheckEnabled()); addRow(UPDATE_CHECK, tr("Check for software updates"), &cb_update_check); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index a9d4c9e3d..981d1431a 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -79,7 +79,7 @@ private: QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache, cbMultiConnectionsPerIp; - QComboBox combo_iface, combo_iface_address, comboUtpMixedMode; + QComboBox combo_iface, combo_iface_address, comboUtpMixedMode, comboChokingAlgorithm, comboSeedChokingAlgorithm; QLineEdit txtAnnounceIP; // OS dependent settings From 55a1628a5ee517be7d5ad42a0e3d7a2564633303 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 11 Aug 2017 19:15:18 +0800 Subject: [PATCH 5/8] Add suggest_mode knob --- src/base/bittorrent/session.cpp | 16 ++++++++++++++++ src/base/bittorrent/session.h | 3 +++ src/gui/advancedsettings.cpp | 6 ++++++ src/gui/advancedsettings.h | 3 ++- 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index dd33778b6..0078106f6 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -264,6 +264,7 @@ Session::Session(QObject *parent) , m_diskCacheTTL(BITTORRENT_SESSION_KEY("DiskCacheTTL"), 60) , m_useOSCache(BITTORRENT_SESSION_KEY("UseOSCache"), true) , m_guidedReadCacheEnabled(BITTORRENT_SESSION_KEY("GuidedReadCache"), true) + , m_isSuggestMode(BITTORRENT_SESSION_KEY("SuggestMode"), false) , m_isAnonymousModeEnabled(BITTORRENT_SESSION_KEY("AnonymousModeEnabled"), false) , m_isQueueingEnabled(BITTORRENT_SESSION_KEY("QueueingSystemEnabled"), true) , m_maxActiveDownloads(BITTORRENT_SESSION_KEY("MaxActiveDownloads"), 3, lowerLimited(-1)) @@ -1260,6 +1261,7 @@ void Session::configure(libtorrent::settings_pack &settingsPack) settingsPack.set_int(libt::settings_pack::disk_io_read_mode, mode); settingsPack.set_int(libt::settings_pack::disk_io_write_mode, mode); settingsPack.set_bool(libt::settings_pack::guided_read_cache, isGuidedReadCacheEnabled()); + settingsPack.set_bool(libt::settings_pack::suggest_mode, isSuggestModeEnabled()); settingsPack.set_bool(libt::settings_pack::anonymous_mode, isAnonymousModeEnabled()); @@ -1496,6 +1498,7 @@ void Session::configure(libtorrent::session_settings &sessionSettings) sessionSettings.disk_io_read_mode = mode; sessionSettings.disk_io_write_mode = mode; sessionSettings.guided_read_cache = isGuidedReadCacheEnabled(); + sessionSettings.suggest_mode = isSuggestModeEnabled(); sessionSettings.anonymous_mode = isAnonymousModeEnabled(); @@ -2926,6 +2929,19 @@ void Session::setGuidedReadCacheEnabled(bool enabled) configureDeferred(); } +bool Session::isSuggestModeEnabled() const +{ + return m_isSuggestMode; +} + +void Session::setSuggestMode(bool mode) +{ + if (mode == m_isSuggestMode) return; + + m_isSuggestMode = mode; + configureDeferred(); +} + bool Session::isAnonymousModeEnabled() const { return m_isAnonymousModeEnabled; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 6bbdaa613..f7eaa915d 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -339,6 +339,8 @@ namespace BitTorrent void setUseOSCache(bool use); bool isGuidedReadCacheEnabled() const; void setGuidedReadCacheEnabled(bool enabled); + bool isSuggestModeEnabled() const; + void setSuggestMode(bool mode); bool isAnonymousModeEnabled() const; void setAnonymousModeEnabled(bool enabled); bool isQueueingSystemEnabled() const; @@ -586,6 +588,7 @@ namespace BitTorrent CachedSettingValue m_diskCacheTTL; CachedSettingValue m_useOSCache; CachedSettingValue m_guidedReadCacheEnabled; + CachedSettingValue m_isSuggestMode; CachedSettingValue m_isAnonymousModeEnabled; CachedSettingValue m_isQueueingEnabled; CachedSettingValue m_maxActiveDownloads; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index 6afd8f8b8..dced1cf05 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -79,6 +79,7 @@ enum AdvSettingsRows DISK_CACHE_TTL, OS_CACHE, GUIDED_READ_CACHE, + SUGGEST_MODE, // ports MAX_HALF_OPEN, OUTGOING_PORT_MIN, @@ -134,6 +135,8 @@ void AdvancedSettings::saveAdvancedSettings() session->setUseOSCache(cb_os_cache.isChecked()); // Guided read cache session->setGuidedReadCacheEnabled(cbGuidedReadCache.isChecked()); + // Suggest mode + session->setSuggestMode(cbSuggestMode.isChecked()); // Save resume data interval session->setSaveResumeDataInterval(spin_save_resume_data_interval.value()); // Outgoing ports @@ -297,6 +300,9 @@ void AdvancedSettings::loadAdvancedSettings() // Guided read cache cbGuidedReadCache.setChecked(session->isGuidedReadCacheEnabled()); addRow(GUIDED_READ_CACHE, tr("Guided read cache"), &cbGuidedReadCache); + // Suggest mode + cbSuggestMode.setChecked(session->isSuggestModeEnabled()); + addRow(SUGGEST_MODE, tr("Send upload piece suggestions"), &cbSuggestMode); // Save resume data interval spin_save_resume_data_interval.setMinimum(1); spin_save_resume_data_interval.setMaximum(1440); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 981d1431a..60d45ff44 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -78,7 +78,8 @@ private: QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl; QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, - cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache, cbMultiConnectionsPerIp; + cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache, cbMultiConnectionsPerIp, + cbSuggestMode; QComboBox combo_iface, combo_iface_address, comboUtpMixedMode, comboChokingAlgorithm, comboSeedChokingAlgorithm; QLineEdit txtAnnounceIP; From f4be16576735d71a9954361606853e1baf4636f2 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Fri, 11 Aug 2017 19:48:58 +0800 Subject: [PATCH 6/8] Add send_buffer_watermark send_buffer_low_watermark send_buffer_watermark_factor knobs --- src/base/bittorrent/session.cpp | 50 +++++++++++++++++++++++++++++++++ src/base/bittorrent/session.h | 9 ++++++ src/gui/advancedsettings.cpp | 23 +++++++++++++++ src/gui/advancedsettings.h | 3 +- 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 0078106f6..9180e058f 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -265,6 +265,9 @@ Session::Session(QObject *parent) , m_useOSCache(BITTORRENT_SESSION_KEY("UseOSCache"), true) , m_guidedReadCacheEnabled(BITTORRENT_SESSION_KEY("GuidedReadCache"), true) , m_isSuggestMode(BITTORRENT_SESSION_KEY("SuggestMode"), false) + , m_sendBufferWatermark(BITTORRENT_SESSION_KEY("SendBufferWatermark"), 500) + , m_sendBufferLowWatermark(BITTORRENT_SESSION_KEY("SendBufferLowWatermark"), 10) + , m_sendBufferWatermarkFactor(BITTORRENT_SESSION_KEY("SendBufferWatermarkFactor"), 50) , m_isAnonymousModeEnabled(BITTORRENT_SESSION_KEY("AnonymousModeEnabled"), false) , m_isQueueingEnabled(BITTORRENT_SESSION_KEY("QueueingSystemEnabled"), true) , m_maxActiveDownloads(BITTORRENT_SESSION_KEY("MaxActiveDownloads"), 3, lowerLimited(-1)) @@ -1263,6 +1266,10 @@ void Session::configure(libtorrent::settings_pack &settingsPack) settingsPack.set_bool(libt::settings_pack::guided_read_cache, isGuidedReadCacheEnabled()); settingsPack.set_bool(libt::settings_pack::suggest_mode, isSuggestModeEnabled()); + settingsPack.set_int(libt::settings_pack::send_buffer_watermark, sendBufferWatermark() * 1024); + settingsPack.set_int(libt::settings_pack::send_buffer_low_watermark, sendBufferLowWatermark() * 1024); + settingsPack.set_int(libt::settings_pack::send_buffer_watermark_factor, sendBufferWatermarkFactor()); + settingsPack.set_bool(libt::settings_pack::anonymous_mode, isAnonymousModeEnabled()); // Queueing System @@ -1500,6 +1507,10 @@ void Session::configure(libtorrent::session_settings &sessionSettings) sessionSettings.guided_read_cache = isGuidedReadCacheEnabled(); sessionSettings.suggest_mode = isSuggestModeEnabled(); + sessionSettings.send_buffer_watermark = sendBufferWatermark() * 1024; + sessionSettings.send_buffer_low_watermark = sendBufferLowWatermark() * 1024; + sessionSettings.send_buffer_watermark_factor = sendBufferWatermarkFactor(); + sessionSettings.anonymous_mode = isAnonymousModeEnabled(); // Queueing System @@ -2942,6 +2953,45 @@ void Session::setSuggestMode(bool mode) configureDeferred(); } +int Session::sendBufferWatermark() const +{ + return m_sendBufferWatermark; +} + +void Session::setSendBufferWatermark(int value) +{ + if (value == m_sendBufferWatermark) return; + + m_sendBufferWatermark = value; + configureDeferred(); +} + +int Session::sendBufferLowWatermark() const +{ + return m_sendBufferLowWatermark; +} + +void Session::setSendBufferLowWatermark(int value) +{ + if (value == m_sendBufferLowWatermark) return; + + m_sendBufferLowWatermark = value; + configureDeferred(); +} + +int Session::sendBufferWatermarkFactor() const +{ + return m_sendBufferWatermarkFactor; +} + +void Session::setSendBufferWatermarkFactor(int value) +{ + if (value == m_sendBufferWatermarkFactor) return; + + m_sendBufferWatermarkFactor = value; + configureDeferred(); +} + bool Session::isAnonymousModeEnabled() const { return m_isAnonymousModeEnabled; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index f7eaa915d..7f4cee61f 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -341,6 +341,12 @@ namespace BitTorrent void setGuidedReadCacheEnabled(bool enabled); bool isSuggestModeEnabled() const; void setSuggestMode(bool mode); + int sendBufferWatermark() const; + void setSendBufferWatermark(int value); + int sendBufferLowWatermark() const; + void setSendBufferLowWatermark(int value); + int sendBufferWatermarkFactor() const; + void setSendBufferWatermarkFactor(int value); bool isAnonymousModeEnabled() const; void setAnonymousModeEnabled(bool enabled); bool isQueueingSystemEnabled() const; @@ -589,6 +595,9 @@ namespace BitTorrent CachedSettingValue m_useOSCache; CachedSettingValue m_guidedReadCacheEnabled; CachedSettingValue m_isSuggestMode; + CachedSettingValue m_sendBufferWatermark; + CachedSettingValue m_sendBufferLowWatermark; + CachedSettingValue m_sendBufferWatermarkFactor; CachedSettingValue m_isAnonymousModeEnabled; CachedSettingValue m_isQueueingEnabled; CachedSettingValue m_maxActiveDownloads; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index dced1cf05..0e2b350cc 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -80,6 +80,9 @@ enum AdvSettingsRows OS_CACHE, GUIDED_READ_CACHE, SUGGEST_MODE, + SEND_BUF_WATERMARK, + SEND_BUF_LOW_WATERMARK, + SEND_BUF_WATERMARK_FACTOR, // ports MAX_HALF_OPEN, OUTGOING_PORT_MIN, @@ -137,6 +140,10 @@ void AdvancedSettings::saveAdvancedSettings() session->setGuidedReadCacheEnabled(cbGuidedReadCache.isChecked()); // Suggest mode session->setSuggestMode(cbSuggestMode.isChecked()); + // Send buffer watermark + session->setSendBufferWatermark(spinSendBufferWatermark.value()); + session->setSendBufferLowWatermark(spinSendBufferLowWatermark.value()); + session->setSendBufferWatermarkFactor(spinSendBufferWatermarkFactor.value()); // Save resume data interval session->setSaveResumeDataInterval(spin_save_resume_data_interval.value()); // Outgoing ports @@ -303,6 +310,22 @@ void AdvancedSettings::loadAdvancedSettings() // Suggest mode cbSuggestMode.setChecked(session->isSuggestModeEnabled()); addRow(SUGGEST_MODE, tr("Send upload piece suggestions"), &cbSuggestMode); + // Send buffer watermark + spinSendBufferWatermark.setMinimum(1); + spinSendBufferWatermark.setMaximum(INT_MAX); + spinSendBufferWatermark.setSuffix(tr(" KiB")); + spinSendBufferWatermark.setValue(session->sendBufferWatermark()); + addRow(SEND_BUF_WATERMARK, tr("Send buffer watermark"), &spinSendBufferWatermark); + spinSendBufferLowWatermark.setMinimum(1); + spinSendBufferLowWatermark.setMaximum(INT_MAX); + spinSendBufferLowWatermark.setSuffix(tr(" KiB")); + spinSendBufferLowWatermark.setValue(session->sendBufferLowWatermark()); + addRow(SEND_BUF_LOW_WATERMARK, tr("Send buffer low watermark"), &spinSendBufferLowWatermark); + spinSendBufferWatermarkFactor.setMinimum(1); + spinSendBufferWatermarkFactor.setMaximum(INT_MAX); + spinSendBufferWatermarkFactor.setSuffix(" %"); + spinSendBufferWatermarkFactor.setValue(session->sendBufferWatermarkFactor()); + addRow(SEND_BUF_WATERMARK_FACTOR, tr("Send buffer watermark factor"), &spinSendBufferWatermarkFactor); // Save resume data interval spin_save_resume_data_interval.setMinimum(1); spin_save_resume_data_interval.setMaximum(1440); diff --git a/src/gui/advancedsettings.h b/src/gui/advancedsettings.h index 60d45ff44..d780db5e5 100644 --- a/src/gui/advancedsettings.h +++ b/src/gui/advancedsettings.h @@ -75,7 +75,8 @@ private: template void addRow(int row, const QString &rowText, T* widget); QLabel labelQbtLink, labelLibtorrentLink; - QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl; + QSpinBox spin_cache, spin_save_resume_data_interval, outgoing_ports_min, outgoing_ports_max, spin_list_refresh, spin_maxhalfopen, spin_tracker_port, spin_cache_ttl, + spinSendBufferWatermark, spinSendBufferLowWatermark, spinSendBufferWatermarkFactor; QCheckBox cb_os_cache, cb_recheck_completed, cb_resolve_countries, cb_resolve_hosts, cb_super_seeding, cb_program_notifications, cb_torrent_added_notifications, cb_tracker_favicon, cb_tracker_status, cb_confirm_torrent_recheck, cb_confirm_remove_all_tags, cb_listen_ipv6, cb_announce_all_trackers, cbGuidedReadCache, cbMultiConnectionsPerIp, From 3f5fa0025d1b239955e112dd14b3d5c649aa5067 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Tue, 15 Aug 2017 20:26:28 +0800 Subject: [PATCH 7/8] Add sanitize helper clampValue() --- src/base/bittorrent/session.cpp | 40 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index 9180e058f..c6bd56dbb 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -237,6 +237,20 @@ namespace template LowerLimited lowerLimited(T limit, T ret) { return LowerLimited(limit, ret); } + + template + std::function clampValue(const T lower, const T upper) + { + // TODO: change return type to `auto` when using C++14 + return [lower, upper](const T value) -> T + { + if (value < lower) + return lower; + if (value > upper) + return upper; + return value; + }; + } } // Session @@ -287,7 +301,7 @@ Session::Session(QObject *parent) , m_maxUploadsPerTorrent(BITTORRENT_SESSION_KEY("MaxUploadsPerTorrent"), -1, lowerLimited(0, -1)) , m_isUTPEnabled(BITTORRENT_SESSION_KEY("uTPEnabled"), true) , m_isUTPRateLimited(BITTORRENT_SESSION_KEY("uTPRateLimited"), true) - , m_utpMixedMode(BITTORRENT_SESSION_KEY("uTPMixedMode"), m_isUTPEnabled) + , m_utpMixedMode(BITTORRENT_SESSION_KEY("uTPMixedMode"), m_isUTPEnabled, clampValue(0, 1)) , m_multiConnectionsPerIpEnabled(BITTORRENT_SESSION_KEY("MultiConnectionsPerIp"), false) , m_isAddTrackersEnabled(BITTORRENT_SESSION_KEY("AddTrackersEnabled"), false) , m_additionalTrackers(BITTORRENT_SESSION_KEY("AdditionalTrackers")) @@ -316,8 +330,8 @@ Session::Session(QObject *parent) , m_encryption(BITTORRENT_SESSION_KEY("Encryption"), 0) , m_isForceProxyEnabled(BITTORRENT_SESSION_KEY("ForceProxy"), true) , m_isProxyPeerConnectionsEnabled(BITTORRENT_SESSION_KEY("ProxyPeerConnections"), false) - , m_chokingAlgorithm(BITTORRENT_SESSION_KEY("ChokingAlgorithm"), 0) - , m_seedChokingAlgorithm(BITTORRENT_SESSION_KEY("SeedChokingAlgorithm"), 1) + , m_chokingAlgorithm(BITTORRENT_SESSION_KEY("ChokingAlgorithm"), 0, clampValue(0, 2)) + , m_seedChokingAlgorithm(BITTORRENT_SESSION_KEY("SeedChokingAlgorithm"), 1, clampValue(0, 2)) , m_storedCategories(BITTORRENT_SESSION_KEY("Categories")) , m_storedTags(BITTORRENT_SESSION_KEY("Tags")) , m_maxRatioAction(BITTORRENT_SESSION_KEY("MaxRatioAction"), Pause) @@ -1310,15 +1324,7 @@ void Session::configure(libtorrent::settings_pack &settingsPack) // uTP settingsPack.set_bool(libt::settings_pack::enable_incoming_utp, isUTPEnabled()); settingsPack.set_bool(libt::settings_pack::enable_outgoing_utp, isUTPEnabled()); - switch (utpMixedMode()) { - case 0: - default: - settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::prefer_tcp); - break; - case 1: - settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::peer_proportional); - break; - } + settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, utpMixedMode()); settingsPack.set_bool(libt::settings_pack::allow_multiple_connections_per_ip, multiConnectionsPerIpEnabled()); @@ -1556,15 +1562,7 @@ void Session::configure(libtorrent::session_settings &sessionSettings) sessionSettings.enable_outgoing_utp = isUTPEnabled(); // uTP rate limiting sessionSettings.rate_limit_utp = isUTPRateLimited(); - switch (utpMixedMode()) { - case 0: - default: - sessionSettings.mixed_mode_algorithm = libt::session_settings::prefer_tcp; - break; - case 1: - sessionSettings.mixed_mode_algorithm = libt::session_settings::peer_proportional; - break; - } + sessionSettings.mixed_mode_algorithm = utpMixedMode(); sessionSettings.allow_multiple_connections_per_ip = multiConnectionsPerIpEnabled(); From 2da2054ccf0ed7a17a798b9147634027087b0b61 Mon Sep 17 00:00:00 2001 From: Chocobo1 Date: Wed, 16 Aug 2017 02:23:07 +0800 Subject: [PATCH 8/8] Use enums for settings --- src/base/bittorrent/session.cpp | 77 +++++++++++++++++++++++++-------- src/base/bittorrent/session.h | 50 +++++++++++++++++---- src/gui/advancedsettings.cpp | 12 ++--- 3 files changed, 107 insertions(+), 32 deletions(-) diff --git a/src/base/bittorrent/session.cpp b/src/base/bittorrent/session.cpp index c6bd56dbb..041db4c47 100644 --- a/src/base/bittorrent/session.cpp +++ b/src/base/bittorrent/session.cpp @@ -301,7 +301,8 @@ Session::Session(QObject *parent) , m_maxUploadsPerTorrent(BITTORRENT_SESSION_KEY("MaxUploadsPerTorrent"), -1, lowerLimited(0, -1)) , m_isUTPEnabled(BITTORRENT_SESSION_KEY("uTPEnabled"), true) , m_isUTPRateLimited(BITTORRENT_SESSION_KEY("uTPRateLimited"), true) - , m_utpMixedMode(BITTORRENT_SESSION_KEY("uTPMixedMode"), m_isUTPEnabled, clampValue(0, 1)) + , m_utpMixedMode(BITTORRENT_SESSION_KEY("uTPMixedMode"), MixedModeAlgorithm::Proportional + , clampValue(MixedModeAlgorithm::TCP, MixedModeAlgorithm::Proportional)) , m_multiConnectionsPerIpEnabled(BITTORRENT_SESSION_KEY("MultiConnectionsPerIp"), false) , m_isAddTrackersEnabled(BITTORRENT_SESSION_KEY("AddTrackersEnabled"), false) , m_additionalTrackers(BITTORRENT_SESSION_KEY("AdditionalTrackers")) @@ -330,8 +331,10 @@ Session::Session(QObject *parent) , m_encryption(BITTORRENT_SESSION_KEY("Encryption"), 0) , m_isForceProxyEnabled(BITTORRENT_SESSION_KEY("ForceProxy"), true) , m_isProxyPeerConnectionsEnabled(BITTORRENT_SESSION_KEY("ProxyPeerConnections"), false) - , m_chokingAlgorithm(BITTORRENT_SESSION_KEY("ChokingAlgorithm"), 0, clampValue(0, 2)) - , m_seedChokingAlgorithm(BITTORRENT_SESSION_KEY("SeedChokingAlgorithm"), 1, clampValue(0, 2)) + , m_chokingAlgorithm(BITTORRENT_SESSION_KEY("ChokingAlgorithm"), ChokingAlgorithm::FixedSlots + , clampValue(ChokingAlgorithm::FixedSlots, ChokingAlgorithm::RateBased)) + , m_seedChokingAlgorithm(BITTORRENT_SESSION_KEY("SeedChokingAlgorithm"), SeedChokingAlgorithm::FastestUpload + , clampValue(SeedChokingAlgorithm::RoundRobin, SeedChokingAlgorithm::AntiLeech)) , m_storedCategories(BITTORRENT_SESSION_KEY("Categories")) , m_storedTags(BITTORRENT_SESSION_KEY("Tags")) , m_maxRatioAction(BITTORRENT_SESSION_KEY("MaxRatioAction"), Pause) @@ -1324,7 +1327,15 @@ void Session::configure(libtorrent::settings_pack &settingsPack) // uTP settingsPack.set_bool(libt::settings_pack::enable_incoming_utp, isUTPEnabled()); settingsPack.set_bool(libt::settings_pack::enable_outgoing_utp, isUTPEnabled()); - settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, utpMixedMode()); + switch (utpMixedMode()) { + case MixedModeAlgorithm::TCP: + default: + settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::prefer_tcp); + break; + case MixedModeAlgorithm::Proportional: + settingsPack.set_int(libt::settings_pack::mixed_mode_algorithm, libt::settings_pack::peer_proportional); + break; + } settingsPack.set_bool(libt::settings_pack::allow_multiple_connections_per_ip, multiConnectionsPerIpEnabled()); @@ -1336,15 +1347,27 @@ void Session::configure(libtorrent::settings_pack &settingsPack) settingsPack.set_bool(libt::settings_pack::enable_lsd, isLSDEnabled()); switch (chokingAlgorithm()) { - case 0: + case ChokingAlgorithm::FixedSlots: default: settingsPack.set_int(libt::settings_pack::choking_algorithm, libt::settings_pack::fixed_slots_choker); break; - case 1: + case ChokingAlgorithm::RateBased: settingsPack.set_int(libt::settings_pack::choking_algorithm, libt::settings_pack::rate_based_choker); break; } - settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, seedChokingAlgorithm()); + + switch (seedChokingAlgorithm()) { + case SeedChokingAlgorithm::RoundRobin: + settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::round_robin); + break; + case SeedChokingAlgorithm::FastestUpload: + default: + settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::fastest_upload); + break; + case SeedChokingAlgorithm::AntiLeech: + settingsPack.set_int(libt::settings_pack::seed_choking_algorithm, libt::settings_pack::anti_leech); + break; + } } void Session::configurePeerClasses() @@ -1562,7 +1585,15 @@ void Session::configure(libtorrent::session_settings &sessionSettings) sessionSettings.enable_outgoing_utp = isUTPEnabled(); // uTP rate limiting sessionSettings.rate_limit_utp = isUTPRateLimited(); - sessionSettings.mixed_mode_algorithm = utpMixedMode(); + switch (utpMixedMode()) { + case MixedModeAlgorithm::TCP: + default: + sessionSettings.mixed_mode_algorithm = libt::session_settings::prefer_tcp; + break; + case MixedModeAlgorithm::Proportional: + sessionSettings.mixed_mode_algorithm = libt::session_settings::peer_proportional; + break; + } sessionSettings.allow_multiple_connections_per_ip = multiConnectionsPerIpEnabled(); @@ -1587,15 +1618,27 @@ void Session::configure(libtorrent::session_settings &sessionSettings) m_nativeSession->stop_lsd(); switch (chokingAlgorithm()) { - case 0: + case ChokingAlgorithm::FixedSlots: default: sessionSettings.choking_algorithm = libt::session_settings::fixed_slots_choker; break; - case 1: + case ChokingAlgorithm::RateBased: sessionSettings.choking_algorithm = libt::session_settings::rate_based_choker; break; } - sessionSettings.seed_choking_algorithm = seedChokingAlgorithm(); + + switch (seedChokingAlgorithm()) { + case SeedChokingAlgorithm::RoundRobin: + sessionSettings.seed_choking_algorithm = libt::session_settings::round_robin; + break; + case SeedChokingAlgorithm::FastestUpload: + default: + sessionSettings.seed_choking_algorithm = libt::session_settings::fastest_upload; + break; + case SeedChokingAlgorithm::AntiLeech: + sessionSettings.seed_choking_algorithm = libt::session_settings::anti_leech; + break; + } } #endif @@ -2697,12 +2740,12 @@ void Session::setProxyPeerConnectionsEnabled(bool enabled) } } -int Session::chokingAlgorithm() const +ChokingAlgorithm Session::chokingAlgorithm() const { return m_chokingAlgorithm; } -void Session::setChokingAlgorithm(int mode) +void Session::setChokingAlgorithm(ChokingAlgorithm mode) { if (mode == m_chokingAlgorithm) return; @@ -2710,12 +2753,12 @@ void Session::setChokingAlgorithm(int mode) configureDeferred(); } -int Session::seedChokingAlgorithm() const +SeedChokingAlgorithm Session::seedChokingAlgorithm() const { return m_seedChokingAlgorithm; } -void Session::setSeedChokingAlgorithm(int mode) +void Session::setSeedChokingAlgorithm(SeedChokingAlgorithm mode) { if (mode == m_seedChokingAlgorithm) return; @@ -3220,12 +3263,12 @@ void Session::setUTPRateLimited(bool limited) } } -int Session::utpMixedMode() const +MixedModeAlgorithm Session::utpMixedMode() const { return m_utpMixedMode; } -void Session::setUtpMixedMode(int mode) +void Session::setUtpMixedMode(MixedModeAlgorithm mode) { if (mode == m_utpMixedMode) return; diff --git a/src/base/bittorrent/session.h b/src/base/bittorrent/session.h index 7f4cee61f..7e21d3541 100644 --- a/src/base/bittorrent/session.h +++ b/src/base/bittorrent/session.h @@ -151,6 +151,38 @@ namespace BitTorrent uint nbErrored = 0; }; + class SessionSettingsEnums + { + Q_GADGET + + public: + // TODO: remove `SessionSettingsEnums` wrapper when we can use `Q_ENUM_NS` directly (QT >= 5.8 only) + enum class ChokingAlgorithm : int + { + FixedSlots = 0, + RateBased = 1 + }; + Q_ENUM(ChokingAlgorithm) + + enum class SeedChokingAlgorithm : int + { + RoundRobin = 0, + FastestUpload = 1, + AntiLeech = 2 + }; + Q_ENUM(SeedChokingAlgorithm) + + enum class MixedModeAlgorithm : int + { + TCP = 0, + Proportional = 1 + }; + Q_ENUM(MixedModeAlgorithm) + }; + using ChokingAlgorithm = SessionSettingsEnums::ChokingAlgorithm; + using SeedChokingAlgorithm = SessionSettingsEnums::SeedChokingAlgorithm; + using MixedModeAlgorithm = SessionSettingsEnums::MixedModeAlgorithm; + #if LIBTORRENT_VERSION_NUM >= 10100 struct SessionMetricIndices { @@ -317,10 +349,10 @@ namespace BitTorrent void setForceProxyEnabled(bool enabled); bool isProxyPeerConnectionsEnabled() const; void setProxyPeerConnectionsEnabled(bool enabled); - int chokingAlgorithm() const; - void setChokingAlgorithm(int mode); - int seedChokingAlgorithm() const; - void setSeedChokingAlgorithm(int mode); + ChokingAlgorithm chokingAlgorithm() const; + void setChokingAlgorithm(ChokingAlgorithm mode); + SeedChokingAlgorithm seedChokingAlgorithm() const; + void setSeedChokingAlgorithm(SeedChokingAlgorithm mode); bool isAddTrackersEnabled() const; void setAddTrackersEnabled(bool enabled); QString additionalTrackers() const; @@ -385,8 +417,8 @@ namespace BitTorrent void setUTPEnabled(bool enabled); bool isUTPRateLimited() const; void setUTPRateLimited(bool limited); - int utpMixedMode() const; - void setUtpMixedMode(int mode); + MixedModeAlgorithm utpMixedMode() const; + void setUtpMixedMode(MixedModeAlgorithm mode); bool multiConnectionsPerIpEnabled() const; void setMultiConnectionsPerIpEnabled(bool enabled); bool isTrackerFilteringEnabled() const; @@ -617,7 +649,7 @@ namespace BitTorrent CachedSettingValue m_maxUploadsPerTorrent; CachedSettingValue m_isUTPEnabled; CachedSettingValue m_isUTPRateLimited; - CachedSettingValue m_utpMixedMode; + CachedSettingValue m_utpMixedMode; CachedSettingValue m_multiConnectionsPerIpEnabled; CachedSettingValue m_isAddTrackersEnabled; CachedSettingValue m_additionalTrackers; @@ -646,8 +678,8 @@ namespace BitTorrent CachedSettingValue m_encryption; CachedSettingValue m_isForceProxyEnabled; CachedSettingValue m_isProxyPeerConnectionsEnabled; - CachedSettingValue m_chokingAlgorithm; - CachedSettingValue m_seedChokingAlgorithm; + CachedSettingValue m_chokingAlgorithm; + CachedSettingValue m_seedChokingAlgorithm; CachedSettingValue m_storedCategories; CachedSettingValue m_storedTags; CachedSettingValue m_maxRatioAction; diff --git a/src/gui/advancedsettings.cpp b/src/gui/advancedsettings.cpp index 0e2b350cc..8f38eb099 100644 --- a/src/gui/advancedsettings.cpp +++ b/src/gui/advancedsettings.cpp @@ -150,7 +150,7 @@ void AdvancedSettings::saveAdvancedSettings() session->setOutgoingPortsMin(outgoing_ports_min.value()); session->setOutgoingPortsMax(outgoing_ports_max.value()); // uTP-TCP mixed mode - session->setUtpMixedMode(comboUtpMixedMode.currentIndex()); + session->setUtpMixedMode(static_cast(comboUtpMixedMode.currentIndex())); // multiple connections per IP session->setMultiConnectionsPerIpEnabled(cbMultiConnectionsPerIp.isChecked()); // Recheck torrents on completion @@ -200,9 +200,9 @@ void AdvancedSettings::saveAdvancedSettings() session->setTrackerEnabled(cb_tracker_status.isChecked()); pref->setTrackerPort(spin_tracker_port.value()); // Choking algorithm - session->setChokingAlgorithm(comboChokingAlgorithm.currentIndex()); + session->setChokingAlgorithm(static_cast(comboChokingAlgorithm.currentIndex())); // Seed choking algorithm - session->setSeedChokingAlgorithm(comboSeedChokingAlgorithm.currentIndex()); + session->setSeedChokingAlgorithm(static_cast(comboSeedChokingAlgorithm.currentIndex())); #if defined(Q_OS_WIN) || defined(Q_OS_MAC) pref->setUpdateCheckEnabled(cb_update_check.isChecked()); @@ -344,7 +344,7 @@ void AdvancedSettings::loadAdvancedSettings() addRow(OUTGOING_PORT_MAX, tr("Outgoing ports (Max) [0: Disabled]"), &outgoing_ports_max); // uTP-TCP mixed mode comboUtpMixedMode.addItems({"Prefer TCP", "Peer proportional (throttles TCP)"}); - comboUtpMixedMode.setCurrentIndex(session->utpMixedMode()); + comboUtpMixedMode.setCurrentIndex(static_cast(session->utpMixedMode())); addRow(UTP_MIX_MODE, tr("uTP-TCP mixed mode algorithm"), &comboUtpMixedMode); // multiple connections per IP cbMultiConnectionsPerIp.setChecked(session->multiConnectionsPerIpEnabled()); @@ -429,11 +429,11 @@ void AdvancedSettings::loadAdvancedSettings() addRow(TRACKER_PORT, tr("Embedded tracker port"), &spin_tracker_port); // Choking algorithm comboChokingAlgorithm.addItems({"Fixed slots", "Upload rate based"}); - comboChokingAlgorithm.setCurrentIndex(session->chokingAlgorithm()); + comboChokingAlgorithm.setCurrentIndex(static_cast(session->chokingAlgorithm())); addRow(CHOKING_ALGORITHM, tr("Upload slots behavior"), &comboChokingAlgorithm); // Seed choking algorithm comboSeedChokingAlgorithm.addItems({"Round-robin", "Fastest upload", "Anti-leech"}); - comboSeedChokingAlgorithm.setCurrentIndex(session->seedChokingAlgorithm()); + comboSeedChokingAlgorithm.setCurrentIndex(static_cast(session->seedChokingAlgorithm())); addRow(SEED_CHOKING_ALGORITHM, tr("Upload choking algorithm"), &comboSeedChokingAlgorithm); #if defined(Q_OS_WIN) || defined(Q_OS_MAC)