fix(lib): give each search its own token
A search token was the first five hex digits of the query's MD5, so two queries could share one, and a peer's answer to either landed in whichever search the map handed back first. Tokens now come from a counter, which no two live searches can share. The e2e test uses two queries that collide under the old scheme.
This commit is contained in:
@@ -17,7 +17,7 @@ use crate::{
|
||||
peer::{ConnectionType, DownloadPeer, Peer, PeerMessage, listen::Listen},
|
||||
shares::Shares,
|
||||
types::{Download, Search, SearchResult},
|
||||
utils::{lock::RwLockExt, md5},
|
||||
utils::lock::RwLockExt,
|
||||
};
|
||||
use std::{
|
||||
collections::{HashMap, HashSet},
|
||||
@@ -90,6 +90,17 @@ fn next_download_token() -> u32 {
|
||||
NEXT_DOWNLOAD_TOKEN.fetch_add(1, Ordering::Relaxed) % 0x8000_0000
|
||||
}
|
||||
|
||||
/// Source of search tokens.
|
||||
///
|
||||
/// A counter, not a hash of the query: a peer's answer is routed to the first
|
||||
/// search holding its token, so two queries sharing one would pour results
|
||||
/// into each other.
|
||||
static NEXT_SEARCH_TOKEN: AtomicU32 = AtomicU32::new(1);
|
||||
|
||||
fn next_search_token() -> u32 {
|
||||
NEXT_SEARCH_TOKEN.fetch_add(1, Ordering::Relaxed)
|
||||
}
|
||||
|
||||
/// A file we have agreed to serve to a peer, awaiting their TransferResponse.
|
||||
struct UploadJob {
|
||||
downloader: String,
|
||||
|
||||
Reference in New Issue
Block a user