Compare commits

..

1 Commits

Author SHA1 Message Date
LastElaphine 8cab343a82 Update example configuration files to align with wiki template 2026-10-18 13:22:33 +02:00
7 changed files with 56 additions and 106 deletions
+5 -5
View File
@@ -52,11 +52,11 @@
# watch directory. # watch directory.
# #
#directory.watch.ready = ./watch, load.start #directory.watch.ready = ./watch, load.start
#schedule2 = watch_directory,5,5,load.start=./watch/*.torrent #schedule = watch_directory,5,5,load.start=./watch/*.torrent
# Close torrents when disk-space is low. # Close torrents when disk-space is low.
# #
#schedule2 = low_diskspace,5,60,close_low_diskspace=100M #schedule = low_diskspace,5,60,close_low_diskspace=100M
# The IP address reported to the tracker. # The IP address reported to the tracker.
# #
@@ -100,8 +100,8 @@
# Alternative calls to bind and IP that should handle dynamic IP's. # Alternative calls to bind and IP that should handle dynamic IP's.
# #
#schedule2 = ip_tick,0,1800,ip=rakshasa #schedule = ip_tick,0,1800,ip=rakshasa
#schedule2 = bind_tick,0,1800,bind=rakshasa #schedule = bind_tick,0,1800,bind=rakshasa
# Encryption options, set to none (default) or any combination of the following: # Encryption options, set to none (default) or any combination of the following:
# allow_incoming, try_outgoing, require, require_RC4, enable_retry, prefer_plaintext # allow_incoming, try_outgoing, require, require_RC4, enable_retry, prefer_plaintext
@@ -145,4 +145,4 @@
# #
#network.scgi.open_port = "127.0.0.1:5000" #network.scgi.open_port = "127.0.0.1:5000"
#network.scgi.open_local = (cat,(session.path),/rpc.sock) #network.scgi.open_local = (cat,(session.path),/rpc.sock)
#schedule2 = socket_chmod, 0, 0, "execute.nothrow=chmod,770,(cat,(session.path),/rpc.sock)" #schedule = socket_chmod, 0, 0, "execute.nothrow=chmod,770,(cat,(session.path),/rpc.sock)"
+15 -9
View File
@@ -30,7 +30,6 @@ network.listen.port.random.set = no
# (conservative settings for 'private' trackers, change for 'public') # (conservative settings for 'private' trackers, change for 'public')
dht.mode.set = disable dht.mode.set = disable
protocol.pex.set = no protocol.pex.set = no
trackers.use_udp.set = no
# Peer settings # Peer settings
throttle.max_uploads.set = 100 throttle.max_uploads.set = 100
@@ -42,14 +41,22 @@ throttle.min_peers.seed.set = 30
throttle.max_peers.seed.set = 80 throttle.max_peers.seed.set = 80
trackers.numwant.set = 80 trackers.numwant.set = 80
protocol.encryption.set = allow_incoming,try_outgoing,enable_retry # Select encryption for handshake and connection:
#
# protocol.encryption.set = {deny,allow,prefer,require}
# protocol.encryption.set = handshake_{deny,allow,prefer,require}, stream_{deny,allow,prefer,require}
#
#protocol.encryption.set = deny
#protocol.encryption.set = require
#protocol.encryption.set = handshake_prefer, stream_deny
#protocol.encryption.set = handshake_require, stream_prefer
# Limits for file handle resources, this is optimized for # Limits for file handle resources, this is optimized for
# an `ulimit` of 1024 (a common default). You MUST leave # an `ulimit` of 1024 (a common default). You MUST leave
# a ceiling of handles reserved for rTorrent's internal needs! # a ceiling of handles reserved for rTorrent's internal needs!
network.http.max_open.set = 50
network.max_open_files.set = 600 # Deprecated, see: https://github.com/rakshasa/rtorrent/wiki/Socket-Manager-and-Resource-Allocation
network.max_open_sockets.set = 300
# Memory resource usage (increase if you have a large number of items loaded, # Memory resource usage (increase if you have a large number of items loaded,
# and/or the available resources to spend) # and/or the available resources to spend)
@@ -65,11 +72,10 @@ execute.nothrow = sh, -c, (cat, "echo >",\
(session.path), "rtorrent.pid", " ", (system.pid)) (session.path), "rtorrent.pid", " ", (system.pid))
# Other operational settings (check & adapt) # Other operational settings (check & adapt)
encoding.add = utf8
system.umask.set = 0027 system.umask.set = 0027
system.cwd.set = (directory.default) system.cwd.set = (directory.default)
network.http.dns_cache_timeout.set = 25 network.http.dns_cache_timeout.set = 25
schedule2 = monitor_diskspace, 15, 60, ((close_low_diskspace, 1000M)) schedule = monitor_diskspace, 15, 60, ((close_low_diskspace, 1000M))
##pieces.hash.on_completion.set = no ##pieces.hash.on_completion.set = no
##view.sort_current = seeding, greater=d.ratio= ##view.sort_current = seeding, greater=d.ratio=
##keys.layout.set = qwerty ##keys.layout.set = qwerty
@@ -88,8 +94,8 @@ method.insert = d.data_path, simple,\
method.insert = d.session_file, simple, "cat=(session.path), (d.hash), .torrent" method.insert = d.session_file, simple, "cat=(session.path), (d.hash), .torrent"
# Watch directories (add more as you like, but use unique schedule names) # Watch directories (add more as you like, but use unique schedule names)
schedule2 = watch_start, 10, 10, ((load.start_verbose, (cat, (cfg.watch), "start/*.torrent"))) schedule = watch_start, 10, 10, ((load.start_verbose, (cat, (cfg.watch), "start/*.torrent")))
schedule2 = watch_load, 11, 10, ((load.verbose, (cat, (cfg.watch), "load/*.torrent"))) schedule = watch_load, 11, 10, ((load.verbose, (cat, (cfg.watch), "load/*.torrent")))
# Run the rTorrent process as a daemon in the background # Run the rTorrent process as a daemon in the background
# (and control via XMLRPC sockets) # (and control via XMLRPC sockets)
+5 -10
View File
@@ -60,7 +60,6 @@ rc.network.listen.port.random = false
-- (conservative settings for 'private' trackers, change for 'public') -- (conservative settings for 'private' trackers, change for 'public')
rc.dht.mode = 'disable' rc.dht.mode = 'disable'
rc.protocol.pex = false rc.protocol.pex = false
rc.trackers.use_udp = false
-- Peer settings -- Peer settings
rc.throttle.max_uploads = 100 rc.throttle.max_uploads = 100
@@ -72,14 +71,11 @@ rc.throttle.min_peers.seed = 30
rc.throttle.max_peers.seed = 80 rc.throttle.max_peers.seed = 80
rc.trackers.numwant = 80 rc.trackers.numwant = 80
rc.protocol.encryption.set('allow_incoming', 'try_outgoing', 'enable_retry')
-- Limits for file handle resources, this is optimized for -- Limits for file handle resources, this is optimized for
-- an `ulimit` of 1024 (a common default). You MUST leave -- an `ulimit` of 1024 (a common default). You MUST leave
-- a ceiling of handles reserved for rTorrent's internal needs! -- a ceiling of handles reserved for rTorrent's internal needs!
rc.network.http.max_open = 50
rc.network.max_open_files = 600 -- Deprecated, see: https://github.com/rakshasa/rtorrent/wiki/Socket-Manager-and-Resource-Allocation
rc.network.max_open_sockets = 300
-- Memory resource usage (increase if you have a large number of items loaded, -- Memory resource usage (increase if you have a large number of items loaded,
-- and/or the available resources to spend) -- and/or the available resources to spend)
@@ -97,11 +93,10 @@ rc.execute.nothrow(
})) }))
-- Other operational settings (check & adapt) -- Other operational settings (check & adapt)
rc.encoding.add('utf8')
rc.system.umask = 0027 rc.system.umask = 0027
rc.system.cwd = rc.directory.default() rc.system.cwd = rc.directory.default()
rc.network.http.dns_cache_timeout = 25 rc.network.http.dns_cache_timeout = 25
rc.schedule2('monitor_diskspace', '15', '60', 'close_low_diskspace=1000M') rc.schedule('monitor_diskspace', '15', '60', 'close_low_diskspace=1000M')
--rc.pieces.hash.on_completion = false --rc.pieces.hash.on_completion = false
--rc.view.sort_current('seeding', 'greater=d.ratio=') --rc.view.sort_current('seeding', 'greater=d.ratio=')
--rc.keys.layout = 'qwerty' --rc.keys.layout = 'qwerty'
@@ -121,8 +116,8 @@ rc.method.insert('d.data_path', 'simple',
rc.method.insert('d.session_file', 'simple', 'cat=(session.path), (d.hash), .torrent') rc.method.insert('d.session_file', 'simple', 'cat=(session.path), (d.hash), .torrent')
-- Watch directories (add more as you like, but use unique schedule names) -- Watch directories (add more as you like, but use unique schedule names)
rc.schedule2('watch_start', '10', '10', 'load.start_verbose=(cat, (cfg.watch), "start/*.torrent")') rc.schedule('watch_start', '10', '10', 'load.start_verbose=(cat, (cfg.watch), "start/*.torrent")')
rc.schedule2('watch_load', '11', '10', 'load.verbose=(cat, (cfg.watch), "load/*.torrent")') rc.schedule('watch_load', '11', '10', 'load.verbose=(cat, (cfg.watch), "load/*.torrent")')
-- Run the rTorrent process as a daemon in the background -- Run the rTorrent process as a daemon in the background
-- (and control via XMLRPC sockets) -- (and control via XMLRPC sockets)
-10
View File
@@ -10,7 +10,6 @@
#include <torrent/utils/directory_events.h> #include <torrent/utils/directory_events.h>
#include "core/dht_manager.h" #include "core/dht_manager.h"
#include "core/download_list.h"
#include "core/http_queue.h" #include "core/http_queue.h"
#include "core/manager.h" #include "core/manager.h"
#include "core/view_manager.h" #include "core/view_manager.h"
@@ -138,15 +137,6 @@ Control::handle_shutdown() {
if (scgi_thread::thread()->is_active()) if (scgi_thread::thread()->is_active())
scgi_thread::thread()->stop_thread_wait(); scgi_thread::thread()->stop_thread_wait();
if (!m_shutdown_session_saved) {
// Flush the latest state before stopped announces can consume the timeout. A shutdown hook may
// already have queued these resume builds.
m_core->download_list()->session_save();
session_thread::manager()->flush_shutdown_saves();
m_shutdown_session_saved = true;
}
if (!m_shutdown_quick) { if (!m_shutdown_quick) {
torrent::runtime::network_manager()->listen_close(); torrent::runtime::network_manager()->listen_close();
torrent::runtime::shutdown(); torrent::runtime::shutdown();
-2
View File
@@ -112,8 +112,6 @@ private:
int m_clear_requests_count{}; int m_clear_requests_count{};
bool m_shutdown_session_saved{};
align_cacheline align_cacheline
std::atomic<bool> m_shutdown_received{}; std::atomic<bool> m_shutdown_received{};
+17 -51
View File
@@ -405,42 +405,24 @@ SessionManager::process_finished_saves() {
if (!m_active) if (!m_active)
throw torrent::internal_error("SessionManager::process_finished_saves() called while not active."); throw torrent::internal_error("SessionManager::process_finished_saves() called while not active.");
for (auto& request : m_finished_saves) for (auto& request : m_finished_saves) {
consume_finished_save_unsafe(request);
m_finished_saves.clear();
callback_save_request();
}
// Returns true when a storage error was suppressed.
bool
SessionManager::report_storage_error_unsafe(const std::string& msg) {
if (m_last_storage_error_message + std::chrono::minutes(5) > torrent::this_thread::cached_time()) {
m_ignored_storage_error_count++;
return true;
}
lt_log_print(torrent::LOG_ERRORS, "Storage errors saving session data for download: ignored:%u : %s", m_ignored_storage_error_count, msg.c_str());
m_last_storage_error_message = torrent::this_thread::cached_time();
m_ignored_storage_error_count = 0;
return false;
}
// The one policy for a finished save, on the session thread and in shutdown flushes: storage errors
// go to report_storage_error_unsafe(), internal and unknown errors propagate.
//
// Returns true when a storage error was suppressed.
bool
SessionManager::consume_finished_save_unsafe(ProcessingSave& request) {
try { try {
request.first.get(); request.first.get();
} catch (torrent::storage_error& e) { } catch (torrent::storage_error& e) {
LT_LOG("error saving download : storage error :download:%p path:%s : %s", request.second.download, request.second.path.c_str(), e.what()); LT_LOG("error saving download : storage error :download:%p path:%s : %s", request.second.download, request.second.path.c_str(), e.what());
return report_storage_error_unsafe(e.what());
if (m_last_storage_error_message + std::chrono::minutes(5) > torrent::this_thread::cached_time()) {
m_ignored_storage_error_count++;
continue;
}
lt_log_print(torrent::LOG_ERRORS, "Storage errors saving session data for download: ignored:%u : %s", m_ignored_storage_error_count, e.what());
m_last_storage_error_message = torrent::this_thread::cached_time();
m_ignored_storage_error_count = 0;
continue;
} catch (torrent::internal_error& e) { } catch (torrent::internal_error& e) {
LT_LOG("error saving download : internal error : download:%p path:%s : %s", request.second.download, request.second.path.c_str(), e.what()); LT_LOG("error saving download : internal error : download:%p path:%s : %s", request.second.download, request.second.path.c_str(), e.what());
@@ -452,18 +434,11 @@ SessionManager::consume_finished_save_unsafe(ProcessingSave& request) {
} }
LT_LOG("finished saving download : download:%p path:%s", request.second.download, request.second.path.c_str()); LT_LOG("finished saving download : download:%p path:%s", request.second.download, request.second.path.c_str());
return false; }
}
void m_finished_saves.clear();
SessionManager::flush_shutdown_saves() {
assert(torrent::this_thread::thread() == torrent::main_thread::thread());
flush_all_pending_builds(); callback_save_request();
std::unique_lock<std::mutex> lock(m_mutex);
flush_all_and_wait_unsafe(lock);
} }
void void
@@ -484,20 +459,11 @@ SessionManager::flush_all_and_wait_unsafe(std::unique_lock<std::mutex>& lock) {
while (!m_processing_saves.empty()) while (!m_processing_saves.empty())
m_finished_condition.wait(lock); m_finished_condition.wait(lock);
unsigned int suppressed = 0;
for (auto& request : m_finished_saves) for (auto& request : m_finished_saves)
suppressed += consume_finished_save_unsafe(request) ? 1 : 0; LT_LOG("finished saving download : download:%p path:%s", request.second.download, request.second.path.c_str());
m_finished_saves.clear(); m_finished_saves.clear();
if (m_ignored_storage_error_count != 0) {
lt_log_print(torrent::LOG_ERRORS, "Storage errors flushing session data: ignored:%u previous:%u",
suppressed, m_ignored_storage_error_count - suppressed);
m_ignored_storage_error_count = 0;
}
LT_LOG("flushed all pending saves", 0); LT_LOG("flushed all pending saves", 0);
} }
-5
View File
@@ -73,10 +73,8 @@ protected:
void cleanup(); void cleanup();
void flush_all_pending_builds(); void flush_all_pending_builds();
void flush_shutdown_saves();
private: private:
void callback_pending_builds(); void callback_pending_builds();
void callback_save_request(); void callback_save_request();
void callback_finished_saves(); void callback_finished_saves();
@@ -94,9 +92,6 @@ private:
using ProcessingSave = std::pair<std::future<void>, SaveRequest>; using ProcessingSave = std::pair<std::future<void>, SaveRequest>;
bool consume_finished_save_unsafe(ProcessingSave& request);
bool report_storage_error_unsafe(const std::string& msg);
torrent::system::Thread* m_thread; torrent::system::Thread* m_thread;
torrent::system::callback_id m_callback_id; torrent::system::callback_id m_callback_id;