libtorrent todo-list

3 urgent 48 important 57 relevant 4 feasible 178 notes
relevance 4../test/test_dht.cpp:1314pass in the actual salt as a parameter
relevance 4../test/test_dht.cpp:2200pass in th actual salt as the argument
relevance 4../src/disk_io_thread.cpp:1173instead of doing this. pass in the settings to each storage_interface call. Each disk thread could hold its most recent understanding of the settings in a shared_ptr, and update it every time it wakes up from a job. That way each access to the settings won't require a std::mutex to be held.
relevance 3../test/test_dht.cpp:111make the mock_socket hold a reference to the list of where to record packets instead of having a global variable
relevance 3../test/test_dht.cpp:120ideally the mock_socket would contain this queue of packets, to make tests independent
relevance 3../test/test_dht.cpp:1271split this up into smaller tests
relevance 3../test/test_dht.cpp:2669use dht_test_setup class to simplify the node setup
relevance 3../test/test_dht.cpp:3207use dht_test_setup class to simplify the node setup
relevance 3../test/test_dht.cpp:3306use dht_test_setup class to simplify the node setup
relevance 3../test/test_dht.cpp:3397use dht_test_setup class to simplify the node setup
relevance 3../src/session_handle.cpp:625expose the sequence_number, public_key, secret_key and signature types to the client
relevance 3../src/peer_connection.cpp:1906replace this magic number with something that makes sense
relevance 3../src/peer_connection.cpp:3025instead of having to ask the torrent whether it's in graceful pause mode or not, the peers should keep that state (and the torrent should update them when it enters graceful pause). When a peer enters graceful pause mode, it should cancel all outstanding requests and clear its request queue.
relevance 3../src/peer_connection.cpp:3912once peers are properly put in graceful pause mode, they can cancel all outstanding requests and this test can be removed.
relevance 3../src/peer_connection.cpp:4593new_piece should be an optional. piece index -1 should not be allowed
relevance 3../src/ConvertUTF.cpp:61replace this implementation with something maintained and/or robust. Perhaps std::codecvt<>
relevance 3../src/torrent.cpp:230we could probably get away with just saving a few fields here
relevance 3../src/torrent.cpp:799assert there are no outstanding async operations on this torrent
relevance 3../src/torrent.cpp:1301there's some duplication between this function and peer_connection::incoming_piece(). is there a way to merge something?
relevance 3../src/torrent.cpp:3584this could probably be pulled out into a free function
relevance 3../src/torrent.cpp:4328should this alert have an error code in it?
relevance 3../src/torrent.cpp:4394this should return optional<>. piece index -1 should not be allowed
relevance 3../src/upnp.cpp:94bind the broadcast socket. it would probably have to be changed to a vector of interfaces to bind to, since the broadcast socket opens one socket per local interface by default
relevance 3../src/session_impl.cpp:899closing the udp sockets here means that the uTP connections cannot be closed gracefully
relevance 3../src/session_impl.cpp:1355the logic in this if-block should be factored out into a separate function. At least most of it
relevance 3../src/session_impl.cpp:1728only run this once in the caller
relevance 3../src/session_impl.cpp:2410it would be neat if the utp socket manager would handle ICMP errors too
relevance 3../src/session_impl.cpp:3912it would probably make sense to have a separate list of peers that are eligible for optimistic unchoke, similar to the torrents perhaps this could even iterate over the pool allocators of torrent_peer objects. It could probably be done in a single pass and collect the n best candidates. maybe just a queue of peers would make even more sense, just pick the next peer in the queue for unchoking. It would be O(1).
relevance 3../src/session_impl.cpp:3935peers should know whether their torrent is paused or not, instead of having to ask it over and over again
relevance 3../src/session_impl.cpp:4173there should be a pre-calculated list of all peers eligible for unchoking
relevance 3../src/session_impl.cpp:4745perhaps params could be moved into the torrent object, instead of it being copied by the torrent constructor
relevance 3../src/session_impl.cpp:5946use public_key here instead of std::array
relevance 3../src/path.cpp:320find out what error code is reported when the filesystem does not support hard links.
relevance 3../src/web_peer_connection.cpp:168this should be an optional, piece index -1 should not be allowed
relevance 3../src/web_peer_connection.cpp:359do we really need a special case here? wouldn't the multi-file case handle single file torrents correctly too?
relevance 3../src/web_peer_connection.cpp:447file_index_t should not allow negative values
relevance 3../src/web_peer_connection.cpp:627this could be made more efficient for the case when we use an HTTP proxy. Then we wouldn't need to add new web seeds to the torrent, we could just make the redirect table contain full URLs.
relevance 3../src/ut_metadata.cpp:272use the aux::write_* functions and the span here instead, it will fit better with send_buffer()
relevance 3../src/kademlia/rpc_manager.cpp:65move this into it's own .cpp file
relevance 3../include/libtorrent/web_peer_connection.hpp:117if we make this be a disk_buffer_holder instead we would save a copy use allocate_disk_receive_buffer and release_disk_receive_buffer
relevance 3../include/libtorrent/utf8.hpp:79take a string_view here
relevance 3../include/libtorrent/pe_crypto.hpp:71dh_key_exchange should probably move into its own file
relevance 3../include/libtorrent/enum_net.hpp:112use string_view for device_name
relevance 3../include/libtorrent/torrent_handle.hpp:481unify url_seed and http_seed with just web_seed, using the web_seed_entry.
relevance 3../include/libtorrent/storage_utils.hpp:52remove this typedef, and use span for disk write operations
relevance 3../include/libtorrent/torrent.hpp:1316factor out predictive pieces and all operations on it into a separate class (to use as memeber here instead)
relevance 3../include/libtorrent/torrent.hpp:1374factor out the links (as well as update_list() to a separate class that torrent can inherit)
relevance 3../include/libtorrent/tracker_manager.hpp:384make sure the udp_socket supports passing on string-hostnames too, and that this function is used
relevance 3../include/libtorrent/stat.hpp:255everything but payload counters and rates could probably be removed from here
relevance 3../include/libtorrent/kademlia/routing_table.hpp:121to improve memory locality and scanning performance, turn the routing table into a single vector with boundaries for the nodes instead. Perhaps replacement nodes should be in a separate vector.
relevance 3../include/libtorrent/aux_/storage_utils.hpp:52remove this typedef, and use span for disk write operations
relevance 2../test/test_piece_picker.cpp:2149test picking with partial pieces and other peers present so that both backup_pieces and backup_pieces2 are used
relevance 2../test/test_storage.cpp:534split this test up into smaller parts
relevance 2../test/test_dht.cpp:1702test num_global_nodes
relevance 2../test/test_dht.cpp:1703test need_refresh
relevance 2../test/test_dht.cpp:2890split this up into smaller test cases
relevance 2../src/http_tracker_connection.cpp:378returning a bool here is redundant. Instead this function should return the peer_entry
relevance 2../src/peer_list.cpp:467it would be nice if there was a way to iterate over these torrent_peer objects in the order they are allocated in the pool instead. It would probably be more efficient
relevance 2../src/udp_tracker_connection.cpp:76support authentication here. tracker_req().auth
relevance 2../src/tracker_manager.cpp:349implement
relevance 2../src/piece_picker.cpp:1906make the 2048 limit configurable
relevance 2../src/piece_picker.cpp:2514the first_block returned here is the largest free range, not the first-fit range, which would be better
relevance 2../src/piece_picker.cpp:3259it would be nice if this could be folded into lock_piece() the main distinction is that this also maintains the m_num_passed counter and the passed_hash_check member Is there ever a case where we call write filed without also locking the piece? Perhaps write_failed() should imply locking it.
relevance 2../src/utp_stream.cpp:294it would be nice if not everything would have to be public here
relevance 2../src/peer_connection.cpp:2467this should probably be based on time instead of number of request messages. For a very high throughput connection, 300 may be a legitimate number of requests to have in flight when getting choked
relevance 2../src/peer_connection.cpp:3202since we throw away the queue entry once we issue the disk job, this may happen. Instead, we should keep the queue entry around, mark it as having been requested from disk and once the disk job comes back, discard it if it has been cancelled. Maybe even be able to cancel disk jobs?
relevance 2../src/peer_connection.cpp:4832use a deadline_timer for timeouts. Don't rely on second_tick()! Hook this up to connect timeout as well. This would improve performance because of less work in second_tick(), and might let use remove ticking entirely eventually
relevance 2../src/instantiate_connection.cpp:40peer_connection and tracker_connection should probably be flags
relevance 2../src/escape_string.cpp:199this should probably be moved into string_util.cpp
relevance 2../src/storage_utils.cpp:350technically, this is where the transaction of moving the files is completed. This is where the new save_path should be committed. If there is an error in the code below, that should not prevent the new save path to be set. Maybe it would make sense to make the save_path an in-out parameter
relevance 2../src/storage_utils.cpp:496is this risky? The upper layer will assume we have the whole file. Perhaps we should verify that at least the size of the file is correct
relevance 2../src/torrent.cpp:231p should probably be moved in here
relevance 2../src/torrent.cpp:325set_merkle_tree should probably take the vector as &&
relevance 2../src/torrent.cpp:566post alert
relevance 2../src/torrent.cpp:1766add a unit test where we don't have metadata, connect to a peer that sends a bitfield that's too large, then we get the metadata
relevance 2../src/torrent.cpp:3946use chrono type for time duration
relevance 2../src/torrent.cpp:4339abort lookups this torrent has made via the session host resolver interface
relevance 2../src/torrent.cpp:6927if peer is a really good peer, maybe we shouldn't disconnect it perhaps this logic should be disabled if we have too many idle peers (with some definition of idle)
relevance 2../src/alert.cpp:1682the salt here is allocated on the heap. It would be nice to allocate in the stack_allocator
relevance 2../src/bdecode.cpp:785attempt to simplify this implementation by embracing the span
relevance 2../src/session_impl.cpp:476is there a reason not to move all of this into init()? and just post it to the io_service?
relevance 2../src/session_impl.cpp:3643make a list for torrents that want to be announced on the DHT so we don't have to loop over all torrents, just to find the ones that want to announce
relevance 2../src/session_impl.cpp:5358this function should be removed and users need to deal with the more generic case of having multiple listen ports
relevance 2../src/session_impl.cpp:5396this function should be removed and users need to deal with the more generic case of having multiple ssl ports
relevance 2../src/session_impl.cpp:6221this should be factored into the udp socket, so we only have the code once
relevance 2../src/path.cpp:345test this on a FAT volume to see what error we get!
relevance 2../src/block_cache.cpp:1619turn these return values into enums returns -1: block not in cache -2: out of memory
relevance 2../src/alert_manager.cpp:75keep a count of the number of threads waiting. Only if it's > 0 notify them
relevance 2../src/web_peer_connection.cpp:576just make this peer not have the pieces associated with the file we just requested. Only when it doesn't have any of the file do the following pad files will make it complicated
relevance 2../src/ut_metadata.cpp:103if we were to initialize m_metadata_size lazily instead, we would probably be more efficient initialize m_metadata_size
relevance 2../src/kademlia/node.cpp:675it would be nice to have a bias towards node-id prefixes that are missing in the bucket
relevance 2../src/kademlia/node.cpp:744use the non deprecated function instead of this one
relevance 2../src/kademlia/dht_storage.cpp:82make this configurable in dht_settings
relevance 2../src/kademlia/routing_table.cpp:143use the non deprecated function instead of this one
relevance 2../src/kademlia/routing_table.cpp:875move the lowest priority nodes to the replacement bucket
relevance 2../include/libtorrent/proxy_base.hpp:274use the resolver interface that has a built-in cache
relevance 2../include/libtorrent/broadcast_socket.hpp:50factor these functions out
relevance 2../include/libtorrent/enum_net.hpp:144this could be done more efficiently by just looking up the interface with the given name, maybe even with if_nametoindex()
relevance 2../include/libtorrent/chained_buffer.hpp:59this type should probably be renamed to send_buffer
relevance 2../include/libtorrent/session_interface.hpp:130make this interface a lot smaller. It could be split up into several smaller interfaces. Each subsystem could then limit the size of the mock object to test it.
relevance 2../include/libtorrent/session_interface.hpp:139the IP voting mechanism should be factored out to its own class, not part of the session and these constants should move too
relevance 2../include/libtorrent/session_handle.hpp:105the ip filter should probably be saved here too loads and saves all session settings, including dht_settings, encryption settings and proxy settings. ``save_state`` writes all keys to the ``entry`` that's passed in, which needs to either not be initialized, or initialized as a dictionary. ``load_state`` expects a bdecode_node which can be built from a bencoded buffer with bdecode(). The ``flags`` argument is used to filter which parts of the session state to save or load. By default, all state is saved/restored (except for the individual torrents). When saving settings, there are two fields that are *not* loaded. ``peer_fingerprint`` and ``user_agent``. Those are left as configured by the ``session_settings`` passed to the session constructor or subsequently set via apply_settings().
relevance 2../include/libtorrent/piece_picker.hpp:576having 8 priority levels is probably excessive. It should probably be changed to 3 levels + dont-download
relevance 2../include/libtorrent/peer_connection.hpp:949this should really be a circular buffer
relevance 2../include/libtorrent/peer_connection.hpp:1043rename this target queue size
relevance 2../include/libtorrent/socks5_stream.hpp:137add async_connect() that takes a hostname and port as well
relevance 2../include/libtorrent/aux_/session_interface.hpp:130make this interface a lot smaller. It could be split up into several smaller interfaces. Each subsystem could then limit the size of the mock object to test it.
relevance 2../include/libtorrent/aux_/session_interface.hpp:139the IP voting mechanism should be factored out to its own class, not part of the session and these constants should move too
relevance 1../src/torrent.cpp:1150make this depend on the error and on the filesystem the files are being downloaded to. If the error is no_space_left_on_device and the filesystem doesn't support sparse files, only zero the priorities of the pieces that are at the tails of all files, leaving everything up to the highest written piece in each file
relevance 1../src/torrent.cpp:7284should disconnect all peers that have the pieces we have not just seeds. It would be pretty expensive to check all pieces for all peers though
relevance 1../src/session_impl.cpp:5572report the proper address of the router as the source IP of this vote of our external address, instead of the empty address
relevance 1../include/libtorrent/ip_voter.hpp:128have one instance per possible subnet, 192.168.x.x, 10.x.x.x, etc.
relevance 0../test/test_transfer.cpp:218these settings_pack tests belong in their own test
relevance 0../test/test_transfer.cpp:312factor out the disk-full test into its own unit test
relevance 0../test/test_upnp.cpp:151store the log and verify that some key messages are there
relevance 0../test/test_timestamp_history.cpp:54test the case where we have > 120 samples (and have the base delay actually be updated)
relevance 0../test/test_timestamp_history.cpp:55test the case where a sample is lower than the history entry but not lower than the base
relevance 0../test/test_resolve_links.cpp:86test files with different piece size (negative test)
relevance 0../test/test_resolve_links.cpp:89it would be nice to test resolving of more than just 2 files as well. like 3 single file torrents merged into one, resolving all 3 files.
relevance 0../test/test_storage.cpp:991this should take a span of iovec_ts
relevance 0../test/test_storage.cpp:1016this should take a span
relevance 0../test/test_fast_extension.cpp:1074test sending invalid requests (out of bound piece index, offsets and sizes)
relevance 0../test/test_tracker.cpp:54test scrape requests
relevance 0../test/test_tracker.cpp:55test parse peers6
relevance 0../test/test_tracker.cpp:56test parse tracker-id
relevance 0../test/test_tracker.cpp:57test parse failure-reason
relevance 0../test/test_tracker.cpp:58test all failure paths, including invalid bencoding not a dictionary no files entry in scrape response no info-hash entry in scrape response malformed peers in peer list of dictionaries uneven number of bytes in peers and peers6 string responses
relevance 0../test/test_block_cache.cpp:484test try_evict_blocks
relevance 0../test/test_block_cache.cpp:485test evicting volatile pieces, to see them be removed
relevance 0../test/test_block_cache.cpp:486test evicting dirty pieces
relevance 0../test/test_block_cache.cpp:487test free_piece
relevance 0../test/test_block_cache.cpp:488test abort_dirty
relevance 0../test/test_block_cache.cpp:489test unaligned reads
relevance 0../test/test_bloom_filter.cpp:134test size()
relevance 0../test/test_bloom_filter.cpp:135test clear()
relevance 0../test/test_ssl.cpp:401test using a signed certificate with the wrong info-hash in DN
relevance 0../test/test_ssl.cpp:499also test using a hash that refers to a valid torrent but that differs from the SNI hash
relevance 0../test/test_flags.cpp:131change to a different test setup. currently always paused. test_set_after_add(torrent_flags::paused); test_unset_after_add(torrent_flags::paused);
relevance 0../test/test_flags.cpp:165change to a different test setup. currently always paused. test_set_after_add(torrent_flags::stop_when_ready);
relevance 0../test/test_file_storage.cpp:627test file attributes
relevance 0../test/test_file_storage.cpp:628test symlinks
relevance 0../test/test_file_storage.cpp:629test reorder_file (make sure internal_file_entry::swap() is used)
relevance 0../test/test_resume.cpp:403test what happens when loading a resume file with both piece priorities and file priorities (file prio should take presedence)
relevance 0../test/test_resume.cpp:406make sure a resume file only ever contain file priorities OR piece priorities. Never both.
relevance 0../test/test_resume.cpp:409generally save
relevance 0../test/test_resume.cpp:725test all other resume flags here too. This would require returning more than just the torrent_status from test_resume_flags. Also http seeds and trackers for instance
relevance 0../test/test_resume.cpp:1326test all other resume flags here too. This would require returning more than just the torrent_status from test_resume_flags. Also http seeds and trackers for instance
relevance 0../test/test_dht.cpp:465check to make sure the "best" items are stored
relevance 0../test/test_dht.cpp:3278this won't work because the second node isn't pinged so it wont be added to the routing table
relevance 0../test/test_dht.cpp:3766test obfuscated_get_peers
relevance 0../test/test_torrent_info.cpp:172test remap_files
relevance 0../test/test_torrent_info.cpp:173merkle torrents. specifically torrent_info::add_merkle_nodes and torrent with "root hash"
relevance 0../test/test_torrent_info.cpp:174torrent with 'p' (padfile) attribute
relevance 0../test/test_torrent_info.cpp:175torrent with 'h' (hidden) attribute
relevance 0../test/test_torrent_info.cpp:176torrent with 'x' (executable) attribute
relevance 0../test/test_torrent_info.cpp:177torrent with 'l' (symlink) attribute
relevance 0../test/test_torrent_info.cpp:178creating a merkle torrent (torrent_info::build_merkle_list)
relevance 0../test/test_torrent_info.cpp:179torrent with multiple trackers in multiple tiers, making sure we shuffle them (how do you test shuffling?, load it multiple times and make sure it's in different order at least once)
relevance 0../test/test_torrent_info.cpp:182torrents with a zero-length name
relevance 0../test/test_torrent_info.cpp:183torrents with a merkle tree and add_merkle_nodes
relevance 0../test/test_torrent_info.cpp:184torrent with a non-dictionary info-section
relevance 0../test/test_torrent_info.cpp:185torrents with DHT nodes
relevance 0../test/test_torrent_info.cpp:186torrent with url-list as a single string
relevance 0../test/test_torrent_info.cpp:187torrent with http seed as a single string
relevance 0../test/test_torrent_info.cpp:188torrent with a comment
relevance 0../test/test_torrent_info.cpp:189torrent with an SSL cert
relevance 0../test/test_torrent_info.cpp:190torrent with attributes (executable and hidden)
relevance 0../test/test_torrent_info.cpp:191torrent_info::add_tracker
relevance 0../test/test_torrent_info.cpp:192torrent_info constructor that takes an invalid bencoded buffer
relevance 0../test/test_torrent_info.cpp:193verify_encoding with a string that triggers character replacement
relevance 0../test/test_peer_list.cpp:968test erasing peers
relevance 0../test/test_peer_list.cpp:969test update_peer_port with allow_multiple_connections_per_ip and without
relevance 0../test/test_peer_list.cpp:970test add i2p peers
relevance 0../test/test_peer_list.cpp:971test allow_i2p_mixed
relevance 0../test/test_peer_list.cpp:972test insert_peer failing with all error conditions
relevance 0../test/test_peer_list.cpp:973test IPv6
relevance 0../test/test_peer_list.cpp:974test connect_to_peer() failing
relevance 0../test/test_peer_list.cpp:975test connection_closed
relevance 0../test/test_peer_list.cpp:976connect candidates recalculation when incrementing failcount
relevance 0../src/choker.cpp:311optimize this using partial_sort or something. We don't need to sort the entire list
relevance 0../src/choker.cpp:314make the comparison function a free function and move it into this cpp file
relevance 0../src/choker.cpp:319make configurable
relevance 0../src/choker.cpp:331make configurable
relevance 0../src/udp_tracker_connection.cpp:632why is this a linked list?
relevance 0../src/magnet_uri.cpp:271what's the right number here?
relevance 0../src/add_torrent_params.cpp:76pre C++17, GCC and msvc does not make std::string nothrow move assignable, which means no type containing a string will be nothrow move assignable by default either static_assert(std::is_nothrow_move_assignable::value , "should be nothrow move assignable");
relevance 0../src/add_torrent_params.cpp:82it would be nice if this was nothrow default constructible static_assert(std::is_nothrow_default_constructible::value , "should be nothrow default constructible");
relevance 0../src/piece_picker.cpp:106find a better place for this
relevance 0../src/piece_picker.cpp:1982this could probably be optimized by incrementally calling partial_sort to sort one more element in the list. Because chances are that we'll just need a single piece, and once we've picked from it we're done. Sorting the rest of the list in that case is a waste of time.
relevance 0../src/piece_picker.cpp:2486when expanding pieces for cache stripe reasons, the !downloading condition doesn't make much sense
relevance 0../src/session_handle.cpp:415in C++14, use unique_ptr and move it into the lambda
relevance 0../src/utp_stream.cpp:1727this loop is not very efficient. It could be fixed by having a separate list of sequence numbers that need resending
relevance 0../src/peer_connection.cpp:1085this should be the global download rate
relevance 0../src/peer_connection.cpp:3427sort the allowed fast set in priority order
relevance 0../src/settings_pack.cpp:505it would be nice to reserve() these vectors up front
relevance 0../src/socks5_stream.cpp:93we could bind the socket here, since we know what the target endpoint is of the proxy
relevance 0../src/part_file.cpp:246what do we do if someone is currently reading from the disk from this piece? does it matter? Since we won't actively erase the data from disk, but it may be overwritten soon, it's probably not that big of a deal
relevance 0../src/part_file.cpp:358instead of rebuilding the whole file header and flushing it, update the slot entries as we go
relevance 0../src/disk_buffer_pool.cpp:207perhaps we should sort the buffers here?
relevance 0../src/disk_io_thread.cpp:492in this case, the piece should probably not be flushed yet. are there any more cases where it should?
relevance 0../src/disk_io_thread.cpp:943it would be nice to optimize this by having the cache pieces also ordered by
relevance 0../src/disk_io_thread.cpp:985instead of doing a lookup each time through the loop, save cached_piece_entry pointers with piece_refcount incremented to pin them
relevance 0../src/disk_io_thread.cpp:1185in the future, propagate exceptions back to the handlers
relevance 0../src/disk_io_thread.cpp:1243a potentially more efficient solution would be to have a special queue for retry jobs, that's only ever run when a job completes, in any thread. It would only work if counters::num_running_disk_jobs > 0
relevance 0../src/disk_io_thread.cpp:1996this is potentially very expensive. One way to solve it would be to have a fence for just this one piece.
relevance 0../src/disk_io_thread.cpp:2255we should probably just hang the job on the piece and make sure the hasher gets kicked
relevance 0../src/http_parser.cpp:138remove to_string() if we're in C++14
relevance 0../src/http_parser.cpp:146remove to_string() if we're in C++14
relevance 0../src/storage_utils.cpp:285ideally, if we end up copying files because of a move across volumes, the source should not be deleted until they've all been copied. That would let us rollback with higher confidence.
relevance 0../src/storage_utils.cpp:475this should probably be moved to default_storage::initialize
relevance 0../src/torrent.cpp:98factor out cache_status to its own header
relevance 0../src/torrent.cpp:331if this is a merkle torrent and we can't restore the tree, we need to wipe all the bits in the have array, but not necessarily we might want to do a full check to see if we have all the pieces. This is low priority since almost no one uses merkle torrents
relevance 0../src/torrent.cpp:460if the existing torrent doesn't have metadata, insert the metadata we just downloaded into it.
relevance 0../src/torrent.cpp:1473is verify_peer_cert called once per certificate in the chain, and this function just tells us which depth we're at right now? If so, the comment makes sense. any certificate that isn't the leaf (i.e. the one presented by the peer) should be accepted automatically, given preverified is true. The leaf certificate need to be verified to make sure its DN matches the info-hash
relevance 0../src/torrent.cpp:1887this could be optimized by looking up which files are complete and just look at those
relevance 0../src/torrent.cpp:1900this could be optimized by looking up which files are complete and just look at those
relevance 0../src/torrent.cpp:2547this pattern is repeated in a few places. Factor this into a function and generalize the concept of a torrent having a dedicated listen port
relevance 0../src/torrent.cpp:3502add one peer per IP the hostname resolves to
relevance 0../src/torrent.cpp:8325add a flag to ignore stats, and only care about resume data for content. For unchanged files, don't trigger a load of the metadata just to save an empty resume data file
relevance 0../src/torrent.cpp:9844instead of resorting the whole list, insert the peers directly into the right place
relevance 0../src/web_connection_base.cpp:68introduce a web-seed default class which has a low download priority
relevance 0../src/pe_crypto.cpp:62it would be nice to get the literal working
relevance 0../src/pe_crypto.cpp:73it would be nice to be able to export to a fixed width field, so we wouldn't have to shift it later
relevance 0../src/ip_notifier.cpp:37simulator support
relevance 0../src/session_impl.cpp:1247it would be nice to reserve() these vectors up front
relevance 0../src/session_impl.cpp:3338have a separate list for these connections, instead of having to loop through all of them
relevance 0../src/session_impl.cpp:3371this should apply to all bandwidth channels
relevance 0../src/session_impl.cpp:4071use a lower limit than m_settings.connections_limit to allocate the to 10% or so of connection slots for incoming connections cap this at max - 1, since we may add one below
relevance 0../src/session_impl.cpp:4208post a message to have this happen immediately instead of waiting for the next tick
relevance 0../src/session_impl.cpp:4589it might be a nice feature here to limit the number of torrents to send in a single update. By just posting the first n torrents, they would nicely be round-robined because the torrent lists are always pushed back. Perhaps the status_update_alert could even have a fixed array of n entries rather than a vector, to further improve memory locality.
relevance 0../src/session_impl.cpp:5762refactor, move the storage to dht_tracker
relevance 0../src/session_impl.cpp:6084asserts that no outstanding async operations are still in flight
relevance 0../src/session_impl.cpp:6885remove this function once all callers are updated to specify a listen socket
relevance 0../src/udp_socket.cpp:506use the system resolver_interface here
relevance 0../src/file_storage.cpp:963padfiles should be removed
relevance 0../src/block_cache.cpp:1009it's somewhat expensive to iterate over this linked list. Presumably because of the random access of memory. It would be nice if pieces with no evictable blocks weren't in this list
relevance 0../src/block_cache.cpp:1080this should probably only be done every n:th time
relevance 0../src/block_cache.cpp:1714create a holder for refcounts that automatically decrement
relevance 0../src/packet_buffer.cpp:155use compare_less_wrap for this comparison as well
relevance 0../src/torrent_peer.cpp:174how do we deal with our external address changing?
relevance 0../src/torrent_info.cpp:754this should be considered a failure, and the .torrent file rejected
relevance 0../src/ut_metadata.cpp:285we really need to increment the refcounter on the torrent while this buffer is still in the peer's send buffer
relevance 0../src/ut_metadata.cpp:338make this an enum class
relevance 0../src/cpuid.cpp:128enable when aarch64 is really tested
relevance 0../src/kademlia/node_id.cpp:64it's a little bit weird to return 159 - leading zeroes. It should probably be 160 - leading zeroes, but all other code in here is tuned to this expectation now, and it doesn't really matter (other than complexity)
relevance 0../src/kademlia/put_data.cpp:88what if o is not an instance of put_data_observer? This need to be redesigned for better type safety.
relevance 0../src/kademlia/node.cpp:1164keep the returned value to pass as a limit to write_nodes_entries when implemented
relevance 0../src/kademlia/node.cpp:1192limit number of entries in the result
relevance 0../src/kademlia/item.cpp:146implement ctor for entry from bdecode_node?
relevance 0../src/kademlia/dht_tracker.cpp:317pick the closest node rather than the first
relevance 0../src/kademlia/routing_table.cpp:152arvidn note when it's across IPv4 and IPv6, adding (dht_global_nodes) would make sense. in the future though, where we may have one DHT node per external interface (which may be multiple of the same address family), then it becomes a bit trickier
relevance 0../include/libtorrent/proxy_base.hpp:188it would be nice to remember the bind port and bind once we know where the proxy is m_sock.bind(endpoint, ec);
relevance 0../include/libtorrent/performance_counters.hpp:47move this out of counters
relevance 0../include/libtorrent/performance_counters.hpp:151should keepalives be in here too? how about dont-have, share-mode, upload-only
relevance 0../include/libtorrent/performance_counters.hpp:493some space could be saved here by making gauges 32 bits
relevance 0../include/libtorrent/performance_counters.hpp:494restore these to regular integers. Instead have one copy of the counters per thread and collect them at convenient synchronization points
relevance 0../include/libtorrent/broadcast_socket.hpp:57refactor these out too
relevance 0../include/libtorrent/torrent_info.hpp:117there may be some opportunities to optimize the size if torrent_info. specifically to turn some std::string and std::vector into pointers
relevance 0../include/libtorrent/torrent_info.hpp:619change the type to std::shared_ptr in C++17
relevance 0../include/libtorrent/upnp.hpp:145support using the windows API for UPnP operations as well
relevance 0../include/libtorrent/config.hpp:44don't include that here. Make each header that use the export macros include it instead. and move it to aux_
relevance 0../include/libtorrent/config.hpp:64figure out which version of clang this is supported in
relevance 0../include/libtorrent/session_impl.hpp:196make these direct members and generate shared_ptrs to them which alias the listen_socket_t shared_ptr
relevance 0../include/libtorrent/session_impl.hpp:984replace this by a proper asio timer
relevance 0../include/libtorrent/session_impl.hpp:989replace this by a proper asio timer
relevance 0../include/libtorrent/session_impl.hpp:996replace this by a proper asio timer
relevance 0../include/libtorrent/announce_entry.hpp:86include the number of peers received from this tracker, at last announce
relevance 0../include/libtorrent/block_cache.hpp:223make this 32 bits and to count seconds since the block cache was created
relevance 0../include/libtorrent/session_interface.hpp:221it would be nice to not have this be part of session_interface
relevance 0../include/libtorrent/peer_connection_interface.hpp:50make this interface smaller!
relevance 0../include/libtorrent/torrent.hpp:237make this a raw pointer. perhaps keep the shared_ptr around further down the object to maintain an owner
relevance 0../include/libtorrent/torrent.hpp:411make graceful pause also finish all sending blocks before disconnecting
relevance 0../include/libtorrent/torrent.hpp:1267this wastes 5 bits per file
relevance 0../include/libtorrent/utp_stream.hpp:426implement blocking write. Low priority since it's not used (yet)
relevance 0../include/libtorrent/piece_picker.hpp:731should this be allocated lazily?
relevance 0../include/libtorrent/piece_picker.hpp:738this could be a much more efficient data structure
relevance 0../include/libtorrent/piece_picker.hpp:804it would be more intuitive to account "wanted" pieces instead of filtered
relevance 0../include/libtorrent/settings_pack.hpp:1165deprecate this ``max_rejects`` is the number of piece requests we will reject in a row while a peer is choked before the peer is considered abusive and is disconnected.
relevance 0../include/libtorrent/peer_connection.hpp:186make this a raw pointer (to save size in the first cache line) and make the constructor take a raw pointer. torrent objects should always outlive their peers
relevance 0../include/libtorrent/peer_connection.hpp:979factor this out into its own class with a virtual interface torrent and session should implement this interface
relevance 0../include/libtorrent/identify_client.hpp:47hide this declaration when deprecated functions are disabled, and remove its internal use
relevance 0../include/libtorrent/max_path.hpp:38Make this count Unicode characters instead of bytes on windows
relevance 0../include/libtorrent/sha1_hash.hpp:58find a better place for these functions
relevance 0../include/libtorrent/kademlia/msg.hpp:85move this to its own .hpp/.cpp pair?
relevance 0../include/libtorrent/kademlia/item.hpp:58since this is a public function, it should probably be moved out of this header and into one with other public functions.
relevance 0../include/libtorrent/aux_/session_impl.hpp:212make these direct members and generate shared_ptrs to them which alias the listen_socket_t shared_ptr
relevance 0../include/libtorrent/aux_/session_impl.hpp:1005replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_impl.hpp:1010replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_impl.hpp:1017replace this by a proper asio timer
relevance 0../include/libtorrent/aux_/session_interface.hpp:224it would be nice to not have this be part of session_interface