Skip to content

v4.2.13#84

Merged
Power2All merged 4 commits into
masterfrom
v4.2.13
Jun 4, 2026
Merged

v4.2.13#84
Power2All merged 4 commits into
masterfrom
v4.2.13

Conversation

@Power2All

@Power2All Power2All commented Jun 4, 2026

Copy link
Copy Markdown
Owner

v4.2.13

  • Applied a fix for Windows, implemented RIO for Windows
  • Further optimization and some refactor work to improve performance and efficiency
  • Minimum Rust version is 1.88.0

Summary by CodeRabbit

  • New Features

    • Windows RIO receive support and new "rio" UDP receive option.
  • Improvements

    • Reduced allocations and optimized data paths for better performance and efficiency.
    • Minimum Rust version set to 1.88.0.
  • Bug Fixes

    • Windows-related UDP handling fixes (RIO).
  • Dependencies

    • Bumped log to 0.4.32; added windows-sys (Windows-only) for RIO support.

@Power2All Power2All self-assigned this Jun 4, 2026
@Power2All Power2All added the enhancement New feature or request label Jun 4, 2026
@coderabbitai

coderabbitai Bot commented Jun 4, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2c94c149-7829-407f-a946-04db471f49ba

📥 Commits

Reviewing files that changed from the base of the PR and between cc01e85 and 00a3203.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (4)
  • Cargo.toml
  • src/udp/impls/parse_pool.rs
  • src/udp/impls/rio_recv.rs
  • src/udp/impls/udp_server.rs
🚧 Files skipped from review as they are similar to previous changes (4)
  • Cargo.toml
  • src/udp/impls/parse_pool.rs
  • src/udp/impls/udp_server.rs
  • src/udp/impls/rio_recv.rs

📝 Walkthrough

Walkthrough

Version 4.2.13 centralizes config defaults, introduces TorrentUpdateData and AnnounceEntry, migrates tracker persistence and DB backends to update summaries, adds a Windows RIO UDP backend with UdpReply-based dispatch, and updates HTTP/WebSocket handlers and tests for the new snapshot-based flows.

Changes

Windows RIO UDP and Tracker Data Refactoring

