@@ -331,6 +331,7 @@ impl DownloaderState {
331331 }
332332 }
333333 state. ranges = ranges;
334+ state. size = state. size . min ( size) ;
334335 self . check_completion ( hash, None , evs) ?;
335336 } else {
336337 // We got an entirely new peer, mark all affected downloads for rebalancing
@@ -340,21 +341,23 @@ impl DownloaderState {
340341 }
341342 }
342343 state. ranges = ranges;
344+ state. size = state. size . min ( size) ;
343345 }
344346 // we have to call start_downloads even if the local bitfield set, since we don't know in which order local and remote bitfields arrive
345347 self . start_downloads ( hash, None , evs) ?;
346348 }
347349 Command :: BitfieldInfo {
348350 peer,
349351 hash,
350- event : BitfieldEvent :: Update { added, removed } ,
352+ event : BitfieldEvent :: Update { added, removed, size } ,
351353 } => {
352354 let state = self . bitfields . get_mut ( & ( peer, hash) ) . context ( format ! (
353355 "bitfield update for unknown peer {peer:?} and hash {hash}"
354356 ) ) ?;
355357 if peer == BitfieldPeer :: Local {
356358 // we got a local bitfield update, notify local observers
357359 // for updates we can just notify the observers that have a non-empty intersection with the update
360+ state. size = state. size . min ( size) ;
358361 if let Some ( observers) = self . observers . get_by_hash ( & hash) {
359362 for ( id, request) in observers {
360363 let added = & added & & request. ranges ;
@@ -365,6 +368,7 @@ impl DownloaderState {
365368 event : BitfieldEvent :: Update {
366369 added : & added & & request. ranges ,
367370 removed : & removed & & request. ranges ,
371+ size : state. size ,
368372 }
369373 } ) ;
370374 }
@@ -383,6 +387,7 @@ impl DownloaderState {
383387 }
384388 state. ranges |= added;
385389 state. ranges &= !removed;
390+ state. size = state. size . min ( size) ;
386391 // a local bitfield update does not make more data available, so we don't need to start downloads
387392 self . start_downloads ( hash, None , evs) ?;
388393 }
@@ -874,6 +879,8 @@ struct PeerBlobState {
874879 subscription_count : usize ,
875880 /// chunk ranges this peer reports to have
876881 ranges : ChunkRanges ,
882+ /// The minimum reported size of the blob
883+ size : u64 ,
877884}
878885
879886impl PeerBlobState {
@@ -882,6 +889,7 @@ impl PeerBlobState {
882889 subscription_id,
883890 subscription_count : 1 ,
884891 ranges : ChunkRanges :: empty ( ) ,
892+ size : u64:: MAX ,
885893 }
886894 }
887895}
@@ -977,6 +985,7 @@ mod tests {
977985 event : BitfieldEvent :: Update {
978986 added : chunk_ranges ( [ 16 ..32 ] ) ,
979987 removed : ChunkRanges :: empty ( ) ,
988+ size : u64:: MAX ,
980989 } ,
981990 } ) ;
982991 assert ! ( evs. is_empty( ) ) ;
@@ -1036,6 +1045,7 @@ mod tests {
10361045 event : BitfieldEvent :: Update {
10371046 added : chunk_ranges ( [ 32 ..48 ] ) ,
10381047 removed : ChunkRanges :: empty ( ) ,
1048+ size : u64:: MAX ,
10391049 } ,
10401050 } ) ;
10411051 assert ! ( evs. is_empty( ) ) ;
@@ -1054,6 +1064,7 @@ mod tests {
10541064 event : BitfieldEvent :: Update {
10551065 added : chunk_ranges ( [ 48 ..64 ] ) ,
10561066 removed : ChunkRanges :: empty ( ) ,
1067+ size : u64:: MAX ,
10571068 } ,
10581069 } ) ;
10591070 assert ! (
@@ -1129,6 +1140,7 @@ mod tests {
11291140 event : BitfieldEvent :: Update {
11301141 added : chunk_ranges ( [ 0 ..16 ] ) ,
11311142 removed : ChunkRanges :: empty ( ) ,
1143+ size : u64:: MAX ,
11321144 } ,
11331145 } ) ;
11341146 // The peer now has more data
@@ -1154,6 +1166,7 @@ mod tests {
11541166 event : BitfieldEvent :: Update {
11551167 added : chunk_ranges ( [ 16 ..32 ] ) ,
11561168 removed : ChunkRanges :: empty ( ) ,
1169+ size : u64:: MAX ,
11571170 } ,
11581171 } ) ;
11591172 // This triggers cancellation of the first peer download and starting a new one for the remaining data
@@ -1187,6 +1200,7 @@ mod tests {
11871200 event : BitfieldEvent :: Update {
11881201 added : chunk_ranges ( [ 32 ..64 ] ) ,
11891202 removed : ChunkRanges :: empty ( ) ,
1203+ size : u64:: MAX ,
11901204 } ,
11911205 } ) ;
11921206 assert ! (
0 commit comments