Layer / File(s) Summary
Version 4.2.13 and Dependency Updates
Cargo.toml, README.md, docker/Dockerfile, docker/build.bat, torrust-actix.desktop
Version bumped to 4.2.13, rust-version set to 1.88.0, log updated, windows-sys added, README changelog updated.
Configuration Default Functions Centralization
src/config/config.rs, src/config/mod.rs, src/config/impls/sentry_config.rs, src/config/structs/sentry_config.rs, src/config/structs/tracker_config.rs
Default helpers (sample_rate, traces_sample_rate, max_breadcrumbs, attach_stacktrace, tracker defaults) added/centralized in src/config/config.rs; serde default paths updated to reference them.
UDP Receive Method Configuration Extended with RIO
src/config/enums/udp_receive_method.rs, src/config/impls/configuration.rs, src/config/impls.rs
Added rio variant and env parsing for "rio"; module exports adjusted.
TorrentUpdateData Struct and Conversions
src/tracker/structs/torrent_update_data.rs, src/tracker/impls/torrent_update_data.rs, src/tracker/structs.rs, src/tracker/impls.rs
New TorrentUpdateData struct and From<&TorrentEntry>/From<&AnnounceEntry> impls converting counts into scalar fields.
AnnounceEntry Snapshot Structure with Bounded Peers
src/tracker/structs/announce_entry.rs, src/tracker/impls/announce_entry.rs
New AnnounceEntry snapshot type with capped peer maps (SNAPSHOT_PEER_CAP) and derived TorrentCounts; from_entry and Default implemented.
TorrentCounts Helpers and Sharding Map Type
src/tracker/structs/torrent_counts.rs, src/tracker/impls/torrent_counts.rs, src/tracker/structs/torrent_sharding.rs, src/tracker/impls/torrent_sharding.rs
Moved TorrentCounts helpers to impls; sharding switched to AHashMap with accessor updates.
Handle Announce Signature and Event Parsing Changes
src/tracker/impls/torrent_tracker_handlers.rs
handle_announce now accepts &AnnounceQueryRequest, returns (TorrentPeer, AnnounceEntry), and uses case-insensitive event parsing.
Peer Management with AnnounceEntry Returns and Ref-based Queries
src/tracker/impls/torrent_tracker_peers.rs
add_torrent_peer/remove_torrent_peer return AnnounceEntry; new get_peers_ref returns borrowed peer refs for response building.
Torrent Update Queue and Persistence Data Type
src/tracker/impls/torrent_tracker_torrents_updates.rs
Queue and persistence APIs refactored to use TorrentUpdateData; peer-count cache filled from scalar fields in the updates.
RTC Peer Handler Returns AnnounceEntry
src/tracker/impls/torrent_tracker_rtctorrent.rs, src/tracker/impls/torrent_tracker_import.rs
RTC get/import paths now return/build AnnounceEntry and produce minimal TorrentUpdateData for persistence.
Statistics Method Signatures Simplified
src/stats/impls/torrent_tracker.rs
update_stats and set_stats no longer return Stats; they perform in-place updates.
DatabaseBackend Trait Updated for TorrentUpdateData
src/database/traits/database_backend.rs, src/database/impls/database_connector.rs
save_torrents now accepts BTreeMap<InfoHash, (TorrentUpdateData, UpdatesAction)>; connector dispatch updated.
MySQL, PostgreSQL, SQLite Database Implementations
src/database/impls/database_connector_mysql.rs, src/database/impls/database_connector_pgsql.rs, src/database/impls/database_connector_sqlite.rs
Connectors updated to read seed/peer/completed values from TorrentUpdateData scalar fields for insert/upsert and update paths.
API Torrents Create/Delete Persistence Updates
src/api/api_torrents.rs
API handlers queue persistence using TorrentUpdateData::from(&torrent_entry) or TorrentUpdateData::default() for deletes.
UdpReply Enum for Socket/Rio Dispatch
src/udp/enums.rs, src/udp/enums/udp_reply.rs, src/udp/impls.rs
Added UdpReply enum and conditional gating of io_uring_recv/rio_recv modules.
Windows RIO UDP Receive Runtime
src/udp/impls/rio_recv.rs
New RioSender, RIO availability detection, setup, run loop, buffer registration, post_receive/post_send, and sockaddr helpers.
UDP Server Integration with RIO Path Selection
src/udp/impls/udp_server.rs, src/udp/structs/udp_server.rs
UdpServer chooses RIO when requested and available; struct gains bind/buffer fields; start spawns RIO thread when applicable; announce handling builds request and calls handle_announce by reference.
UdpPacket Reply Field and Response Dispatch
src/udp/structs/udp_packet.rs, src/udp/impls/io_uring_recv.rs
UdpPacket now carries reply: UdpReply; io_uring recv builds UdpReply::Socket(...); send_response/send_packet dispatch via UdpReply.
ParsePool Adaptive Polling and Reply Dispatch
src/udp/impls/parse_pool.rs
Worker loop changed to adaptive POLL_MIN/POLL_MAX backoff; response dispatch uses packet.reply in both non-slave and slave-forward modes.
HTTP Handler Updates for New Announce Flow
src/http/http.rs
Announce/scrape handlers pass borrowed &str to parse_query, use tracker.handle_announce(&announce_request, user_key), iterate peers via get_peers_ref, and compute totals from torrent.counts.
WebSocket Handler Updates for AnnounceEntry Responses
src/websocket/websocket.rs
WebSocket announce/scrape handlers updated for borrowed query parsing, new handle_announce signature, and build_*_announce_response now accept &AnnounceEntry.
Query String Parsing Parameter Optimization
src/common/common.rs
parse_query now accepts Option<&str> to avoid unnecessary allocations.
Tracker Tests Updated for New Return Types
tests/tracker_tests.rs
Tests updated for AnnounceEntry returns; new test validates announce snapshot counts when peer map is capped.

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Power2All/torrust-actix#83: Both PRs extend UDP receive-method infrastructure; this PR adds Windows rio wiring and RIO backend.
  • Power2All/torrust-actix#78: Both PRs touch TorrentCounts and tracker scrape/announce counting behavior and reorganize helper placement.

🐇 "I hopped through code with eager paws,

Snipped clones to counters with tiny applause,
Capped snapshots hold peers, counts stay exact,
RIO wakes Windows — fast paths intact!"

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 21.25% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The PR title 'v4.2.13' refers only to the version bump and does not describe the main changes such as RIO Windows support, performance refactoring, or Rust version updates. Consider using a more descriptive title that captures the primary change, such as 'Add Windows RIO support and performance improvements for v4.2.13' or similar.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch v4.2.13

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
src/tracker/impls/torrent_tracker_handlers.rs (2)

244-269: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Don't enqueue a zeroed torrent update for a no-op stopped announce.

The wildcard arm on Line 263 collapses “peer/torrent not found” and “torrent removed entirely” into the same AnnounceEntry::default(), and the unconditional add_torrent_update right after that writes zeros in both cases. A repeated or bogus stopped request can therefore create or overwrite a zero-count cache/DB record for an info hash that was never present.

Suggested fix
-                let torrent_entry = match data.remove_torrent_peer(
+                let (torrent_entry, should_update) = match data.remove_torrent_peer(
                     announce_query.info_hash,
                     announce_query.peer_id,
                     is_persistent,
                     false
                 ) {
-                    (Some(_), Some(new_torrent)) => {
+                    (Some(_), Some(new_torrent)) => {
                         if users_enabled && let Some(user_id) = user_key && let Some(mut user) = data.get_user(user_id) {
                             user.uploaded += announce_query.uploaded;
                             user.downloaded += announce_query.downloaded;
                             user.updated = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs();
                             user.torrents_active.remove(&announce_query.info_hash);
                             data.add_user(user_id, user.clone());
                             if is_users_persistent {
                                 data.add_user_update(user_id, user, UpdatesAction::Add);
                             }
                         }
-                        new_torrent
+                        (new_torrent, true)
                     }
-                    _ => AnnounceEntry::default()
+                    (Some(_), None) => (AnnounceEntry::default(), true),
+                    _ => (AnnounceEntry::default(), false),
                 };
-                if needs_update {
+                if needs_update && should_update {
                     let _ = data.add_torrent_update(
                         announce_query.info_hash,
                         TorrentUpdateData::from(&torrent_entry),
                         UpdatesAction::Add
                     );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/tracker/impls/torrent_tracker_handlers.rs` around lines 244 - 269, The
code unconditionally enqueues a zeroed TorrentUpdate when remove_torrent_peer
falls through to AnnounceEntry::default(), causing bogus zeroed records on no-op
stopped announces; change the logic around the match on data.remove_torrent_peer
(the branch that currently returns AnnounceEntry::default()) to detect the “not
found / no-op stopped” case and skip calling data.add_torrent_update when there
is no real torrent to update (i.e., only call data.add_torrent_update when the
match yields Some(new_torrent) or when torrent_entry represents a real torrent
state change), using announce_query.stopped or announce_query.event to
distinguish stop no-ops from genuine removals and preserving the existing
needs_update behavior otherwise.

291-315: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Use needs_update in the completed path as well.

Started and Stopped both propagate TorrentUpdateData when persistence or cache is enabled, but Completed only does so when is_persistent is true. In cache-only deployments that drops completed/count updates entirely until some later announce touches the torrent.

Suggested fix
-                    if is_persistent {
+                    if needs_update {
                         let _ = data.add_torrent_update(
                             announce_query.info_hash,
                             TorrentUpdateData::from(&rtc_entry),
                             UpdatesAction::Add
                         );
                     }
@@
-                    if is_persistent {
+                    if needs_update {
                         let _ = data.add_torrent_update(
                             announce_query.info_hash,
                             TorrentUpdateData::from(&torrent_entry),
                             UpdatesAction::Add
                         );
                     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/tracker/impls/torrent_tracker_handlers.rs` around lines 291 - 315, The
completed branch only writes TorrentUpdateData when is_persistent is true;
change those guards to include the cache-update flag by using needs_update (e.g.
if needs_update || is_persistent { ... }) for the torrent update (the
add_torrent_update call using TorrentUpdateData::from(&rtc_entry)) and similarly
include needs_update when deciding to call data.add_user_update for the user
update (e.g. if is_users_persistent || needs_update { ... }). Ensure you update
both the completed-path checks so cache-only deployments also propagate the
completed/count updates.
src/database/impls/database_connector_mysql.rs (1)

246-253: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Persist total seed/peer counts here, not just the IPv4 buckets.

column_seeds and column_peers are the only persisted counters for a torrent, but this now writes counts.seeds_ipv4 / counts.peers_ipv4 directly. Any IPv6 or RTC peers disappear from the stored totals, so scrape data and post-restart state will undercount after a sync. The same regression is repeated in the PgSQL and SQLite save_torrents implementations in this PR.

Also applies to: 280-287

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/database/impls/database_connector_mysql.rs` around lines 246 - 253, The
code is persisting only IPv4 buckets (counts.seeds_ipv4/counts.peers_ipv4) into
the aggregate columns; change the upsert to write the total seed/peer counters
instead (use the overall counters on the counts struct, e.g. counts.seeds and
counts.peers or counts.seeds_total/counts.peers_total as available) when calling
build_upsert_torrent_query for &structure.column_seeds and
&structure.column_peers; make the identical change in the save_torrents
implementations for PgSQL and SQLite so the persisted totals include IPv6/RTC
counts as well.
src/tracker/impls/torrent_tracker_peers.rs (1)

141-150: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Remove the previous peer from both IP-family maps before re-inserting.

This replacement path only deletes the old entry from the incoming peer's current family. If the same peer_id re-announces on IPv6 after previously existing on IPv4 (or the reverse), the stale entry survives in the old map and then a second entry is inserted into the new map, which inflates both peer lists and stats.

Suggested fix
-                let (seeds_removed, peers_removed) = if torrent_peer.peer_addr.is_ipv4() {
-                    (
-                        i64::from(entry.seeds.remove(&peer_id).is_some()),
-                        i64::from(entry.peers.remove(&peer_id).is_some()),
-                    )
-                } else {
-                    (
-                        i64::from(entry.seeds_ipv6.remove(&peer_id).is_some()),
-                        i64::from(entry.peers_ipv6.remove(&peer_id).is_some()),
-                    )
-                };
+                let seeds_removed = i64::from(entry.seeds.remove(&peer_id).is_some())
+                    + i64::from(entry.seeds_ipv6.remove(&peer_id).is_some());
+                let peers_removed = i64::from(entry.peers.remove(&peer_id).is_some())
+                    + i64::from(entry.peers_ipv6.remove(&peer_id).is_some());

Also applies to: 193-206

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/tracker/impls/torrent_tracker_peers.rs` around lines 141 - 150, The code
only removes the peer_id from the IP-family matching the incoming announce,
leaving a stale entry in the opposite family; change the logic so you remove
peer_id from both IPv4 and IPv6 maps before inserting the new record: call
entry.seeds.remove(&peer_id), entry.peers.remove(&peer_id),
entry.seeds_ipv6.remove(&peer_id) and entry.peers_ipv6.remove(&peer_id) (or
perform a small helper like remove_peer_from_all_families(peer_id, &mut entry))
and then compute seeds_removed/peers_removed based on whether any of the removes
returned true; apply the same fix to both places where this branch logic appears
(the blocks handling removal/re-insert around torrent_peer and peer_id).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Cargo.toml`:
- Around line 8-9: Add the minimum supported Rust version to Cargo.toml by
setting the package rust-version field to match README.md (1.88.0); update the
Cargo.toml [package] section to include rust-version = "1.88.0" so Cargo/tooling
will enforce the MSRV and reject older toolchains (ensure the value exactly
matches the README.md stated version).

In `@src/udp/impls/parse_pool.rs`:
- Around line 55-75: The loop currently always awaits
tokio::time::sleep(poll_interval) between iterations causing a fixed delay even
when work is available; change the control flow so you only sleep when no work
was found. Concretely, in the loop that uses poll_interval, POLL_MIN, POLL_MAX,
BATCH_SIZE, payload and batch (and still honoring shutdown_handler.changed()),
attempt to drain up to BATCH_SIZE into batch and process/drain consecutive
non-empty batches immediately (i.e., loop draining and processing until a drain
yields an empty batch), only then set/increase poll_interval and await
tokio::time::sleep(poll_interval); reset poll_interval to POLL_MIN when work was
processed and back off (multiply/min) only after a poll found no work. This
removes the sleep between back-to-back batches while preserving backoff when
idle.

In `@src/udp/impls/rio_recv.rs`:
- Around line 117-137: The Winsock initialization in is_available() and setup()
calls WSAStartup but never calls WSACleanup, leaking reference counts; update
is_available(), setup(), and any early-return paths to ensure WSACleanup is
called after a successful WSAStartup (use an RAII guard that calls WSACleanup in
Drop or explicitly call WSACleanup on every exit), e.g., wrap the WSAStartup
result in a small struct (WinsockGuard) or ensure after load_rio_table/socket
cleanup you call WSACleanup before returning, and ensure RioContext::drop
remains responsible only for socket/RIO resources while the new guard handles
WSACleanup.

In `@src/udp/impls/udp_server.rs`:
- Around line 163-169: The code currently panics on thread spawn failure via
.expect("failed to spawn RIO receive thread"); change this to handle the Result
from std::thread::Builder::new().spawn(...) gracefully: match or if let Err(e)
=> log the error (using the existing logger) and avoid aborting, and only
proceed to await rx.changed() when the thread was spawned successfully;
reference the spawn call created by std::thread::Builder::new().name("udp-rio")
and the action inside crate::udp::impls::rio_recv::run(bind_address, ...) so you
log the spawn error and skip or recover instead of panicking, ensuring
rx.changed().await.ok() is not awaited unconditionally when spawn failed.

---

Outside diff comments:
In `@src/database/impls/database_connector_mysql.rs`:
- Around line 246-253: The code is persisting only IPv4 buckets
(counts.seeds_ipv4/counts.peers_ipv4) into the aggregate columns; change the
upsert to write the total seed/peer counters instead (use the overall counters
on the counts struct, e.g. counts.seeds and counts.peers or
counts.seeds_total/counts.peers_total as available) when calling
build_upsert_torrent_query for &structure.column_seeds and
&structure.column_peers; make the identical change in the save_torrents
implementations for PgSQL and SQLite so the persisted totals include IPv6/RTC
counts as well.

In `@src/tracker/impls/torrent_tracker_handlers.rs`:
- Around line 244-269: The code unconditionally enqueues a zeroed TorrentUpdate
when remove_torrent_peer falls through to AnnounceEntry::default(), causing
bogus zeroed records on no-op stopped announces; change the logic around the
match on data.remove_torrent_peer (the branch that currently returns
AnnounceEntry::default()) to detect the “not found / no-op stopped” case and
skip calling data.add_torrent_update when there is no real torrent to update
(i.e., only call data.add_torrent_update when the match yields Some(new_torrent)
or when torrent_entry represents a real torrent state change), using
announce_query.stopped or announce_query.event to distinguish stop no-ops from
genuine removals and preserving the existing needs_update behavior otherwise.
- Around line 291-315: The completed branch only writes TorrentUpdateData when
is_persistent is true; change those guards to include the cache-update flag by
using needs_update (e.g. if needs_update || is_persistent { ... }) for the
torrent update (the add_torrent_update call using
TorrentUpdateData::from(&rtc_entry)) and similarly include needs_update when
deciding to call data.add_user_update for the user update (e.g. if
is_users_persistent || needs_update { ... }). Ensure you update both the
completed-path checks so cache-only deployments also propagate the
completed/count updates.

In `@src/tracker/impls/torrent_tracker_peers.rs`:
- Around line 141-150: The code only removes the peer_id from the IP-family
matching the incoming announce, leaving a stale entry in the opposite family;
change the logic so you remove peer_id from both IPv4 and IPv6 maps before
inserting the new record: call entry.seeds.remove(&peer_id),
entry.peers.remove(&peer_id), entry.seeds_ipv6.remove(&peer_id) and
entry.peers_ipv6.remove(&peer_id) (or perform a small helper like
remove_peer_from_all_families(peer_id, &mut entry)) and then compute
seeds_removed/peers_removed based on whether any of the removes returned true;
apply the same fix to both places where this branch logic appears (the blocks
handling removal/re-insert around torrent_peer and peer_id).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 97906b7f-54e2-4958-adbb-c0cfe7459bc5

📥 Commits

Reviewing files that changed from the base of the PR and between 65923e0 and cc01e85.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (50)
  • Cargo.toml
  • README.md
  • docker/Dockerfile
  • docker/build.bat
  • src/api/api_torrents.rs
  • src/common/common.rs
  • src/config/config.rs
  • src/config/enums/udp_receive_method.rs
  • src/config/impls.rs
  • src/config/impls/configuration.rs
  • src/config/impls/sentry_config.rs
  • src/config/mod.rs
  • src/config/structs/sentry_config.rs
  • src/config/structs/tracker_config.rs
  • src/database/impls/database_connector.rs
  • src/database/impls/database_connector_mysql.rs
  • src/database/impls/database_connector_pgsql.rs
  • src/database/impls/database_connector_sqlite.rs
  • src/database/traits/database_backend.rs
  • src/http/http.rs
  • src/stats/impls/torrent_tracker.rs
  • src/tracker/impls.rs
  • src/tracker/impls/announce_entry.rs
  • src/tracker/impls/torrent_counts.rs
  • src/tracker/impls/torrent_sharding.rs
  • src/tracker/impls/torrent_tracker_handlers.rs
  • src/tracker/impls/torrent_tracker_import.rs
  • src/tracker/impls/torrent_tracker_peers.rs
  • src/tracker/impls/torrent_tracker_rtctorrent.rs
  • src/tracker/impls/torrent_tracker_torrents.rs
  • src/tracker/impls/torrent_tracker_torrents_updates.rs
  • src/tracker/impls/torrent_update_data.rs
  • src/tracker/structs.rs
  • src/tracker/structs/announce_entry.rs
  • src/tracker/structs/torrent_counts.rs
  • src/tracker/structs/torrent_sharding.rs
  • src/tracker/structs/torrent_update_data.rs
  • src/tracker/types/torrents_updates.rs
  • src/udp/enums.rs
  • src/udp/enums/udp_reply.rs
  • src/udp/impls.rs
  • src/udp/impls/io_uring_recv.rs
  • src/udp/impls/parse_pool.rs
  • src/udp/impls/rio_recv.rs
  • src/udp/impls/udp_server.rs
  • src/udp/structs/udp_packet.rs
  • src/udp/structs/udp_server.rs
  • src/websocket/websocket.rs
  • tests/tracker_tests.rs
  • torrust-actix.desktop
💤 Files with no reviewable changes (1)
  • src/tracker/structs/torrent_counts.rs

Comment thread Cargo.toml
Comment thread src/udp/impls/parse_pool.rs Outdated
Comment thread src/udp/impls/rio_recv.rs Outdated
Comment thread src/udp/impls/udp_server.rs Outdated
@Power2All Power2All merged commit e27eea1 into master Jun 4, 2026
2 checks passed
@Power2All Power2All deleted the v4.2.13 branch June 4, 2026 13:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant